diff --git a/shared/source/gmm_helper/gmm.cpp b/shared/source/gmm_helper/gmm.cpp index 13862944b4..06fd3f5698 100644 --- a/shared/source/gmm_helper/gmm.cpp +++ b/shared/source/gmm_helper/gmm.cpp @@ -42,6 +42,8 @@ Gmm::Gmm(GmmHelper *gmmHelper, const void *alignedPtr, size_t alignedSize, size_ this->preferNoCpuAccess = CacheSettingsHelper::preferNoCpuAccess(gmmResourceUsage, gmmHelper->getRootDeviceEnvironment()); bool cacheable = !this->preferNoCpuAccess && !CacheSettingsHelper::isUncachedType(gmmResourceUsage); + + gmmRequirements.overriderPreferNoCpuAccess.doOverride(this->preferNoCpuAccess); gmmRequirements.overriderCacheable.doOverride(cacheable); resourceParams.Flags.Info.Cacheable = cacheable; diff --git a/shared/source/gmm_helper/gmm.h b/shared/source/gmm_helper/gmm.h index 92e48296b2..32d1f53a45 100644 --- a/shared/source/gmm_helper/gmm.h +++ b/shared/source/gmm_helper/gmm.h @@ -35,6 +35,7 @@ struct GmmRequirements { bool preferCompressed; bool allowLargePages; Overrider overriderCacheable; + Overrider overriderPreferNoCpuAccess; }; class Gmm { diff --git a/shared/source/os_interface/windows/wddm_memory_manager.cpp b/shared/source/os_interface/windows/wddm_memory_manager.cpp index 6773b1a80e..de16a27408 100644 --- a/shared/source/os_interface/windows/wddm_memory_manager.cpp +++ b/shared/source/os_interface/windows/wddm_memory_manager.cpp @@ -225,6 +225,10 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryUsingKmdAndMapItToC gmmRequirements.overriderCacheable.enableOverride = true; gmmRequirements.overriderCacheable.value = true; } + if (productHelper.overrideCacheableForDcFlushMitigation(allocationData.type)) { + gmmRequirements.overriderPreferNoCpuAccess.enableOverride = true; + gmmRequirements.overriderPreferNoCpuAccess.value = false; + } auto gmm = new Gmm(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(), nullptr, sizeAligned, 0u, @@ -451,6 +455,10 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryForNonSvmHostPtr(co gmmRequirements.overriderCacheable.enableOverride = true; gmmRequirements.overriderCacheable.value = true; } + if (productHelper.overrideCacheableForDcFlushMitigation(allocationData.type)) { + gmmRequirements.overriderPreferNoCpuAccess.enableOverride = true; + gmmRequirements.overriderPreferNoCpuAccess.value = false; + } auto gmm = new Gmm(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(), alignedPtr, alignedSize, 0u, CacheSettingsHelper::getGmmUsageType(wddmAllocation->getAllocationType(), !!allocationData.flags.uncacheable, productHelper), {}, gmmRequirements); diff --git a/shared/test/unit_test/gmm_helper/gmm_tests.cpp b/shared/test/unit_test/gmm_helper/gmm_tests.cpp index 23dad65a24..d8d307c0cd 100644 --- a/shared/test/unit_test/gmm_helper/gmm_tests.cpp +++ b/shared/test/unit_test/gmm_helper/gmm_tests.cpp @@ -122,6 +122,18 @@ HWTEST_F(GmmTests, givenVariousResourceUsageTypeWhenCreateGmmThenFlagCacheableIs auto gmm = std::make_unique(getGmmHelper(), nullptr, 0, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, storageInfo, gmmRequirements); EXPECT_TRUE(gmm->resourceParams.Flags.Info.Cacheable); } + { + gmmRequirements.overriderPreferNoCpuAccess.enableOverride = true; + gmmRequirements.overriderPreferNoCpuAccess.value = true; + auto gmm = std::make_unique(getGmmHelper(), nullptr, 0, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, storageInfo, gmmRequirements); + EXPECT_TRUE(gmm->getPreferNoCpuAccess()); + } + { + gmmRequirements.overriderPreferNoCpuAccess.enableOverride = true; + gmmRequirements.overriderPreferNoCpuAccess.value = false; + auto gmm = std::make_unique(getGmmHelper(), nullptr, 0, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, storageInfo, gmmRequirements); + EXPECT_FALSE(gmm->getPreferNoCpuAccess()); + } } } // namespace NEO