From 401344137c5a1921b07f9b34ec8a41616e68a024 Mon Sep 17 00:00:00 2001 From: Jaime Arteaga Date: Mon, 30 Jan 2023 16:13:56 -0800 Subject: [PATCH] fix: Correctly set UUID for non-multi-tile archs Use getSubDevicesCount() from hwInfo to determine whether device is root or not, instead of isSubDevice(), since the former does not change with the affinity mask. Signed-off-by: Jaime Arteaga --- shared/source/device/device.cpp | 5 +- .../os_interface/device_uuid_tests.cpp | 71 ++++++++++++++++++- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/shared/source/device/device.cpp b/shared/source/device/device.cpp index 1204c11610..6bc2386315 100644 --- a/shared/source/device/device.cpp +++ b/shared/source/device/device.cpp @@ -757,7 +757,10 @@ bool Device::getUuid(std::array &uuid) { if (this->uuid.isValid) { uuid = this->uuid.id; - if (!isSubDevice() && deviceBitfield.count() == 1) { + auto hwInfo = getHardwareInfo(); + auto subDevicesCount = GfxCoreHelper::getSubDevicesCount(&hwInfo); + + if (subDevicesCount > 1 && deviceBitfield.count() == 1) { // In case of no sub devices created (bits set in affinity mask == 1), return the UUID of enabled sub-device. uint32_t subDeviceIndex = Math::log2(static_cast(deviceBitfield.to_ulong())); uuid[ProductHelper::uuidSize - 1] = subDeviceIndex + 1; diff --git a/shared/test/unit_test/os_interface/device_uuid_tests.cpp b/shared/test/unit_test/os_interface/device_uuid_tests.cpp index 1998e578c6..35a74bc1f9 100644 --- a/shared/test/unit_test/os_interface/device_uuid_tests.cpp +++ b/shared/test/unit_test/os_interface/device_uuid_tests.cpp @@ -125,6 +125,38 @@ HWTEST2_F(MultipleDeviceBdfUuidTest, GivenDefaultAffinityMaskWhenRetrievingDevic } } +HWTEST2_F(MultipleDeviceBdfUuidTest, GivenDefaultAffinityMaskWhenRetrievingDeviceUuidFromBdfFromOneDeviceThenCorrectUuidIsRetrieved, MatchAny) { + + std::unique_ptr deviceFactory; + auto mockExecutionEnvironment = std::make_unique(defaultHwInfo.get(), false, 1); + RAIIProductHelperFactory> raii(*mockExecutionEnvironment->rootDeviceEnvironments[0]); + std::array uuid; + const uint32_t numSubDevices = 1; + uint8_t expectedUuid[NEO::ProductHelper::uuidSize] = {}; + DebugManager.flags.ZE_AFFINITY_MASK.set("default"); + PhysicalDevicePciBusInfo pciBusInfo(0x54ad, 0x34, 0xab, 0xcd); + deviceFactory = createDevices(pciBusInfo, numSubDevices, mockExecutionEnvironment.release()); + + uint16_t vendorId = 0x8086; // Intel + uint16_t deviceId = static_cast(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usDeviceID); + uint16_t revisionId = static_cast(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usRevId); + uint16_t pciDomain = static_cast(pciBusInfo.pciDomain); + uint8_t pciBus = static_cast(pciBusInfo.pciBus); + uint8_t pciDevice = static_cast(pciBusInfo.pciDevice); + uint8_t pciFunction = static_cast(pciBusInfo.pciFunction); + + memcpy_s(&expectedUuid[0], sizeof(uint16_t), &vendorId, sizeof(uint16_t)); + memcpy_s(&expectedUuid[2], sizeof(uint16_t), &deviceId, sizeof(uint16_t)); + memcpy_s(&expectedUuid[4], sizeof(uint16_t), &revisionId, sizeof(uint16_t)); + memcpy_s(&expectedUuid[6], sizeof(uint16_t), &pciDomain, sizeof(uint16_t)); + memcpy_s(&expectedUuid[8], sizeof(uint8_t), &pciBus, sizeof(uint8_t)); + memcpy_s(&expectedUuid[9], sizeof(uint8_t), &pciDevice, sizeof(uint8_t)); + memcpy_s(&expectedUuid[10], sizeof(uint8_t), &pciFunction, sizeof(uint8_t)); + + EXPECT_EQ(true, deviceFactory->rootDevices[0]->getUuid(uuid)); + EXPECT_TRUE(0 == std::memcmp(uuid.data(), expectedUuid, sizeof(expectedUuid))); +} + HWTEST2_F(MultipleDeviceBdfUuidTest, GivenIncorrectBdfWhenRetrievingDeviceUuidFromBdfThenUuidIsNotRetrieved, MatchAny) { std::unique_ptr deviceFactory; @@ -172,12 +204,12 @@ HWTEST2_F(MultipleDeviceBdfUuidTest, GivenNoSubDevicesInAffinityMaskwhenRetrievi EXPECT_TRUE(0 == std::memcmp(uuid.data(), expectedUuid, sizeof(expectedUuid))); } -HWTEST2_F(MultipleDeviceBdfUuidTest, GivenValidBdfWithOneBitEnabledInAffinityMaskThenUuidOfRootDeviceIsBasedOnAffinityMask, MatchAny) { +HWTEST2_F(MultipleDeviceBdfUuidTest, GivenValidBdfWithOneBitEnabledInAffinityMaskSetToRootDeviceThenUuidOfRootDeviceIsBasedOnAffinityMask, MatchAny) { std::unique_ptr deviceFactory; auto mockExecutionEnvironment = std::make_unique(defaultHwInfo.get(), false, 1); RAIIProductHelperFactory> raii(*mockExecutionEnvironment->rootDeviceEnvironments[0]); - DebugManager.flags.ZE_AFFINITY_MASK.set("0.3"); + DebugManager.flags.ZE_AFFINITY_MASK.set("0"); PhysicalDevicePciBusInfo pciBusInfo(0x00, 0x34, 0xab, 0xcd); deviceFactory = createDevices(pciBusInfo, 4, mockExecutionEnvironment.release()); @@ -201,7 +233,40 @@ HWTEST2_F(MultipleDeviceBdfUuidTest, GivenValidBdfWithOneBitEnabledInAffinityMas memcpy_s(&expectedUuid[10], sizeof(uint8_t), &pciFunction, sizeof(uint8_t)); EXPECT_EQ(true, deviceFactory->rootDevices[0]->getUuid(uuid)); - expectedUuid[15] = 4; + EXPECT_TRUE(0 == std::memcmp(uuid.data(), expectedUuid, sizeof(expectedUuid))); +} + +HWTEST2_F(MultipleDeviceBdfUuidTest, GivenValidBdfWithOneBitEnabledInAffinityMaskSetToSubDeviceThenUuidOfRootDeviceIsBasedOnAffinityMask, MatchAny) { + + std::unique_ptr deviceFactory; + auto mockExecutionEnvironment = std::make_unique(defaultHwInfo.get(), false, 1); + RAIIProductHelperFactory> raii(*mockExecutionEnvironment->rootDeviceEnvironments[0]); + DebugManager.flags.ZE_AFFINITY_MASK.set("0.3"); + uint32_t subDeviceIndex = 3; + PhysicalDevicePciBusInfo pciBusInfo(0x00, 0x34, 0xab, 0xcd); + deviceFactory = createDevices(pciBusInfo, 4, mockExecutionEnvironment.release()); + + std::array uuid; + uint8_t expectedUuid[NEO::ProductHelper::uuidSize] = {}; + + uint16_t vendorId = 0x8086; // Intel + uint16_t deviceId = static_cast(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usDeviceID); + uint16_t revisionId = static_cast(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usRevId); + uint16_t pciDomain = static_cast(pciBusInfo.pciDomain); + uint8_t pciBus = static_cast(pciBusInfo.pciBus); + uint8_t pciDevice = static_cast(pciBusInfo.pciDevice); + uint8_t pciFunction = static_cast(pciBusInfo.pciFunction); + + memcpy_s(&expectedUuid[0], sizeof(uint16_t), &vendorId, sizeof(uint16_t)); + memcpy_s(&expectedUuid[2], sizeof(uint16_t), &deviceId, sizeof(uint16_t)); + memcpy_s(&expectedUuid[4], sizeof(uint16_t), &revisionId, sizeof(uint16_t)); + memcpy_s(&expectedUuid[6], sizeof(uint16_t), &pciDomain, sizeof(uint16_t)); + memcpy_s(&expectedUuid[8], sizeof(uint8_t), &pciBus, sizeof(uint8_t)); + memcpy_s(&expectedUuid[9], sizeof(uint8_t), &pciDevice, sizeof(uint8_t)); + memcpy_s(&expectedUuid[10], sizeof(uint8_t), &pciFunction, sizeof(uint8_t)); + + EXPECT_EQ(true, deviceFactory->rootDevices[0]->getUuid(uuid)); + expectedUuid[15] = subDeviceIndex + 1; EXPECT_TRUE(0 == std::memcmp(uuid.data(), expectedUuid, sizeof(expectedUuid))); }