fix: ignore unrecognized topology type in xe path

Related-To: NEO-11125
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2024-04-15 10:58:47 +00:00
committed by Compute-Runtime-Automation
parent ff4a919004
commit 5b6acb4f3f
2 changed files with 72 additions and 4 deletions

View File

@@ -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<drm_xe_query_topology_mask *>(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) {

View File

@@ -733,6 +733,57 @@ TEST(IoctlHelperXeTest, givenGeomDssWhenGetTopologyDataAndMapThenResultsAreCorre
}
}
TEST(IoctlHelperXeTest, givenUnknownTopologyTypeWhenGetTopologyDataAndMapThenNotRecognizedTopologyIsIgnored) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto &hwInfo = *executionEnvironment->rootDeviceEnvironments[0]->getHardwareInfo();
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXe>(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<int> 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<int> 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<MockExecutionEnvironment>();
@@ -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<MockExecutionEnvironment>();
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) {