From 0136ef049a482ee9e9be8a97a6e2d1c9b388c6c7 Mon Sep 17 00:00:00 2001 From: Vishnu Khanth Date: Wed, 19 Jun 2024 05:57:54 +0000 Subject: [PATCH] fix: Update canControl field based on set Request Support Related-to: NEO-11443 Signed-off-by: Vishnu Khanth --- .../linux/sysman_os_frequency_imp.cpp | 4 +- .../frequency/linux/sysman_os_frequency_imp.h | 4 +- .../api/power/linux/sysman_os_power_imp.cpp | 6 +-- .../linux/sysman_os_scheduler_imp.cpp | 6 +-- .../scheduler/linux/sysman_os_scheduler_imp.h | 3 +- .../frequency/linux/mock_sysfs_frequency_xe.h | 8 --- .../frequency/linux/mock_sysman_frequency.h | 8 --- .../frequency/linux/test_zes_frequency.cpp | 27 +++++++++- .../frequency/linux/test_zes_frequency_xe.cpp | 14 +++++- .../sources/linux/mocks/CMakeLists.txt | 1 + .../linux/mocks/mock_sysman_product_helper.h | 26 ++++++++++ .../sources/power/linux/test_zes_power.cpp | 49 +++++++++++++++++++ .../power/linux/test_zes_power_helper.cpp | 17 ++++++- 13 files changed, 140 insertions(+), 33 deletions(-) create mode 100644 level_zero/sysman/test/unit_tests/sources/linux/mocks/mock_sysman_product_helper.h 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 343934c0b3..44dbcf6485 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 @@ -23,7 +23,6 @@ namespace L0 { namespace Sysman { -const bool LinuxFrequencyImp::canControl = true; // canControl is true on i915 (GEN9 Hardcode) ze_result_t LinuxFrequencyImp::osFrequencyGetProperties(zes_freq_properties_t &properties) { properties.pNext = nullptr; @@ -72,7 +71,7 @@ ze_result_t LinuxFrequencyImp::osFrequencySetRange(const zes_freq_range_t *pLimi double newMin = round(pLimits->min); double newMax = round(pLimits->max); - if (!pSysmanProductHelper->isFrequencySetRangeSupported()) { + if (!canControl) { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; } @@ -427,6 +426,7 @@ void LinuxFrequencyImp::init() { throttleReasonPL2File = pSysmanKmdInterface->getSysfsFilePath(SysfsName::sysfsNameThrottleReasonPL2, subdeviceId, baseDirectoryExists); throttleReasonPL4File = pSysmanKmdInterface->getSysfsFilePath(SysfsName::sysfsNameThrottleReasonPL4, subdeviceId, baseDirectoryExists); throttleReasonThermalFile = pSysmanKmdInterface->getSysfsFilePath(SysfsName::sysfsNameThrottleReasonThermal, subdeviceId, baseDirectoryExists); + canControl = pSysmanProductHelper->isFrequencySetRangeSupported(); if (pSysmanKmdInterface->isDefaultFrequencyAvailable()) { minDefaultFreqFile = pSysmanKmdInterface->getSysfsFilePath(SysfsName::sysfsNameMinDefaultFrequency, subdeviceId, baseDirectoryExists); 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 86d8e387d5..12b6399bfa 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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Intel Corporation + * Copyright (C) 2020-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -76,7 +76,7 @@ class LinuxFrequencyImp : public OsFrequency, NEO::NonCopyableOrMovableClass { std::string throttleReasonPL2File; std::string throttleReasonPL4File; std::string throttleReasonThermalFile; - static const bool canControl; + bool canControl = false; bool isSubdevice = false; uint32_t subdeviceId = 0; zes_freq_domain_t frequencyDomainNumber = ZES_FREQ_DOMAIN_GPU; diff --git a/level_zero/sysman/source/api/power/linux/sysman_os_power_imp.cpp b/level_zero/sysman/source/api/power/linux/sysman_os_power_imp.cpp index 5355c1a950..d87d6b086d 100644 --- a/level_zero/sysman/source/api/power/linux/sysman_os_power_imp.cpp +++ b/level_zero/sysman/source/api/power/linux/sysman_os_power_imp.cpp @@ -147,7 +147,7 @@ ze_result_t LinuxPowerImp::getLimits(zes_power_sustained_limit_t *pSustained, ze ze_result_t LinuxPowerImp::setLimits(const zes_power_sustained_limit_t *pSustained, const zes_power_burst_limit_t *pBurst, const zes_power_peak_limit_t *pPeak) { ze_result_t result = ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; - if ((!isSubdevice) && (pSysmanProductHelper->isPowerSetLimitSupported())) { + if (canControl) { uint64_t val = 0; if (pSustained != nullptr) { @@ -238,7 +238,7 @@ ze_result_t LinuxPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_de ze_result_t LinuxPowerImp::setLimitsExt(uint32_t *pCount, zes_power_limit_ext_desc_t *pSustained) { ze_result_t result = ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; - if ((!isSubdevice) && (pSysmanProductHelper->isPowerSetLimitSupported())) { + if (canControl) { uint64_t val = 0; for (uint32_t i = 0; i < *pCount; i++) { if (pSustained[i].level == ZES_POWER_LEVEL_SUSTAINED) { @@ -296,7 +296,7 @@ bool LinuxPowerImp::isPowerModuleSupported() { if (isIntelGraphicsHwmonDir(name)) { intelGraphicsHwmonDir = hwmonDir + "/" + tempHwmonDirEntry; hwmonDirExists = true; - canControl = isSubdevice ? false : true; + canControl = (!isSubdevice) && (pSysmanProductHelper->isPowerSetLimitSupported()); } } diff --git a/level_zero/sysman/source/api/scheduler/linux/sysman_os_scheduler_imp.cpp b/level_zero/sysman/source/api/scheduler/linux/sysman_os_scheduler_imp.cpp index 1d260b00e1..67cfe94c69 100644 --- a/level_zero/sysman/source/api/scheduler/linux/sysman_os_scheduler_imp.cpp +++ b/level_zero/sysman/source/api/scheduler/linux/sysman_os_scheduler_imp.cpp @@ -302,7 +302,7 @@ ze_result_t LinuxSchedulerImp::setTimesliceMode(zes_sched_timeslice_properties_t ze_result_t LinuxSchedulerImp::getProperties(zes_sched_properties_t &schedProperties) { schedProperties.onSubdevice = onSubdevice; schedProperties.subdeviceId = subdeviceId; - schedProperties.canControl = canControlScheduler(); + schedProperties.canControl = true; schedProperties.engines = this->engineType; schedProperties.supportedModes = (1 << ZES_SCHED_MODE_TIMEOUT) | (1 << ZES_SCHED_MODE_TIMESLICE) | (1 << ZES_SCHED_MODE_EXCLUSIVE); return ZE_RESULT_SUCCESS; @@ -350,10 +350,6 @@ ze_result_t LinuxSchedulerImp::setHeartbeatInterval(uint64_t heartbeat) { listOfEngines, engineType, heartbeat); } -ze_bool_t LinuxSchedulerImp::canControlScheduler() { - return 1; -} - ze_result_t LinuxSchedulerImp::setComputeUnitDebugMode(ze_bool_t *pNeedReload) { *pNeedReload = false; return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; diff --git a/level_zero/sysman/source/api/scheduler/linux/sysman_os_scheduler_imp.h b/level_zero/sysman/source/api/scheduler/linux/sysman_os_scheduler_imp.h index cb9e8b82f5..ec09c1321d 100644 --- a/level_zero/sysman/source/api/scheduler/linux/sysman_os_scheduler_imp.h +++ b/level_zero/sysman/source/api/scheduler/linux/sysman_os_scheduler_imp.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Intel Corporation + * Copyright (C) 2020-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -51,7 +51,6 @@ class LinuxSchedulerImp : public OsScheduler, NEO::NonCopyableOrMovableClass { ze_result_t setPreemptTimeout(uint64_t timeout); ze_result_t setTimesliceDuration(uint64_t timeslice); ze_result_t setHeartbeatInterval(uint64_t heartbeat); - ze_bool_t canControlScheduler(); ze_result_t disableComputeUnitDebugMode(ze_bool_t *pNeedReload); bool isComputeUnitDebugModeEnabled(); diff --git a/level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysfs_frequency_xe.h b/level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysfs_frequency_xe.h index 04c0351d66..537b2087cf 100644 --- a/level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysfs_frequency_xe.h +++ b/level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysfs_frequency_xe.h @@ -11,7 +11,6 @@ #include "shared/test/common/test_macros/mock_method_macros.h" #include "level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.h" -#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.h" #include "level_zero/sysman/source/shared/linux/sysman_fs_access_interface.h" #include "gtest/gtest.h" @@ -204,13 +203,6 @@ struct MockXeFrequencySysfsAccess : public L0::Sysman::SysFsAccessInterface { ~MockXeFrequencySysfsAccess() override = default; }; -struct MockSysmanProductHelperFreq : L0::Sysman::SysmanProductHelperHw { - MockSysmanProductHelperFreq() = default; - bool isFrequencySetRangeSupported() override { - return false; - } -}; - class PublicLinuxFrequencyImp : public L0::Sysman::LinuxFrequencyImp { public: PublicLinuxFrequencyImp(L0::Sysman::OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_freq_domain_t type) : L0::Sysman::LinuxFrequencyImp(pOsSysman, onSubdevice, subdeviceId, type) {} diff --git a/level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysman_frequency.h b/level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysman_frequency.h index 9415283848..4a16f26525 100644 --- a/level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysman_frequency.h +++ b/level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysman_frequency.h @@ -12,7 +12,6 @@ #include "shared/test/common/test_macros/mock_method_macros.h" #include "level_zero/sysman/source/api/frequency/linux/sysman_os_frequency_imp.h" -#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.h" #include "level_zero/sysman/source/shared/linux/sysman_fs_access_interface.h" #include "gtest/gtest.h" @@ -350,13 +349,6 @@ struct MockFrequencySysfsAccess : public L0::Sysman::SysFsAccessInterface { ~MockFrequencySysfsAccess() override = default; }; -struct MockSysmanProductHelperFreq : L0::Sysman::SysmanProductHelperHw { - MockSysmanProductHelperFreq() = default; - bool isFrequencySetRangeSupported() override { - return false; - } -}; - class PublicLinuxFrequencyImp : public L0::Sysman::LinuxFrequencyImp { public: PublicLinuxFrequencyImp(L0::Sysman::OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_freq_domain_t type) : L0::Sysman::LinuxFrequencyImp(pOsSysman, onSubdevice, subdeviceId, type) {} diff --git a/level_zero/sysman/test/unit_tests/sources/frequency/linux/test_zes_frequency.cpp b/level_zero/sysman/test/unit_tests/sources/frequency/linux/test_zes_frequency.cpp index 6849fcdf7f..df194c79b8 100644 --- a/level_zero/sysman/test/unit_tests/sources/frequency/linux/test_zes_frequency.cpp +++ b/level_zero/sysman/test/unit_tests/sources/frequency/linux/test_zes_frequency.cpp @@ -8,6 +8,7 @@ #include "level_zero/sysman/source/shared/linux/sysman_kmd_interface.h" #include "level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysman_frequency.h" #include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h" +#include "level_zero/sysman/test/unit_tests/sources/linux/mocks/mock_sysman_product_helper.h" #include @@ -156,6 +157,11 @@ TEST_F(SysmanDeviceFrequencyFixture, GivenActualComponentCountTwoWhenTryingToGet } TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyGetPropertiesThenSuccessIsReturned) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isFrequencySetRangeSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + auto handles = getFreqHandles(handleComponentCount); for (auto handle : handles) { EXPECT_NE(handle, nullptr); @@ -171,6 +177,19 @@ TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFreq } } +TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleAndFrequenceSetRangeIsUnsupportedWhenCallingzesFrequencyGetPropertiesThenVerifyCanControlIsSetToFalse) { + std::unique_ptr pSysmanProductHelper = std::make_unique(); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + + auto handles = getFreqHandles(handleComponentCount); + for (auto handle : handles) { + ASSERT_NE(nullptr, handle); + zes_freq_properties_t properties{}; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetProperties(handle, &properties)); + EXPECT_FALSE(properties.canControl); + } +} + HWTEST2_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleAndZeroCountWhenCallingzesFrequencyGetAvailableClocksThenCallSucceeds, IsPVC) { auto handles = getFreqHandles(handleComponentCount); for (auto handle : handles) { @@ -350,8 +369,9 @@ HWTEST2_F(SysmanDeviceFrequencyFixture, GivenInvalidFrequencyLimitsWhenCallingFr } TEST_F(SysmanDeviceFrequencyFixture, GivenFrequencySetRangeNotSupportedWhenCallingzesFrequencySetRangeThenVerifyzesFrequencySetRangeFails) { - std::unique_ptr pSysmanProductHelper = std::make_unique(); + std::unique_ptr pSysmanProductHelper = std::make_unique(); std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + auto handles = getFreqHandles(handleComponentCount); for (auto handle : handles) { const double startingMin = 900.0; @@ -754,6 +774,11 @@ TEST_F(SysmanDeviceFrequencyFixture, GivengetMinValFunctionReturnsErrorWhenValid } TEST_F(SysmanDeviceFrequencyFixture, GivenOnSubdeviceSetWhenValidatingAnyFrequencyAPIThenSuccessIsReturned) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isFrequencySetRangeSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + zes_freq_properties_t properties = {}; PublicLinuxFrequencyImp linuxFrequencyImp(pOsSysman, 1, 0, ZES_FREQ_DOMAIN_GPU); EXPECT_EQ(ZE_RESULT_SUCCESS, linuxFrequencyImp.osFrequencyGetProperties(properties)); diff --git a/level_zero/sysman/test/unit_tests/sources/frequency/linux/test_zes_frequency_xe.cpp b/level_zero/sysman/test/unit_tests/sources/frequency/linux/test_zes_frequency_xe.cpp index c5dbf0a60d..aa0f5ce913 100644 --- a/level_zero/sysman/test/unit_tests/sources/frequency/linux/test_zes_frequency_xe.cpp +++ b/level_zero/sysman/test/unit_tests/sources/frequency/linux/test_zes_frequency_xe.cpp @@ -7,6 +7,7 @@ #include "level_zero/sysman/test/unit_tests/sources/frequency/linux/mock_sysfs_frequency_xe.h" #include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h" +#include "level_zero/sysman/test/unit_tests/sources/linux/mocks/mock_sysman_product_helper.h" #include "level_zero/sysman/test/unit_tests/sources/shared/linux/mock_sysman_kmd_interface_xe.h" #include @@ -125,6 +126,11 @@ TEST_F(SysmanDeviceFrequencyFixtureXe, GivenActualComponentCountTwoWhenTryingToG } TEST_F(SysmanDeviceFrequencyFixtureXe, GivenValidFrequencyHandleWhenCallingzesFrequencyGetPropertiesThenSuccessIsReturned) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isFrequencySetRangeSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + auto handles = getFreqHandles(handleComponentCount); for (auto &handle : handles) { EXPECT_NE(handle, nullptr); @@ -352,8 +358,9 @@ TEST_F(SysmanDeviceFrequencyFixtureXe, GivenInvalidFrequencyLimitsWhenCallingFre } TEST_F(SysmanDeviceFrequencyFixtureXe, GivenFrequencySetRangeNotSupportedWhenCallingzesFrequencySetRangeThenVerifyzesFrequencySetRangeFails) { - std::unique_ptr pSysmanProductHelper = std::make_unique(); + std::unique_ptr pSysmanProductHelper = std::make_unique(); std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + auto handles = getFreqHandles(handleComponentCount); for (auto handle : handles) { const double startingMin = 900.0; @@ -675,6 +682,11 @@ TEST_F(SysmanDeviceFrequencyFixtureXe, GivengetMinValFunctionReturnsErrorWhenVal } TEST_F(SysmanDeviceFrequencyFixtureXe, GivenOnSubdeviceSetWhenValidatingAnyFrequencyAPIThenSuccessIsReturned) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isFrequencySetRangeSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + zes_freq_properties_t properties = {}; PublicLinuxFrequencyImp linuxFrequencyImp(pOsSysman, 1, 0, ZES_FREQ_DOMAIN_GPU); EXPECT_EQ(ZE_RESULT_SUCCESS, linuxFrequencyImp.osFrequencyGetProperties(properties)); diff --git a/level_zero/sysman/test/unit_tests/sources/linux/mocks/CMakeLists.txt b/level_zero/sysman/test/unit_tests/sources/linux/mocks/CMakeLists.txt index dd55336da5..fda95a5b73 100644 --- a/level_zero/sysman/test/unit_tests/sources/linux/mocks/CMakeLists.txt +++ b/level_zero/sysman/test/unit_tests/sources/linux/mocks/CMakeLists.txt @@ -7,6 +7,7 @@ if(UNIX) target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/mock_sysman_product_helper.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_sysman_product_helper.cpp ) endif() \ No newline at end of file diff --git a/level_zero/sysman/test/unit_tests/sources/linux/mocks/mock_sysman_product_helper.h b/level_zero/sysman/test/unit_tests/sources/linux/mocks/mock_sysman_product_helper.h new file mode 100644 index 0000000000..1044d069d8 --- /dev/null +++ b/level_zero/sysman/test/unit_tests/sources/linux/mocks/mock_sysman_product_helper.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include "shared/test/common/test_macros/mock_method_macros.h" + +#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.h" + +namespace L0 { +namespace Sysman { +namespace ult { + +struct MockSysmanProductHelper : public L0::Sysman::SysmanProductHelperHw { + MockSysmanProductHelper() = default; + ADDMETHOD_NOBASE(isFrequencySetRangeSupported, bool, false, ()); + ADDMETHOD_NOBASE(isPowerSetLimitSupported, bool, false, ()); +}; + +} // namespace ult +} // namespace Sysman +} // namespace L0 diff --git a/level_zero/sysman/test/unit_tests/sources/power/linux/test_zes_power.cpp b/level_zero/sysman/test/unit_tests/sources/power/linux/test_zes_power.cpp index edc5215f9d..3b971c76d8 100644 --- a/level_zero/sysman/test/unit_tests/sources/power/linux/test_zes_power.cpp +++ b/level_zero/sysman/test/unit_tests/sources/power/linux/test_zes_power.cpp @@ -5,6 +5,7 @@ * */ +#include "level_zero/sysman/test/unit_tests/sources/linux/mocks/mock_sysman_product_helper.h" #include "level_zero/sysman/test/unit_tests/sources/power/linux/mock_sysfs_power.h" namespace L0 { @@ -88,7 +89,16 @@ TEST_F(SysmanDevicePowerFixtureI915, GivenScanDiectoriesFailAndPmtIsNullWhenGett } TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleWhenGettingPowerPropertiesWhenhwmonInterfaceExistsThenCallSucceeds) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isPowerSetLimitSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + for (const auto &handle : pSysmanDeviceImp->pPowerHandleContext->handleList) { + delete handle; + } + pSysmanDeviceImp->pPowerHandleContext->handleList.clear(); + pSysmanDeviceImp->pPowerHandleContext->init(pLinuxSysmanImp->getSubDeviceCount()); auto handles = getPowerHandles(powerHandleComponentCount); for (auto handle : handles) { @@ -106,6 +116,16 @@ TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleWhenGettingPowerProper } TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleWhenGettingPowerPropertiesAndExtPropertiesThenCallSucceeds) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isPowerSetLimitSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + + for (const auto &handle : pSysmanDeviceImp->pPowerHandleContext->handleList) { + delete handle; + } + pSysmanDeviceImp->pPowerHandleContext->handleList.clear(); + pSysmanDeviceImp->pPowerHandleContext->init(pLinuxSysmanImp->getSubDeviceCount()); auto handles = getPowerHandles(powerHandleComponentCount); for (auto handle : handles) { @@ -136,6 +156,16 @@ TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleWhenGettingPowerProper } TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleWithNoStypeForExtPropertiesWhenGettingPowerPropertiesAndExtPropertiesThenCallSucceeds) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isPowerSetLimitSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + + for (const auto &handle : pSysmanDeviceImp->pPowerHandleContext->handleList) { + delete handle; + } + pSysmanDeviceImp->pPowerHandleContext->handleList.clear(); + pSysmanDeviceImp->pPowerHandleContext->init(pLinuxSysmanImp->getSubDeviceCount()); auto handles = getPowerHandles(powerHandleComponentCount); for (auto handle : handles) { @@ -157,6 +187,25 @@ TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleWithNoStypeForExtPrope } } +TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleAndPowerSetLimitSupportedIsUnsupportedWhenCallingzesPowerGetPropertiesThenVerifyCanControlIsSetToFalse) { + std::unique_ptr pSysmanProductHelper = std::make_unique(); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + + for (const auto &handle : pSysmanDeviceImp->pPowerHandleContext->handleList) { + delete handle; + } + pSysmanDeviceImp->pPowerHandleContext->handleList.clear(); + pSysmanDeviceImp->pPowerHandleContext->init(pLinuxSysmanImp->getSubDeviceCount()); + auto handles = getPowerHandles(powerHandleComponentCount); + + for (auto handle : handles) { + ASSERT_NE(nullptr, handle); + zes_power_properties_t properties{}; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetProperties(handle, &properties)); + EXPECT_FALSE(properties.canControl); + } +} + TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleWhenGettingPowerPropertiesAndSysfsReadFailsThenFailureIsReturned) { std::unique_ptr pLinuxPowerImp(new PublicLinuxPowerImp(pOsSysman, false, 0)); pLinuxPowerImp->pSysfsAccess = pSysfsAccess; diff --git a/level_zero/sysman/test/unit_tests/sources/power/linux/test_zes_power_helper.cpp b/level_zero/sysman/test/unit_tests/sources/power/linux/test_zes_power_helper.cpp index 023f890464..8cd17eafed 100644 --- a/level_zero/sysman/test/unit_tests/sources/power/linux/test_zes_power_helper.cpp +++ b/level_zero/sysman/test/unit_tests/sources/power/linux/test_zes_power_helper.cpp @@ -5,8 +5,8 @@ * */ +#include "level_zero/sysman/test/unit_tests/sources/linux/mocks/mock_sysman_product_helper.h" #include "level_zero/sysman/test/unit_tests/sources/power/linux/mock_sysfs_power.h" - namespace L0 { namespace Sysman { namespace ult { @@ -55,6 +55,11 @@ TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenValidPowerPointerWhenGett } TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenValidPowerHandleWhenGettingPowerPropertiesThenCallSucceeds) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isPowerSetLimitSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + auto handles = getPowerHandles(powerHandleComponentCountMultiDevice); for (auto handle : handles) { zes_power_properties_t properties = {}; @@ -75,6 +80,11 @@ TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenValidPowerHandleWhenGetti } TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenValidPowerHandleWhenGettingPowerPropertiesAndExtPropertiesThenCallSucceeds) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isPowerSetLimitSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + auto handles = getPowerHandles(powerHandleComponentCountMultiDevice); for (auto handle : handles) { ASSERT_NE(nullptr, handle); @@ -109,6 +119,11 @@ TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenValidPowerHandleWhenGetti } TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenValidPowerHandleAndExtPropertiesWithNullDescWhenGettingPowerPropertiesThenCallSucceeds) { + MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper(); + pMockSysmanProductHelper->isPowerSetLimitSupportedResult = true; + std::unique_ptr pSysmanProductHelper(static_cast(pMockSysmanProductHelper)); + std::swap(pLinuxSysmanImp->pSysmanProductHelper, pSysmanProductHelper); + auto handles = getPowerHandles(powerHandleComponentCountMultiDevice); for (auto handle : handles) { ASSERT_NE(nullptr, handle);