diff --git a/opencl/test/unit_test/os_interface/hw_info_config_tests.cpp b/opencl/test/unit_test/os_interface/hw_info_config_tests.cpp index a972c45961..bb59d5ea92 100644 --- a/opencl/test/unit_test/os_interface/hw_info_config_tests.cpp +++ b/opencl/test/unit_test/os_interface/hw_info_config_tests.cpp @@ -162,6 +162,19 @@ HWTEST_F(HwInfoConfigTest, givenHwInfoConfigWhenAskedForPageTableManagerSupportT EXPECT_EQ(hwInfoConfig.isPageTableManagerSupported(pInHwInfo), UnitTestHelper::isPageTableManagerSupported(pInHwInfo)); } +HWTEST_F(HwInfoConfigTest, whenIsMidThreadPreemptionSupportedIsCalledThenCorrectResultIsReturned) { + const auto &hwInfoConfig = *HwInfoConfig::get(pInHwInfo.platform.eProductFamily); + auto hwInfo = pInHwInfo; + + hwInfo.featureTable.ftrGpGpuMidThreadLevelPreempt = true; + auto midThreadPreemptionSupported = hwInfoConfig.isMidThreadPreemptionSupported(hwInfo); + EXPECT_TRUE(midThreadPreemptionSupported); + + hwInfo.featureTable.ftrGpGpuMidThreadLevelPreempt = false; + midThreadPreemptionSupported = hwInfoConfig.isMidThreadPreemptionSupported(hwInfo); + EXPECT_FALSE(midThreadPreemptionSupported); +} + HWTEST_F(HwInfoConfigTest, givenVariousValuesWhenConvertingHwRevIdAndSteppingThenConversionIsCorrect) { const auto &hwInfoConfig = *HwInfoConfig::get(pInHwInfo.platform.eProductFamily); diff --git a/shared/source/os_interface/hw_info_config.h b/shared/source/os_interface/hw_info_config.h index 297b75db84..d62d9e6787 100644 --- a/shared/source/os_interface/hw_info_config.h +++ b/shared/source/os_interface/hw_info_config.h @@ -40,6 +40,7 @@ class HwInfoConfig { virtual uint64_t getSharedSystemMemCapabilities() = 0; virtual void convertTimestampsFromOaToCsDomain(uint64_t ×tampData) = 0; virtual uint32_t getDeviceMemoryMaxClkRate(const HardwareInfo *hwInfo) = 0; + virtual bool isMidThreadPreemptionSupported(const HardwareInfo &hwInfo) const = 0; virtual bool isAdditionalStateBaseAddressWARequired(const HardwareInfo &hwInfo) const = 0; virtual bool isMaxThreadsForWorkgroupWARequired(const HardwareInfo &hwInfo) const = 0; virtual uint32_t getMaxThreadsForWorkgroupInDSSOrSS(const HardwareInfo &hwInfo, uint32_t maxNumEUsPerSubSlice, uint32_t maxNumEUsPerDualSubSlice) const = 0; @@ -76,6 +77,7 @@ class HwInfoConfigHw : public HwInfoConfig { void convertTimestampsFromOaToCsDomain(uint64_t ×tampData) override; uint32_t getDeviceMemoryMaxClkRate(const HardwareInfo *hwInfo) override; bool isAdditionalStateBaseAddressWARequired(const HardwareInfo &hwInfo) const override; + bool isMidThreadPreemptionSupported(const HardwareInfo &hwInfo) const override; bool isMaxThreadsForWorkgroupWARequired(const HardwareInfo &hwInfo) const override; uint32_t getMaxThreadsForWorkgroupInDSSOrSS(const HardwareInfo &hwInfo, uint32_t maxNumEUsPerSubSlice, uint32_t maxNumEUsPerDualSubSlice) const override; uint32_t getMaxThreadsForWorkgroup(const HardwareInfo &hwInfo, uint32_t maxNumEUsPerSubSlice) const override; diff --git a/shared/source/os_interface/hw_info_config.inl b/shared/source/os_interface/hw_info_config.inl index 402f49f04f..4332d81bba 100644 --- a/shared/source/os_interface/hw_info_config.inl +++ b/shared/source/os_interface/hw_info_config.inl @@ -96,6 +96,11 @@ uint32_t HwInfoConfigHw::getMaxThreadsForWorkgroup(const HardwareInf return maxNumEUsPerSubSlice * numThreadsPerEU; } +template +bool HwInfoConfigHw::isMidThreadPreemptionSupported(const HardwareInfo &hwInfo) const { + return static_cast(hwInfo.featureTable.ftrGpGpuMidThreadLevelPreempt); +} + template void HwInfoConfigHw::setForceNonCoherent(void *const commandPtr, const StateComputeModeProperties &properties) {} diff --git a/shared/source/os_interface/linux/hw_info_config_drm.cpp b/shared/source/os_interface/linux/hw_info_config_drm.cpp index c6fcf8b8f7..30cd794bf9 100644 --- a/shared/source/os_interface/linux/hw_info_config_drm.cpp +++ b/shared/source/os_interface/linux/hw_info_config_drm.cpp @@ -176,7 +176,7 @@ int HwInfoConfig::configureHwInfoDrm(const HardwareInfo *inHwInfo, HardwareInfo drm->checkPreemptionSupport(); bool preemption = drm->isPreemptionSupported(); PreemptionHelper::adjustDefaultPreemptionMode(outHwInfo->capabilityTable, - static_cast(outHwInfo->featureTable.ftrGpGpuMidThreadLevelPreempt) && preemption, + isMidThreadPreemptionSupported(*outHwInfo) && preemption, static_cast(outHwInfo->featureTable.ftrGpGpuThreadGroupLevelPreempt) && preemption, static_cast(outHwInfo->featureTable.ftrGpGpuMidBatchPreempt) && preemption); diff --git a/shared/source/os_interface/windows/hw_info_config_wddm.cpp b/shared/source/os_interface/windows/hw_info_config_wddm.cpp index b200f7af20..50e0d2f84b 100644 --- a/shared/source/os_interface/windows/hw_info_config_wddm.cpp +++ b/shared/source/os_interface/windows/hw_info_config_wddm.cpp @@ -28,9 +28,10 @@ int HwInfoConfig::configureHwInfoWddm(const HardwareInfo *inHwInfo, HardwareInfo outHwInfo->capabilityTable.ftrSupportsCoherency &= inHwInfo->featureTable.ftrL3IACoherency; PreemptionHelper::adjustDefaultPreemptionMode(outHwInfo->capabilityTable, - static_cast(outHwInfo->featureTable.ftrGpGpuMidThreadLevelPreempt), + isMidThreadPreemptionSupported(*outHwInfo), static_cast(outHwInfo->featureTable.ftrGpGpuThreadGroupLevelPreempt), static_cast(outHwInfo->featureTable.ftrGpGpuMidBatchPreempt)); + if (DebugManager.flags.OverridePreemptionSurfaceSizeInMb.get() >= 0) { outHwInfo->gtSystemInfo.CsrSizeInMb = static_cast(DebugManager.flags.OverridePreemptionSurfaceSizeInMb.get()); } diff --git a/shared/test/unit_test/os_interface/os_agnostic_hw_info_config_tests.cpp b/shared/test/unit_test/os_interface/os_agnostic_hw_info_config_tests.cpp index 4e166cfec8..5fa54414cd 100644 --- a/shared/test/unit_test/os_interface/os_agnostic_hw_info_config_tests.cpp +++ b/shared/test/unit_test/os_interface/os_agnostic_hw_info_config_tests.cpp @@ -13,6 +13,11 @@ template <> void HwInfoConfigHw::adjustSamplerState(void *sampler, const HardwareInfo &hwInfo) { } +template <> +bool HwInfoConfigHw::isMidThreadPreemptionSupported(const HardwareInfo &hwInfo) const { + return static_cast(hwInfo.featureTable.ftrGpGpuMidThreadLevelPreempt); +} + template <> void HwInfoConfigHw::convertTimestampsFromOaToCsDomain(uint64_t ×tampData) { }