Skip to content

Commit 9b7ac3a

Browse files
fix: correct querying number of slices in xe path
Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent c7db849 commit 9b7ac3a

File tree

2 files changed

+42
-41
lines changed

2 files changed

+42
-41
lines changed

shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,8 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo
505505
int euPerDss = 0;
506506
int l3BankCount = 0;
507507
uint32_t hwMaxSubSliceCount = hwInfo.gtSystemInfo.MaxSubSlicesSupported;
508+
topologyData.maxSlices = hwInfo.gtSystemInfo.MaxSlicesSupported ? hwInfo.gtSystemInfo.MaxSlicesSupported : 1;
509+
topologyData.maxSubSlicesPerSlice = hwMaxSubSliceCount / topologyData.maxSlices;
508510

509511
for (auto tileId = 0u; tileId < numTiles; tileId++) {
510512

@@ -513,29 +515,33 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo
513515
std::vector<int> sliceIndices;
514516
std::vector<int> subSliceIndices;
515517

516-
sliceIndices.push_back(0);
518+
int previouslyEnabledSlice = -1;
517519

518-
for (auto subSliceId = 0u; subSliceId < std::min(hwMaxSubSliceCount, static_cast<uint32_t>(computeDss[tileId].size() * 8)); subSliceId++) {
519-
auto byte = subSliceId / 8;
520-
auto bit = subSliceId & 0b111;
521-
if (computeDss[tileId][byte].test(bit)) {
522-
subSliceIndices.push_back(subSliceId);
523-
subSliceCountPerTile++;
524-
}
525-
}
526-
527-
if (subSliceCountPerTile == 0) {
528-
for (auto subSliceId = 0u; subSliceId < std::min(hwMaxSubSliceCount, static_cast<uint32_t>(geomDss[tileId].size() * 8)); subSliceId++) {
520+
auto processSubSliceInfo = [&](const std::vector<std::bitset<8>> &subSliceInfo) -> void {
521+
for (auto subSliceId = 0u; subSliceId < std::min(hwMaxSubSliceCount, static_cast<uint32_t>(subSliceInfo.size() * 8)); subSliceId++) {
529522
auto byte = subSliceId / 8;
530523
auto bit = subSliceId & 0b111;
531-
if (geomDss[tileId][byte].test(bit)) {
524+
int sliceId = static_cast<int>(subSliceId / topologyData.maxSubSlicesPerSlice);
525+
if (subSliceInfo[byte].test(bit)) {
532526
subSliceIndices.push_back(subSliceId);
533527
subSliceCountPerTile++;
528+
if (sliceId != previouslyEnabledSlice) {
529+
previouslyEnabledSlice = sliceId;
530+
sliceIndices.push_back(sliceId);
531+
}
534532
}
535533
}
534+
};
535+
processSubSliceInfo(computeDss[tileId]);
536+
537+
if (subSliceCountPerTile == 0) {
538+
processSubSliceInfo(geomDss[tileId]);
536539
}
540+
537541
topologyMap[tileId].sliceIndices = std::move(sliceIndices);
538-
topologyMap[tileId].subsliceIndices = std::move(subSliceIndices);
542+
if (topologyMap[tileId].sliceIndices.size() < 2u) {
543+
topologyMap[tileId].subsliceIndices = std::move(subSliceIndices);
544+
}
539545
int sliceCountPerTile = static_cast<int>(topologyMap[tileId].sliceIndices.size());
540546

541547
int euPerDssPerTile = 0;
@@ -555,14 +561,12 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo
555561
l3BankCount = (l3BankCount == 0) ? l3BankCountPerTile : std::min(l3BankCount, l3BankCountPerTile);
556562

557563
// pick max config
558-
topologyData.maxSubSlicesPerSlice = std::max(topologyData.maxSubSlicesPerSlice, subSliceCountPerTile);
559564
topologyData.maxEusPerSubSlice = std::max(topologyData.maxEusPerSubSlice, euPerDssPerTile);
560565
}
561566

562567
topologyData.sliceCount = sliceCount;
563568
topologyData.subSliceCount = subSliceCount;
564569
topologyData.euCount = subSliceCount * euPerDss;
565-
topologyData.maxSlices = sliceCount;
566570
topologyData.numL3Banks = l3BankCount;
567571
return receivedDssInfo;
568572
}

shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,8 @@ TEST(IoctlHelperXeTest, givenGeomDssWhenGetTopologyDataAndMapThenResultsAreCorre
708708
DrmQueryTopologyData topologyData{};
709709
TopologyMap topologyMap{};
710710

711-
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64;
711+
hwInfo.gtSystemInfo.MaxSlicesSupported = 1;
712+
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 6;
712713
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
713714
ASSERT_TRUE(result);
714715

@@ -760,7 +761,8 @@ TEST(IoctlHelperXeTest, givenUnknownTopologyTypeWhenGetTopologyDataAndMapThenNot
760761
DrmQueryTopologyData topologyData{};
761762
TopologyMap topologyMap{};
762763

763-
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64;
764+
hwInfo.gtSystemInfo.MaxSlicesSupported = 1;
765+
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 6;
764766
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
765767
ASSERT_TRUE(result);
766768

@@ -803,48 +805,38 @@ TEST(IoctlHelperXeTest, givenComputeDssWhenGetTopologyDataAndMapThenResultsAreCo
803805
uint16_t tileId = 0;
804806
for (auto gtId = 0u; gtId < 4u; gtId++) {
805807
drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0, 0, 0, 0, 0, 0, 0, 0});
806-
drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff});
808+
drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0x0fu, 0xff, 0u, 0xff, 0u, 0u, 0xff, 0xff});
807809
drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_EU_PER_DSS, 8, {0b1111'1111, 0, 0, 0, 0, 0, 0, 0});
808810
}
809811

810812
DrmQueryTopologyData topologyData{};
811813
TopologyMap topologyMap{};
812814

815+
hwInfo.gtSystemInfo.MaxSlicesSupported = 4u;
813816
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 32u;
814817
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
815818
ASSERT_TRUE(result);
816819

817820
// verify topology data
818-
EXPECT_EQ(1, topologyData.sliceCount);
819-
EXPECT_EQ(1, topologyData.maxSlices);
821+
EXPECT_EQ(3, topologyData.sliceCount);
822+
EXPECT_EQ(4, topologyData.maxSlices);
820823

821-
EXPECT_EQ(32, topologyData.subSliceCount);
822-
EXPECT_EQ(32, topologyData.maxSubSlicesPerSlice);
824+
EXPECT_EQ(20, topologyData.subSliceCount);
825+
EXPECT_EQ(8, topologyData.maxSubSlicesPerSlice);
823826

824-
EXPECT_EQ(256, topologyData.euCount);
827+
EXPECT_EQ(160, topologyData.euCount);
825828
EXPECT_EQ(8, topologyData.maxEusPerSubSlice);
826829

827830
// verify topology map
828-
std::vector<int> expectedSliceIndices = {0};
831+
std::vector<int> expectedSliceIndices = {0, 1, 3};
829832
ASSERT_EQ(expectedSliceIndices.size(), topologyMap[tileId].sliceIndices.size());
830833
ASSERT_TRUE(topologyMap[tileId].sliceIndices.size() > 0);
831834

832835
for (auto i = 0u; i < expectedSliceIndices.size(); i++) {
833836
EXPECT_EQ(expectedSliceIndices[i], topologyMap[tileId].sliceIndices[i]);
834837
}
835838

836-
std::vector<int> expectedSubSliceIndices;
837-
expectedSubSliceIndices.reserve(64u);
838-
for (auto i = 0u; i < hwInfo.gtSystemInfo.MaxSubSlicesSupported; i++) {
839-
expectedSubSliceIndices.emplace_back(i);
840-
}
841-
842-
ASSERT_EQ(expectedSubSliceIndices.size(), topologyMap[tileId].subsliceIndices.size());
843-
ASSERT_TRUE(topologyMap[tileId].subsliceIndices.size() > 0);
844-
845-
for (auto i = 0u; i < expectedSubSliceIndices.size(); i++) {
846-
EXPECT_EQ(expectedSubSliceIndices[i], topologyMap[tileId].subsliceIndices[i]);
847-
}
839+
EXPECT_EQ(0u, topologyMap[tileId].subsliceIndices.size());
848840
}
849841

850842
TEST(IoctlHelperXeTest, givenOnlyMediaTypeWhenGetTopologyDataAndMapThenSubsliceIndicesNotSet) {
@@ -881,10 +873,10 @@ TEST(IoctlHelperXeTest, givenOnlyMediaTypeWhenGetTopologyDataAndMapThenSubsliceI
881873

882874
// verify topology data
883875
EXPECT_EQ(0, topologyData.sliceCount);
884-
EXPECT_EQ(0, topologyData.maxSlices);
876+
EXPECT_EQ(static_cast<int>(hwInfo.gtSystemInfo.MaxSlicesSupported), topologyData.maxSlices);
885877

886878
EXPECT_EQ(0, topologyData.subSliceCount);
887-
EXPECT_EQ(0, topologyData.maxSubSlicesPerSlice);
879+
EXPECT_EQ(static_cast<int>(hwInfo.gtSystemInfo.MaxSubSlicesSupported / topologyData.maxSlices), topologyData.maxSubSlicesPerSlice);
888880

889881
EXPECT_EQ(0, topologyData.euCount);
890882
EXPECT_EQ(0, topologyData.maxEusPerSubSlice);
@@ -951,6 +943,7 @@ TEST(IoctlHelperXeTest, givenMainAndMediaTypesWhenGetTopologyDataAndMapThenResul
951943
DrmQueryTopologyData topologyData{};
952944
TopologyMap topologyMap{};
953945

946+
hwInfo.gtSystemInfo.MaxSlicesSupported = 1;
954947
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64;
955948

956949
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
@@ -990,6 +983,7 @@ TEST(IoctlHelperXeTest, given2TileAndComputeDssWhenGetTopologyDataAndMapThenResu
990983
DrmQueryTopologyData topologyData{};
991984
TopologyMap topologyMap{};
992985

986+
hwInfo.gtSystemInfo.MaxSlicesSupported = 1;
993987
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64;
994988
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
995989
ASSERT_TRUE(result);
@@ -1051,6 +1045,7 @@ TEST(IoctlHelperXeTest, given2TileWithDisabledDssOn1TileAndComputeDssWhenGetTopo
10511045
DrmQueryTopologyData topologyData{};
10521046
TopologyMap topologyMap{};
10531047

1048+
hwInfo.gtSystemInfo.MaxSlicesSupported = 1;
10541049
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64;
10551050
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
10561051
ASSERT_TRUE(result);
@@ -1117,6 +1112,7 @@ TEST(IoctlHelperXeTest, given2TileWithDisabledEvenDssAndComputeDssWhenGetTopolog
11171112
DrmQueryTopologyData topologyData{};
11181113
TopologyMap topologyMap{};
11191114

1115+
hwInfo.gtSystemInfo.MaxSlicesSupported = 1;
11201116
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64;
11211117
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
11221118
ASSERT_TRUE(result);
@@ -1126,7 +1122,7 @@ TEST(IoctlHelperXeTest, given2TileWithDisabledEvenDssAndComputeDssWhenGetTopolog
11261122
EXPECT_EQ(1, topologyData.maxSlices);
11271123

11281124
EXPECT_EQ(32, topologyData.subSliceCount);
1129-
EXPECT_EQ(32, topologyData.maxSubSlicesPerSlice);
1125+
EXPECT_EQ(64, topologyData.maxSubSlicesPerSlice);
11301126

11311127
EXPECT_EQ(256, topologyData.euCount);
11321128
EXPECT_EQ(8, topologyData.maxEusPerSubSlice);
@@ -1207,7 +1203,8 @@ TEST(IoctlHelperXeTest, givenMissingEuPerDssInTopologyWhenGetTopologyDataAndMapT
12071203
drm->addMockedQueryTopologyData(tileIdToGtId[tileId], DRM_XE_TOPO_DSS_GEOMETRY, 8, {0, 0, 0, 0, 0, 0, 0, 0});
12081204
drm->addMockedQueryTopologyData(tileIdToGtId[tileId], DRM_XE_TOPO_DSS_COMPUTE, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0});
12091205
}
1210-
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 64;
1206+
hwInfo.gtSystemInfo.MaxSlicesSupported = 1;
1207+
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 16;
12111208
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
12121209
EXPECT_TRUE(result);
12131210

0 commit comments

Comments
 (0)