From 5ea86b712ff827337c91b7333bfea456c294b479 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Wed, 22 Jun 2022 09:45:44 +0000 Subject: [PATCH] Bind virtual copy engines in optimal sequence Signed-off-by: Lukasz Jobczyk --- shared/source/os_interface/linux/drm_neo.cpp | 18 ++++++++++- shared/source/os_interface/linux/drm_neo.h | 1 + .../linux/drm_engine_info_prelim_tests.cpp | 2 +- .../os_interface/linux/drm_tests.cpp | 30 +++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index ff47f0c7d2..9771eedcac 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -1152,7 +1152,7 @@ unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, au for (auto engineIndex = 0u; engineIndex < engineCount; engineIndex++) { if (useVirtualEnginesForBcs && engine->engineClass == ioctlHelper->getDrmParamValue(DrmParam::EngineClassCopy)) { - auto mappedBcsEngineType = static_cast(EngineHelpers::mapBcsIndexToEngineType(engineIndex, includeMainCopyEngineInGroup)); + auto mappedBcsEngineType = this->getBcsTypeToBind(engineIndex, includeMainCopyEngineInGroup); bool isBcsEnabled = rootDeviceEnvironment.getHardwareInfo()->featureTable.ftrBcsInfo.test(EngineHelpers::getBcsIndex(mappedBcsEngineType)); if (!isBcsEnabled) { @@ -1185,6 +1185,22 @@ unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, au return retVal; } +constexpr std::array optimalBcsSequence = {aub_stream::ENGINE_BCS2, aub_stream::ENGINE_BCS3, + aub_stream::ENGINE_BCS4, aub_stream::ENGINE_BCS7, + aub_stream::ENGINE_BCS1, aub_stream::ENGINE_BCS5, + aub_stream::ENGINE_BCS6, aub_stream::ENGINE_BCS8}; + +aub_stream::EngineType Drm::getBcsTypeToBind(unsigned int engineIndex, bool includeMain) { + if (engineIndex == 0 && includeMain) { + return aub_stream::EngineType::ENGINE_BCS; + } else { + if (includeMain) { + engineIndex--; + } + return optimalBcsSequence[engineIndex]; + } +} + void Drm::waitForBind(uint32_t vmHandleId) { if (pagingFence[vmHandleId] >= fenceVal[vmHandleId]) { return; diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index e8499daff2..1331e4a4f3 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -112,6 +112,7 @@ class Drm : public DriverModel { void setLowPriorityContextParam(uint32_t drmContextId); unsigned int bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType, bool engineInstancedDevice); + aub_stream::EngineType getBcsTypeToBind(unsigned int engineIndex, bool includeMain); MOCKABLE_VIRTUAL int getErrno(); bool setQueueSliceCount(uint64_t sliceCount); diff --git a/shared/test/unit_test/os_interface/linux/drm_engine_info_prelim_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_engine_info_prelim_tests.cpp index 9a05dcf5ed..e5dcbb7932 100644 --- a/shared/test/unit_test/os_interface/linux/drm_engine_info_prelim_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_engine_info_prelim_tests.cpp @@ -193,7 +193,7 @@ static void givenBcsEngineTypeWhenBindingDrmContextThenContextParamEngineIsSet(s EXPECT_EQ(numBcsSiblings, drm->receivedContextEnginesLoadBalance.num_siblings); for (auto balancedEngine = 0u; balancedEngine < numBcsSiblings; balancedEngine++) { EXPECT_EQ(I915_ENGINE_CLASS_COPY, drm->receivedContextEnginesLoadBalance.engines[balancedEngine].engine_class); - auto engineInstance = engineIndex ? balancedEngine + 1 : balancedEngine; + auto engineInstance = EngineHelpers::getBcsIndex(drm->getBcsTypeToBind(balancedEngine, engineIndex == 0)); EXPECT_EQ(engineInstance, DrmMockHelper::getIdFromEngineOrMemoryInstance(drm->receivedContextEnginesLoadBalance.engines[balancedEngine].engine_instance)); EXPECT_EQ(I915_ENGINE_CLASS_COPY, drm->receivedContextParamEngines.engines[1 + balancedEngine].engine_class); EXPECT_EQ(engineInstance, DrmMockHelper::getIdFromEngineOrMemoryInstance(drm->receivedContextParamEngines.engines[1 + balancedEngine].engine_instance)); diff --git a/shared/test/unit_test/os_interface/linux/drm_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_tests.cpp index d54b06addd..4ba6af989d 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -102,6 +102,36 @@ TEST(DrmTest, GivenInvalidPciPathWhenFrequencyIsQueriedThenReturnError) { EXPECT_EQ(0, maxFrequency); } +TEST(DrmTest, whenGetBcsTypeToBindThenReturnOptimalSequence) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]}; + + { + auto includeMain = false; + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS2, drm.getBcsTypeToBind(0, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS3, drm.getBcsTypeToBind(1, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS4, drm.getBcsTypeToBind(2, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS7, drm.getBcsTypeToBind(3, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS1, drm.getBcsTypeToBind(4, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS5, drm.getBcsTypeToBind(5, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS6, drm.getBcsTypeToBind(6, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS8, drm.getBcsTypeToBind(7, includeMain)); + } + { + auto includeMain = true; + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS, drm.getBcsTypeToBind(0, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS2, drm.getBcsTypeToBind(1, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS3, drm.getBcsTypeToBind(2, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS4, drm.getBcsTypeToBind(3, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS7, drm.getBcsTypeToBind(4, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS1, drm.getBcsTypeToBind(5, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS5, drm.getBcsTypeToBind(6, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS6, drm.getBcsTypeToBind(7, includeMain)); + EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS8, drm.getBcsTypeToBind(8, includeMain)); + } +} + TEST(DrmTest, WhenGettingRevisionIdThenCorrectIdIsReturned) { auto executionEnvironment = std::make_unique(); executionEnvironment->prepareRootDeviceEnvironments(1);