From e711aa9bc790e8ded13ea343f8a42813ce408271 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Fri, 23 Dec 2022 11:51:48 +0000 Subject: [PATCH] [PVC] Remove tlb flush from CCS Signed-off-by: Lukasz Jobczyk --- .../direct_submission/linux/drm_direct_submission.inl | 3 ++- shared/source/os_interface/hw_info_config.h | 2 ++ shared/source/os_interface/hw_info_config.inl | 5 +++++ shared/source/os_interface/linux/drm_neo.cpp | 3 ++- .../os_agnostic_hw_info_config_xe_hpc_core.inl | 5 +++++ .../linux/drm_direct_submission_tests.cpp | 10 +++++++--- .../linux/drm_residency_handler_prelim_tests.cpp | 5 +++-- .../xe_hpc_core/pvc/test_hw_info_config_pvc.cpp | 5 +++++ 8 files changed, 31 insertions(+), 7 deletions(-) diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl index 2aa533f9bb..61fa279ff5 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.inl +++ b/shared/source/direct_submission/linux/drm_direct_submission.inl @@ -161,8 +161,9 @@ bool DrmDirectSubmission::handleResidency() { template bool DrmDirectSubmission::isNewResourceHandleNeeded() { + const auto &productHelper = *ProductHelper::get(this->hwInfo->platform.eProductFamily); auto osContextLinux = static_cast(&this->osContext); - auto newResourcesBound = osContextLinux->isTlbFlushRequired(); + auto newResourcesBound = productHelper.isTlbFlushRequired(osContextLinux->getEngineType()) && osContextLinux->isTlbFlushRequired(); if (DebugManager.flags.DirectSubmissionNewResourceTlbFlush.get() != -1) { newResourcesBound = DebugManager.flags.DirectSubmissionNewResourceTlbFlush.get(); diff --git a/shared/source/os_interface/hw_info_config.h b/shared/source/os_interface/hw_info_config.h index da09a8c267..f713494ca5 100644 --- a/shared/source/os_interface/hw_info_config.h +++ b/shared/source/os_interface/hw_info_config.h @@ -150,6 +150,7 @@ class ProductHelper { virtual bool isResolveDependenciesByPipeControlsSupported(const HardwareInfo &hwInfo, bool isOOQ) const = 0; virtual bool isMidThreadPreemptionDisallowedForRayTracingKernels() const = 0; virtual bool isBufferPoolAllocatorSupported() const = 0; + virtual bool isTlbFlushRequired(aub_stream::EngineType engineType) const = 0; virtual bool getFrontEndPropertyScratchSizeSupport() const = 0; virtual bool getFrontEndPropertyPrivateScratchSizeSupport() const = 0; @@ -295,6 +296,7 @@ class ProductHelperHw : public ProductHelper { bool isResolveDependenciesByPipeControlsSupported(const HardwareInfo &hwInfo, bool isOOQ) const override; bool isMidThreadPreemptionDisallowedForRayTracingKernels() const override; bool isBufferPoolAllocatorSupported() const override; + bool isTlbFlushRequired(aub_stream::EngineType engineType) const override; bool getFrontEndPropertyScratchSizeSupport() const override; bool getFrontEndPropertyPrivateScratchSizeSupport() const override; diff --git a/shared/source/os_interface/hw_info_config.inl b/shared/source/os_interface/hw_info_config.inl index 5b77c7d779..f5977ea4ff 100644 --- a/shared/source/os_interface/hw_info_config.inl +++ b/shared/source/os_interface/hw_info_config.inl @@ -50,6 +50,11 @@ void ProductHelperHw::adjustPlatformForProductFamily(HardwareInfo *h template void ProductHelperHw::adjustSamplerState(void *sampler, const HardwareInfo &hwInfo) {} +template +bool ProductHelperHw::isTlbFlushRequired(aub_stream::EngineType engineType) const { + return true; +} + template void ProductHelperHw::enableBlitterOperationsSupport(HardwareInfo *hwInfo) const { hwInfo->capabilityTable.blitterOperationsSupported = obtainBlitterPreference(*hwInfo); diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 6deeab0908..659e4842ee 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -657,9 +657,10 @@ uint32_t Drm::getVirtualMemoryAddressSpace(uint32_t vmId) const { } void Drm::setNewResourceBoundToVM(uint32_t vmHandleId) { + const auto &productHelper = *ProductHelper::get(this->getRootDeviceEnvironment().getHardwareInfo()->platform.eProductFamily); const auto &engines = this->rootDeviceEnvironment.executionEnvironment.memoryManager->getRegisteredEngines(); for (const auto &engine : engines) { - if (engine.osContext->getDeviceBitfield().test(vmHandleId)) { + if (engine.osContext->getDeviceBitfield().test(vmHandleId) && productHelper.isTlbFlushRequired(engine.osContext->getEngineType())) { auto osContextLinux = static_cast(engine.osContext); if (&osContextLinux->getDrm() == this) { diff --git a/shared/source/xe_hpc_core/os_agnostic_hw_info_config_xe_hpc_core.inl b/shared/source/xe_hpc_core/os_agnostic_hw_info_config_xe_hpc_core.inl index de09d8a25a..563f3ecc40 100644 --- a/shared/source/xe_hpc_core/os_agnostic_hw_info_config_xe_hpc_core.inl +++ b/shared/source/xe_hpc_core/os_agnostic_hw_info_config_xe_hpc_core.inl @@ -43,6 +43,11 @@ std::pair ProductHelperHw::isPipeControlPriorToNonPipeli return {isBasicWARequired, isExtendedWARequired}; } +template <> +bool ProductHelperHw::isTlbFlushRequired(aub_stream::EngineType engineType) const { + return EngineHelpers::isBcs(engineType); +} + template <> void ProductHelperHw::adjustSamplerState(void *sampler, const HardwareInfo &hwInfo) { using SAMPLER_STATE = typename XeHpcCoreFamily::SAMPLER_STATE; diff --git a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp index 7d15f2d7df..fc8a0c0d8a 100644 --- a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp @@ -566,6 +566,7 @@ HWTEST_F(DrmDirectSubmissionTest, givenNewResourceBoundWhenDispatchCommandBuffer DebugManagerStateRestore restorer; DebugManager.flags.DirectSubmissionNewResourceTlbFlush.set(-1); + const auto &productHelper = *ProductHelper::get(device->getHardwareInfo().platform.eProductFamily); MockDrmDirectSubmission directSubmission(*device->getDefaultEngine().commandStreamReceiver); @@ -584,9 +585,12 @@ HWTEST_F(DrmDirectSubmissionTest, givenNewResourceBoundWhenDispatchCommandBuffer hwParse.parseCommands(directSubmission.ringCommandStream, 0); hwParse.findHardwareCommands(); auto *pipeControl = hwParse.getCommand(); - EXPECT_TRUE(pipeControl->getTlbInvalidate()); - EXPECT_TRUE(pipeControl->getTextureCacheInvalidationEnable()); - EXPECT_FALSE(osContext->isTlbFlushRequired()); + if (productHelper.isTlbFlushRequired(osContext->getEngineType())) { + auto *pipeControl = hwParse.getCommand(); + EXPECT_TRUE(pipeControl->getTlbInvalidate()); + } else { + EXPECT_EQ(pipeControl, nullptr); + } EXPECT_EQ(directSubmission.getSizeNewResourceHandler(), sizeof(PIPE_CONTROL)); } diff --git a/shared/test/unit_test/os_interface/linux/drm_residency_handler_prelim_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_residency_handler_prelim_tests.cpp index c2c7a45e75..552d3a72e5 100644 --- a/shared/test/unit_test/os_interface/linux/drm_residency_handler_prelim_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_residency_handler_prelim_tests.cpp @@ -116,12 +116,13 @@ TEST_F(DrmMemoryOperationsHandlerBindMultiRootDeviceTest, whenSetNewResourceBoun struct MockOsContextLinux : OsContextLinux { using OsContextLinux::lastFlushedTlbFlushCounter; }; + const auto &productHelper = *ProductHelper::get(executionEnvironment->rootDeviceEnvironments[0]->getHardwareInfo()->platform.eProductFamily); mock->setNewResourceBoundToVM(1u); for (const auto &engine : device->getAllEngines()) { auto osContexLinux = static_cast(engine.osContext); - if (osContexLinux->getDeviceBitfield().test(1u)) { + if (osContexLinux->getDeviceBitfield().test(1u) && productHelper.isTlbFlushRequired(osContexLinux->getEngineType())) { EXPECT_TRUE(osContexLinux->isTlbFlushRequired()); } else { EXPECT_FALSE(osContexLinux->isTlbFlushRequired()); @@ -139,7 +140,7 @@ TEST_F(DrmMemoryOperationsHandlerBindMultiRootDeviceTest, whenSetNewResourceBoun for (const auto &engine : devices[1]->getAllEngines()) { auto osContexLinux = static_cast(engine.osContext); - if (osContexLinux->getDeviceBitfield().test(0u)) { + if (osContexLinux->getDeviceBitfield().test(0u) && productHelper.isTlbFlushRequired(osContexLinux->getEngineType())) { EXPECT_TRUE(osContexLinux->isTlbFlushRequired()); } else { EXPECT_FALSE(osContexLinux->isTlbFlushRequired()); diff --git a/shared/test/unit_test/xe_hpc_core/pvc/test_hw_info_config_pvc.cpp b/shared/test/unit_test/xe_hpc_core/pvc/test_hw_info_config_pvc.cpp index 729fb0957c..1189dbf21b 100644 --- a/shared/test/unit_test/xe_hpc_core/pvc/test_hw_info_config_pvc.cpp +++ b/shared/test/unit_test/xe_hpc_core/pvc/test_hw_info_config_pvc.cpp @@ -27,6 +27,11 @@ PVCTEST_F(PvcProductHelper, whenGettingAubstreamProductFamilyThenProperEnumValue EXPECT_EQ(aub_stream::ProductFamily::Pvc, productHelper->getAubStreamProductFamily()); } +PVCTEST_F(PvcProductHelper, whenCheckIsTlbFlushRequiredThenReturnProperValue) { + EXPECT_TRUE(productHelper->isTlbFlushRequired(aub_stream::EngineType::ENGINE_BCS2)); + EXPECT_FALSE(productHelper->isTlbFlushRequired(aub_stream::EngineType::ENGINE_CCS1)); +} + PVCTEST_F(PvcProductHelper, givenPVCRevId3AndAboveWhenGettingThreadEuRatioForScratchThen16IsReturned) { auto hwInfo = *defaultHwInfo; hwInfo.platform.usRevId = 3;