Fix issue with board number property

Buffer usage of less size resulted in invalid board number.
Added logic to use sufficient size to retrieve board number
from PMT.

Added logic to provide decoded values rather than ASCII
characters.

Related-To: LOCI-3545

Signed-off-by: Bellekallu Rajkiran <bellekallu.rajkiran@intel.com>
This commit is contained in:
Bellekallu Rajkiran
2022-11-17 10:49:10 +00:00
committed by Compute-Runtime-Automation
parent eee6a2439f
commit 47a2d309bb
3 changed files with 59 additions and 29 deletions

View File

@@ -42,7 +42,7 @@ static const std::map<int, zes_engine_type_flags_t> engineMap = {
{3, ZES_ENGINE_TYPE_FLAG_MEDIA},
{4, ZES_ENGINE_TYPE_FLAG_COMPUTE}};
bool LinuxGlobalOperationsImp::readTelemData(char (&data)[ZES_STRING_PROPERTY_SIZE], const ssize_t bytesToRead, const std::string &key) {
bool LinuxGlobalOperationsImp::getTelemOffsetAndTelemDir(uint64_t &telemOffset, const std::string &key, std::string &telemDir) {
auto pDrm = &pLinuxSysmanImp->getDrm();
std::optional<std::string> rootPath = NEO::getPciRootPath(pDrm->getFileDescriptor());
if (!rootPath.has_value()) {
@@ -56,7 +56,7 @@ bool LinuxGlobalOperationsImp::readTelemData(char (&data)[ZES_STRING_PROPERTY_SI
}
auto iterator = telemPciPath.begin();
std::string_view telemDir = iterator->second;
telemDir = iterator->second;
std::array<char, NEO::PmtUtil::guidStringSize> guidString = {};
if (!NEO::PmtUtil::readGuid(telemDir, guidString)) {
@@ -72,24 +72,30 @@ bool LinuxGlobalOperationsImp::readTelemData(char (&data)[ZES_STRING_PROPERTY_SI
if (ZE_RESULT_SUCCESS == PlatformMonitoringTech::getKeyOffsetMap(guidString.data(), keyOffsetMap)) {
auto keyOffset = keyOffsetMap.find(key.c_str());
if (keyOffset != keyOffsetMap.end()) {
uint64_t value;
ssize_t bytesRead = NEO::PmtUtil::readTelem(telemDir.data(), bytesToRead, keyOffset->second + offset, &value);
if (bytesRead == bytesToRead) {
std::ostringstream telemDataString;
telemDataString << std::hex << std::showbase << value;
memcpy_s(data, ZES_STRING_PROPERTY_SIZE, telemDataString.str().c_str(), telemDataString.str().size());
return true;
}
telemOffset = keyOffset->second + offset;
return true;
}
}
return false;
}
bool LinuxGlobalOperationsImp::getSerialNumber(char (&serialNumber)[ZES_STRING_PROPERTY_SIZE]) {
if (!LinuxGlobalOperationsImp::readTelemData(serialNumber, sizeof(uint64_t), "PPIN")) {
uint64_t offset = 0;
std::string telemDir = {};
if (!LinuxGlobalOperationsImp::getTelemOffsetAndTelemDir(offset, "PPIN", telemDir)) {
return false;
}
return true;
uint64_t value;
ssize_t bytesRead = NEO::PmtUtil::readTelem(telemDir.data(), sizeof(uint64_t), offset, &value);
if (bytesRead == sizeof(uint64_t)) {
std::ostringstream telemDataString;
telemDataString << std::hex << std::showbase << value;
memcpy_s(serialNumber, ZES_STRING_PROPERTY_SIZE, telemDataString.str().c_str(), telemDataString.str().size());
return true;
}
return false;
}
Device *LinuxGlobalOperationsImp::getDevice() {
@@ -97,12 +103,20 @@ Device *LinuxGlobalOperationsImp::getDevice() {
}
bool LinuxGlobalOperationsImp::getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) {
const ssize_t boardNumberSize = 32;
if (!LinuxGlobalOperationsImp::readTelemData(boardNumber, boardNumberSize, "BoardNumber")) {
uint64_t offset = 0;
std::string telemDir = {};
constexpr uint32_t boardNumberSize = 32;
if (!LinuxGlobalOperationsImp::getTelemOffsetAndTelemDir(offset, "BoardNumber", telemDir)) {
return false;
}
std::array<uint8_t, boardNumberSize> value;
ssize_t bytesRead = NEO::PmtUtil::readTelem(telemDir.data(), boardNumberSize, offset, value.data());
if (bytesRead == boardNumberSize) {
memcpy_s(boardNumber, ZES_STRING_PROPERTY_SIZE, value.data(), bytesRead);
return true;
}
return true;
return false;
}
void LinuxGlobalOperationsImp::getBrandName(char (&brandName)[ZES_STRING_PROPERTY_SIZE]) {

View File

@@ -54,7 +54,7 @@ class LinuxGlobalOperationsImp : public OsGlobalOperations, NEO::NonCopyableOrMo
static const std::string srcVersionFile;
static const std::string agamaVersionFile;
static const std::string ueventWedgedFile;
bool readTelemData(char (&serialNumber)[ZES_STRING_PROPERTY_SIZE], const ssize_t bytesToRead, const std::string &key);
bool getTelemOffsetAndTelemDir(uint64_t &telemOffset, const std::string &key, std::string &telemDir);
std::string devicePciBdf = "";
NEO::ExecutionEnvironment *executionEnvironment = nullptr;
uint32_t rootDeviceIndex = 0u;