diff --git a/level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.cpp b/level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.cpp index 66e6b2c523..9da042f038 100644 --- a/level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.cpp +++ b/level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.cpp @@ -11,6 +11,7 @@ #include "shared/source/device/device.h" #include "shared/source/helpers/hw_info.h" +#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper.h" #include "level_zero/sysman/source/shared/linux/sysman_fs_access_interface.h" #include "level_zero/sysman/source/shared/linux/sysman_kmd_interface.h" #include "level_zero/sysman/source/shared/linux/zes_os_sysman_imp.h" @@ -45,11 +46,7 @@ ze_result_t LinuxFrequencyImp::osFrequencyGetProperties(zes_freq_properties_t &p double LinuxFrequencyImp::osFrequencyGetStepSize() { double stepSize; - if (productFamily >= IGFX_XE_HP_SDV) { - stepSize = 50.0; - } else { - stepSize = 50.0 / 3; // Step of 16.6666667 Mhz (GEN9 Hardcode) - } + pSysmanProductHelper->getFrequencyStepSize(&stepSize); return stepSize; } @@ -437,7 +434,7 @@ void LinuxFrequencyImp::init() { LinuxFrequencyImp::LinuxFrequencyImp(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_freq_domain_t frequencyDomainNumber) : isSubdevice(onSubdevice), subdeviceId(subdeviceId), frequencyDomainNumber(frequencyDomainNumber) { LinuxSysmanImp *pLinuxSysmanImp = static_cast(pOsSysman); pSysfsAccess = &pLinuxSysmanImp->getSysfsAccess(); - productFamily = pLinuxSysmanImp->getProductFamily(); + pSysmanProductHelper = pLinuxSysmanImp->getSysmanProductHelper(); pSysmanKmdInterface = pLinuxSysmanImp->getSysmanKmdInterface(); init(); } diff --git a/level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.h b/level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.h index 45ec87ebe3..2acfbbbca5 100644 --- a/level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.h +++ b/level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.h @@ -16,6 +16,7 @@ namespace L0 { namespace Sysman { class SysmanKmdInterface; +class SysmanProductHelper; class SysFsAccessInterface; class LinuxFrequencyImp : public OsFrequency, NEO::NonCopyableOrMovableClass { @@ -77,7 +78,7 @@ class LinuxFrequencyImp : public OsFrequency, NEO::NonCopyableOrMovableClass { bool isSubdevice = false; uint32_t subdeviceId = 0; zes_freq_domain_t frequencyDomainNumber = ZES_FREQ_DOMAIN_GPU; - PRODUCT_FAMILY productFamily; + SysmanProductHelper *pSysmanProductHelper = nullptr; void init(); }; diff --git a/level_zero/sysman/source/shared/linux/product_helper/CMakeLists.txt b/level_zero/sysman/source/shared/linux/product_helper/CMakeLists.txt index 33ee27937f..edf1975201 100644 --- a/level_zero/sysman/source/shared/linux/product_helper/CMakeLists.txt +++ b/level_zero/sysman/source/shared/linux/product_helper/CMakeLists.txt @@ -11,6 +11,7 @@ target_sources(${L0_STATIC_LIB_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_hw.h ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_hw.inl ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_xe_hp_and_later.inl ) add_subdirectories() diff --git a/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper.h b/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper.h index a4899e3402..e887b41ea9 100644 --- a/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper.h +++ b/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper.h @@ -36,6 +36,9 @@ class SysmanProductHelper { return productHelper; } + // Frequency + virtual void getFrequencyStepSize(double *pStepSize) = 0; + // Memory virtual ze_result_t getMemoryProperties(zes_mem_properties_t *pProperties, const LinuxSysmanImp *pLinuxSysmanImp) = 0; virtual ze_result_t getMemoryBandwidth(zes_mem_bandwidth_t *pBandwidth, const LinuxSysmanImp *pLinuxSysmanImp) = 0; diff --git a/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.h b/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.h index 3551f6835f..df7c24e2a1 100644 --- a/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.h +++ b/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.h @@ -22,6 +22,9 @@ class SysmanProductHelperHw : public SysmanProductHelper { return pSysmanProductHelper; } + // Frequency + void getFrequencyStepSize(double *pStepSize) override; + // Memory ze_result_t getMemoryProperties(zes_mem_properties_t *pProperties, const LinuxSysmanImp *pLinuxSysmanImp) override; ze_result_t getMemoryBandwidth(zes_mem_bandwidth_t *pBandwidth, const LinuxSysmanImp *pLinuxSysmanImp) override; diff --git a/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.inl b/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.inl index 5ab1ed5a7d..3ceef6019c 100644 --- a/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.inl +++ b/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.inl @@ -16,6 +16,11 @@ namespace L0 { namespace Sysman { +template +void SysmanProductHelperHw::getFrequencyStepSize(double *pStepSize) { + *pStepSize = (50.0 / 3); // Step of 16.6666667 Mhz +} + template ze_result_t SysmanProductHelperHw::getMemoryProperties(zes_mem_properties_t *pProperties, const LinuxSysmanImp *pLinuxSysmanImp) { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; diff --git a/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_xe_hp_and_later.inl b/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_xe_hp_and_later.inl new file mode 100644 index 0000000000..f7ea8d246c --- /dev/null +++ b/level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_xe_hp_and_later.inl @@ -0,0 +1,11 @@ +/* + * Copyright (C) 2023 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +template <> +void SysmanProductHelperHw::getFrequencyStepSize(double *pStepSize) { + *pStepSize = 50.0; +} \ No newline at end of file diff --git a/level_zero/sysman/source/shared/linux/product_helper/xe_hpc_core/pvc/sysman_product_helper_pvc.cpp b/level_zero/sysman/source/shared/linux/product_helper/xe_hpc_core/pvc/sysman_product_helper_pvc.cpp index 631447cdc4..a89fb7608d 100644 --- a/level_zero/sysman/source/shared/linux/product_helper/xe_hpc_core/pvc/sysman_product_helper_pvc.cpp +++ b/level_zero/sysman/source/shared/linux/product_helper/xe_hpc_core/pvc/sysman_product_helper_pvc.cpp @@ -16,6 +16,8 @@ namespace L0 { namespace Sysman { constexpr static auto gfxProduct = IGFX_PVC; +#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_xe_hp_and_later.inl" + template <> void SysmanProductHelperHw::getMediaPerformanceFactorMultiplier(const double performanceFactor, double *pMultiplier) { if (performanceFactor > halfOfMaxPerformanceFactor) { diff --git a/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/arl/sysman_product_helper_arl.cpp b/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/arl/sysman_product_helper_arl.cpp index 23ba8c695c..398eb8b945 100644 --- a/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/arl/sysman_product_helper_arl.cpp +++ b/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/arl/sysman_product_helper_arl.cpp @@ -13,6 +13,8 @@ namespace Sysman { constexpr static auto gfxProduct = IGFX_ARROWLAKE; +#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_xe_hp_and_later.inl" + template class SysmanProductHelperHw; } // namespace Sysman diff --git a/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/dg2/sysman_product_helper_dg2.cpp b/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/dg2/sysman_product_helper_dg2.cpp index 57f3286655..d17c50a421 100644 --- a/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/dg2/sysman_product_helper_dg2.cpp +++ b/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/dg2/sysman_product_helper_dg2.cpp @@ -18,6 +18,8 @@ RasInterfaceType SysmanProductHelperHw::getGtRasUtilInterface() { return RasInterfaceType::pmu; } +#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_xe_hp_and_later.inl" + template class SysmanProductHelperHw; } // namespace Sysman diff --git a/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/mtl/sysman_product_helper_mtl.cpp b/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/mtl/sysman_product_helper_mtl.cpp index e7088c72d9..8d2b87eb7d 100644 --- a/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/mtl/sysman_product_helper_mtl.cpp +++ b/level_zero/sysman/source/shared/linux/product_helper/xe_hpg_core/mtl/sysman_product_helper_mtl.cpp @@ -13,6 +13,8 @@ namespace Sysman { constexpr static auto gfxProduct = IGFX_METEORLAKE; +#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_xe_hp_and_later.inl" + template class SysmanProductHelperHw; } // namespace Sysman diff --git a/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/CMakeLists.txt b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/CMakeLists.txt index 54855d6cdf..fa6fe5c86c 100644 --- a/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/CMakeLists.txt +++ b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/CMakeLists.txt @@ -11,6 +11,7 @@ if(UNIX) ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_memory_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_temperature_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_globalops_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_frequency_tests.cpp ) endif() diff --git a/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_frequency_tests.cpp b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_frequency_tests.cpp new file mode 100644 index 0000000000..7d49db4ef4 --- /dev/null +++ b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_frequency_tests.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2023 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper.h" +#include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h" + +namespace L0 { +namespace Sysman { +namespace ult { + +using SysmanProductHelperFrequencyTest = ::testing::Test; +using IsProductXeHpSdvPlus = IsAtLeastProduct; + +HWTEST2_F(SysmanProductHelperFrequencyTest, GivenFrequencyModuleWhenGettingStepSizeThenValidStepSizeIsReturned, IsProductXeHpSdvPlus) { + auto pSysmanProductHelper = L0::Sysman::SysmanProductHelper::create(defaultHwInfo->platform.eProductFamily); + double stepSize = 0; + pSysmanProductHelper->getFrequencyStepSize(&stepSize); + EXPECT_EQ(50.0, stepSize); +} + +HWTEST2_F(SysmanProductHelperFrequencyTest, GivenFrequencyModuleWhenGettingStepSizeThenValidStepSizeIsReturned, IsGen9) { + auto pSysmanProductHelper = L0::Sysman::SysmanProductHelper::create(defaultHwInfo->platform.eProductFamily); + double stepSize = 0; + pSysmanProductHelper->getFrequencyStepSize(&stepSize); + EXPECT_EQ((50.0 / 3), stepSize); +} + +} // namespace ult +} // namespace Sysman +} // namespace L0 \ No newline at end of file