diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 86dac75323..2ed2b05a4c 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -505,6 +505,10 @@ int Drm::setupHardwareInfo(const DeviceDescriptor *device, bool setupFeatureTabl printDebugString(debugManager.flags.PrintDebugMessages.get(), stderr, "%s", "WARNING: Failed to query engine info\n"); } + if (!hwInfo->gtSystemInfo.L3BankCount) { + hwInfo->gtSystemInfo.L3BankCount = hwInfo->gtSystemInfo.MaxDualSubSlicesSupported; + } + DrmQueryTopologyData topologyData = {}; if (!queryTopology(*hwInfo, topologyData)) { @@ -567,9 +571,7 @@ int Drm::setupHardwareInfo(const DeviceDescriptor *device, bool setupFeatureTabl } if (systemInfo) { - uint32_t bankCount = (hwInfo->gtSystemInfo.L3BankCount > 0) ? hwInfo->gtSystemInfo.L3BankCount : hwInfo->gtSystemInfo.MaxDualSubSlicesSupported; - - hwInfo->gtSystemInfo.L3CacheSizeInKb = systemInfo->getL3BankSizeInKb() * bankCount; + hwInfo->gtSystemInfo.L3CacheSizeInKb = systemInfo->getL3BankSizeInKb() * hwInfo->gtSystemInfo.L3BankCount; } rootDeviceEnvironment.setRcsExposure(); diff --git a/shared/test/unit_test/os_interface/linux/drm_system_info_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_system_info_tests.cpp index 2d006cb4ce..d02582e23b 100644 --- a/shared/test/unit_test/os_interface/linux/drm_system_info_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_system_info_tests.cpp @@ -360,7 +360,7 @@ TEST(DrmSystemInfoTest, givenZeroBankCountWhenCreatingSystemInfoThenUseDualSubsl EXPECT_NE(nullptr, drm.getSystemInfo()); const auto >SystemInfo = executionEnvironment->rootDeviceEnvironments[0]->getHardwareInfo()->gtSystemInfo; - EXPECT_EQ(0u, gtSystemInfo.L3BankCount); + EXPECT_EQ(gtSystemInfo.MaxDualSubSlicesSupported, gtSystemInfo.L3BankCount); uint64_t expectedL3Size = gtSystemInfo.MaxDualSubSlicesSupported * drm.getSystemInfo()->getL3BankSizeInKb(); uint64_t calculatedL3Size = gtSystemInfo.L3CacheSizeInKb; diff --git a/shared/test/unit_test/os_interface/linux/drm_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_tests.cpp index 1144b5915d..b5cdcd8bee 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -1794,6 +1794,42 @@ TEST(DrmHwInfoTest, givenTopologyDataWithoutSystemInfoWhenSettingHwInfoThenCorre EXPECT_EQ(hwInfo->gtSystemInfo.MaxDualSubSlicesSupported, 16u); } +TEST(DrmHwInfoTest, givenTopologyDataWithoutL3BankCountWhenSettingHwInfoThenL3BankCountIsSetBasedOnMaxDualSubslicesBeforeQueryTopology) { + auto executionEnvironment = std::make_unique(); + DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]}; + + drm.ioctlHelper = std::make_unique(drm); + + auto ioctlHelper = static_cast(drm.ioctlHelper.get()); + + ioctlHelper->topologyDataToSet.sliceCount = 1; + ioctlHelper->topologyDataToSet.subSliceCount = 1; + ioctlHelper->topologyDataToSet.maxEusPerSubSlice = 1; + ioctlHelper->topologyDataToSet.euCount = 1; + ioctlHelper->topologyDataToSet.maxSlices = 1; + ioctlHelper->topologyDataToSet.maxSubSlicesPerSlice = 16; + + auto hwInfo = executionEnvironment->rootDeviceEnvironments[0]->getMutableHardwareInfo(); + + hwInfo->gtSystemInfo = {}; + + auto setupHardwareInfo = [](HardwareInfo *hwInfo, bool, const ReleaseHelper *) { + hwInfo->gtSystemInfo.MaxSubSlicesSupported = 8; + hwInfo->gtSystemInfo.MaxDualSubSlicesSupported = 8; + }; + DeviceDescriptor device = {0, hwInfo, setupHardwareInfo}; + + drm.systemInfoQueried = true; + EXPECT_EQ(nullptr, drm.systemInfo.get()); + EXPECT_EQ(0, drm.setupHardwareInfo(&device, false)); + EXPECT_EQ(nullptr, drm.systemInfo.get()); + + EXPECT_EQ(hwInfo->gtSystemInfo.L3BankCount, 8u); + + EXPECT_EQ(hwInfo->gtSystemInfo.MaxSubSlicesSupported, 16u); + EXPECT_EQ(hwInfo->gtSystemInfo.MaxDualSubSlicesSupported, 16u); +} + TEST(DrmWrapperTest, givenEAgainOrEIntrOrEBusyWhenCheckingIfReinvokeRequiredThenTrueIsReturned) { auto executionEnvironment = std::make_unique(); DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};