diff --git a/level_zero/sysman/source/global_operations/linux/sysman_os_global_operations_imp.cpp b/level_zero/sysman/source/global_operations/linux/sysman_os_global_operations_imp.cpp index 78596aab25..3e65711605 100644 --- a/level_zero/sysman/source/global_operations/linux/sysman_os_global_operations_imp.cpp +++ b/level_zero/sysman/source/global_operations/linux/sysman_os_global_operations_imp.cpp @@ -114,6 +114,16 @@ bool LinuxGlobalOperationsImp::getBoardNumber(char (&boardNumber)[ZES_STRING_PRO std::array value; ssize_t bytesRead = NEO::PmtUtil::readTelem(telemDir.data(), boardNumberSize, offset, value.data()); if (bytesRead == boardNumberSize) { + // Board Number from PMT is available as multiple uint32_t integers, We need to swap (i.e convert each uint32_t + // to big endian) elements of each uint32_t to get proper board number string. + // For instance, Board Number stored in PMT space is as follows (stored as uint32_t - Little endian): + // 1. BoardNumber0 - 2PTW + // 2. BoardNumber1 - 0503 + // 3. BoardNumber2 - 0130. BoardNumber is actual combination of all 0, 1 and 2 i.e WTP230500310. + for (uint32_t i = 0; i < boardNumberSize; i += 4) { + std::swap(value[i], value[i + 3]); + std::swap(value[i + 1], value[i + 2]); + } memcpy_s(boardNumber, ZES_STRING_PROPERTY_SIZE, value.data(), bytesRead); return true; } diff --git a/level_zero/sysman/test/unit_tests/sources/global_operations/linux/test_zes_global_operations.cpp b/level_zero/sysman/test/unit_tests/sources/global_operations/linux/test_zes_global_operations.cpp index 18f3841d5e..14956f677c 100644 --- a/level_zero/sysman/test/unit_tests/sources/global_operations/linux/test_zes_global_operations.cpp +++ b/level_zero/sysman/test/unit_tests/sources/global_operations/linux/test_zes_global_operations.cpp @@ -200,7 +200,7 @@ TEST_F(SysmanGlobalOperationsFixture, GivenValidDeviceHandleWhenCallingzesGlobal pLinuxSysmanImp->rootPath = NEO::getPciRootPath(pLinuxSysmanImp->getDrm()->getFileDescriptor()).value_or(""); zes_device_properties_t properties; const std::string expectedSerialNumber("0x3e8c9dfe1c2e4d5c"); - const std::string expectedBoardNumber("0821VPTW910091000821VPTW91009100"); + const std::string expectedBoardNumber("1280WTPV001900191280WTPV00190019"); ze_result_t result = zesDeviceGetProperties(device, &properties); EXPECT_EQ(ZE_RESULT_SUCCESS, result); 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 76394d0695..36437dc52f 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 @@ -125,6 +125,16 @@ bool LinuxGlobalOperationsImp::getBoardNumber(char (&boardNumber)[ZES_STRING_PRO std::array value; ssize_t bytesRead = NEO::PmtUtil::readTelem(telemDir.data(), boardNumberSize, offset, value.data()); if (bytesRead == boardNumberSize) { + // Board Number from PMT is available as multiple uint32_t integers, We need to swap (i.e convert each uint32_t + // to big endian) elements of each uint32_t to get proper board number string. + // For instance, Board Number stored in PMT space is as follows (stored as uint32_t - Little endian): + // 1. BoardNumber0 - 2PTW + // 2. BoardNumber1 - 0503 + // 3. BoardNumber2 - 0130. BoardNumber is actual combination of all 0, 1 and 2 i.e WTP230500310. + for (uint32_t i = 0; i < boardNumberSize; i += 4) { + std::swap(value[i], value[i + 3]); + std::swap(value[i + 1], value[i + 2]); + } memcpy_s(boardNumber, ZES_STRING_PROPERTY_SIZE, value.data(), bytesRead); return true; } 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 aff011ca98..053667d64e 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 @@ -214,7 +214,7 @@ TEST_F(SysmanGlobalOperationsFixture, GivenValidDeviceHandleWhenCallingzesGlobal zes_device_properties_t properties; const std::string expectedSerialNumber("0x3e8c9dfe1c2e4d5c"); - const std::string expectedBoardNumber("0821VPTW910091000821VPTW91009100"); + const std::string expectedBoardNumber("1280WTPV001900191280WTPV00190019"); ze_result_t result = zesDeviceGetProperties(device, &properties); EXPECT_EQ(ZE_RESULT_SUCCESS, result);