From 5b6acb4f3f5e446387705af51d780d816b2287a0 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Mon, 15 Apr 2024 10:58:47 +0000 Subject: [PATCH] fix: ignore unrecognized topology type in xe path Related-To: NEO-11125 Signed-off-by: Mateusz Jablonski --- .../os_interface/linux/xe/ioctl_helper_xe.cpp | 8 ++- .../linux/xe/ioctl_helper_xe_tests.cpp | 68 ++++++++++++++++++- 2 files changed, 72 insertions(+), 4 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 29bfb401f6..5350df3274 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -428,6 +428,8 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo geomDss.resize(numTiles); computeDss.resize(numTiles); euDss.resize(numTiles); + bool receivedDssInfo = false; + bool receivedEuPerDssInfo = false; while (topologySize >= sizeof(drm_xe_query_topology_mask)) { drm_xe_query_topology_mask *topo = reinterpret_cast(dataPtr); UNRECOVERABLE_IF(topo == nullptr); @@ -439,16 +441,18 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo switch (topo->type) { case DRM_XE_TOPO_DSS_GEOMETRY: fillMask(geomDss[tileId], topo); + receivedDssInfo = true; break; case DRM_XE_TOPO_DSS_COMPUTE: fillMask(computeDss[tileId], topo); + receivedDssInfo = true; break; case DRM_XE_TOPO_EU_PER_DSS: fillMask(euDss[tileId], topo); + receivedEuPerDssInfo = true; break; default: xeLog("Unhandle GT Topo type: %d\n", topo->type); - return false; } } @@ -463,7 +467,7 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo auto &dssInfo = isComputeDssEmpty ? geomDss : computeDss; getTopologyMap(numTiles, dssInfo.begin(), topologyMap); - return true; + return receivedDssInfo && receivedEuPerDssInfo; } void IoctlHelperXe::updateBindInfo(uint32_t handle, uint64_t userPtr, uint64_t size) { 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 6d7bd758d3..fc68fee8e0 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 @@ -733,6 +733,57 @@ TEST(IoctlHelperXeTest, givenGeomDssWhenGetTopologyDataAndMapThenResultsAreCorre } } +TEST(IoctlHelperXeTest, givenUnknownTopologyTypeWhenGetTopologyDataAndMapThenNotRecognizedTopologyIsIgnored) { + + auto executionEnvironment = std::make_unique(); + DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]}; + auto &hwInfo = *executionEnvironment->rootDeviceEnvironments[0]->getHardwareInfo(); + auto xeIoctlHelper = std::make_unique(drm); + xeIoctlHelper->initialize(); + + constexpr int16_t unknownTopology = -1; + + uint16_t tileId = 0; + for (auto gtId = 0u; gtId < 3u; gtId++) { + drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0b11'1111, 0, 0, 0, 0, 0, 0, 0}); + drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0, 0, 0, 0, 0, 0, 0, 0}); + drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_EU_PER_DSS, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0}); + drm.addMockedQueryTopologyData(gtId, unknownTopology, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0}); + } + DrmQueryTopologyData topologyData{}; + TopologyMap topologyMap{}; + + auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); + ASSERT_TRUE(result); + + // verify topology data + EXPECT_EQ(1, topologyData.sliceCount); + EXPECT_EQ(1, topologyData.maxSliceCount); + + EXPECT_EQ(6, topologyData.subSliceCount); + EXPECT_EQ(6, topologyData.maxSubSliceCount); + + EXPECT_EQ(96, topologyData.euCount); + EXPECT_EQ(16, topologyData.maxEuPerSubSlice); + + // verify topology map + std::vector expectedSliceIndices{0}; + ASSERT_EQ(expectedSliceIndices.size(), topologyMap[tileId].sliceIndices.size()); + ASSERT_TRUE(topologyMap[tileId].sliceIndices.size() > 0); + + for (auto i = 0u; i < expectedSliceIndices.size(); i++) { + EXPECT_EQ(expectedSliceIndices[i], topologyMap[tileId].sliceIndices[i]); + } + + std::vector expectedSubSliceIndices{0, 1, 2, 3, 4, 5}; + 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]); + } +} + TEST(IoctlHelperXeTest, givenComputeDssWhenGetTopologyDataAndMapThenResultsAreCorrect) { auto executionEnvironment = std::make_unique(); @@ -817,7 +868,7 @@ TEST(IoctlHelperXeTest, givenOnlyMediaTypeWhenGetTopologyDataAndMapThenSubsliceI TopologyMap topologyMap{}; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); - ASSERT_TRUE(result); + EXPECT_FALSE(result); // verify topology data EXPECT_EQ(1, topologyData.sliceCount); @@ -1144,7 +1195,7 @@ TEST(IoctlHelperXeTest, given2TileWithDisabledEvenDssAndComputeDssWhenGetTopolog } } -TEST(IoctlHelperXeTest, givenInvalidTypeFlagGetTopologyDataAndMapThenReturnFalse) { +TEST(IoctlHelperXeTest, givenMissingSupportedTopologiesWhenGetTopologyDataAndMapThenReturnFalse) { auto executionEnvironment = std::make_unique(); DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]}; @@ -1158,12 +1209,25 @@ TEST(IoctlHelperXeTest, givenInvalidTypeFlagGetTopologyDataAndMapThenReturnFalse drm.addMockedQueryTopologyData(tileId, incorrectFlagType, 8, {0b11'1111, 0, 0, 0, 0, 0, 0, 0}); drm.addMockedQueryTopologyData(tileId, incorrectFlagType, 8, {0, 0, 0, 0, 0, 0, 0, 0}); drm.addMockedQueryTopologyData(tileId, incorrectFlagType, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0}); + drm.addMockedQueryTopologyData(tileId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0, 0, 0, 0, 0, 0, 0, 0}); DrmQueryTopologyData topologyData{}; TopologyMap topologyMap{}; auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); EXPECT_FALSE(result); + + drm.addMockedQueryTopologyData(tileId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0, 0, 0, 0, 0, 0, 0, 0}); + result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); + EXPECT_FALSE(result); + drm.addMockedQueryTopologyData(tileId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0}); + result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); + EXPECT_FALSE(result); + + drm.queryTopology.clear(); + drm.addMockedQueryTopologyData(tileId, DRM_XE_TOPO_EU_PER_DSS, 4, {0b1111'1111, 0, 0, 0}); + result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap); + EXPECT_FALSE(result); } TEST(IoctlHelperXeTest, whenCreatingEngineInfoThenProperEnginesAreDiscovered) {