diff --git a/level_zero/tools/source/sysman/power/windows/os_power_imp.cpp b/level_zero/tools/source/sysman/power/windows/os_power_imp.cpp index 9876187792..b50d548b1a 100644 --- a/level_zero/tools/source/sysman/power/windows/os_power_imp.cpp +++ b/level_zero/tools/source/sysman/power/windows/os_power_imp.cpp @@ -65,19 +65,16 @@ ze_result_t WddmPowerImp::getPropertiesExt(zes_power_ext_properties_t *pExtPoper } ze_result_t WddmPowerImp::getEnergyCounter(zes_power_energy_counter_t *pEnergy) { - uint32_t energyUnits = 0; + uint64_t energyCounter64Bit = 0; uint32_t timestampFrequency = 0; + uint64_t valueTimeStamp = 0; std::vector vRequests = {}; std::vector vResponses = {}; KmdSysman::RequestProperty request = {}; request.commandId = KmdSysman::Command::Get; request.componentId = KmdSysman::Component::PowerComponent; - - request.requestId = KmdSysman::Requests::Power::EnergyCounterUnits; - vRequests.push_back(request); - - request.requestId = KmdSysman::Requests::Power::CurrentEnergyCounter; + request.requestId = KmdSysman::Requests::Power::CurrentEnergyCounter64Bit; vRequests.push_back(request); request.commandId = KmdSysman::Command::Get; @@ -92,22 +89,13 @@ ze_result_t WddmPowerImp::getEnergyCounter(zes_power_energy_counter_t *pEnergy) } if (vResponses[0].returnCode == KmdSysman::Success) { - memcpy_s(&energyUnits, sizeof(uint32_t), vResponses[0].dataBuffer, sizeof(uint32_t)); + memcpy_s(&energyCounter64Bit, sizeof(uint64_t), vResponses[0].dataBuffer, sizeof(uint64_t)); + pEnergy->energy = energyCounter64Bit; + memcpy_s(&valueTimeStamp, sizeof(uint64_t), (vResponses[0].dataBuffer + sizeof(uint64_t)), sizeof(uint64_t)); } - uint32_t valueCounter = 0; - uint64_t valueTimeStamp = 0; if (vResponses[1].returnCode == KmdSysman::Success) { - memcpy_s(&valueCounter, sizeof(uint32_t), vResponses[1].dataBuffer, sizeof(uint32_t)); - uint32_t conversionUnit = (1 << energyUnits); - double valueConverted = static_cast(valueCounter) / static_cast(conversionUnit); - valueConverted *= static_cast(convertJouleToMicroJoule); - pEnergy->energy = static_cast(valueConverted); - memcpy_s(&valueTimeStamp, sizeof(uint64_t), (vResponses[1].dataBuffer + sizeof(uint32_t)), sizeof(uint64_t)); - } - - if (vResponses[2].returnCode == KmdSysman::Success) { - memcpy_s(×tampFrequency, sizeof(uint32_t), vResponses[2].dataBuffer, sizeof(uint32_t)); + memcpy_s(×tampFrequency, sizeof(uint32_t), vResponses[1].dataBuffer, sizeof(uint32_t)); double timeFactor = 1.0 / static_cast(timestampFrequency); timeFactor = static_cast(valueTimeStamp) * timeFactor; timeFactor *= static_cast(microFacor); diff --git a/level_zero/tools/source/sysman/windows/kmd_sys.h b/level_zero/tools/source/sysman/windows/kmd_sys.h index 07c787b563..1b271e225d 100644 --- a/level_zero/tools/source/sysman/windows/kmd_sys.h +++ b/level_zero/tools/source/sysman/windows/kmd_sys.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -128,6 +128,7 @@ enum Power { CurrentEnergyThreshold, DisableEnergyThreshold, CurrentEnergyCounter, + CurrentEnergyCounter64Bit, MaxPowerRequests, }; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/power/windows/mock_power.h b/level_zero/tools/test/unit_tests/sources/sysman/power/windows/mock_power.h index 6b9ffb1599..f4d8053b22 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/power/windows/mock_power.h +++ b/level_zero/tools/test/unit_tests/sources/sysman/power/windows/mock_power.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -33,7 +33,7 @@ struct Mock : public PowerKmdSysManager { uint32_t mockEnergyCounter = 3231121; uint32_t mockTimeStamp = 1123412412; uint32_t mockEnergyUnit = 14; - + uint64_t mockEnergyCounter64Bit = 32323232323232; uint32_t mockFrequencyTimeStamp = 38400000; void getActivityProperty(KmdSysman::GfxSysmanReqHeaderIn *pRequest, KmdSysman::GfxSysmanReqHeaderOut *pResponse) { @@ -145,6 +145,14 @@ struct Mock : public PowerKmdSysManager { pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess; pResponse->outDataSize = sizeof(uint32_t); } break; + case KmdSysman::Requests::Power::CurrentEnergyCounter64Bit: { + uint64_t *pValueCounter = reinterpret_cast(pBuffer); + uint64_t *pValueTS = reinterpret_cast(pBuffer + sizeof(uint64_t)); + *pValueCounter = mockEnergyCounter64Bit; + *pValueTS = mockTimeStamp; + pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess; + pResponse->outDataSize = sizeof(uint64_t) + sizeof(uint64_t); + } break; default: { pResponse->outDataSize = 0; pResponse->outReturnCode = KmdSysman::KmdSysmanFail; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/power/windows/test_zes_sysman_power.cpp b/level_zero/tools/test/unit_tests/sources/sysman/power/windows/test_zes_sysman_power.cpp index 86e4e48f15..2bf7346b71 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/power/windows/test_zes_sysman_power.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/power/windows/test_zes_sysman_power.cpp @@ -154,12 +154,8 @@ TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenGettingPowerEnergyCoun ze_result_t result = zesPowerGetEnergyCounter(handle, &energyCounter); - uint32_t conversionUnit = (1 << pKmdSysManager->mockEnergyUnit); - double valueConverted = static_cast(pKmdSysManager->mockEnergyCounter) / static_cast(conversionUnit); - valueConverted *= static_cast(convertJouleToMicroJoule); - uint64_t mockEnergytoMicroJoules = static_cast(valueConverted); EXPECT_EQ(ZE_RESULT_SUCCESS, result); - EXPECT_EQ(energyCounter.energy, mockEnergytoMicroJoules); + EXPECT_EQ(energyCounter.energy, pKmdSysManager->mockEnergyCounter64Bit); EXPECT_EQ(energyCounter.timestamp, convertTStoMicroSec(pKmdSysManager->mockTimeStamp, pKmdSysManager->mockFrequencyTimeStamp)); } }