From 9b7ac3a71e792f7c8a69772c8cb05e83a404bb32 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Wed, 25 Sep 2024 17:56:46 +0000 Subject: [PATCH] fix: correct querying number of slices in xe path Signed-off-by: Mateusz Jablonski --- .../os_interface/linux/xe/ioctl_helper_xe.cpp | 36 +++++++------- .../linux/xe/ioctl_helper_xe_tests.cpp | 47 +++++++++---------- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp index a1f445cac6..82425dce0f 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -505,6 +505,8 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo int euPerDss = 0; int l3BankCount = 0; uint32_t hwMaxSubSliceCount = hwInfo.gtSystemInfo.MaxSubSlicesSupported; + topologyData.maxSlices = hwInfo.gtSystemInfo.MaxSlicesSupported ? hwInfo.gtSystemInfo.MaxSlicesSupported : 1; + topologyData.maxSubSlicesPerSlice = hwMaxSubSliceCount / topologyData.maxSlices; for (auto tileId = 0u; tileId < numTiles; tileId++) { @@ -513,29 +515,33 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo std::vector sliceIndices; std::vector subSliceIndices; - sliceIndices.push_back(0); + int previouslyEnabledSlice = -1; - for (auto subSliceId = 0u; subSliceId < std::min(hwMaxSubSliceCount, static_cast(computeDss[tileId].size() * 8)); subSliceId++) { - auto byte = subSliceId / 8; - auto bit = subSliceId & 0b111; - if (computeDss[tileId][byte].test(bit)) { - subSliceIndices.push_back(subSliceId); - subSliceCountPerTile++; - } - } - - if (subSliceCountPerTile == 0) { - for (auto subSliceId = 0u; subSliceId < std::min(hwMaxSubSliceCount, static_cast(geomDss[tileId].size() * 8)); subSliceId++) { + auto processSubSliceInfo = [&](const std::vector> &subSliceInfo) -> void { + for (auto subSliceId = 0u; subSliceId < std::min(hwMaxSubSliceCount, static_cast(subSliceInfo.size() * 8)); subSliceId++) { auto byte = subSliceId / 8; auto bit = subSliceId & 0b111; - if (geomDss[tileId][byte].test(bit)) { + int sliceId = static_cast(subSliceId / topologyData.maxSubSlicesPerSlice); + if (subSliceInfo[byte].test(bit)) { subSliceIndices.push_back(subSliceId); subSliceCountPerTile++; + if (sliceId != previouslyEnabledSlice) { + previouslyEnabledSlice = sliceId; + sliceIndices.push_back(sliceId); + } } } + }; + processSubSliceInfo(computeDss[tileId]); + + if (subSliceCountPerTile == 0) { + processSubSliceInfo(geomDss[tileId]); } + topologyMap[tileId].sliceIndices = std::move(sliceIndices); - topologyMap[tileId].subsliceIndices = std::move(subSliceIndices); + if (topologyMap[tileId].sliceIndices.size() < 2u) { + topologyMap[tileId].subsliceIndices = std::move(subSliceIndices); + } int sliceCountPerTile = static_cast(topologyMap[tileId].sliceIndices.size()); int euPerDssPerTile = 0; @@ -555,14 +561,12 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo l3BankCount = (l3BankCount == 0) ? l3BankCountPerTile : std::min(l3BankCount, l3BankCountPerTile); // pick max config - topologyData.maxSubSlicesPerSlice = std::max(topologyData.maxSubSlicesPerSlice, subSliceCountPerTile); topologyData.maxEusPerSubSlice = std::max(topologyData.maxEusPerSubSlice, euPerDssPerTile); } topologyData.sliceCount = sliceCount; topologyData.subSliceCount = subSliceCount; topologyData.euCount = subSliceCount * euPerDss; - topologyData.maxSlices = sliceCount; topologyData.numL3Banks = l3BankCount; return receivedDssInfo; } diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp index 14ece73e45..4a944f2560 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp @@ -708,7 +708,8 @@ TEST(IoctlHelperXeTest, givenGeomDssWhenGetTopologyDataAndMapThenResultsAreCorre DrmQueryTopologyData topologyData{}; TopologyMap topologyMap{}; - hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64; + hwInfo.gtSystemInfo.MaxSlicesSupported = 1; + hwInfo.gtSystemInfo.MaxSubSlicesSupported = 6; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); ASSERT_TRUE(result); @@ -760,7 +761,8 @@ TEST(IoctlHelperXeTest, givenUnknownTopologyTypeWhenGetTopologyDataAndMapThenNot DrmQueryTopologyData topologyData{}; TopologyMap topologyMap{}; - hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64; + hwInfo.gtSystemInfo.MaxSlicesSupported = 1; + hwInfo.gtSystemInfo.MaxSubSlicesSupported = 6; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); ASSERT_TRUE(result); @@ -803,29 +805,30 @@ TEST(IoctlHelperXeTest, givenComputeDssWhenGetTopologyDataAndMapThenResultsAreCo uint16_t tileId = 0; for (auto gtId = 0u; gtId < 4u; gtId++) { drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0, 0, 0, 0, 0, 0, 0, 0}); - drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}); + drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0x0fu, 0xff, 0u, 0xff, 0u, 0u, 0xff, 0xff}); drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_EU_PER_DSS, 8, {0b1111'1111, 0, 0, 0, 0, 0, 0, 0}); } DrmQueryTopologyData topologyData{}; TopologyMap topologyMap{}; + hwInfo.gtSystemInfo.MaxSlicesSupported = 4u; hwInfo.gtSystemInfo.MaxSubSlicesSupported = 32u; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); ASSERT_TRUE(result); // verify topology data - EXPECT_EQ(1, topologyData.sliceCount); - EXPECT_EQ(1, topologyData.maxSlices); + EXPECT_EQ(3, topologyData.sliceCount); + EXPECT_EQ(4, topologyData.maxSlices); - EXPECT_EQ(32, topologyData.subSliceCount); - EXPECT_EQ(32, topologyData.maxSubSlicesPerSlice); + EXPECT_EQ(20, topologyData.subSliceCount); + EXPECT_EQ(8, topologyData.maxSubSlicesPerSlice); - EXPECT_EQ(256, topologyData.euCount); + EXPECT_EQ(160, topologyData.euCount); EXPECT_EQ(8, topologyData.maxEusPerSubSlice); // verify topology map - std::vector expectedSliceIndices = {0}; + std::vector expectedSliceIndices = {0, 1, 3}; ASSERT_EQ(expectedSliceIndices.size(), topologyMap[tileId].sliceIndices.size()); ASSERT_TRUE(topologyMap[tileId].sliceIndices.size() > 0); @@ -833,18 +836,7 @@ TEST(IoctlHelperXeTest, givenComputeDssWhenGetTopologyDataAndMapThenResultsAreCo EXPECT_EQ(expectedSliceIndices[i], topologyMap[tileId].sliceIndices[i]); } - std::vector expectedSubSliceIndices; - expectedSubSliceIndices.reserve(64u); - for (auto i = 0u; i < hwInfo.gtSystemInfo.MaxSubSlicesSupported; i++) { - expectedSubSliceIndices.emplace_back(i); - } - - ASSERT_EQ(expectedSubSliceIndices.size(), topologyMap[tileId].subsliceIndices.size()); - ASSERT_TRUE(topologyMap[tileId].subsliceIndices.size() > 0); - - for (auto i = 0u; i < expectedSubSliceIndices.size(); i++) { - EXPECT_EQ(expectedSubSliceIndices[i], topologyMap[tileId].subsliceIndices[i]); - } + EXPECT_EQ(0u, topologyMap[tileId].subsliceIndices.size()); } TEST(IoctlHelperXeTest, givenOnlyMediaTypeWhenGetTopologyDataAndMapThenSubsliceIndicesNotSet) { @@ -881,10 +873,10 @@ TEST(IoctlHelperXeTest, givenOnlyMediaTypeWhenGetTopologyDataAndMapThenSubsliceI // verify topology data EXPECT_EQ(0, topologyData.sliceCount); - EXPECT_EQ(0, topologyData.maxSlices); + EXPECT_EQ(static_cast(hwInfo.gtSystemInfo.MaxSlicesSupported), topologyData.maxSlices); EXPECT_EQ(0, topologyData.subSliceCount); - EXPECT_EQ(0, topologyData.maxSubSlicesPerSlice); + EXPECT_EQ(static_cast(hwInfo.gtSystemInfo.MaxSubSlicesSupported / topologyData.maxSlices), topologyData.maxSubSlicesPerSlice); EXPECT_EQ(0, topologyData.euCount); EXPECT_EQ(0, topologyData.maxEusPerSubSlice); @@ -951,6 +943,7 @@ TEST(IoctlHelperXeTest, givenMainAndMediaTypesWhenGetTopologyDataAndMapThenResul DrmQueryTopologyData topologyData{}; TopologyMap topologyMap{}; + hwInfo.gtSystemInfo.MaxSlicesSupported = 1; hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); @@ -990,6 +983,7 @@ TEST(IoctlHelperXeTest, given2TileAndComputeDssWhenGetTopologyDataAndMapThenResu DrmQueryTopologyData topologyData{}; TopologyMap topologyMap{}; + hwInfo.gtSystemInfo.MaxSlicesSupported = 1; hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); ASSERT_TRUE(result); @@ -1051,6 +1045,7 @@ TEST(IoctlHelperXeTest, given2TileWithDisabledDssOn1TileAndComputeDssWhenGetTopo DrmQueryTopologyData topologyData{}; TopologyMap topologyMap{}; + hwInfo.gtSystemInfo.MaxSlicesSupported = 1; hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); ASSERT_TRUE(result); @@ -1117,6 +1112,7 @@ TEST(IoctlHelperXeTest, given2TileWithDisabledEvenDssAndComputeDssWhenGetTopolog DrmQueryTopologyData topologyData{}; TopologyMap topologyMap{}; + hwInfo.gtSystemInfo.MaxSlicesSupported = 1; hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); ASSERT_TRUE(result); @@ -1126,7 +1122,7 @@ TEST(IoctlHelperXeTest, given2TileWithDisabledEvenDssAndComputeDssWhenGetTopolog EXPECT_EQ(1, topologyData.maxSlices); EXPECT_EQ(32, topologyData.subSliceCount); - EXPECT_EQ(32, topologyData.maxSubSlicesPerSlice); + EXPECT_EQ(64, topologyData.maxSubSlicesPerSlice); EXPECT_EQ(256, topologyData.euCount); EXPECT_EQ(8, topologyData.maxEusPerSubSlice); @@ -1207,7 +1203,8 @@ TEST(IoctlHelperXeTest, givenMissingEuPerDssInTopologyWhenGetTopologyDataAndMapT drm->addMockedQueryTopologyData(tileIdToGtId[tileId], DRM_XE_TOPO_DSS_GEOMETRY, 8, {0, 0, 0, 0, 0, 0, 0, 0}); drm->addMockedQueryTopologyData(tileIdToGtId[tileId], DRM_XE_TOPO_DSS_COMPUTE, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0}); } - hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64; + hwInfo.gtSystemInfo.MaxSlicesSupported = 1; + hwInfo.gtSystemInfo.MaxSubSlicesSupported = 16; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); EXPECT_TRUE(result);