diff --git a/level_zero/tools/source/sysman/global_operations/global_operations_imp.cpp b/level_zero/tools/source/sysman/global_operations/global_operations_imp.cpp index bed7f76188..ffbe9542d9 100644 --- a/level_zero/tools/source/sysman/global_operations/global_operations_imp.cpp +++ b/level_zero/tools/source/sysman/global_operations/global_operations_imp.cpp @@ -73,7 +73,10 @@ void GlobalOperationsImp::init() { pOsGlobalOperations->getDriverVersion(sysmanProperties.driverVersion); pOsGlobalOperations->getModelName(sysmanProperties.modelName); pOsGlobalOperations->getBrandName(sysmanProperties.brandName); - pOsGlobalOperations->getBoardNumber(sysmanProperties.boardNumber); + memset(sysmanProperties.boardNumber, 0, ZES_STRING_PROPERTY_SIZE); + if (!pOsGlobalOperations->getBoardNumber(sysmanProperties.boardNumber)) { + memcpy_s(sysmanProperties.boardNumber, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), unknown.length() + 1); + } memset(sysmanProperties.serialNumber, 0, ZES_STRING_PROPERTY_SIZE); if (!pOsGlobalOperations->getSerialNumber(sysmanProperties.serialNumber)) { memcpy_s(sysmanProperties.serialNumber, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), unknown.length() + 1); diff --git a/level_zero/tools/source/sysman/global_operations/linux/os_global_operations_imp.cpp b/level_zero/tools/source/sysman/global_operations/linux/os_global_operations_imp.cpp index e99495a75d..e79f04936f 100644 --- a/level_zero/tools/source/sysman/global_operations/linux/os_global_operations_imp.cpp +++ b/level_zero/tools/source/sysman/global_operations/linux/os_global_operations_imp.cpp @@ -42,25 +42,7 @@ static const std::map engineMap = { {3, ZES_ENGINE_TYPE_FLAG_MEDIA}, {4, ZES_ENGINE_TYPE_FLAG_COMPUTE}}; -bool LinuxGlobalOperationsImp::readSerialNumber(std::string_view telemDir, std::array &guidString, const uint64_t offset, char (&serialNumber)[ZES_STRING_PROPERTY_SIZE]) { - std::map keyOffsetMap; - if (ZE_RESULT_SUCCESS == PlatformMonitoringTech::getKeyOffsetMap(guidString.data(), keyOffsetMap)) { - auto ppinOffset = keyOffsetMap.find("PPIN"); - if (ppinOffset != keyOffsetMap.end()) { - uint64_t value; - ssize_t bytesRead = NEO::PmtUtil::readTelem(telemDir.data(), sizeof(uint64_t), ppinOffset->second + offset, &value); - if (bytesRead == sizeof(uint64_t)) { - std::ostringstream serialNumberString; - serialNumberString << std::hex << std::showbase << value; - memcpy_s(serialNumber, ZES_STRING_PROPERTY_SIZE, serialNumberString.str().c_str(), serialNumberString.str().size()); - return true; - } - } - } - return false; -} - -bool LinuxGlobalOperationsImp::getSerialNumber(char (&serialNumber)[ZES_STRING_PROPERTY_SIZE]) { +bool LinuxGlobalOperationsImp::readTelemData(char (&data)[ZES_STRING_PROPERTY_SIZE], const ssize_t bytesToRead, const std::string &key) { auto pDrm = &pLinuxSysmanImp->getDrm(); std::optional rootPath = NEO::getPciRootPath(pDrm->getFileDescriptor()); if (!rootPath.has_value()) { @@ -69,15 +51,14 @@ bool LinuxGlobalOperationsImp::getSerialNumber(char (&serialNumber)[ZES_STRING_P std::map telemPciPath; NEO::PmtUtil::getTelemNodesInPciPath(rootPath.value(), telemPciPath); - if (telemPciPath.size() < pDevice->getNEODevice()->getNumSubDevices() + 1) { return false; } auto iterator = telemPciPath.begin(); - std::string telemDir = iterator->second; + std::string_view telemDir = iterator->second; - std::array guidString; + std::array guidString = {}; if (!NEO::PmtUtil::readGuid(telemDir, guidString)) { return false; } @@ -87,10 +68,27 @@ bool LinuxGlobalOperationsImp::getSerialNumber(char (&serialNumber)[ZES_STRING_P return false; } - if (!LinuxGlobalOperationsImp::readSerialNumber(telemDir, guidString, offset, serialNumber)) { + std::map keyOffsetMap; + 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; + } + } + } + return false; +} + +bool LinuxGlobalOperationsImp::getSerialNumber(char (&serialNumber)[ZES_STRING_PROPERTY_SIZE]) { + if (!LinuxGlobalOperationsImp::readTelemData(serialNumber, sizeof(uint64_t), "PPIN")) { return false; } - return true; } @@ -98,8 +96,13 @@ Device *LinuxGlobalOperationsImp::getDevice() { return pDevice; } -void LinuxGlobalOperationsImp::getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) { - std::strncpy(boardNumber, unknown.c_str(), ZES_STRING_PROPERTY_SIZE); +bool LinuxGlobalOperationsImp::getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) { + const ssize_t boardNumberSize = 32; + if (!LinuxGlobalOperationsImp::readTelemData(boardNumber, boardNumberSize, "BoardNumber")) { + return false; + } + + return true; } void LinuxGlobalOperationsImp::getBrandName(char (&brandName)[ZES_STRING_PROPERTY_SIZE]) { diff --git a/level_zero/tools/source/sysman/global_operations/linux/os_global_operations_imp.h b/level_zero/tools/source/sysman/global_operations/linux/os_global_operations_imp.h index f0351dbe18..8ac78c73d3 100644 --- a/level_zero/tools/source/sysman/global_operations/linux/os_global_operations_imp.h +++ b/level_zero/tools/source/sysman/global_operations/linux/os_global_operations_imp.h @@ -18,7 +18,7 @@ struct Device; class LinuxGlobalOperationsImp : public OsGlobalOperations, NEO::NonCopyableOrMovableClass { public: bool getSerialNumber(char (&serialNumber)[ZES_STRING_PROPERTY_SIZE]) override; - void getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) override; + bool getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) override; void getBrandName(char (&brandName)[ZES_STRING_PROPERTY_SIZE]) override; void getModelName(char (&modelName)[ZES_STRING_PROPERTY_SIZE]) override; void getVendorName(char (&vendorName)[ZES_STRING_PROPERTY_SIZE]) override; @@ -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; - static bool readSerialNumber(std::string_view telemDir, std::array &guidString, const uint64_t offset, char (&serialNumber)[ZES_STRING_PROPERTY_SIZE]); + bool readTelemData(char (&serialNumber)[ZES_STRING_PROPERTY_SIZE], const ssize_t bytesToRead, const std::string &key); std::string devicePciBdf = ""; NEO::ExecutionEnvironment *executionEnvironment = nullptr; uint32_t rootDeviceIndex = 0u; diff --git a/level_zero/tools/source/sysman/global_operations/os_global_operations.h b/level_zero/tools/source/sysman/global_operations/os_global_operations.h index 9ecdc310cc..bca6750929 100644 --- a/level_zero/tools/source/sysman/global_operations/os_global_operations.h +++ b/level_zero/tools/source/sysman/global_operations/os_global_operations.h @@ -19,7 +19,7 @@ namespace L0 { class OsGlobalOperations { public: virtual bool getSerialNumber(char (&serialNumber)[ZES_STRING_PROPERTY_SIZE]) = 0; - virtual void getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) = 0; + virtual bool getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) = 0; virtual void getBrandName(char (&brandName)[ZES_STRING_PROPERTY_SIZE]) = 0; virtual void getModelName(char (&modelName)[ZES_STRING_PROPERTY_SIZE]) = 0; virtual void getVendorName(char (&vendorName)[ZES_STRING_PROPERTY_SIZE]) = 0; diff --git a/level_zero/tools/source/sysman/global_operations/windows/os_global_operations_imp.cpp b/level_zero/tools/source/sysman/global_operations/windows/os_global_operations_imp.cpp index 7324fc0f8c..a268898288 100644 --- a/level_zero/tools/source/sysman/global_operations/windows/os_global_operations_imp.cpp +++ b/level_zero/tools/source/sysman/global_operations/windows/os_global_operations_imp.cpp @@ -17,7 +17,8 @@ bool WddmGlobalOperationsImp::getSerialNumber(char (&serialNumber)[ZES_STRING_PR return false; } -void WddmGlobalOperationsImp::getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) { +bool WddmGlobalOperationsImp::getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) { + return false; } void WddmGlobalOperationsImp::getBrandName(char (&brandName)[ZES_STRING_PROPERTY_SIZE]) { diff --git a/level_zero/tools/source/sysman/global_operations/windows/os_global_operations_imp.h b/level_zero/tools/source/sysman/global_operations/windows/os_global_operations_imp.h index be7ac7eeb0..f70ec98c48 100644 --- a/level_zero/tools/source/sysman/global_operations/windows/os_global_operations_imp.h +++ b/level_zero/tools/source/sysman/global_operations/windows/os_global_operations_imp.h @@ -17,7 +17,7 @@ class KmdSysManager; class WddmGlobalOperationsImp : public OsGlobalOperations, NEO::NonCopyableOrMovableClass { public: bool getSerialNumber(char (&serialNumber)[ZES_STRING_PROPERTY_SIZE]) override; - void getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) override; + bool getBoardNumber(char (&boardNumber)[ZES_STRING_PROPERTY_SIZE]) override; void getBrandName(char (&brandName)[ZES_STRING_PROPERTY_SIZE]) override; void getModelName(char (&modelName)[ZES_STRING_PROPERTY_SIZE]) override; void getVendorName(char (&vendorName)[ZES_STRING_PROPERTY_SIZE]) override; diff --git a/level_zero/tools/source/sysman/linux/pmt/pmt_xml_offsets.h b/level_zero/tools/source/sysman/linux/pmt/pmt_xml_offsets.h index f6c71b4474..ab9f8a6f37 100644 --- a/level_zero/tools/source/sysman/linux/pmt/pmt_xml_offsets.h +++ b/level_zero/tools/source/sysman/linux/pmt/pmt_xml_offsets.h @@ -240,5 +240,6 @@ const std::map> guidToKeyOffsetMap {"VF1_HBM3_READ", 360}, {"VF1_HBM3_WRITE", 364}}}, {"0x41fe79a5", // For PVC root device - {{"PPIN", 152}}}}; + {{"PPIN", 152}, + {"BoardNumber", 72}}}}; } // namespace L0 diff --git a/level_zero/tools/test/unit_tests/sources/sysman/global_operations/linux/test_zes_global_operations.cpp b/level_zero/tools/test/unit_tests/sources/sysman/global_operations/linux/test_zes_global_operations.cpp index df71cf8831..72792c5808 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/global_operations/linux/test_zes_global_operations.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/global_operations/linux/test_zes_global_operations.cpp @@ -236,16 +236,16 @@ TEST_F(SysmanGlobalOperationsFixture, GivenValidDeviceHandleWhenCallingzesGlobal pLinuxSysmanImp->pDrm = pDrmMock.get(); zes_device_properties_t properties; - const std::string expectedSerialNumber("0x3e8c9dfe1c2e4d5c"); + const std::string expectedData("0x3e8c9dfe1c2e4d5c"); ze_result_t result = zesDeviceGetProperties(device, &properties); EXPECT_EQ(ZE_RESULT_SUCCESS, result); EXPECT_EQ(properties.numSubdevices, 0u); - EXPECT_TRUE(0 == unknown.compare(properties.boardNumber)); + EXPECT_TRUE(0 == expectedData.compare(properties.boardNumber)); EXPECT_TRUE(0 == vendorIntel.compare(properties.brandName)); EXPECT_TRUE(0 == driverVersion.compare(properties.driverVersion)); EXPECT_TRUE(0 == expectedModelName.compare(properties.modelName)); - EXPECT_TRUE(0 == expectedSerialNumber.compare(properties.serialNumber)); + EXPECT_TRUE(0 == expectedData.compare(properties.serialNumber)); EXPECT_TRUE(0 == vendorIntel.compare(properties.vendorName)); pLinuxSysmanImp->pDrm = pOriginalDrm; }