mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 23:03:02 +08:00
feature(sysman): Modify getEnergyCounter method implementation
Related-To: NEO-14011 Signed-off-by: Anvesh Bakwad <anvesh.bakwad@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
29b3cb3c85
commit
e815da1e4f
@@ -33,11 +33,16 @@ inline static int mockStatFailure(const std::string &filePath, struct stat *stat
|
||||
return -1;
|
||||
}
|
||||
|
||||
inline static int mockStatSuccess(const std::string &filePath, struct stat *statbuf) noexcept {
|
||||
inline static int mockStatFailure2(const std::string &filePath, struct stat *statbuf) noexcept {
|
||||
statbuf->st_mode = S_IWUSR | S_IRUSR;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline static int mockStatSuccess(const std::string &filePath, struct stat *statbuf) noexcept {
|
||||
statbuf->st_mode = S_IWUSR | S_IRUSR | S_IFREG;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline static int mockStatNoPermissions(const std::string &filePath, struct stat *statbuf) noexcept {
|
||||
statbuf->st_mode = 0;
|
||||
return 0;
|
||||
@@ -235,6 +240,7 @@ TEST_F(SysmanDeviceFixture, GivenPublicFsAccessClassWhenCallingCanWriteWithInval
|
||||
|
||||
TEST_F(SysmanDeviceFixture, GivenValidPathnameWhenCallingFsAccessExistsThenSuccessIsReturned) {
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
auto fsAccess = &pLinuxSysmanImp->getFsAccess();
|
||||
|
||||
char cwd[PATH_MAX];
|
||||
@@ -242,7 +248,24 @@ TEST_F(SysmanDeviceFixture, GivenValidPathnameWhenCallingFsAccessExistsThenSucce
|
||||
EXPECT_TRUE(fsAccess->fileExists(path));
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFixture, GivenStatCallFailsWhenCallingFsAccessExistsThenErrorIsReturned) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatFailure);
|
||||
auto fsAccess = &pLinuxSysmanImp->getSysfsAccess();
|
||||
|
||||
std::string path = "";
|
||||
EXPECT_FALSE(fsAccess->fileExists(path));
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFixture, GivenPathIsNotOfFileTypeWhenCallingFsAccessExistsThenErrorIsReturned) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatFailure2);
|
||||
auto fsAccess = &pLinuxSysmanImp->getSysfsAccess();
|
||||
|
||||
std::string path = "";
|
||||
EXPECT_FALSE(fsAccess->fileExists(path));
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFixture, GivenInvalidPathnameWhenCallingFsAccessExistsThenErrorIsReturned) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
auto fsAccess = &pLinuxSysmanImp->getFsAccess();
|
||||
|
||||
std::string path = "noSuchFileOrDirectory";
|
||||
@@ -417,6 +440,7 @@ TEST_F(SysmanDeviceFixture, GivenSysfsAccessClassAndOpenSysCallFailsWhenCallingR
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFixture, GivenValidPidWhenCallingProcfsAccessIsAliveThenSuccessIsReturned) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&SysCalls::allowFakeDevicePath, true);
|
||||
auto procfsAccess = &pLinuxSysmanImp->getProcfsAccess();
|
||||
|
||||
|
||||
@@ -43,11 +43,21 @@ constexpr uint32_t mockDefaultPowerLimitVal = 600000000;
|
||||
constexpr uint64_t mockMinPowerLimitVal = 300000000;
|
||||
constexpr uint64_t mockMaxPowerLimitVal = 600000000;
|
||||
|
||||
const std::string realPathTelem = "/sys/devices/pci0000:89/0000:89:02.0/0000:8a:00.0/0000:8b:02.0/0000:8e:00.1/pmt_telemetry.1.auto/intel_pmt/telem1";
|
||||
const std::string sysfsPathTelem = "/sys/class/intel_pmt/telem1";
|
||||
const std::string telemOffsetFileName("/sys/class/intel_pmt/telem1/offset");
|
||||
const std::string telemGuidFileName("/sys/class/intel_pmt/telem1/guid");
|
||||
const std::string telemFileName("/sys/class/intel_pmt/telem1/telem");
|
||||
const std::string realPathTelem1 = "/sys/devices/pci0000:89/0000:89:02.0/0000:8a:00.0/0000:8b:02.0/0000:8e:00.1/pmt_telemetry.1.auto/intel_pmt/telem1";
|
||||
const std::string realPathTelem2 = "/sys/devices/pci0000:89/0000:89:02.0/0000:8a:00.0/0000:8b:02.0/0000:8e:00.1/pmt_telemetry.1.auto/intel_pmt/telem2";
|
||||
const std::string realPathTelem3 = "/sys/devices/pci0000:89/0000:89:02.0/0000:8a:00.0/0000:8b:02.0/0000:8e:00.1/pmt_telemetry.1.auto/intel_pmt/telem3";
|
||||
const std::string sysfsPathTelem1 = "/sys/class/intel_pmt/telem1";
|
||||
const std::string sysfsPathTelem2 = "/sys/class/intel_pmt/telem2";
|
||||
const std::string sysfsPathTelem3 = "/sys/class/intel_pmt/telem3";
|
||||
const std::string telem1OffsetFileName("/sys/class/intel_pmt/telem1/offset");
|
||||
const std::string telem1GuidFileName("/sys/class/intel_pmt/telem1/guid");
|
||||
const std::string telem1TelemFileName("/sys/class/intel_pmt/telem1/telem");
|
||||
const std::string telem2OffsetFileName("/sys/class/intel_pmt/telem2/offset");
|
||||
const std::string telem2GuidFileName("/sys/class/intel_pmt/telem2/guid");
|
||||
const std::string telem2TelemFileName("/sys/class/intel_pmt/telem2/telem");
|
||||
const std::string telem3OffsetFileName("/sys/class/intel_pmt/telem3/offset");
|
||||
const std::string telem3GuidFileName("/sys/class/intel_pmt/telem3/guid");
|
||||
const std::string telem3TelemFileName("/sys/class/intel_pmt/telem3/telem");
|
||||
|
||||
struct MockPowerSysfsAccessInterface : public L0::Sysman::SysFsAccessInterface {
|
||||
|
||||
@@ -56,10 +66,17 @@ struct MockPowerSysfsAccessInterface : public L0::Sysman::SysFsAccessInterface {
|
||||
ze_result_t mockWriteResult = ZE_RESULT_SUCCESS;
|
||||
ze_result_t mockReadIntResult = ZE_RESULT_SUCCESS;
|
||||
ze_result_t mockWritePeakLimitResult = ZE_RESULT_SUCCESS;
|
||||
ze_result_t mockscanDirEntriesResult = ZE_RESULT_SUCCESS;
|
||||
std::vector<ze_result_t> mockscanDirEntriesResult{};
|
||||
std::vector<ze_result_t> mockReadValUnsignedLongResult{};
|
||||
std::vector<ze_result_t> mockWriteUnsignedResult{};
|
||||
|
||||
uint64_t sustainedPowerLimitVal = 0;
|
||||
uint64_t criticalPowerLimitVal = 0;
|
||||
int32_t sustainedPowerLimitIntervalVal = 0;
|
||||
bool isEnergyCounterFilePresent = true;
|
||||
bool isSustainedPowerLimitFilePresent = true;
|
||||
bool isCriticalPowerLimitFilePresent = true;
|
||||
|
||||
ze_result_t getValString(const std::string file, std::string &val) {
|
||||
ze_result_t result = ZE_RESULT_ERROR_UNKNOWN;
|
||||
if (file.compare(i915HwmonDir + "/" + "name") == 0) {
|
||||
@@ -80,10 +97,6 @@ struct MockPowerSysfsAccessInterface : public L0::Sysman::SysFsAccessInterface {
|
||||
return result;
|
||||
}
|
||||
|
||||
uint64_t sustainedPowerLimitVal = 0;
|
||||
uint64_t criticalPowerLimitVal = 0;
|
||||
int32_t sustainedPowerLimitIntervalVal = 0;
|
||||
|
||||
ze_result_t getValUnsignedLongHelper(const std::string file, uint64_t &val);
|
||||
ze_result_t getValUnsignedLong(const std::string file, uint64_t &val) {
|
||||
ze_result_t result = ZE_RESULT_SUCCESS;
|
||||
@@ -225,13 +238,29 @@ struct MockPowerSysfsAccessInterface : public L0::Sysman::SysFsAccessInterface {
|
||||
}
|
||||
|
||||
ze_result_t scanDirEntries(const std::string file, std::vector<std::string> &listOfEntries) override {
|
||||
if (mockscanDirEntriesResult != ZE_RESULT_SUCCESS) {
|
||||
return mockscanDirEntriesResult;
|
||||
if (!mockscanDirEntriesResult.empty()) {
|
||||
ze_result_t result = mockscanDirEntriesResult.front();
|
||||
mockscanDirEntriesResult.erase(mockscanDirEntriesResult.begin());
|
||||
if (result != ZE_RESULT_SUCCESS) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return getscanDirEntries(file, listOfEntries);
|
||||
}
|
||||
|
||||
bool fileExists(const std::string file) override {
|
||||
if (file.find(energyCounterNode) != std::string::npos) {
|
||||
return isEnergyCounterFilePresent;
|
||||
} else if (file.find(sustainedPowerLimit) != std::string::npos) {
|
||||
return isSustainedPowerLimitFilePresent;
|
||||
} else if (file.find(criticalPowerLimit1) != std::string::npos) {
|
||||
return isCriticalPowerLimitFilePresent;
|
||||
} else if (file.find(criticalPowerLimit2) != std::string::npos) {
|
||||
return isCriticalPowerLimitFilePresent;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
MockPowerSysfsAccessInterface() = default;
|
||||
};
|
||||
|
||||
@@ -262,8 +291,8 @@ class SysmanDevicePowerFixtureI915 : public SysmanDeviceFixture {
|
||||
pSysmanKmdInterface->pFsAccess.reset(pFsAccess);
|
||||
pSysmanKmdInterface->pSysfsAccess.reset(pSysfsAccess);
|
||||
pLinuxSysmanImp->pSysmanKmdInterface.reset(pSysmanKmdInterface);
|
||||
pSysfsAccess->mockscanDirEntriesResult.push_back(ZE_RESULT_SUCCESS);
|
||||
pLinuxSysmanImp->pFsAccess = pFsAccess;
|
||||
getPowerHandles(0);
|
||||
}
|
||||
void TearDown() override {
|
||||
SysmanDeviceFixture::TearDown();
|
||||
@@ -303,6 +332,7 @@ class SysmanDevicePowerMultiDeviceFixture : public SysmanMultiDeviceFixture {
|
||||
pSysfsAccess = new MockPowerSysfsAccessInterface();
|
||||
pSysmanKmdInterface->pSysfsAccess.reset(pSysfsAccess);
|
||||
pLinuxSysmanImp->pSysmanKmdInterface.reset(pSysmanKmdInterface);
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess;
|
||||
}
|
||||
void TearDown() override {
|
||||
SysmanMultiDeviceFixture::TearDown();
|
||||
|
||||
@@ -60,6 +60,76 @@ TEST_F(SysmanDevicePowerFixtureI915, GivenPowerHandlesListContainsCardDomainHand
|
||||
EXPECT_EQ(zesDeviceGetCardPowerDomain(device->toHandle(), &phPower), ZE_RESULT_SUCCESS);
|
||||
}
|
||||
|
||||
TEST_F(SysmanDevicePowerFixtureI915, GivenHwmonDirectoriesDoesNotExistWhenGettingPowerHandlesThenNoHandlesAreReturned) {
|
||||
pSysfsAccess->mockscanDirEntriesResult.clear();
|
||||
pSysfsAccess->mockscanDirEntriesResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
pSysfsAccess->mockscanDirEntriesResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
|
||||
uint32_t count = 0;
|
||||
EXPECT_EQ(zesDeviceEnumPowerDomains(device->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS);
|
||||
EXPECT_EQ(count, 0u);
|
||||
}
|
||||
|
||||
TEST_F(SysmanDevicePowerFixtureI915, GivenHwmonDirectoriesDoesNotContainNameFileWhenGettingPowerHandlesThenNoHandlesAreReturned) {
|
||||
pSysfsAccess->mockReadResult = ZE_RESULT_ERROR_NOT_AVAILABLE;
|
||||
|
||||
uint32_t count = 0;
|
||||
EXPECT_EQ(zesDeviceEnumPowerDomains(device->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS);
|
||||
EXPECT_EQ(count, 0u);
|
||||
}
|
||||
|
||||
TEST_F(SysmanDevicePowerFixtureI915, GivenPowerHandleWithUnknownPowerDomainWhenIsPowerModuleSupportedIsCalledThenFalseValueIsReturned) {
|
||||
uint32_t subdeviceId = 0;
|
||||
ze_bool_t onSubdevice = false;
|
||||
auto pPowerImp = std::make_unique<PublicLinuxPowerImp>(pOsSysman, onSubdevice, subdeviceId, ZES_POWER_DOMAIN_UNKNOWN);
|
||||
pPowerImp->pSysfsAccess = pSysfsAccess;
|
||||
EXPECT_FALSE(pPowerImp->isPowerModuleSupported());
|
||||
}
|
||||
|
||||
TEST_F(SysmanDevicePowerFixtureI915, GivenTelemetrySupportAndEnergyCounterNodeExistanceStatesWhenIsPowerModuleSupportedIsCalledForSubdeviceHandleThenCorrectSupportStatusIsReturnedForPackageDomain) {
|
||||
auto pPowerImp = std::make_unique<PublicLinuxPowerImp>(pOsSysman, true, 0, ZES_POWER_DOMAIN_PACKAGE);
|
||||
|
||||
// Loop through all combinations of the three boolean flags (false/true) for the file existence
|
||||
for (bool isPackageEnergyCounterFilePresent : {false, true}) {
|
||||
for (bool isTelemetrySupportAvailable : {false, true}) {
|
||||
// Set the file existence flags based on the current combination
|
||||
pSysfsAccess->isEnergyCounterFilePresent = isPackageEnergyCounterFilePresent;
|
||||
pPowerImp->isTelemetrySupportAvailable = isTelemetrySupportAvailable;
|
||||
// The expected result is true if at least one of the path is present
|
||||
bool expected = (isTelemetrySupportAvailable || isPackageEnergyCounterFilePresent);
|
||||
|
||||
// Verify if the power module is supported as expected
|
||||
EXPECT_EQ(pPowerImp->isPowerModuleSupported(), expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(SysmanDevicePowerFixtureI915, GivenVariousPowerLimitFileExistanceStatesWhenIsPowerModuleSupportedIsCalledForRootDeviceHandleThenCorrectSupportStatusIsReturnedForPackageDomain) {
|
||||
auto pPowerImp = std::make_unique<PublicLinuxPowerImp>(pOsSysman, false, 0, ZES_POWER_DOMAIN_PACKAGE);
|
||||
|
||||
// Loop through all combinations of the three boolean flags (false/true) for the file existence
|
||||
for (bool isPackageEnergyCounterFilePresent : {false, true}) {
|
||||
for (bool isTelemetrySupportAvailable : {false, true}) {
|
||||
for (bool isPackagedSustainedPowerLimitFilePresent : {false, true}) {
|
||||
for (bool isPackageCriticalPowerLimit2Present : {false, true}) {
|
||||
// Set the file existence flags based on the current combination
|
||||
pPowerImp->isTelemetrySupportAvailable = isTelemetrySupportAvailable;
|
||||
pSysfsAccess->isEnergyCounterFilePresent = isPackageEnergyCounterFilePresent;
|
||||
pSysfsAccess->isSustainedPowerLimitFilePresent = isPackagedSustainedPowerLimitFilePresent;
|
||||
pSysfsAccess->isCriticalPowerLimitFilePresent = isPackageCriticalPowerLimit2Present;
|
||||
|
||||
// The expected result is true if at least one of the files is present
|
||||
bool expected = (isTelemetrySupportAvailable || isPackageEnergyCounterFilePresent ||
|
||||
isPackagedSustainedPowerLimitFilePresent || isPackageCriticalPowerLimit2Present);
|
||||
|
||||
// Verify if the power module is supported as expected
|
||||
EXPECT_EQ(pPowerImp->isPowerModuleSupported(), expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(SysmanDevicePowerFixtureI915, GivenValidPowerHandleWhenGettingPowerPropertiesWhenhwmonInterfaceExistsThenCallSucceeds) {
|
||||
MockSysmanProductHelper *pMockSysmanProductHelper = new MockSysmanProductHelper();
|
||||
pMockSysmanProductHelper->isPowerSetLimitSupportedResult = true;
|
||||
@@ -297,8 +367,8 @@ TEST_F(SysmanDevicePowerFixtureI915, GivenReadingToSysNodesFailsWhenCallingGetPo
|
||||
for (const auto &handle : pSysmanDeviceImp->pPowerHandleContext->handleList) {
|
||||
delete handle;
|
||||
}
|
||||
pSysfsAccess->mockReadValUnsignedLongResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
pSysfsAccess->mockReadValUnsignedLongResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
pSysfsAccess->isSustainedPowerLimitFilePresent = false;
|
||||
pSysfsAccess->isCriticalPowerLimitFilePresent = false;
|
||||
pSysmanDeviceImp->pPowerHandleContext->handleList.clear();
|
||||
pSysmanDeviceImp->pPowerHandleContext->init(pLinuxSysmanImp->getSubDeviceCount());
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenValidPowerHandleAndExtPro
|
||||
|
||||
TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenScanDirectoriesFailAndTelemetrySupportNotAvailableWhenGettingCardPowerThenFailureIsReturned) {
|
||||
|
||||
pSysfsAccess->mockscanDirEntriesResult = ZE_RESULT_ERROR_NOT_AVAILABLE;
|
||||
pSysfsAccess->mockscanDirEntriesResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
|
||||
for (const auto &handle : pSysmanDeviceImp->pPowerHandleContext->handleList) {
|
||||
delete handle;
|
||||
@@ -180,8 +180,8 @@ TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenReadingToSysNodesFailsWhe
|
||||
delete handle;
|
||||
}
|
||||
pSysmanDeviceImp->pPowerHandleContext->handleList.clear();
|
||||
pSysfsAccess->mockReadValUnsignedLongResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
pSysfsAccess->mockReadValUnsignedLongResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
pSysfsAccess->isSustainedPowerLimitFilePresent = false;
|
||||
pSysfsAccess->isCriticalPowerLimitFilePresent = false;
|
||||
pSysmanDeviceImp->pPowerHandleContext->init(pLinuxSysmanImp->getSubDeviceCount());
|
||||
|
||||
auto handles = getPowerHandles(powerHandleComponentCountMultiDevice);
|
||||
@@ -202,7 +202,9 @@ TEST_F(SysmanDevicePowerMultiDeviceFixtureHelper, GivenValidPowerHandleWhenGetti
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetProperties(handle, &properties));
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
ASSERT_EQ(ZE_RESULT_SUCCESS, zesPowerGetEnergyCounter(handle, &energyCounter));
|
||||
if (properties.subdeviceId == 0) {
|
||||
if (!properties.onSubdevice) {
|
||||
EXPECT_EQ(energyCounter.energy, expectedEnergyCounter);
|
||||
} else if (properties.subdeviceId == 0) {
|
||||
EXPECT_EQ(energyCounter.energy, expectedEnergyCounterTile0);
|
||||
} else if (properties.subdeviceId == 1) {
|
||||
EXPECT_EQ(energyCounter.energy, expectedEnergyCounterTile1);
|
||||
|
||||
@@ -256,6 +256,14 @@ TEST_F(SysmanFixtureDeviceI915Prelim, GivenSysmanKmdInterfaceInstanceWhenCalling
|
||||
EXPECT_STREQ("/sys/bus/pci/drivers/i915/unbind", pSysmanKmdInterface->getGpuUnBindEntry().c_str());
|
||||
}
|
||||
|
||||
TEST_F(SysmanFixtureDeviceI915Prelim, GivenSysmanKmdInterfaceWhenGetEnergyCounterNodeFileIsCalledForDifferentPowerDomainsThenProperPathIsReturned) {
|
||||
auto pSysmanKmdInterface = pLinuxSysmanImp->pSysmanKmdInterface.get();
|
||||
std::string expectedFilePath = "energy1_input";
|
||||
EXPECT_EQ(expectedFilePath, pSysmanKmdInterface->getEnergyCounterNodeFile(ZES_POWER_DOMAIN_PACKAGE));
|
||||
expectedFilePath = "";
|
||||
EXPECT_EQ(expectedFilePath, pSysmanKmdInterface->getEnergyCounterNodeFile(ZES_POWER_DOMAIN_CARD));
|
||||
}
|
||||
|
||||
} // namespace ult
|
||||
} // namespace Sysman
|
||||
} // namespace L0
|
||||
|
||||
@@ -268,6 +268,14 @@ TEST_F(SysmanFixtureDeviceI915Upstream, GivenSysmanKmdInterfaceInstanceWhenCalli
|
||||
EXPECT_STREQ("/sys/bus/pci/drivers/i915/unbind", pSysmanKmdInterface->getGpuUnBindEntry().c_str());
|
||||
}
|
||||
|
||||
TEST_F(SysmanFixtureDeviceI915Upstream, GivenSysmanKmdInterfaceWhenGetEnergyCounterNodeFileIsCalledForDifferentPowerDomainsThenProperPathIsReturned) {
|
||||
auto pSysmanKmdInterface = pLinuxSysmanImp->pSysmanKmdInterface.get();
|
||||
std::string expectedFilePath = "energy1_input";
|
||||
EXPECT_EQ(expectedFilePath, pSysmanKmdInterface->getEnergyCounterNodeFile(ZES_POWER_DOMAIN_PACKAGE));
|
||||
expectedFilePath = "";
|
||||
EXPECT_EQ(expectedFilePath, pSysmanKmdInterface->getEnergyCounterNodeFile(ZES_POWER_DOMAIN_CARD));
|
||||
}
|
||||
|
||||
} // namespace ult
|
||||
} // namespace Sysman
|
||||
} // namespace L0
|
||||
@@ -219,6 +219,15 @@ TEST_F(SysmanFixtureDeviceXe, GivenSysmanKmdInterfaceInstanceWhenCallingGpuBindA
|
||||
EXPECT_STREQ("/sys/bus/pci/drivers/xe/unbind", pSysmanKmdInterface->getGpuUnBindEntry().c_str());
|
||||
}
|
||||
|
||||
TEST_F(SysmanFixtureDeviceXe, GivenSysmanKmdInterfaceWhenGetEnergyCounterNodeFilePathIsCalledForDifferentPowerDomainsThenProperPathIsReturned) {
|
||||
auto pSysmanKmdInterface = pLinuxSysmanImp->pSysmanKmdInterface.get();
|
||||
std::string expectedFilePath = "energy1_input";
|
||||
EXPECT_EQ(expectedFilePath, pSysmanKmdInterface->getEnergyCounterNodeFile(ZES_POWER_DOMAIN_PACKAGE));
|
||||
expectedFilePath = "";
|
||||
EXPECT_EQ(expectedFilePath, pSysmanKmdInterface->getEnergyCounterNodeFile(ZES_POWER_DOMAIN_CARD));
|
||||
EXPECT_EQ(expectedFilePath, pSysmanKmdInterface->getEnergyCounterNodeFile(ZES_POWER_DOMAIN_UNKNOWN));
|
||||
}
|
||||
|
||||
} // namespace ult
|
||||
} // namespace Sysman
|
||||
} // namespace L0
|
||||
@@ -19,7 +19,7 @@ constexpr uint32_t powerHandleComponentCount = 1u;
|
||||
|
||||
static int mockReadLinkSuccess(const char *path, char *buf, size_t bufsize) {
|
||||
std::map<std::string, std::string> fileNameLinkMap = {
|
||||
{sysfsPathTelem, realPathTelem},
|
||||
{sysfsPathTelem1, realPathTelem1},
|
||||
};
|
||||
auto it = fileNameLinkMap.find(std::string(path));
|
||||
if (it != fileNameLinkMap.end()) {
|
||||
@@ -29,6 +29,26 @@ static int mockReadLinkSuccess(const char *path, char *buf, size_t bufsize) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mockReadLinkFailure(const char *path, char *buf, size_t bufsize) {
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mockOpenSuccess(const char *pathname, int flags) {
|
||||
int returnValue = -1;
|
||||
std::string strPathName(pathname);
|
||||
if ((strPathName == telem1OffsetFileName) || (strPathName == telem2OffsetFileName) || (strPathName == telem3OffsetFileName)) {
|
||||
returnValue = 4;
|
||||
} else if ((strPathName == telem1GuidFileName) || (strPathName == telem2GuidFileName) || (strPathName == telem3GuidFileName)) {
|
||||
returnValue = 5;
|
||||
} else if ((strPathName == telem1TelemFileName) || (strPathName == telem2TelemFileName) || (strPathName == telem3TelemFileName)) {
|
||||
returnValue = 6;
|
||||
} else if (strPathName.find(energyCounterNode) != std::string::npos) {
|
||||
returnValue = 7;
|
||||
}
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
static ssize_t mockReadSuccess(int fd, void *buf, size_t count, off_t offset) {
|
||||
std::ostringstream oStream;
|
||||
uint64_t val = 0;
|
||||
@@ -53,20 +73,9 @@ static ssize_t mockReadSuccess(int fd, void *buf, size_t count, off_t offset) {
|
||||
return count;
|
||||
}
|
||||
|
||||
static int mockOpenSuccess(const char *pathname, int flags) {
|
||||
|
||||
int returnValue = -1;
|
||||
std::string strPathName(pathname);
|
||||
if (strPathName == telemOffsetFileName) {
|
||||
returnValue = 4;
|
||||
} else if (strPathName == telemGuidFileName) {
|
||||
returnValue = 5;
|
||||
} else if (strPathName == telemFileName) {
|
||||
returnValue = 6;
|
||||
} else if (strPathName.find(energyCounterNode) != std::string::npos) {
|
||||
returnValue = 7;
|
||||
}
|
||||
return returnValue;
|
||||
inline static int mockStatSuccess(const std::string &filePath, struct stat *statbuf) noexcept {
|
||||
statbuf->st_mode = S_IWUSR | S_IRUSR | S_IFREG;
|
||||
return 0;
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidProductHelperHandleWhenCallingGetPowerLimitValueThenCorrectValueIsReturned, IsPVC) {
|
||||
@@ -134,113 +143,256 @@ HWTEST2_F(SysmanProductHelperPowerTest, GivenValidProductHelperHandleWhenCalling
|
||||
EXPECT_TRUE(pSysmanProductHelper->isPowerSetLimitSupported());
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenSysfsReadFailsAndKeyOffsetMapNotAvailableForGuidWhenGettingPowerEnergyCounterThenFailureIsReturned, IsDG1) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
std::ostringstream oStream;
|
||||
uint64_t val = 0;
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &val, count);
|
||||
return count;
|
||||
} else if (fd == 5) {
|
||||
oStream << "0xABCDE";
|
||||
} else if (fd == 7) {
|
||||
return -1;
|
||||
} else {
|
||||
oStream << "-1";
|
||||
}
|
||||
std::string value = oStream.str();
|
||||
memcpy(buf, value.data(), count);
|
||||
return count;
|
||||
});
|
||||
|
||||
std::unique_ptr<PublicLinuxPowerImp> pLinuxPowerImp(new PublicLinuxPowerImp(pOsSysman, false, 0, ZES_POWER_DOMAIN_PACKAGE));
|
||||
pLinuxPowerImp->isTelemetrySupportAvailable = true;
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidRootDevicePowerHandleForPackageDomainWithTelemetrySupportNotAvailableAndSysfsNodeReadFailsWhenGettingPowerEnergyCounterThenFailureIsReturned, IsPVC) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkFailure);
|
||||
pSysfsAccess->mockReadValUnsignedLongResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, pLinuxPowerImp->getEnergyCounter(&energyCounter));
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenSysfsReadFailsAndPmtReadValueFailsWhenGettingPowerEnergyCounterThenFailureIsReturned, IsDG1) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
std::ostringstream oStream;
|
||||
uint64_t val = 0;
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &val, count);
|
||||
return count;
|
||||
} else if (fd == 5) {
|
||||
oStream << "0x490e01";
|
||||
} else if (fd == 6) {
|
||||
if (offset == mockKeyOffset) {
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
} else if (fd == 7) {
|
||||
return -1;
|
||||
} else {
|
||||
oStream << "-1";
|
||||
}
|
||||
std::string value = oStream.str();
|
||||
memcpy(buf, value.data(), count);
|
||||
return count;
|
||||
});
|
||||
|
||||
std::unique_ptr<PublicLinuxPowerImp> pLinuxPowerImp(new PublicLinuxPowerImp(pOsSysman, false, 0, ZES_POWER_DOMAIN_PACKAGE));
|
||||
pLinuxPowerImp->isTelemetrySupportAvailable = true;
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, pLinuxPowerImp->getEnergyCounter(&energyCounter));
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenSysfsReadFailsWhenGettingPowerEnergyCounterThenSuccesIsReturned, IsDG1) {
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidRootDevicePowerHandleForPackageDomainWithTelemetryDataNotAvailableAndSysfsNodeReadAlsoFailsWhenGettingPowerEnergyCounterThenFailureIsReturned, IsPVC) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
uint64_t telem1Offset = 0;
|
||||
std::string validGuid = "0xb15a0ede";
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &telem1Offset, count);
|
||||
} else if (fd == 5) {
|
||||
memcpy(buf, validGuid.data(), count);
|
||||
}
|
||||
return count;
|
||||
});
|
||||
pSysfsAccess->mockReadValUnsignedLongResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
|
||||
std::unique_ptr<PublicLinuxPowerImp> pLinuxPowerImp(new PublicLinuxPowerImp(pOsSysman, false, 0, ZES_POWER_DOMAIN_PACKAGE));
|
||||
pLinuxPowerImp->isTelemetrySupportAvailable = true;
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, pLinuxPowerImp->getEnergyCounter(&energyCounter));
|
||||
uint64_t expectedEnergyCounter = convertJouleToMicroJoule * (setEnergyCounter / 1048576);
|
||||
EXPECT_EQ(energyCounter.energy, expectedEnergyCounter);
|
||||
std::unique_ptr<PublicLinuxPowerImp> pLinuxPowerImp(new PublicLinuxPowerImp(pOsSysman, false, 0, ZES_POWER_DOMAIN_PACKAGE));
|
||||
EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, pLinuxPowerImp->getEnergyCounter(&energyCounter));
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidPowerHandleAndHwMonDoesNotExistWhenGettingPowerLimitsThenUnsupportedFeatureErrorIsReturned, IsDG1) {
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidSubdevicePowerHandleForPackagePackageDomainWithTelemetrySupportNotAvailableAndSysfsNodeReadFailsWhenGettingPowerEnergyCounterThenFailureIsReturned, IsPVC) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkFailure);
|
||||
pSysfsAccess->mockReadValUnsignedLongResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
std::unique_ptr<PublicLinuxPowerImp> pLinuxPowerImp(new PublicLinuxPowerImp(pOsSysman, true, 0, ZES_POWER_DOMAIN_PACKAGE));
|
||||
EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, pLinuxPowerImp->getEnergyCounter(&energyCounter));
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidSubdevicePowerHandleForPackageDomainWithTelemetrySupportAvailableAndSysfsNodeReadFailsWhenGettingPowerEnergyCounterThenFailureIsReturned, IsPVC) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
uint64_t telem1Offset = 0;
|
||||
std::string validGuid = "0xb15a0ede";
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &telem1Offset, count);
|
||||
} else if (fd == 5) {
|
||||
memcpy(buf, validGuid.data(), count);
|
||||
}
|
||||
return count;
|
||||
});
|
||||
pSysfsAccess->mockReadValUnsignedLongResult.push_back(ZE_RESULT_ERROR_NOT_AVAILABLE);
|
||||
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
std::unique_ptr<PublicLinuxPowerImp> pLinuxPowerImp(new PublicLinuxPowerImp(pOsSysman, true, 0, ZES_POWER_DOMAIN_PACKAGE));
|
||||
EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, pLinuxPowerImp->getEnergyCounter(&energyCounter));
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidPowerHandlesWithTelemetrySupportNotAvailableButSysfsReadSucceedsWhenGettingPowerEnergyCounterThenValidPowerReadingsRetrievedFromSysfsNode, IsPVC) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
uint64_t telem1Offset = 0;
|
||||
std::string validGuid = "0xb15a0ede";
|
||||
|
||||
uint32_t count = 0;
|
||||
std::vector<zes_pwr_handle_t> handles(count, nullptr);
|
||||
EXPECT_EQ(zesDeviceEnumPowerDomains(pSysmanDevice->toHandle(), &count, handles.data()), ZE_RESULT_SUCCESS);
|
||||
EXPECT_EQ(count, powerHandleComponentCount);
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &telem1Offset, count);
|
||||
} else if (fd == 5) {
|
||||
memcpy(buf, validGuid.data(), count);
|
||||
} else if (fd == 6) {
|
||||
count = -1;
|
||||
}
|
||||
return count;
|
||||
});
|
||||
|
||||
auto handles = getPowerHandles(powerHandleComponentCount);
|
||||
|
||||
for (auto handle : handles) {
|
||||
ASSERT_NE(nullptr, handle);
|
||||
zes_power_sustained_limit_t sustained;
|
||||
zes_power_burst_limit_t burst;
|
||||
zes_power_peak_limit_t peak;
|
||||
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesPowerGetLimits(handle, &sustained, &burst, &peak));
|
||||
|
||||
zes_power_properties_t properties = {};
|
||||
zes_power_ext_properties_t extProperties = {};
|
||||
|
||||
properties.pNext = &extProperties;
|
||||
extProperties.stype = ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetProperties(handle, &properties));
|
||||
|
||||
EXPECT_EQ(ZES_POWER_DOMAIN_PACKAGE, extProperties.domain);
|
||||
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetEnergyCounter(handle, &energyCounter));
|
||||
EXPECT_EQ(energyCounter.energy, expectedEnergyCounter);
|
||||
}
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenScanDirectoriesFailAndTelemetrySupportAvailableThenPowerModuleIsSupported, IsDG1) {
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidPowerHandlesWithTelemetrySupportAvailableWhenGettingPowerEnergyCounterThenValidPowerReadingsRetrievedFromPmtNode, IsDG1) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
uint64_t telem1Offset = 0;
|
||||
std::string validGuid = "0x490e01";
|
||||
// uint32_t mockKeyValue = 0x3;
|
||||
|
||||
auto subDeviceCount = pLinuxSysmanImp->getSubDeviceCount();
|
||||
pSysmanDeviceImp->pPowerHandleContext->init(subDeviceCount);
|
||||
ze_bool_t onSubdevice = (subDeviceCount == 0) ? false : true;
|
||||
uint32_t subdeviceId = 0;
|
||||
std::unique_ptr<PublicLinuxPowerImp> pLinuxPowerImp(new PublicLinuxPowerImp(pOsSysman, onSubdevice, subdeviceId, ZES_POWER_DOMAIN_PACKAGE));
|
||||
EXPECT_TRUE(pLinuxPowerImp->isPowerModuleSupported());
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &telem1Offset, count);
|
||||
} else if (fd == 5) {
|
||||
memcpy(buf, validGuid.data(), count);
|
||||
} else if (fd == 6) {
|
||||
memcpy(buf, &setEnergyCounter, count);
|
||||
}
|
||||
return count;
|
||||
});
|
||||
|
||||
auto handles = getPowerHandles(powerHandleComponentCount);
|
||||
|
||||
for (auto handle : handles) {
|
||||
ASSERT_NE(nullptr, handle);
|
||||
|
||||
zes_power_properties_t properties = {};
|
||||
zes_power_ext_properties_t extProperties = {};
|
||||
|
||||
properties.pNext = &extProperties;
|
||||
extProperties.stype = ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetProperties(handle, &properties));
|
||||
|
||||
EXPECT_EQ(ZES_POWER_DOMAIN_PACKAGE, extProperties.domain);
|
||||
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetEnergyCounter(handle, &energyCounter));
|
||||
uint64_t expectedEnergyCounter = convertJouleToMicroJoule * (setEnergyCounter / 1048576);
|
||||
EXPECT_EQ(energyCounter.energy, expectedEnergyCounter);
|
||||
}
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidPowerHandlesWithTelemetrySupportNotAvailableButSysfsReadSucceedsWhenGettingPowerEnergyCounterThenValidPowerReadingsRetrievedFromSysfsNode, IsDG1) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
uint64_t telem1Offset = 0;
|
||||
std::string validGuid = "0x490e01";
|
||||
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &telem1Offset, count);
|
||||
} else if (fd == 5) {
|
||||
memcpy(buf, validGuid.data(), count);
|
||||
} else if (fd == 6) {
|
||||
count = -1;
|
||||
}
|
||||
return count;
|
||||
});
|
||||
|
||||
auto handles = getPowerHandles(powerHandleComponentCount);
|
||||
|
||||
for (auto handle : handles) {
|
||||
ASSERT_NE(nullptr, handle);
|
||||
|
||||
zes_power_properties_t properties = {};
|
||||
zes_power_ext_properties_t extProperties = {};
|
||||
|
||||
properties.pNext = &extProperties;
|
||||
extProperties.stype = ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetProperties(handle, &properties));
|
||||
|
||||
EXPECT_EQ(ZES_POWER_DOMAIN_PACKAGE, extProperties.domain);
|
||||
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetEnergyCounter(handle, &energyCounter));
|
||||
}
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidPowerHandlesWithTelemetrySupportAvailableWhenGettingPowerEnergyCounterThenValidPowerReadingsRetrievedFromPmtNode, IsDG2) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
uint64_t telem1Offset = 0;
|
||||
std::string validGuid = "0x4f9302";
|
||||
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &telem1Offset, count);
|
||||
} else if (fd == 5) {
|
||||
memcpy(buf, validGuid.data(), count);
|
||||
} else if (fd == 6) {
|
||||
memcpy(buf, &setEnergyCounter, count);
|
||||
}
|
||||
return count;
|
||||
});
|
||||
|
||||
auto handles = getPowerHandles(powerHandleComponentCount);
|
||||
|
||||
for (auto handle : handles) {
|
||||
ASSERT_NE(nullptr, handle);
|
||||
|
||||
zes_power_properties_t properties = {};
|
||||
zes_power_ext_properties_t extProperties = {};
|
||||
|
||||
properties.pNext = &extProperties;
|
||||
extProperties.stype = ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetProperties(handle, &properties));
|
||||
|
||||
EXPECT_EQ(ZES_POWER_DOMAIN_PACKAGE, extProperties.domain);
|
||||
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetEnergyCounter(handle, &energyCounter));
|
||||
uint64_t expectedEnergyCounter = convertJouleToMicroJoule * (setEnergyCounter / 1048576);
|
||||
EXPECT_EQ(energyCounter.energy, expectedEnergyCounter);
|
||||
}
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidPowerHandlesWithTelemetrySupportNotAvailableButSysfsReadSucceedsWhenGettingPowerEnergyCounterThenValidPowerReadingsRetrievedFromSysfsNode, IsDG2) {
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
uint64_t telem1Offset = 0;
|
||||
std::string validGuid = "0x4f9302";
|
||||
|
||||
if (fd == 4) {
|
||||
memcpy(buf, &telem1Offset, count);
|
||||
} else if (fd == 5) {
|
||||
memcpy(buf, validGuid.data(), count);
|
||||
} else if (fd == 6) {
|
||||
count = -1;
|
||||
}
|
||||
return count;
|
||||
});
|
||||
|
||||
auto handles = getPowerHandles(powerHandleComponentCount);
|
||||
for (auto handle : handles) {
|
||||
ASSERT_NE(nullptr, handle);
|
||||
|
||||
zes_power_properties_t properties = {};
|
||||
zes_power_ext_properties_t extProperties = {};
|
||||
|
||||
properties.pNext = &extProperties;
|
||||
extProperties.stype = ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetProperties(handle, &properties));
|
||||
|
||||
EXPECT_EQ(ZES_POWER_DOMAIN_PACKAGE, extProperties.domain);
|
||||
|
||||
zes_power_energy_counter_t energyCounter = {};
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetEnergyCounter(handle, &energyCounter));
|
||||
}
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerTest, GivenValidPowerHandleWhenSettingPowerLimitsThenUnsupportedFeatureErrorIsReturned, IsDG1) {
|
||||
@@ -579,77 +731,6 @@ HWTEST2_F(SysmanProductHelperPowerMultiDeviceTest, GivenValidPowerHandlesWhenCal
|
||||
}
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanProductHelperPowerMultiDeviceTest, GivenValidPowerHandlesWhenCallingSetAndGetPowerLimitExtThenLimitsSetEarlierAreRetrieved, IsDG1) {
|
||||
auto handles = getPowerHandles(powerHandleComponentCountMultiDevice);
|
||||
for (auto handle : handles) {
|
||||
ASSERT_NE(nullptr, handle);
|
||||
uint32_t limitCount = 0;
|
||||
const int32_t testLimit = 300000;
|
||||
const int32_t testInterval = 10;
|
||||
|
||||
zes_power_properties_t properties = {};
|
||||
zes_power_limit_ext_desc_t limits = {};
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetProperties(handle, &properties));
|
||||
|
||||
if (!properties.onSubdevice) {
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, nullptr));
|
||||
EXPECT_EQ(limitCount, mockLimitCount);
|
||||
} else {
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, &limits));
|
||||
EXPECT_EQ(limitCount, 0u);
|
||||
}
|
||||
|
||||
limitCount++;
|
||||
if (!properties.onSubdevice) {
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, nullptr));
|
||||
EXPECT_EQ(limitCount, mockLimitCount);
|
||||
} else {
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, nullptr));
|
||||
EXPECT_EQ(limitCount, 0u);
|
||||
}
|
||||
|
||||
std::vector<zes_power_limit_ext_desc_t> allLimits(limitCount);
|
||||
if (!properties.onSubdevice) {
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, allLimits.data()));
|
||||
} else {
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, allLimits.data()));
|
||||
EXPECT_EQ(limitCount, 0u);
|
||||
}
|
||||
for (uint32_t i = 0; i < limitCount; i++) {
|
||||
if (allLimits[i].level == ZES_POWER_LEVEL_SUSTAINED) {
|
||||
EXPECT_FALSE(allLimits[i].limitValueLocked);
|
||||
EXPECT_TRUE(allLimits[i].enabledStateLocked);
|
||||
EXPECT_FALSE(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;
|
||||
allLimits[i].interval = testInterval;
|
||||
} else if (allLimits[i].level == ZES_POWER_LEVEL_PEAK) {
|
||||
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 (!properties.onSubdevice) {
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerSetLimitsExt(handle, &limitCount, allLimits.data()));
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesPowerGetLimitsExt(handle, &limitCount, allLimits.data()));
|
||||
for (uint32_t i = 0; i < limitCount; i++) {
|
||||
if (allLimits[i].level == ZES_POWER_LEVEL_SUSTAINED) {
|
||||
EXPECT_EQ(testInterval, allLimits[i].interval);
|
||||
} else if (allLimits[i].level == ZES_POWER_LEVEL_PEAK) {
|
||||
EXPECT_EQ(0, allLimits[i].interval);
|
||||
}
|
||||
EXPECT_EQ(testLimit, allLimits[i].limit);
|
||||
}
|
||||
} else {
|
||||
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesPowerSetLimitsExt(handle, &limitCount, allLimits.data()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ult
|
||||
} // namespace Sysman
|
||||
} // namespace L0
|
||||
|
||||
@@ -40,6 +40,11 @@ static int mockReadLinkSingleTelemetryNodesSuccess(const char *path, char *buf,
|
||||
return -1;
|
||||
}
|
||||
|
||||
inline static int mockStatSuccess(const std::string &filePath, struct stat *statbuf) noexcept {
|
||||
statbuf->st_mode = S_IWUSR | S_IRUSR | S_IFREG;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mockOpenSuccess(const char *pathname, int flags) {
|
||||
int returnValue = -1;
|
||||
std::string strPathName(pathname);
|
||||
@@ -1022,6 +1027,7 @@ HWTEST2_F(SysmanProductHelperTemperatureTest, GivenValidTemperatureHandleWhenZes
|
||||
static uint32_t validTemperatureHandleCount = 3u;
|
||||
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSingleTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t {
|
||||
|
||||
@@ -175,11 +175,17 @@ static ssize_t mockReadSuccessDg2(int fd, void *buf, size_t count, off_t offset)
|
||||
return count;
|
||||
}
|
||||
|
||||
inline static int mockStatSuccess(const std::string &filePath, struct stat *statbuf) noexcept {
|
||||
statbuf->st_mode = S_IWUSR | S_IRUSR | S_IFREG;
|
||||
return 0;
|
||||
}
|
||||
|
||||
HWTEST2_F(SysmanMultiDeviceTemperatureFixture, GivenComponentCountZeroWhenCallingZetSysmanTemperatureGetThenZeroCountIsReturnedAndVerifySysmanTemperatureGetCallSucceeds, IsPVC) {
|
||||
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkMultiTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessPvc);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
uint32_t count = 0;
|
||||
@@ -203,6 +209,7 @@ HWTEST2_F(SysmanMultiDeviceTemperatureFixture, GivenValidTempHandleWhenGettingTe
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkMultiTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessPvc);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
auto handles = getTempHandles(handleComponentCountForTwoTileDevices);
|
||||
@@ -231,6 +238,7 @@ HWTEST2_F(SysmanMultiDeviceTemperatureFixture, GivenValidTempHandleWhenGettingTe
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkMultiTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessPvc);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
auto handles = getTempHandles(handleComponentCountForTwoTileDevices);
|
||||
@@ -246,6 +254,7 @@ HWTEST2_F(SysmanMultiDeviceTemperatureFixture, GivenValidTempHandleWhenSettingTe
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkMultiTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessPvc);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
auto handles = getTempHandles(handleComponentCountForTwoTileDevices);
|
||||
@@ -279,6 +288,7 @@ HWTEST2_F(SysmanDeviceTemperatureFixture, GivenValidPowerHandleAndHandleCountZer
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkMultiTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessPvc);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
uint32_t count = 0;
|
||||
@@ -299,6 +309,7 @@ HWTEST2_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingGPUAndG
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSingleTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessDg1);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
auto handles = getTempHandles(handleComponentCountForNoSubDevices);
|
||||
@@ -329,6 +340,7 @@ HWTEST2_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingGPUAndG
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkSingleTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessDg2);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
auto handles = getTempHandles(handleComponentCountForNoSubDevices);
|
||||
@@ -380,6 +392,7 @@ HWTEST2_F(SysmanDeviceTemperatureFixture, GivenComponentCountZeroWhenCallingZetS
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkMultiTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessPvc);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
uint32_t count = 0;
|
||||
@@ -403,6 +416,7 @@ HWTEST2_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingTempera
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsReadlink)> mockReadLink(&NEO::SysCalls::sysCallsReadlink, &mockReadLinkMultiTelemetryNodesSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccessPvc);
|
||||
VariableBackup<decltype(NEO::SysCalls::sysCallsStat)> mockStat(&NEO::SysCalls::sysCallsStat, &mockStatSuccess);
|
||||
VariableBackup<bool> allowFakeDevicePathBackup(&NEO::SysCalls::allowFakeDevicePath, true);
|
||||
|
||||
auto handles = getTempHandles(handleComponentCountForSingleTileDevice);
|
||||
|
||||
Reference in New Issue
Block a user