From 50fe037aebaf3607bd27c4a5ed1496780e8d7ede Mon Sep 17 00:00:00 2001 From: "Kulkarni, Ashwin Kumar" Date: Fri, 22 Dec 2023 05:20:54 +0000 Subject: [PATCH] refactor(sysman): enable product helper for power module Related-To: NEO-8734 Signed-off-by: Kulkarni, Ashwin Kumar --- .../linux/sysman_os_power_imp_prelim.cpp | 18 ++---- .../power/linux/sysman_os_power_imp_prelim.h | 3 +- .../product_helper/sysman_product_helper.h | 5 ++ .../product_helper/sysman_product_helper_hw.h | 5 ++ .../sysman_product_helper_hw.inl | 17 ++++++ .../pvc/sysman_product_helper_pvc.cpp | 15 +++++ .../linux/product_helper/CMakeLists.txt | 1 + .../sysman_product_helper_power_tests.cpp | 58 +++++++++++++++++++ 8 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_power_tests.cpp diff --git a/level_zero/sysman/source/api/power/linux/sysman_os_power_imp_prelim.cpp b/level_zero/sysman/source/api/power/linux/sysman_os_power_imp_prelim.cpp index e6725be82c..b10ae6f5a7 100644 --- a/level_zero/sysman/source/api/power/linux/sysman_os_power_imp_prelim.cpp +++ b/level_zero/sysman/source/api/power/linux/sysman_os_power_imp_prelim.cpp @@ -10,6 +10,7 @@ #include "shared/source/debug_settings/debug_settings_manager.h" #include "level_zero/sysman/source/shared/linux/pmt/sysman_pmt.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" @@ -285,14 +286,8 @@ ze_result_t LinuxPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_de pSustained[count].source = ZES_POWER_SOURCE_ANY; pSustained[count].level = ZES_POWER_LEVEL_PEAK; pSustained[count].interval = 0; // Hardcode to 100 micro seconds i.e 0.1 milli seconds - if (productFamily == IGFX_PVC) { - pSustained[count].limit = static_cast(val); - pSustained[count].limitUnit = ZES_LIMIT_UNIT_CURRENT; - } else { - val /= milliFactor; // Convert microwatts to milliwatts - pSustained[count].limit = static_cast(val); - pSustained[count].limitUnit = ZES_LIMIT_UNIT_POWER; - } + pSustained[count].limit = pSysmanProductHelper->getPowerLimitValue(val); + pSustained[count].limitUnit = pSysmanProductHelper->getPowerLimitUnit(); } } return result; @@ -317,11 +312,7 @@ ze_result_t LinuxPowerImp::setLimitsExt(uint32_t *pCount, zes_power_limit_ext_de return getErrorCode(result); } } else if (pSustained[i].level == ZES_POWER_LEVEL_PEAK) { - if (productFamily == IGFX_PVC) { - val = pSustained[i].limit; - } else { - val = static_cast(pSustained[i].limit) * milliFactor; // Convert milliwatts to microwatts - } + val = pSysmanProductHelper->setPowerLimitValue(pSustained[i].limit); result = pSysfsAccess->write(criticalPowerLimit, val); if (ZE_RESULT_SUCCESS != result) { NEO::printDebugString(NEO::debugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): SysfsAccess->write() failed to write into %s/%s and returning error:0x%x \n", __FUNCTION__, intelGraphicsHwmonDir.c_str(), criticalPowerLimit.c_str(), getErrorCode(result)); @@ -407,6 +398,7 @@ LinuxPowerImp::LinuxPowerImp(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_ pSysfsAccess = &pLinuxSysmanImp->getSysfsAccess(); pSysmanKmdInterface = pLinuxSysmanImp->getSysmanKmdInterface(); productFamily = pLinuxSysmanImp->getProductFamily(); + pSysmanProductHelper = pLinuxSysmanImp->getSysmanProductHelper(); } OsPower *OsPower::create(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId) { diff --git a/level_zero/sysman/source/api/power/linux/sysman_os_power_imp_prelim.h b/level_zero/sysman/source/api/power/linux/sysman_os_power_imp_prelim.h index 9f07f5f488..292557a7b7 100644 --- a/level_zero/sysman/source/api/power/linux/sysman_os_power_imp_prelim.h +++ b/level_zero/sysman/source/api/power/linux/sysman_os_power_imp_prelim.h @@ -20,7 +20,7 @@ namespace Sysman { class SysmanKmdInterface; class SysFsAccessInterface; - +class SysmanProductHelper; class PlatformMonitoringTech; class LinuxPowerImp : public OsPower, NEO::NonCopyableOrMovableClass { public: @@ -56,6 +56,7 @@ class LinuxPowerImp : public OsPower, NEO::NonCopyableOrMovableClass { uint32_t subdeviceId = 0; uint32_t powerLimitCount = 0; PRODUCT_FAMILY productFamily{}; + SysmanProductHelper *pSysmanProductHelper = nullptr; class PowerLimitRestorer; ze_result_t getErrorCode(ze_result_t result) { 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 e0473bb54d..ab1f7ee113 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 @@ -62,6 +62,11 @@ class SysmanProductHelper { // Voltage virtual void getCurrentVoltage(PlatformMonitoringTech *pPmt, double &voltage) = 0; + // power + virtual int32_t getPowerLimitValue(uint64_t value) = 0; + virtual uint64_t setPowerLimitValue(int32_t value) = 0; + virtual zes_limit_unit_t getPowerLimitUnit() = 0; + virtual ~SysmanProductHelper() = default; protected: 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 6bebefcd48..53908c8ad7 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 @@ -48,6 +48,11 @@ class SysmanProductHelperHw : public SysmanProductHelper { // Voltage void getCurrentVoltage(PlatformMonitoringTech *pPmt, double &voltage) override; + // power + int32_t getPowerLimitValue(uint64_t value) override; + uint64_t setPowerLimitValue(int32_t value) override; + zes_limit_unit_t getPowerLimitUnit() override; + ~SysmanProductHelperHw() override = default; protected: 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 4bd19c4997..2fdcf3bc79 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 @@ -131,5 +131,22 @@ void SysmanProductHelperHw::getCurrentVoltage(PlatformMonitoringTech voltage = -1.0; } +template +int32_t SysmanProductHelperHw::getPowerLimitValue(uint64_t value) { + uint64_t val = value / milliFactor; + return static_cast(val); +} + +template +uint64_t SysmanProductHelperHw::setPowerLimitValue(int32_t value) { + uint64_t val = static_cast(value) * milliFactor; + return val; +} + +template +zes_limit_unit_t SysmanProductHelperHw::getPowerLimitUnit() { + return ZES_LIMIT_UNIT_POWER; +} + } // namespace Sysman } // namespace L0 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 a89fb7608d..bfeeafb00e 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 @@ -94,6 +94,21 @@ bool SysmanProductHelperHw::isRepairStatusSupported() { return true; } +template <> +int32_t SysmanProductHelperHw::getPowerLimitValue(uint64_t value) { + return static_cast(value); +} + +template <> +uint64_t SysmanProductHelperHw::setPowerLimitValue(int32_t value) { + return static_cast(value); +} + +template <> +zes_limit_unit_t SysmanProductHelperHw::getPowerLimitUnit() { + return ZES_LIMIT_UNIT_CURRENT; +} + 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 a8d60e4609..78eede5678 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 @@ -13,6 +13,7 @@ if(UNIX) ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_globalops_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_frequency_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_ras_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_power_tests.cpp ) endif() diff --git a/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_power_tests.cpp b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_power_tests.cpp new file mode 100644 index 0000000000..85fdae3107 --- /dev/null +++ b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_power_tests.cpp @@ -0,0 +1,58 @@ +/* + * 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 SysmanProductHelperPowerTest = SysmanDeviceFixture; +HWTEST2_F(SysmanProductHelperPowerTest, GivenValidProductHelperHandleWhenCallingGetPowerLimitValueThenCorrectValueIsReturned, IsPVC) { + uint64_t testValue = 3000; + int32_t expectedValue = 3000; + auto pSysmanProductHelper = L0::Sysman::SysmanProductHelper::create(defaultHwInfo->platform.eProductFamily); + EXPECT_EQ(expectedValue, pSysmanProductHelper->getPowerLimitValue(testValue)); +} + +HWTEST2_F(SysmanProductHelperPowerTest, GivenValidProductHelperHandleWhenCallingGetPowerLimitValueThenCorrectValueIsReturned, IsNotPVC) { + uint64_t testValue = 3000; + int32_t expectedValue = 3; + auto pSysmanProductHelper = L0::Sysman::SysmanProductHelper::create(defaultHwInfo->platform.eProductFamily); + EXPECT_EQ(expectedValue, pSysmanProductHelper->getPowerLimitValue(testValue)); +} + +HWTEST2_F(SysmanProductHelperPowerTest, GivenValidProductHelperHandleWhenCallingSetPowerLimitValueThenCorrectValueIsReturned, IsPVC) { + int32_t testValue = 3000; + uint64_t expectedValue = 3000; + auto pSysmanProductHelper = L0::Sysman::SysmanProductHelper::create(defaultHwInfo->platform.eProductFamily); + EXPECT_EQ(expectedValue, pSysmanProductHelper->setPowerLimitValue(testValue)); +} + +HWTEST2_F(SysmanProductHelperPowerTest, GivenValidProductHelperHandleWhenCallingSetPowerLimitValueThenCorrectValueIsReturned, IsNotPVC) { + int32_t testValue = 3; + uint64_t expectedValue = 3000; + auto pSysmanProductHelper = L0::Sysman::SysmanProductHelper::create(defaultHwInfo->platform.eProductFamily); + EXPECT_EQ(expectedValue, pSysmanProductHelper->setPowerLimitValue(testValue)); +} + +HWTEST2_F(SysmanProductHelperPowerTest, GivenValidProductHelperHandleWhenCallingGetPowerLimitUnitThenCorrectPowerLimitUnitIsReturned, IsPVC) { + zes_limit_unit_t expectedPowerUnit = ZES_LIMIT_UNIT_CURRENT; + auto pSysmanProductHelper = L0::Sysman::SysmanProductHelper::create(defaultHwInfo->platform.eProductFamily); + EXPECT_EQ(expectedPowerUnit, pSysmanProductHelper->getPowerLimitUnit()); +} + +HWTEST2_F(SysmanProductHelperPowerTest, GivenValidProductHelperHandleWhenCallingGetPowerLimitUnitThenCorrectPowerLimitUnitIsReturned, IsNotPVC) { + zes_limit_unit_t expectedPowerUnit = ZES_LIMIT_UNIT_POWER; + auto pSysmanProductHelper = L0::Sysman::SysmanProductHelper::create(defaultHwInfo->platform.eProductFamily); + EXPECT_EQ(expectedPowerUnit, pSysmanProductHelper->getPowerLimitUnit()); +} + +} // namespace ult +} // namespace Sysman +} // namespace L0