From 60711a169e78a6eae6d5c8af0cdd579bf402584e Mon Sep 17 00:00:00 2001 From: shubham kumar Date: Wed, 21 Aug 2024 04:36:32 +0000 Subject: [PATCH] feature: Add support for DC limits in peak power Related-To: NEO-12290 Signed-off-by: shubham kumar --- .../api/power/windows/sysman_os_power_imp.cpp | 75 ++++++++++++++----- .../sources/power/windows/mock_power.h | 2 +- .../power/windows/test_zes_sysman_power.cpp | 10 ++- .../test/black_box_tests/zello_sysman.cpp | 10 ++- 4 files changed, 73 insertions(+), 24 deletions(-) diff --git a/level_zero/sysman/source/api/power/windows/sysman_os_power_imp.cpp b/level_zero/sysman/source/api/power/windows/sysman_os_power_imp.cpp index 74f088e0a1..bf1687f8ef 100644 --- a/level_zero/sysman/source/api/power/windows/sysman_os_power_imp.cpp +++ b/level_zero/sysman/source/api/power/windows/sysman_os_power_imp.cpp @@ -325,7 +325,7 @@ ze_result_t WddmPowerImp::setEnergyThreshold(double threshold) { bool WddmPowerImp::isPowerModuleSupported() { powerLimitCount = 0; - std::vector vRequests = {}; + std::vector vRequests(4); std::vector vResponses = {}; KmdSysman::RequestProperty request = {}; @@ -333,13 +333,15 @@ bool WddmPowerImp::isPowerModuleSupported() { request.componentId = KmdSysman::Component::PowerComponent; request.paramInfo = static_cast(powerGroupToDomainTypeMap.at(this->powerDomain)); request.requestId = KmdSysman::Requests::Power::PowerLimit1Enabled; - vRequests.push_back(request); + vRequests[0] = request; request.requestId = KmdSysman::Requests::Power::PowerLimit2Enabled; - vRequests.push_back(request); + vRequests[1] = request; request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Ac; - vRequests.push_back(request); + vRequests[2] = request; + request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Dc; + vRequests[3] = request; ze_result_t status = pKmdSysManager->requestMultiple(vRequests, vResponses); @@ -347,7 +349,7 @@ bool WddmPowerImp::isPowerModuleSupported() { return status; } - for (uint32_t i = 0; i < vResponses.size() - 1; i++) { + for (uint32_t i = 0; i < vResponses.size() - 2; i++) { ze_bool_t enabled = false; if (vResponses[i].returnCode == KmdSysman::Success) { memcpy_s(&enabled, sizeof(ze_bool_t), vResponses[i].dataBuffer, sizeof(ze_bool_t)); @@ -362,6 +364,10 @@ bool WddmPowerImp::isPowerModuleSupported() { powerLimitCount++; } + if (vResponses[3].returnCode == KmdSysman::Success) { + powerLimitCount++; + } + if (powerLimitCount > 0) { return true; } else { @@ -380,7 +386,7 @@ ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_des *pCount = std::min(*pCount, powerLimitCount); - std::vector vRequests = {}; + std::vector vRequests(7); std::vector vResponses = {}; KmdSysman::RequestProperty request = {}; @@ -388,22 +394,25 @@ ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_des request.componentId = KmdSysman::Component::PowerComponent; request.paramInfo = static_cast(powerGroupToDomainTypeMap.at(this->powerDomain)); request.requestId = KmdSysman::Requests::Power::PowerLimit1Enabled; - vRequests.push_back(request); + vRequests[0] = request; request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit1; - vRequests.push_back(request); + vRequests[1] = request; request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit1Tau; - vRequests.push_back(request); + vRequests[2] = request; request.requestId = KmdSysman::Requests::Power::PowerLimit2Enabled; - vRequests.push_back(request); + vRequests[3] = request; request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit2; - vRequests.push_back(request); + vRequests[4] = request; request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Ac; - vRequests.push_back(request); + vRequests[5] = request; + + request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Dc; + vRequests[6] = request; ze_result_t status = pKmdSysManager->requestMultiple(vRequests, vResponses); @@ -464,7 +473,7 @@ ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_des count++; } } - // Peak + // Peak AC if (count < *pCount) { if (vResponses[5].returnCode == KmdSysman::Success) { uint32_t powerAC = 0; @@ -475,13 +484,32 @@ ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_des pSustained[count].enabledStateLocked = true; pSustained[count].intervalValueLocked = true; pSustained[count].limitValueLocked = false; - pSustained[count].source = ZES_POWER_SOURCE_ANY; + pSustained[count].source = ZES_POWER_SOURCE_MAINS; pSustained[count].level = ZES_POWER_LEVEL_PEAK; pSustained[count].limitUnit = ZES_LIMIT_UNIT_POWER; pSustained[count].interval = 0; count++; } } + // Peak DC + if (count < *pCount) { + if (vResponses[6].returnCode == KmdSysman::Success) { + uint32_t powerDC = 0; + memset(&pSustained[count], 0, sizeof(zes_power_limit_ext_desc_t)); + memcpy_s(&powerDC, sizeof(uint32_t), vResponses[6].dataBuffer, sizeof(uint32_t)); + pSustained[count].enabled = true; + pSustained[count].limit = powerDC; + pSustained[count].enabledStateLocked = true; + pSustained[count].intervalValueLocked = true; + pSustained[count].limitValueLocked = false; + pSustained[count].source = ZES_POWER_SOURCE_BATTERY; + pSustained[count].level = ZES_POWER_LEVEL_PEAK; + pSustained[count].limitUnit = ZES_LIMIT_UNIT_POWER; + pSustained[count].interval = 0; + count++; + } + } + *pCount = count; return result; } @@ -519,11 +547,20 @@ ze_result_t WddmPowerImp::setLimitsExt(uint32_t *pCount, zes_power_limit_ext_des return status; } } else if (pSustained[i].level == ZES_POWER_LEVEL_PEAK) { - request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Ac; - memcpy_s(request.dataBuffer, sizeof(uint32_t), &pSustained[i].limit, sizeof(uint32_t)); - status = pKmdSysManager->requestSingle(request, response); - if (status != ZE_RESULT_SUCCESS) { - return status; + if (pSustained[i].source == ZES_POWER_SOURCE_MAINS) { + request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Ac; + memcpy_s(request.dataBuffer, sizeof(uint32_t), &pSustained[i].limit, sizeof(uint32_t)); + status = pKmdSysManager->requestSingle(request, response); + if (status != ZE_RESULT_SUCCESS) { + return status; + } + } else if (pSustained[i].source == ZES_POWER_SOURCE_BATTERY) { + request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Dc; + memcpy_s(request.dataBuffer, sizeof(uint32_t), &pSustained[i].limit, sizeof(uint32_t)); + status = pKmdSysManager->requestSingle(request, response); + if (status != ZE_RESULT_SUCCESS) { + return status; + } } } else { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; diff --git a/level_zero/sysman/test/unit_tests/sources/power/windows/mock_power.h b/level_zero/sysman/test/unit_tests/sources/power/windows/mock_power.h index ddcbae334a..eac617084c 100644 --- a/level_zero/sysman/test/unit_tests/sources/power/windows/mock_power.h +++ b/level_zero/sysman/test/unit_tests/sources/power/windows/mock_power.h @@ -12,7 +12,7 @@ namespace L0 { namespace Sysman { namespace ult { -constexpr uint32_t mockLimitCount = 3u; +constexpr uint32_t mockLimitCount = 4u; struct PowerKmdSysManager : public MockKmdSysManager { diff --git a/level_zero/sysman/test/unit_tests/sources/power/windows/test_zes_sysman_power.cpp b/level_zero/sysman/test/unit_tests/sources/power/windows/test_zes_sysman_power.cpp index 025b5e78c5..76cc73bb5a 100644 --- a/level_zero/sysman/test/unit_tests/sources/power/windows/test_zes_sysman_power.cpp +++ b/level_zero/sysman/test/unit_tests/sources/power/windows/test_zes_sysman_power.cpp @@ -399,9 +399,13 @@ TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandlesWhenCallingSetAndGetPower EXPECT_FALSE(allLimits[i].limitValueLocked); EXPECT_TRUE(allLimits[i].enabledStateLocked); EXPECT_TRUE(allLimits[i].intervalValueLocked); - EXPECT_EQ(ZES_POWER_SOURCE_ANY, allLimits[i].source); EXPECT_EQ(ZES_LIMIT_UNIT_POWER, allLimits[i].limitUnit); allLimits[i].limit = testLimit; + if (allLimits[i].source == ZES_POWER_SOURCE_MAINS) { + EXPECT_EQ(ZES_POWER_SOURCE_MAINS, allLimits[i].source); + } else { + EXPECT_EQ(ZES_POWER_SOURCE_BATTERY, allLimits[i].source); + } } else if (allLimits[i].level == ZES_POWER_LEVEL_BURST) { EXPECT_FALSE(allLimits[i].limitValueLocked); EXPECT_TRUE(allLimits[i].enabledStateLocked); @@ -438,7 +442,7 @@ TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenCallingGetAnsSetPowerL std::vector allLimits(limitCount); EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, allLimits.data())); - std::vector requestId = {KmdSysman::Requests::Power::PowerLimit1Enabled, KmdSysman::Requests::Power::CurrentPowerLimit1, KmdSysman::Requests::Power::CurrentPowerLimit1Tau, KmdSysman::Requests::Power::PowerLimit2Enabled, KmdSysman::Requests::Power::CurrentPowerLimit2, KmdSysman::Requests::Power::CurrentPowerLimit4Ac}; + std::vector requestId = {KmdSysman::Requests::Power::PowerLimit1Enabled, KmdSysman::Requests::Power::CurrentPowerLimit1, KmdSysman::Requests::Power::CurrentPowerLimit1Tau, KmdSysman::Requests::Power::PowerLimit2Enabled, KmdSysman::Requests::Power::CurrentPowerLimit2, KmdSysman::Requests::Power::CurrentPowerLimit4Ac, KmdSysman::Requests::Power::CurrentPowerLimit4Dc}; for (auto it = requestId.begin(); it != requestId.end(); it++) { pKmdSysManager->mockPowerFailure[*it] = 1; uint32_t count = limitCount; @@ -447,7 +451,7 @@ TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenCallingGetAnsSetPowerL } EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, allLimits.data())); - requestId = {KmdSysman::Requests::Power::CurrentPowerLimit1, KmdSysman::Requests::Power::CurrentPowerLimit1Tau, KmdSysman::Requests::Power::CurrentPowerLimit2, KmdSysman::Requests::Power::CurrentPowerLimit4Ac}; + requestId = {KmdSysman::Requests::Power::CurrentPowerLimit1, KmdSysman::Requests::Power::CurrentPowerLimit1Tau, KmdSysman::Requests::Power::CurrentPowerLimit2, KmdSysman::Requests::Power::CurrentPowerLimit4Ac, KmdSysman::Requests::Power::CurrentPowerLimit4Dc}; for (auto it = requestId.begin(); it != requestId.end(); it++) { pKmdSysManager->mockPowerFailure[*it] = 1; EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, zesPowerSetLimitsExt(handle, &limitCount, allLimits.data())); diff --git a/level_zero/tools/test/black_box_tests/zello_sysman.cpp b/level_zero/tools/test/black_box_tests/zello_sysman.cpp index ebae97f575..abea98a37a 100644 --- a/level_zero/tools/test/black_box_tests/zello_sysman.cpp +++ b/level_zero/tools/test/black_box_tests/zello_sysman.cpp @@ -196,6 +196,14 @@ void getSysmanDeviceHandles(zes_driver_handle_t &sysmanDriverHandle, std::vector VALIDATECALL(zesDeviceGet(sysmanDriverHandle, &deviceCount, sysmanDevices.data())); } +std::string getPowerLimitSourceType(zes_power_source_t type) { + static const std::map powerLimitsSourceTypeMap{ + {ZES_POWER_SOURCE_ANY, "ZES_POWER_SOURCE_ANY"}, + {ZES_POWER_SOURCE_MAINS, "ZES_POWER_SOURCE_MAINS"}, + {ZES_POWER_SOURCE_BATTERY, "ZES_POWER_SOURCE_BATTERY"}}; + return powerLimitsSourceTypeMap.at(type); +} + void getPowerLimits(const zes_pwr_handle_t &handle) { uint32_t limitCount = 0; VALIDATECALL(zesPowerGetLimitsExt(handle, &limitCount, nullptr)); @@ -227,7 +235,7 @@ void getPowerLimits(const zes_pwr_handle_t &handle) { std::cout << "powerLimit.intervalValueLocked = " << +allLimits[i].intervalValueLocked << std::endl; std::cout << "powerLimit.enabledStateLocked = " << +allLimits[i].enabledStateLocked << std::endl; std::cout << "powerLimit.limitValueLocked = " << +allLimits[i].limitValueLocked << std::endl; - std::cout << "powerLimit.source = " << allLimits[i].source << std::endl; + std::cout << "powerLimit.source = " << getPowerLimitSourceType(allLimits[i].source) << std::endl; std::cout << "powerLimit.limitUnit = " << allLimits[i].limitUnit << std::endl; std::cout << "powerLimit.limit = " << allLimits[i].limit << std::endl; std::cout << "powerLimit.interval = " << allLimits[i].interval << std::endl;