blob: ee0abf90cba4658075a797cead5716625709427a [file] [log] [blame]
#include "mps.hpp"
namespace phosphor::software::VR
{
bool MPSImageParser::isValidDataTokens(
const std::vector<std::string_view>& tokens)
{
return tokens.size() > static_cast<size_t>(ATE::regName) &&
!tokens[0].starts_with('*');
}
MPSData MPSImageParser::extractData(const std::vector<std::string_view>& tokens)
{
MPSData data;
data.page = getVal<uint8_t>(tokens, ATE::pageNum);
data.addr = getVal<uint8_t>(tokens, ATE::regAddrHex);
std::string regData = getVal<std::string>(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<uint8_t>(
std::stoul(regData.substr(i * 2, 2), nullptr, 16));
}
data.length = static_cast<uint8_t>(byteCount);
return data;
}
std::vector<MPSData> MPSImageParser::getRegistersData()
{
std::vector<MPSData> 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<bool> MPSVoltageRegulator::parseImage(
const uint8_t* image, size_t imageSize)
{
parser = std::make_unique<MPSImageParser>(image, imageSize);
configuration = std::make_unique<MPSConfig>();
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<uint8_t, std::vector<MPSData>>
MPSVoltageRegulator::getGroupedConfigData(uint8_t configMask, uint8_t shift)
{
std::map<uint8_t, std::vector<MPSData>> 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