fix: correct hw info setting in drm path

add fallback to get max eu per ss from topology if not available in other way

Related-To: NEO-12073
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2024-07-26 16:46:59 +00:00
committed by Compute-Runtime-Automation
parent a734a738fa
commit 71f4088a1e
3 changed files with 54 additions and 1 deletions

View File

@@ -534,6 +534,10 @@ int Drm::setupHardwareInfo(const DeviceDescriptor *device, bool setupFeatureTabl
hwInfo->gtSystemInfo.SubSliceCount = static_cast<uint32_t>(topologyData.subSliceCount);
hwInfo->gtSystemInfo.DualSubSliceCount = static_cast<uint32_t>(topologyData.subSliceCount);
if (!hwInfo->gtSystemInfo.MaxEuPerSubSlice) {
hwInfo->gtSystemInfo.MaxEuPerSubSlice = topologyData.maxEusPerSubSlice;
}
auto maxEuCount = static_cast<uint32_t>(topologyData.subSliceCount) * hwInfo->gtSystemInfo.MaxEuPerSubSlice;
if (topologyData.euCount == 0 || static_cast<uint32_t>(topologyData.euCount) > maxEuCount) {

View File

@@ -70,7 +70,14 @@ class MockIoctlHelper : public IoctlHelperPrelim20 {
std::unique_ptr<MemoryInfo> memoryInfo = std::make_unique<MemoryInfo>(regionInfo, drm);
return memoryInfo;
}
bool getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTopologyData &topologyData, TopologyMap &topologyMap) override {
topologyData = topologyDataToSet;
topologyMap[0].sliceIndices = topologyMapToSet.sliceIndices;
topologyMap[0].subsliceIndices = topologyMapToSet.subsliceIndices;
return true;
}
DrmQueryTopologyData topologyDataToSet{};
TopologyMapping topologyMapToSet{};
int getDrmParamValueResult = 1234;
uint32_t releaseInterruptCalled = 0;
uint32_t latestReleaseInterruptHandle = InterruptId::notUsed;

View File

@@ -1752,6 +1752,48 @@ TEST(DrmWrapperTest, WhenGettingDrmParamValueStringThenProperStringIsReturned) {
EXPECT_THROW(getDrmParamString(DrmParam::engineClassRender, &ioctlHelper), std::runtime_error);
}
TEST(DrmHwInfoTest, givenTopologyDataWithoutSystemInfoWhenSettingHwInfoThenCorrectValuesAreSet) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};
drm.ioctlHelper = std::make_unique<MockIoctlHelper>(drm);
auto ioctlHelper = static_cast<MockIoctlHelper *>(drm.ioctlHelper.get());
ioctlHelper->topologyDataToSet.sliceCount = 2;
ioctlHelper->topologyDataToSet.subSliceCount = 6;
ioctlHelper->topologyDataToSet.euCount = 12;
ioctlHelper->topologyDataToSet.numL3Banks = 3;
ioctlHelper->topologyDataToSet.maxSlices = 4;
ioctlHelper->topologyDataToSet.maxSubSlicesPerSlice = 4;
ioctlHelper->topologyDataToSet.maxEusPerSubSlice = 9;
ioctlHelper->topologyMapToSet.sliceIndices = {1, 2};
ioctlHelper->topologyMapToSet.subsliceIndices = {};
auto hwInfo = executionEnvironment->rootDeviceEnvironments[0]->getMutableHardwareInfo();
hwInfo->gtSystemInfo = {};
auto setupHardwareInfo = [](HardwareInfo *, bool, const ReleaseHelper *) {};
DeviceDescriptor device = {0, hwInfo, setupHardwareInfo};
drm.systemInfoQueried = true;
EXPECT_EQ(nullptr, drm.systemInfo.get());
drm.setupHardwareInfo(&device, false);
EXPECT_EQ(nullptr, drm.systemInfo.get());
EXPECT_EQ(hwInfo->gtSystemInfo.SliceCount, 2u);
EXPECT_EQ(hwInfo->gtSystemInfo.SubSliceCount, 6u);
EXPECT_EQ(hwInfo->gtSystemInfo.DualSubSliceCount, 6u);
EXPECT_EQ(hwInfo->gtSystemInfo.EUCount, 12u);
EXPECT_EQ(hwInfo->gtSystemInfo.L3BankCount, 3u);
EXPECT_EQ(hwInfo->gtSystemInfo.MaxEuPerSubSlice, 9u);
EXPECT_EQ(hwInfo->gtSystemInfo.MaxSlicesSupported, 2u);
EXPECT_EQ(hwInfo->gtSystemInfo.MaxSubSlicesSupported, 16u);
EXPECT_EQ(hwInfo->gtSystemInfo.MaxDualSubSlicesSupported, 16u);
}
TEST(DrmWrapperTest, givenEAgainOrEIntrOrEBusyWhenCheckingIfReinvokeRequiredThenTrueIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};