Update zesPowerGetEnergyCounter to return 64BitEnergyCounter in micro joules

Signed-off-by: sairamud <sairam.udaya.janardhana.muttavarapu@intel.com>
This commit is contained in:
sairamud 2022-08-24 07:46:57 +00:00 committed by Compute-Runtime-Automation
parent a3b3f3e86e
commit 0d6ad522cb
4 changed files with 20 additions and 27 deletions

View File

@ -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<KmdSysman::RequestProperty> vRequests = {};
std::vector<KmdSysman::ResponseProperty> 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<double>(valueCounter) / static_cast<double>(conversionUnit);
valueConverted *= static_cast<double>(convertJouleToMicroJoule);
pEnergy->energy = static_cast<uint64_t>(valueConverted);
memcpy_s(&valueTimeStamp, sizeof(uint64_t), (vResponses[1].dataBuffer + sizeof(uint32_t)), sizeof(uint64_t));
}
if (vResponses[2].returnCode == KmdSysman::Success) {
memcpy_s(&timestampFrequency, sizeof(uint32_t), vResponses[2].dataBuffer, sizeof(uint32_t));
memcpy_s(&timestampFrequency, sizeof(uint32_t), vResponses[1].dataBuffer, sizeof(uint32_t));
double timeFactor = 1.0 / static_cast<double>(timestampFrequency);
timeFactor = static_cast<double>(valueTimeStamp) * timeFactor;
timeFactor *= static_cast<double>(microFacor);

View File

@ -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,
};

View File

@ -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<PowerKmdSysManager> : 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<PowerKmdSysManager> : public PowerKmdSysManager {
pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess;
pResponse->outDataSize = sizeof(uint32_t);
} break;
case KmdSysman::Requests::Power::CurrentEnergyCounter64Bit: {
uint64_t *pValueCounter = reinterpret_cast<uint64_t *>(pBuffer);
uint64_t *pValueTS = reinterpret_cast<uint64_t *>(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;

View File

@ -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<double>(pKmdSysManager->mockEnergyCounter) / static_cast<double>(conversionUnit);
valueConverted *= static_cast<double>(convertJouleToMicroJoule);
uint64_t mockEnergytoMicroJoules = static_cast<uint64_t>(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));
}
}