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 bf1687f8ef..060abd0551 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(4); + std::vector vRequests(3); std::vector vResponses = {}; KmdSysman::RequestProperty request = {}; @@ -338,10 +338,8 @@ bool WddmPowerImp::isPowerModuleSupported() { request.requestId = KmdSysman::Requests::Power::PowerLimit2Enabled; vRequests[1] = request; - request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Ac; + request.requestId = KmdSysman::Requests::Power::PowerLimit4Enabled; vRequests[2] = request; - request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Dc; - vRequests[3] = request; ze_result_t status = pKmdSysManager->requestMultiple(vRequests, vResponses); @@ -349,8 +347,9 @@ bool WddmPowerImp::isPowerModuleSupported() { return status; } - for (uint32_t i = 0; i < vResponses.size() - 2; i++) { - ze_bool_t enabled = false; + ze_bool_t enabled; + for (uint32_t i = 0; i < vResponses.size() - 1; i++) { + enabled = false; if (vResponses[i].returnCode == KmdSysman::Success) { memcpy_s(&enabled, sizeof(ze_bool_t), vResponses[i].dataBuffer, sizeof(ze_bool_t)); } @@ -359,13 +358,13 @@ bool WddmPowerImp::isPowerModuleSupported() { } } - // CurrentPowerLimit4Ac is not a bool hence check for it individually + enabled = false; if (vResponses[2].returnCode == KmdSysman::Success) { - powerLimitCount++; - } - - if (vResponses[3].returnCode == KmdSysman::Success) { - powerLimitCount++; + memcpy_s(&enabled, sizeof(ze_bool_t), vResponses[2].dataBuffer, sizeof(ze_bool_t)); + if (enabled) { + // PowerLimit4Enabled controls AC and DC peak limit, hence increment the count by 2. + powerLimitCount += 2; + } } if (powerLimitCount > 0) { @@ -386,7 +385,7 @@ ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_des *pCount = std::min(*pCount, powerLimitCount); - std::vector vRequests(7); + std::vector vRequests(8); std::vector vResponses = {}; KmdSysman::RequestProperty request = {}; @@ -408,12 +407,15 @@ ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_des request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit2; vRequests[4] = request; - request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Ac; + request.requestId = KmdSysman::Requests::Power::PowerLimit4Enabled; vRequests[5] = request; - request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Dc; + request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Ac; vRequests[6] = request; + request.requestId = KmdSysman::Requests::Power::CurrentPowerLimit4Dc; + vRequests[7] = request; + ze_result_t status = pKmdSysManager->requestMultiple(vRequests, vResponses); if ((status != ZE_RESULT_SUCCESS) || (vResponses.size() != vRequests.size())) { @@ -474,11 +476,16 @@ ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_des } } // Peak AC - if (count < *pCount) { - if (vResponses[5].returnCode == KmdSysman::Success) { + enabled = false; + if (vResponses[5].returnCode == KmdSysman::Success) { + memcpy_s(&enabled, sizeof(ze_bool_t), vResponses[5].dataBuffer, sizeof(ze_bool_t)); + } + + if (count < *pCount && enabled) { + if (vResponses[6].returnCode == KmdSysman::Success) { uint32_t powerAC = 0; memset(&pSustained[count], 0, sizeof(zes_power_limit_ext_desc_t)); - memcpy_s(&powerAC, sizeof(uint32_t), vResponses[5].dataBuffer, sizeof(uint32_t)); + memcpy_s(&powerAC, sizeof(uint32_t), vResponses[6].dataBuffer, sizeof(uint32_t)); pSustained[count].enabled = true; pSustained[count].limit = powerAC; pSustained[count].enabledStateLocked = true; @@ -492,11 +499,11 @@ ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_des } } // Peak DC - if (count < *pCount) { - if (vResponses[6].returnCode == KmdSysman::Success) { + if (count < *pCount && enabled) { + if (vResponses[7].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)); + memcpy_s(&powerDC, sizeof(uint32_t), vResponses[7].dataBuffer, sizeof(uint32_t)); pSustained[count].enabled = true; pSustained[count].limit = powerDC; pSustained[count].enabledStateLocked = true; diff --git a/level_zero/sysman/source/shared/windows/product_helper/xe2_hpg_core/bmg/sysman_product_helper_bmg.cpp b/level_zero/sysman/source/shared/windows/product_helper/xe2_hpg_core/bmg/sysman_product_helper_bmg.cpp index 08b396ef44..8108821164 100644 --- a/level_zero/sysman/source/shared/windows/product_helper/xe2_hpg_core/bmg/sysman_product_helper_bmg.cpp +++ b/level_zero/sysman/source/shared/windows/product_helper/xe2_hpg_core/bmg/sysman_product_helper_bmg.cpp @@ -564,7 +564,7 @@ ze_result_t SysmanProductHelperHw::getMemoryBandWidth(zes_mem_bandwi // PMT reports maxBandwidth in units of 100 MBps (decimal). Need to convert it into Bytes/sec, unit to be returned by sysman. pBandwidth->maxBandwidth = static_cast(maxBandwidth) * megaBytesToBytes * 100; - // timestamp calcuation + // timestamp calculation uint32_t timeStampL = 0; uint32_t timeStampH = 0; diff --git a/level_zero/sysman/source/shared/windows/sysman_kmd_sys.h b/level_zero/sysman/source/shared/windows/sysman_kmd_sys.h index 3c2ece2ff2..1ff7b6a03c 100644 --- a/level_zero/sysman/source/shared/windows/sysman_kmd_sys.h +++ b/level_zero/sysman/source/shared/windows/sysman_kmd_sys.h @@ -131,6 +131,8 @@ enum Power { DisableEnergyThreshold, CurrentEnergyCounter, CurrentEnergyCounter64Bit, + PowerSupportedSubDevices, + PowerLimit4Enabled, MaxPowerRequests, }; 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 eac617084c..62f0c75bf0 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 @@ -19,6 +19,7 @@ struct PowerKmdSysManager : public MockKmdSysManager { uint32_t mockPowerDomainCount = 2; uint32_t mockPowerLimit1Enabled = 1; uint32_t mockPowerLimit2Enabled = 1; + uint32_t mockPowerLimit4Enabled = 1; int32_t mockPowerLimit1 = 25000; int32_t mockPowerLimit2 = 41000; int32_t mockTauPowerLimit1 = 20800; @@ -162,6 +163,12 @@ struct PowerKmdSysManager : public MockKmdSysManager { pResponse->outReturnCode = getReturnCode(pRequest->inRequestId); pResponse->outDataSize = sizeof(uint64_t) + sizeof(uint64_t); } break; + case KmdSysman::Requests::Power::PowerLimit4Enabled: { + uint32_t *pValue = reinterpret_cast(pBuffer); + *pValue = mockPowerLimit4Enabled; + pResponse->outReturnCode = getReturnCode(pRequest->inRequestId); + pResponse->outDataSize = sizeof(uint32_t); + } break; default: { pResponse->outDataSize = 0; pResponse->outReturnCode = KmdSysman::KmdSysmanFail; 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 76cc73bb5a..ac7cfc7352 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 @@ -428,7 +428,7 @@ TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandlesWhenCallingSetAndGetPower } } -TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenCallingGetAnsSetPowerLimitsExtThenProperValuesAreReturnedCoveringMutlipleBranches) { +TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenCallingGetAndSetPowerLimitsExtThenProperValuesAreReturnedCoveringMutlipleBranches) { // Setting allow set calls or not init(true); auto handles = getPowerHandles(powerHandleComponentCount); @@ -442,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, KmdSysman::Requests::Power::CurrentPowerLimit4Dc}; + 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::PowerLimit4Enabled, 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; @@ -477,6 +477,11 @@ TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenCallingGetAnsSetPowerL EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &count, allLimits.data())); pKmdSysManager->mockPowerLimit1Enabled = 1; + pKmdSysManager->mockPowerLimit4Enabled = 0; + count = mockLimitCount; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &count, allLimits.data())); + pKmdSysManager->mockPowerLimit4Enabled = 1; + allLimits[0].level = ZES_POWER_LEVEL_UNKNOWN; count = mockLimitCount; EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesPowerSetLimitsExt(handle, &count, allLimits.data()));