diff --git a/shared/source/command_container/cmdcontainer.cpp b/shared/source/command_container/cmdcontainer.cpp index 0c4abc5171..3814dad31c 100644 --- a/shared/source/command_container/cmdcontainer.cpp +++ b/shared/source/command_container/cmdcontainer.cpp @@ -570,6 +570,9 @@ void CommandContainer::storeAllocationAndFlushTagUpdate(GraphicsAllocation *allo } else { getHeapHelper()->storeHeapAllocation(allocation); } + if (device->getProductHelper().isDcFlushMitigated()) { + this->immediateCmdListCsr->registerDcFlushForDcMitigation(); + } this->immediateCmdListCsr->flushTagUpdate(); } diff --git a/shared/source/command_stream/command_stream_receiver.cpp b/shared/source/command_stream/command_stream_receiver.cpp index badfed4866..0123702e42 100644 --- a/shared/source/command_stream/command_stream_receiver.cpp +++ b/shared/source/command_stream/command_stream_receiver.cpp @@ -689,6 +689,10 @@ IndirectHeap &CommandStreamReceiver::getIndirectHeap(IndirectHeap::Type heapType internalAllocationStorage->storeAllocation(std::unique_ptr(heapMemory), REUSABLE_ALLOCATION); heapMemory = nullptr; this->heapStorageRequiresRecyclingTag = true; + + if (this->peekRootDeviceEnvironment().getProductHelper().isDcFlushMitigated()) { + this->registerDcFlushForDcMitigation(); + } } if (!heapMemory) { diff --git a/shared/source/gmm_helper/cache_settings_helper.cpp b/shared/source/gmm_helper/cache_settings_helper.cpp index 0bd0efbe11..41104030dc 100644 --- a/shared/source/gmm_helper/cache_settings_helper.cpp +++ b/shared/source/gmm_helper/cache_settings_helper.cpp @@ -47,7 +47,7 @@ bool CacheSettingsHelper::preferNoCpuAccess(GMM_RESOURCE_USAGE_TYPE_ENUM gmmReso } GMM_RESOURCE_USAGE_TYPE_ENUM CacheSettingsHelper::getDefaultUsageTypeWithCachingEnabled(AllocationType allocationType, const ProductHelper &productHelper) { - if (productHelper.overridePatAndUsageForDcFlushMitigation(allocationType)) { + if (productHelper.overrideUsageForDcFlushMitigation(allocationType)) { return getDefaultUsageTypeWithCachingDisabled(allocationType, productHelper); } diff --git a/shared/source/os_interface/product_helper.h b/shared/source/os_interface/product_helper.h index 00dd82d8a5..0f67b87a60 100644 --- a/shared/source/os_interface/product_helper.h +++ b/shared/source/os_interface/product_helper.h @@ -135,7 +135,9 @@ class ProductHelper { virtual bool isDcFlushAllowed() const = 0; virtual bool isDcFlushMitigated() const = 0; virtual bool mitigateDcFlush() const = 0; - virtual bool overridePatAndUsageForDcFlushMitigation(AllocationType allocationType) const = 0; + virtual bool overrideUsageForDcFlushMitigation(AllocationType allocationType) const = 0; + virtual bool overridePatToUCAndTwoWayCohForDcFlushMitigation(AllocationType allocationType) const = 0; + virtual bool overridePatToUCAndOneWayCohForDcFlushMitigation(AllocationType allocationType) const = 0; virtual bool overrideCacheableForDcFlushMitigation(AllocationType allocationType) const = 0; virtual uint32_t computeMaxNeededSubSliceSpace(const HardwareInfo &hwInfo) const = 0; virtual bool getUuid(NEO::DriverModel *driverModel, const uint32_t subDeviceCount, const uint32_t deviceIndex, std::array &uuid) const = 0; diff --git a/shared/source/os_interface/product_helper.inl b/shared/source/os_interface/product_helper.inl index 6435fae1b5..e04977ae57 100644 --- a/shared/source/os_interface/product_helper.inl +++ b/shared/source/os_interface/product_helper.inl @@ -416,7 +416,12 @@ bool ProductHelperHw::isDcFlushMitigated() const { } template -bool ProductHelperHw::overridePatAndUsageForDcFlushMitigation(AllocationType allocationType) const { +bool ProductHelperHw::overrideUsageForDcFlushMitigation(AllocationType allocationType) const { + return this->isDcFlushMitigated() && (this->overridePatToUCAndTwoWayCohForDcFlushMitigation(allocationType) || overridePatToUCAndOneWayCohForDcFlushMitigation(allocationType)); +} + +template +bool ProductHelperHw::overridePatToUCAndTwoWayCohForDcFlushMitigation(AllocationType allocationType) const { return this->isDcFlushMitigated() && (this->overrideCacheableForDcFlushMitigation(allocationType) || allocationType == AllocationType::timestampPacketTagBuffer || @@ -424,6 +429,13 @@ bool ProductHelperHw::overridePatAndUsageForDcFlushMitigation(Alloca allocationType == AllocationType::gpuTimestampDeviceBuffer); } +template +bool ProductHelperHw::overridePatToUCAndOneWayCohForDcFlushMitigation(AllocationType allocationType) const { + return this->isDcFlushMitigated() && + (allocationType == AllocationType::internalHeap || + allocationType == AllocationType::linearStream); +} + template bool ProductHelperHw::overrideCacheableForDcFlushMitigation(AllocationType allocationType) const { return this->isDcFlushMitigated() && @@ -433,8 +445,6 @@ bool ProductHelperHw::overrideCacheableForDcFlushMitigation(Allocati allocationType == AllocationType::svmCpu || allocationType == AllocationType::svmZeroCopy || allocationType == AllocationType::internalHostMemory || - allocationType == AllocationType::internalHeap || - allocationType == AllocationType::linearStream || allocationType == AllocationType::printfSurface); } diff --git a/shared/source/os_interface/product_helper_hw.h b/shared/source/os_interface/product_helper_hw.h index 7b3260eb56..4dfabccd10 100644 --- a/shared/source/os_interface/product_helper_hw.h +++ b/shared/source/os_interface/product_helper_hw.h @@ -77,7 +77,9 @@ class ProductHelperHw : public ProductHelper { bool isDcFlushAllowed() const override; bool isDcFlushMitigated() const override; bool mitigateDcFlush() const override; - bool overridePatAndUsageForDcFlushMitigation(AllocationType allocationType) const override; + bool overrideUsageForDcFlushMitigation(AllocationType allocationType) const override; + bool overridePatToUCAndTwoWayCohForDcFlushMitigation(AllocationType allocationType) const override; + bool overridePatToUCAndOneWayCohForDcFlushMitigation(AllocationType allocationType) const override; bool overrideCacheableForDcFlushMitigation(AllocationType allocationType) const override; uint32_t computeMaxNeededSubSliceSpace(const HardwareInfo &hwInfo) const override; bool getUuid(NEO::DriverModel *driverModel, uint32_t subDeviceCount, uint32_t deviceIndex, std::array &uuid) const override; diff --git a/shared/source/xe2_hpg_core/windows/product_helper_lnl.cpp b/shared/source/xe2_hpg_core/windows/product_helper_lnl.cpp index b9675e76f4..08c2c23c92 100644 --- a/shared/source/xe2_hpg_core/windows/product_helper_lnl.cpp +++ b/shared/source/xe2_hpg_core/windows/product_helper_lnl.cpp @@ -28,10 +28,14 @@ int ProductHelperHw::configureHardwareCustom(HardwareInfo *hwInfo, O template <> uint64_t ProductHelperHw::overridePatIndex(bool isUncachedType, uint64_t patIndex, AllocationType allocationType) const { - if (this->overridePatAndUsageForDcFlushMitigation(allocationType)) { + if (this->overridePatToUCAndTwoWayCohForDcFlushMitigation(allocationType)) { return 2; // L3: WB, L4: UC, 2-Way coh } + if (this->overridePatToUCAndOneWayCohForDcFlushMitigation(allocationType)) { + return 1; // L3: WB, L4: UC, 1-Way coh + } + return patIndex; } diff --git a/shared/test/common/mocks/mock_product_helper.cpp b/shared/test/common/mocks/mock_product_helper.cpp index 82573105a1..11b32ba923 100644 --- a/shared/test/common/mocks/mock_product_helper.cpp +++ b/shared/test/common/mocks/mock_product_helper.cpp @@ -292,7 +292,17 @@ bool ProductHelperHw::mitigateDcFlush() const { } template <> -bool ProductHelperHw::overridePatAndUsageForDcFlushMitigation(AllocationType allocationType) const { +bool ProductHelperHw::overridePatToUCAndTwoWayCohForDcFlushMitigation(AllocationType allocationType) const { + return false; +} + +template <> +bool ProductHelperHw::overrideUsageForDcFlushMitigation(AllocationType allocationType) const { + return false; +} + +template <> +bool ProductHelperHw::overridePatToUCAndOneWayCohForDcFlushMitigation(AllocationType allocationType) const { return false; } diff --git a/shared/test/unit_test/os_interface/product_helper_tests.cpp b/shared/test/unit_test/os_interface/product_helper_tests.cpp index ae40a94cde..c4600aaf47 100644 --- a/shared/test/unit_test/os_interface/product_helper_tests.cpp +++ b/shared/test/unit_test/os_interface/product_helper_tests.cpp @@ -311,12 +311,12 @@ HWTEST_F(ProductHelperTest, givenVariousValuesWhenGettingAubStreamSteppingFromHw EXPECT_EQ(AubMemDump::SteppingValues::A, mockProductHelper.getAubStreamSteppingFromHwRevId(pInHwInfo)); } -HWTEST_F(ProductHelperTest, givenDcFlushMitigationWhenOverridePatAndUsageForDcFlushMitigationThenReturnCorrectValue) { +HWTEST_F(ProductHelperTest, givenDcFlushMitigationWhenOverridePatToUCAndTwoWayCohForDcFlushMitigationThenReturnCorrectValue) { DebugManagerStateRestore restorer; if (!productHelper->isDcFlushMitigated()) { for (auto i = 0; i < static_cast(AllocationType::count); ++i) { auto allocationType = static_cast(i); - EXPECT_FALSE(productHelper->overridePatAndUsageForDcFlushMitigation(allocationType)); + EXPECT_FALSE(productHelper->overridePatToUCAndTwoWayCohForDcFlushMitigation(allocationType)); } } debugManager.flags.AllowDcFlush.set(0); @@ -334,9 +334,9 @@ HWTEST_F(ProductHelperTest, givenDcFlushMitigationWhenOverridePatAndUsageForDcFl allocationType == AllocationType::linearStream || allocationType == AllocationType::internalHeap || allocationType == AllocationType::printfSurface) { - EXPECT_EQ(productHelper->overridePatAndUsageForDcFlushMitigation(allocationType), productHelper->isDcFlushMitigated()); + EXPECT_EQ(productHelper->overrideUsageForDcFlushMitigation(allocationType), productHelper->isDcFlushMitigated()); } else { - EXPECT_FALSE(productHelper->overridePatAndUsageForDcFlushMitigation(allocationType)); + EXPECT_FALSE(productHelper->overridePatToUCAndTwoWayCohForDcFlushMitigation(allocationType)); } } } diff --git a/shared/test/unit_test/xe2_hpg_core/lnl/product_helper_tests_lnl.cpp b/shared/test/unit_test/xe2_hpg_core/lnl/product_helper_tests_lnl.cpp index c82bdfa6f2..719c4cd22b 100644 --- a/shared/test/unit_test/xe2_hpg_core/lnl/product_helper_tests_lnl.cpp +++ b/shared/test/unit_test/xe2_hpg_core/lnl/product_helper_tests_lnl.cpp @@ -146,8 +146,6 @@ LNLTEST_F(LnlProductHelper, givenExternalHostPtrWhenMitigateDcFlushThenOverrideC allocationType == AllocationType::svmZeroCopy || allocationType == AllocationType::internalHostMemory || allocationType == AllocationType::commandBuffer || - allocationType == AllocationType::internalHeap || - allocationType == AllocationType::linearStream || allocationType == AllocationType::printfSurface) { EXPECT_TRUE(productHelper->overrideAllocationCacheable(allocationData)); } else { diff --git a/shared/test/unit_test/xe2_hpg_core/lnl/windows/product_helper_tests_lnl_windows.cpp b/shared/test/unit_test/xe2_hpg_core/lnl/windows/product_helper_tests_lnl_windows.cpp index 2792e1e42a..d8633ab85e 100644 --- a/shared/test/unit_test/xe2_hpg_core/lnl/windows/product_helper_tests_lnl_windows.cpp +++ b/shared/test/unit_test/xe2_hpg_core/lnl/windows/product_helper_tests_lnl_windows.cpp @@ -40,6 +40,8 @@ LNLTEST_F(LnlProductHelperWindows, givenProductHelperWhenOverridePatIndexCalledT EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::internalHostMemory)); EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::timestampPacketTagBuffer)); EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::tagBuffer)); + EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::linearStream)); + EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::internalHeap)); debugManager.flags.AllowDcFlush.set(0); @@ -51,6 +53,10 @@ LNLTEST_F(LnlProductHelperWindows, givenProductHelperWhenOverridePatIndexCalledT EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::internalHostMemory)); EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::timestampPacketTagBuffer)); EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::tagBuffer)); + + expectedPatIndexOverride = 1u; + EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::linearStream)); + EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::internalHeap)); } LNLTEST_F(LnlProductHelperWindows, givenProductHelperWhenIsStagingBuffersEnabledThenTrueIsReturned) {