From cc914ffde32fc181881b6a8ec854f12b053bf740 Mon Sep 17 00:00:00 2001 From: Mateusz Hoppe Date: Fri, 7 May 2021 15:29:28 +0000 Subject: [PATCH] Save topology - slice mapping Related-To: NEO-5640 Signed-off-by: Mateusz Hoppe --- shared/source/os_interface/linux/drm_neo.cpp | 23 ++++++++++++++----- shared/source/os_interface/linux/drm_neo.h | 9 +++++++- .../os_interface/linux/drm_query_extended.cpp | 6 ++++- .../os_interface/linux/drm_query_tests.cpp | 22 ++++++++++++++++++ 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 8dbb2d5f2d..5cf4333bd9 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -521,11 +521,11 @@ uint32_t Drm::getVirtualMemoryAddressSpace(uint32_t vmId) { return 0; } -bool Drm::translateTopologyInfo(const drm_i915_query_topology_info *queryTopologyInfo, int &sliceCount, int &subSliceCount, int &euCount, int &maxSliceCount) { - sliceCount = 0; - subSliceCount = 0; - euCount = 0; - maxSliceCount = queryTopologyInfo->max_slices; +bool Drm::translateTopologyInfo(const drm_i915_query_topology_info *queryTopologyInfo, QueryTopologyData &data, TopologyMapping &mapping) { + int sliceCount = 0; + int subSliceCount = 0; + int euCount = 0; + int maxSliceCount = queryTopologyInfo->max_slices; std::vector sliceIndices; sliceIndices.reserve(maxSliceCount); @@ -556,8 +556,15 @@ bool Drm::translateTopologyInfo(const drm_i915_query_topology_info *queryTopolog if (sliceIndices.size()) { maxSliceCount = sliceIndices[sliceIndices.size() - 1] + 1; + mapping.sliceIndices = std::move(sliceIndices); } - return (sliceCount && subSliceCount && euCount); + + data.sliceCount = sliceCount; + data.subSliceCount = subSliceCount; + data.euCount = euCount; + data.maxSliceCount = maxSliceCount; + + return (data.sliceCount && data.subSliceCount && data.euCount); } Drm::~Drm() { @@ -582,4 +589,8 @@ ADAPTER_BDF Drm::getAdapterBDF() const { return adapterBDF; } +const std::vector &Drm::getSliceMappings(uint32_t deviceIndex) { + return topologyMap[deviceIndex].sliceIndices; +} + } // namespace NEO diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index f18e4eb93a..2f0d529190 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -190,9 +190,14 @@ class Drm { void setNewResourceBound(bool value) { this->newResourceBound = value; }; bool getNewResourceBound() { return this->newResourceBound; }; + const std::vector &getSliceMappings(uint32_t deviceIndex); + protected: + struct TopologyMapping { + std::vector sliceIndices; + }; int getQueueSliceCount(drm_i915_gem_context_param_sseu *sseu); - bool translateTopologyInfo(const drm_i915_query_topology_info *queryTopologyInfo, int &sliceCount, int &subSliceCount, int &euCount, int &maxSliceCount); + bool translateTopologyInfo(const drm_i915_query_topology_info *queryTopologyInfo, QueryTopologyData &data, TopologyMapping &mapping); std::string generateUUID(); std::string generateElfUUID(const void *data); bool sliceCountChangeSupported = false; @@ -222,6 +227,8 @@ class Drm { std::array pagingFence; std::array fenceVal; + std::unordered_map topologyMap; + std::string getSysFsPciPath(); std::unique_ptr query(uint32_t queryId, uint32_t queryItemFlags, int32_t &length); diff --git a/shared/source/os_interface/linux/drm_query_extended.cpp b/shared/source/os_interface/linux/drm_query_extended.cpp index e65094a7ba..5894e3db7c 100644 --- a/shared/source/os_interface/linux/drm_query_extended.cpp +++ b/shared/source/os_interface/linux/drm_query_extended.cpp @@ -23,7 +23,11 @@ bool Drm::queryTopology(const HardwareInfo &hwInfo, QueryTopologyData &topologyD topologyData.maxSliceCount = data->max_slices; topologyData.maxSubSliceCount = data->max_subslices; topologyData.maxEuCount = data->max_eus_per_subslice; - return translateTopologyInfo(data, topologyData.sliceCount, topologyData.subSliceCount, topologyData.euCount, topologyData.maxSliceCount); + + TopologyMapping mapping; + auto result = translateTopologyInfo(data, topologyData, mapping); + this->topologyMap[0] = mapping; + return result; } bool Drm::isDebugAttachAvailable() { diff --git a/shared/test/unit_test/os_interface/linux/drm_query_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_query_tests.cpp index e2f734fd7a..279e1bec67 100644 --- a/shared/test/unit_test/os_interface/linux/drm_query_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_query_tests.cpp @@ -67,6 +67,28 @@ TEST(DrmQueryTest, GivenDrmWhenQueryingTopologyInfoCorrectMaxValuesAreSet) { EXPECT_EQ(drm.StoredEUVal / drm.StoredSSVal, topologyData.maxEuCount); } +TEST(DrmQueryTest, givenDrmWhenGettingSliceMappingsThenCorrectMappingReturned) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + + *executionEnvironment->rootDeviceEnvironments[0]->getMutableHardwareInfo() = *NEO::defaultHwInfo.get(); + DrmMock drmMock{*executionEnvironment->rootDeviceEnvironments[0]}; + + Drm::QueryTopologyData topologyData = {}; + + EXPECT_TRUE(drmMock.queryTopology(*executionEnvironment->rootDeviceEnvironments[0]->getHardwareInfo(), topologyData)); + + auto device0SliceMapping = drmMock.getSliceMappings(0); + auto device1SliceMapping = drmMock.getSliceMappings(1); + + ASSERT_EQ(static_cast(topologyData.maxSliceCount), device0SliceMapping.size()); + EXPECT_EQ(0u, device1SliceMapping.size()); + + for (int i = 0; i < topologyData.maxSliceCount; i++) { + EXPECT_EQ(i, device0SliceMapping[i]); + } +} + using HwConfigTopologyQuery = ::testing::Test; HWTEST2_F(HwConfigTopologyQuery, WhenGettingTopologyFailsThenSetMaxValuesBasedOnSubsliceIoctlQuery, MatchAny) {