feature: handle DRM_XE_TOPO_SIMD16_EU_PER_DSS in xe non-prelim path

Related-To: NEO-12012
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski 2024-11-18 12:22:18 +00:00 committed by Compute-Runtime-Automation
parent 3898bc1f3f
commit b46525f556
8 changed files with 46 additions and 154 deletions

View File

@ -27,7 +27,6 @@ endif()
if(NEO_ENABLE_XE_PRELIM_DETECTION)
list(APPEND NEO_CORE_OS_INTERFACE_LINUX_XE
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe_prelim.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe_prelim.h
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}create_ioctl_helper_xe_prelim.cpp
)

View File

@ -489,12 +489,12 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo
case DRM_XE_TOPO_L3_BANK:
fillMask(l3Banks[tileId], topo);
break;
case DRM_XE_TOPO_EU_PER_DSS:
case DRM_XE_TOPO_SIMD16_EU_PER_DSS:
fillMask(euDss[tileId], topo);
break;
default:
if (isEuPerDssTopologyType(topo->type)) {
fillMask(euDss[tileId], topo);
} else {
xeLog("Unhandle GT Topo type: %d\n", topo->type);
}
xeLog("Unhandle GT Topo type: %d\n", topo->type);
}
}
@ -1732,7 +1732,4 @@ void IoctlHelperXe::querySupportedFeatures() {
};
supportedFeatures.flags.pageFault = checkVmCreateFlagsSupport(DRM_XE_VM_CREATE_FLAG_LR_MODE | DRM_XE_VM_CREATE_FLAG_FAULT_MODE);
};
bool IoctlHelperXe::isEuPerDssTopologyType(uint16_t topologyType) const {
return topologyType == DRM_XE_TOPO_EU_PER_DSS;
}
} // namespace NEO

View File

@ -132,7 +132,6 @@ class IoctlHelperXe : public IoctlHelper {
void registerBOBindHandle(Drm *drm, DrmAllocation *drmAllocation) override;
bool resourceRegistrationEnabled() override { return true; }
bool isPreemptionSupported() override { return true; }
virtual bool isEuPerDssTopologyType(uint16_t topologyType) const;
protected:
static constexpr uint32_t maxContextSetProperties = 4;

View File

@ -1,18 +0,0 @@
/*
* Copyright (C) 2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/xe/ioctl_helper_xe_prelim.h"
#include "shared/source/os_interface/linux/xe/xedrm_prelim.h"
namespace NEO {
bool IoctlHelperXePrelim::isEuPerDssTopologyType(uint16_t topologyType) const {
return topologyType == DRM_XE_TOPO_EU_PER_DSS ||
topologyType == DRM_XE_TOPO_SIMD16_EU_PER_DSS;
}
} // namespace NEO

View File

@ -13,7 +13,6 @@ namespace NEO {
class IoctlHelperXePrelim : public IoctlHelperXe {
public:
using IoctlHelperXe::IoctlHelperXe;
bool isEuPerDssTopologyType(uint16_t topologyType) const override;
};
} // namespace NEO

View File

@ -15,12 +15,6 @@ if(NEO_ENABLE_XE_EU_DEBUG_SUPPORT)
)
endif()
if(NEO_ENABLE_XE_PRELIM_DETECTION)
list(APPEND NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe_prelim_tests.cpp
)
endif()
set_property(GLOBAL APPEND PROPERTY NEO_CORE_OS_INTERFACE_TESTS_LINUX ${NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE})
if(UNIX)

View File

@ -1,24 +0,0 @@
/*
* Copyright (C) 2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/drm_neo.h"
#include "shared/source/os_interface/linux/xe/ioctl_helper_xe_prelim.h"
#include "shared/source/os_interface/linux/xe/xedrm_prelim.h"
#include "shared/test/common/mocks/mock_execution_environment.h"
#include "shared/test/common/test_macros/test.h"
using namespace NEO;
TEST(IoctlHelperXePrelimTest, givenSimd16EuPerDssTypeWhenCheckingIfTopologyIsEuPerDssThenSuccessIsReturned) {
MockExecutionEnvironment executionEnvironment{};
std::unique_ptr<Drm> drm{Drm::create(std::make_unique<HwDeviceIdDrm>(0, ""), *executionEnvironment.rootDeviceEnvironments[0])};
IoctlHelperXePrelim ioctlHelper{*drm};
EXPECT_TRUE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_SIMD16_EU_PER_DSS));
EXPECT_TRUE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_EU_PER_DSS));
EXPECT_FALSE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_DSS_GEOMETRY));
EXPECT_FALSE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_DSS_COMPUTE));
}

View File

@ -744,57 +744,6 @@ TEST(IoctlHelperXeTest, whenCallingIoctlThenProperValueIsReturned) {
drm->reset();
}
TEST(IoctlHelperXeTest, givenGeomDssWhenGetTopologyDataAndMapThenResultsAreCorrect) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXe *>(drm->getIoctlHelper());
auto &hwInfo = *executionEnvironment->rootDeviceEnvironments[0]->getMutableHardwareInfo();
xeIoctlHelper->initialize();
uint16_t tileId = 0;
for (auto gtId = 0u; gtId < 4u; 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});
}
DrmQueryTopologyData topologyData{};
TopologyMap topologyMap{};
hwInfo.gtSystemInfo.MaxSlicesSupported = 1;
hwInfo.gtSystemInfo.MaxSubSlicesSupported = 6;
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(6, topologyData.subSliceCount);
EXPECT_EQ(6, topologyData.maxSubSlicesPerSlice);
EXPECT_EQ(96, topologyData.euCount);
EXPECT_EQ(16, topologyData.maxEusPerSubSlice);
// 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, givenUnknownTopologyTypeWhenGetTopologyDataAndMapThenNotRecognizedTopologyIsIgnored) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
@ -848,7 +797,7 @@ TEST(IoctlHelperXeTest, givenUnknownTopologyTypeWhenGetTopologyDataAndMapThenNot
}
}
TEST(IoctlHelperXeTest, givenComputeDssWhenGetTopologyDataAndMapThenResultsAreCorrect) {
TEST(IoctlHelperXeTest, givenVariousDssConfigInputsWhenGetTopologyDataAndMapThenResultsAreCorrect) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
@ -856,41 +805,47 @@ TEST(IoctlHelperXeTest, givenComputeDssWhenGetTopologyDataAndMapThenResultsAreCo
auto &hwInfo = *executionEnvironment->rootDeviceEnvironments[0]->getMutableHardwareInfo();
xeIoctlHelper->initialize();
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, {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});
for (auto &dssConfigType : {DRM_XE_TOPO_DSS_GEOMETRY, DRM_XE_TOPO_DSS_COMPUTE}) {
for (auto &euPerDssConfigType : {DRM_XE_TOPO_EU_PER_DSS, DRM_XE_TOPO_SIMD16_EU_PER_DSS}) {
drm->queryTopology.clear();
uint16_t tileId = 0;
for (auto gtId = 0u; gtId < 4u; gtId++) {
drm->addMockedQueryTopologyData(gtId, dssConfigType, 8, {0x0fu, 0xff, 0u, 0xff, 0u, 0u, 0xff, 0xff});
drm->addMockedQueryTopologyData(gtId, euPerDssConfigType, 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(3, topologyData.sliceCount);
EXPECT_EQ(4, topologyData.maxSlices);
EXPECT_EQ(20, topologyData.subSliceCount);
EXPECT_EQ(8, topologyData.maxSubSlicesPerSlice);
EXPECT_EQ(160, topologyData.euCount);
EXPECT_EQ(8, topologyData.maxEusPerSubSlice);
// verify topology map
std::vector<int> expectedSliceIndices = {0, 1, 3};
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]);
}
EXPECT_EQ(0u, topologyMap[tileId].subsliceIndices.size());
}
}
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(3, topologyData.sliceCount);
EXPECT_EQ(4, topologyData.maxSlices);
EXPECT_EQ(20, topologyData.subSliceCount);
EXPECT_EQ(8, topologyData.maxSubSlicesPerSlice);
EXPECT_EQ(160, topologyData.euCount);
EXPECT_EQ(8, topologyData.maxEusPerSubSlice);
// verify topology map
std::vector<int> expectedSliceIndices = {0, 1, 3};
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]);
}
EXPECT_EQ(0u, topologyMap[tileId].subsliceIndices.size());
}
TEST(IoctlHelperXeTest, givenOnlyMediaTypeWhenGetTopologyDataAndMapThenSubsliceIndicesNotSet) {
@ -2460,15 +2415,6 @@ TEST_F(IoctlHelperXeHwIpVersionTests, WhenSetupIpVersionIsCalledAndIoctlReturnsN
EXPECT_EQ(config, hwInfo.ipVersion.value);
}
TEST(IoctlHelperXeTest, givenCorrectEuPerDssTypeWhenCheckingIfTopologyIsEuPerDssThenSuccessIsReturned) {
MockExecutionEnvironment executionEnvironment{};
std::unique_ptr<Drm> drm{Drm::create(std::make_unique<HwDeviceIdDrm>(0, ""), *executionEnvironment.rootDeviceEnvironments[0])};
IoctlHelperXe ioctlHelper{*drm};
EXPECT_TRUE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_EU_PER_DSS));
EXPECT_FALSE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_DSS_GEOMETRY));
EXPECT_FALSE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_DSS_COMPUTE));
}
TEST(IoctlHelperXeTest, givenIoctlHelperWhenSettingExtContextThenCallExternalIoctlFunction) {
MockExecutionEnvironment executionEnvironment{};
std::unique_ptr<Drm> drm{Drm::create(std::make_unique<HwDeviceIdDrm>(0, ""), *executionEnvironment.rootDeviceEnvironments[0])};