feature: Add support for Media frequncy Domain on linux

Related-To: LOCI-4552

Signed-off-by: Mayank Raghuwanshi <mayank.raghuwanshi@intel.com>
This commit is contained in:
Mayank Raghuwanshi
2023-06-20 11:15:02 +00:00
committed by Compute-Runtime-Automation
parent 46007dde5b
commit 085293b230
18 changed files with 230 additions and 5 deletions

View File

@@ -427,7 +427,20 @@ OsFrequency *OsFrequency::create(OsSysman *pOsSysman, ze_bool_t onSubdevice, uin
}
std::vector<zes_freq_domain_t> OsFrequency::getNumberOfFreqDomainsSupported(OsSysman *pOsSysman) {
std::vector<zes_freq_domain_t> freqDomains = {ZES_FREQ_DOMAIN_GPU};
LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman);
auto pDevice = Device::fromHandle(pLinuxSysmanImp->getSysmanDeviceImp()->hCoreDevice);
auto &productHelper = pDevice->getNEODevice()->getProductHelper();
auto releaseHelper = pDevice->getNEODevice()->getReleaseHelper();
std::vector<zes_freq_domain_t> freqDomains = {};
uint32_t mediaFreqTileIndex;
if (productHelper.getMediaFrequencyTileIndex(releaseHelper, mediaFreqTileIndex) == true) {
auto pSysfsAccess = &pLinuxSysmanImp->getSysfsAccess();
const std::string baseDir = "gt/gt" + std::to_string(mediaFreqTileIndex) + "/";
if (pSysfsAccess->directoryExists(baseDir)) {
freqDomains.push_back(ZES_FREQ_DOMAIN_MEDIA);
}
}
freqDomains.push_back(ZES_FREQ_DOMAIN_GPU);
return freqDomains;
}

View File

@@ -6,6 +6,8 @@
*/
#pragma once
#include "shared/source/os_interface/product_helper_hw.h"
#include "shared/source/release_helper/release_helper.h"
#include "shared/test/common/test_macros/mock_method_macros.h"
#include "level_zero/tools/source/sysman/frequency/linux/os_frequency_imp_prelim.h"
@@ -341,6 +343,15 @@ struct MockFrequencySysfsAccess : public SysfsAccess {
~MockFrequencySysfsAccess() override = default;
};
struct MockProductHelperFreq : NEO::ProductHelperHw<IGFX_UNKNOWN> {
MockProductHelperFreq() = default;
bool isMediaFreqDomainPresent = false;
bool getMediaFrequencyTileIndex(const NEO::ReleaseHelper *releaseHelper, uint32_t &tileIndex) const override {
tileIndex = 1;
return isMediaFreqDomainPresent;
}
};
class PublicLinuxFrequencyImp : public L0::LinuxFrequencyImp {
public:
PublicLinuxFrequencyImp(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_freq_domain_t type) : LinuxFrequencyImp(pOsSysman, onSubdevice, subdeviceId, type) {}

View File

@@ -35,6 +35,7 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
protected:
std::vector<ze_device_handle_t> deviceHandles;
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
std::unique_ptr<ProductHelper> pProductHelper;
SysfsAccess *pSysfsAccessOld = nullptr;
uint32_t numClocks = 0;
double step = 0;
@@ -54,6 +55,9 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
pSysfsAccess = std::make_unique<MockFrequencySysfsAccess>();
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
pProductHelper = std::make_unique<MockProductHelperFreq>();
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
pSysfsAccess->setVal(minFreqFile, minFreq);
pSysfsAccess->setVal(maxFreqFile, maxFreq);
@@ -78,7 +82,6 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
deviceHandles.resize(subDeviceCount, nullptr);
Device::fromHandle(device->toHandle())->getSubDevices(&subDeviceCount, deviceHandles.data());
}
getFreqHandles(0);
}
void TearDown() override {
@@ -86,6 +89,8 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
GTEST_SKIP();
}
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
SysmanDeviceFixture::TearDown();
}
@@ -163,6 +168,51 @@ TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequ
}
}
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequencyHandlesAndMediaFreqDomainIsPresentThenNonZeroCountIsReturnedAndCallSucceds) {
auto mockProductHelper = std::make_unique<MockProductHelperFreq>();
mockProductHelper->isMediaFreqDomainPresent = true;
std::unique_ptr<ProductHelper> productHelper = std::move(mockProductHelper);
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, productHelper);
uint32_t count = 0U;
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &count, nullptr));
EXPECT_EQ(count, 2U);
uint32_t testCount = count + 1;
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &testCount, nullptr));
EXPECT_EQ(count, testCount);
auto handles = getFreqHandles(count);
for (auto handle : handles) {
EXPECT_NE(handle, nullptr);
}
std::swap(rootDeviceEnvironment.productHelper, productHelper);
}
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequencyHandlesAndMediaDomainIsAbsentThenNonZeroCountIsReturnedAndCallSucceds) {
pSysfsAccess->directoryExistsResult = false;
auto mockProductHelper = std::make_unique<MockProductHelperFreq>();
mockProductHelper->isMediaFreqDomainPresent = true;
std::unique_ptr<ProductHelper> productHelper = std::move(mockProductHelper);
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, productHelper);
uint32_t count = 0U;
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &count, nullptr));
EXPECT_EQ(count, 1U);
uint32_t testCount = count + 1;
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &testCount, nullptr));
EXPECT_EQ(count, testCount);
auto handles = getFreqHandles(count);
for (auto handle : handles) {
EXPECT_NE(handle, nullptr);
}
std::swap(rootDeviceEnvironment.productHelper, productHelper);
}
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroAndValidPtrWhenEnumeratingFrequencyHandlesThenNonZeroCountAndNoHandlesAreReturnedAndCallSucceds) {
uint32_t count = 0U;
zes_freq_handle_t handle = static_cast<zes_freq_handle_t>(0UL);
@@ -853,6 +903,7 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
protected:
DebugManagerStateRestore restorer;
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
std::unique_ptr<ProductHelper> pProductHelper;
SysfsAccess *pSysfsAccessOld = nullptr;
std::vector<ze_device_handle_t> deviceHandles;
@@ -865,6 +916,9 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
pSysfsAccess = std::make_unique<MockFrequencySysfsAccess>();
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
pProductHelper = std::make_unique<MockProductHelperFreq>();
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
// delete handles created in initial SysmanDeviceHandleContext::init() call
for (auto handle : pSysmanDeviceImp->pFrequencyHandleContext->handleList) {
delete handle;
@@ -887,6 +941,8 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
GTEST_SKIP();
}
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
SysmanMultiDeviceFixture::TearDown();
}