From 316389782dc67b6220745181d1876be98b9b7971 Mon Sep 17 00:00:00 2001 From: shubham kumar Date: Fri, 13 Dec 2024 05:01:30 +0000 Subject: [PATCH] fix: Decouple power handle creation from power limit support available Related-To: NEO-13185 Signed-off-by: shubham kumar --- .../api/power/windows/sysman_os_power_imp.cpp | 26 +++++++---- .../api/power/windows/sysman_os_power_imp.h | 1 + .../power/windows/test_zes_sysman_power.cpp | 45 ++++++++++++++++--- 3 files changed, 57 insertions(+), 15 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 9c5b43b174..e0133d79bf 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 @@ -244,10 +244,19 @@ ze_result_t WddmPowerImp::setEnergyThreshold(double threshold) { return pKmdSysManager->requestSingle(request, response); } -bool WddmPowerImp::isPowerModuleSupported() { +void WddmPowerImp::initPowerLimits() { if (supportsEnergyCounterOnly) { - return true; + return; } + + auto paramInfo = powerGroupToDomainTypeMap.find(this->powerDomain); + if (paramInfo == powerGroupToDomainTypeMap.end()) { + NEO::printDebugString(NEO::debugManager.flags.PrintDebugMessages.get(), stderr, + "Power Domain %u is not supported for KMD calls.\n", this->powerDomain); + DEBUG_BREAK_IF(true); + return; + } + powerLimitCount = 0; std::vector vRequests(3); std::vector vResponses = {}; @@ -255,7 +264,7 @@ bool WddmPowerImp::isPowerModuleSupported() { request.commandId = KmdSysman::Command::Get; request.componentId = KmdSysman::Component::PowerComponent; - request.paramInfo = static_cast(powerGroupToDomainTypeMap.at(this->powerDomain)); + request.paramInfo = static_cast(paramInfo->second); request.requestId = KmdSysman::Requests::Power::PowerLimit1Enabled; vRequests[0] = request; @@ -268,7 +277,7 @@ bool WddmPowerImp::isPowerModuleSupported() { ze_result_t status = pKmdSysManager->requestMultiple(vRequests, vResponses); if ((status != ZE_RESULT_SUCCESS) || (vResponses.size() != vRequests.size())) { - return status; + return; } ze_bool_t enabled; @@ -290,12 +299,10 @@ bool WddmPowerImp::isPowerModuleSupported() { powerLimitCount += 2; } } +} - if (powerLimitCount > 0) { - return true; - } else { - return false; - } +bool WddmPowerImp::isPowerModuleSupported() { + return true; } ze_result_t WddmPowerImp::getLimitsExt(uint32_t *pCount, zes_power_limit_ext_desc_t *pSustained) { @@ -521,6 +528,7 @@ WddmPowerImp::WddmPowerImp(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t pWddmSysmanImp = static_cast(pOsSysman); pKmdSysManager = &pWddmSysmanImp->getKmdSysManager(); isPowerHandleEnergyCounterOnly(); + initPowerLimits(); } std::vector OsPower::getNumberOfPowerDomainsSupported(OsSysman *pOsSysman) { diff --git a/level_zero/sysman/source/api/power/windows/sysman_os_power_imp.h b/level_zero/sysman/source/api/power/windows/sysman_os_power_imp.h index a9608e15f4..7e0c9bdd86 100644 --- a/level_zero/sysman/source/api/power/windows/sysman_os_power_imp.h +++ b/level_zero/sysman/source/api/power/windows/sysman_os_power_imp.h @@ -28,6 +28,7 @@ class WddmPowerImp : public OsPower, NEO::NonCopyableOrMovableClass { bool isPowerModuleSupported() override; void isPowerHandleEnergyCounterOnly(); + void initPowerLimits(); WddmPowerImp(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_power_domain_t powerDomain); WddmPowerImp() = default; ~WddmPowerImp() override = default; 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 a936069d40..f25b473254 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 @@ -77,16 +77,49 @@ TEST_F(SysmanDevicePowerFixture, GivenComponentCountZeroWhenEnumeratingPowerDoma EXPECT_EQ(count, 0u); } -TEST_F(SysmanDevicePowerFixture, GivenComponentCountZeroWhenEnumeratingPowerDomainWithUnexpectedValueFromKmdForDomainsSupportedThenValidCountIsReturnedAndVerifySysmanPowerGetCallSucceeds) { +TEST_F(SysmanDevicePowerFixture, GivenComponentCountZeroWhenEnumeratingPowerDomainWithUnexpectedReturnStatusFromKmdForPowerLimitsEnabledThenZesDeviceEnumPowerDomainsCallSucceedsAndProperHandleCountIsReturned) { init(true); - uint32_t count = 0; - pKmdSysManager->mockPowerFailure[KmdSysman::Requests::Power::NumPowerDomains] = 1; - EXPECT_EQ(zesDeviceEnumPowerDomains(pSysmanDevice->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS); - EXPECT_EQ(count, 0u); + pKmdSysManager->mockRequestMultiple = true; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumPowerDomains(pSysmanDevice->toHandle(), &count, nullptr)); + EXPECT_EQ(count, pKmdSysManager->mockPowerDomainCount); } -TEST_F(SysmanDevicePowerFixture, GivenComponentCountZeroWhenEnumeratingPowerDomainWithUnexpectedResponseFromKmdThenValidCountIsReturnedAndVerifySysmanPowerGetCallSucceeds) { +TEST_F(SysmanDevicePowerFixture, GivenComponentCountZeroWhenEnumeratingPowerDomainWithUnexpectedReturnSizeFromKmdForPowerLimitsEnabledThenZesDeviceEnumPowerDomainsCallSucceedsAndProperHandleCountIsReturned) { + init(true); + uint32_t count = 0; + pKmdSysManager->mockRequestMultiple = true; + pKmdSysManager->requestMultipleSizeDiff = true; + pKmdSysManager->mockRequestMultipleResult = ZE_RESULT_SUCCESS; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumPowerDomains(pSysmanDevice->toHandle(), &count, nullptr)); + EXPECT_EQ(count, pKmdSysManager->mockPowerDomainCount); +} + +TEST_F(SysmanDevicePowerFixture, GivenComponentCountZeroWhenEnumeratingPowerDomainWithPowerLimitsNotEnabledThenZesDeviceEnumPowerDomainsCallSucceedsAndProperHandleCountIsReturned) { + init(true); + + pKmdSysManager->mockPowerFailure[KmdSysman::Requests::Power::PowerLimit1Enabled] = 1; + pKmdSysManager->mockPowerFailure[KmdSysman::Requests::Power::PowerLimit2Enabled] = 1; + pKmdSysManager->mockPowerFailure[KmdSysman::Requests::Power::PowerLimit4Enabled] = 1; + + uint32_t count = 0; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumPowerDomains(pSysmanDevice->toHandle(), &count, nullptr)); + EXPECT_EQ(powerHandleComponentCount, count); +} + +TEST_F(SysmanDevicePowerFixture, GivenComponentCountZeroWhenEnumeratingPowerDomainWithNoPowerLimitsSupportAvailableThenZesDeviceEnumPowerDomainsCallSucceedsAndProperHandleCountIsReturned) { + init(true); + + pKmdSysManager->mockPowerLimit1Enabled = 0; + pKmdSysManager->mockPowerLimit2Enabled = 0; + pKmdSysManager->mockPowerLimit4Enabled = 0; + + uint32_t count = 0; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumPowerDomains(pSysmanDevice->toHandle(), &count, nullptr)); + EXPECT_EQ(powerHandleComponentCount, count); +} + +TEST_F(SysmanDevicePowerFixture, GivenComponentCountZeroWhenEnumeratingPowerDomainWithUnexpectedValueFromKmdForDomainsSupportedThenValidCountIsReturnedAndVerifySysmanPowerGetCallSucceeds) { init(true); uint32_t count = 0; pKmdSysManager->mockPowerDomainCount = 3;