#include "mps.hpp" namespace phosphor::software::VR { bool MPSImageParser::isValidDataTokens( const std::vector& tokens) { return tokens.size() > static_cast(ATE::regName) && !tokens[0].starts_with('*'); } MPSData MPSImageParser::extractData(const std::vector& tokens) { MPSData data; data.page = getVal(tokens, ATE::pageNum); data.addr = getVal(tokens, ATE::regAddrHex); std::string regData = getVal(tokens, ATE::regDataHex); size_t byteCount = std::min(regData.length() / 2, size_t(4)); for (size_t i = 0; i < byteCount; ++i) { data.data[byteCount - 1 - i] = static_cast( std::stoul(regData.substr(i * 2, 2), nullptr, 16)); } data.length = static_cast(byteCount); return data; } std::vector MPSImageParser::getRegistersData() { std::vector registersData; for (const auto& tokens : lineTokens) { if (tokens[0].starts_with("END")) { break; } if (isValidDataTokens(tokens)) { registersData.push_back(extractData(tokens)); } } return registersData; } sdbusplus::async::task MPSVoltageRegulator::parseImage( const uint8_t* image, size_t imageSize) { parser = std::make_unique(image, imageSize); configuration = std::make_unique(); configuration->registersData = parser->getRegistersData(); if (!co_await parseDeviceConfiguration()) { co_return false; } lg2::debug( "Parsed configuration: Data Size={SIZE}, Vendor ID={VID}, " "Product ID={PID}, Config ID={CID}, CRC User={CRCUSR}, " "CRC Multi={CRCMULTI}", "SIZE", configuration->registersData.size(), "VID", lg2::hex, configuration->vendorId, "PID", lg2::hex, configuration->productId, "CID", lg2::hex, configuration->configId, "CRCUSR", lg2::hex, configuration->crcUser, "CRCMULTI", lg2::hex, configuration->crcMulti); co_return true; } std::map> MPSVoltageRegulator::getGroupedConfigData(uint8_t configMask, uint8_t shift) { std::map> groupedData; if (!configuration) { return groupedData; } for (const auto& data : configuration->registersData) { uint8_t config = (data.page & configMask) >> shift; groupedData[config].push_back(data); } return groupedData; } } // namespace phosphor::software::VR