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

@@ -422,7 +422,19 @@ 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 &productHelper = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironment().getHelper<NEO::ProductHelper>();
auto releaseHelper = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironment().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

@@ -32,6 +32,9 @@ struct SysmanDeviceImp : SysmanDevice, NEO::NonCopyableOrMovableClass {
const NEO::RootDeviceEnvironment &getRootDeviceEnvironment() const {
return *executionEnvironment->rootDeviceEnvironments[rootDeviceIndex];
}
NEO::RootDeviceEnvironment &getRootDeviceEnvironmentRef() const {
return *executionEnvironment->rootDeviceEnvironments[rootDeviceIndex];
}
const NEO::HardwareInfo &getHardwareInfo() const override { return *getRootDeviceEnvironment().getHardwareInfo(); }
PRODUCT_FAMILY getProductFamily() const { return getHardwareInfo().platform.eProductFamily; }
NEO::ExecutionEnvironment *getExecutionEnvironment() const { return executionEnvironment; }

View File

@@ -7,6 +7,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/sysman/source/frequency/linux/sysman_os_frequency_imp_prelim.h"
@@ -346,6 +348,15 @@ struct MockFrequencySysfsAccess : public L0::Sysman::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::Sysman::LinuxFrequencyImp {
public:
PublicLinuxFrequencyImp(L0::Sysman::OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_freq_domain_t type) : L0::Sysman::LinuxFrequencyImp(pOsSysman, onSubdevice, subdeviceId, type) {}

View File

@@ -31,6 +31,8 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
L0::Sysman::SysmanDevice *device = nullptr;
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
L0::Sysman::SysfsAccess *pSysfsAccessOld = nullptr;
std::unique_ptr<ProductHelper> pProductHelper;
std::unique_ptr<ProductHelper> pProductHelperOld;
uint32_t numClocks = 0;
double step = 0;
PRODUCT_FAMILY productFamily{};
@@ -40,6 +42,9 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
device = pSysmanDevice;
pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
pSysfsAccess = std::make_unique<MockFrequencySysfsAccess>();
pProductHelper = std::make_unique<MockProductHelperFreq>();
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
productFamily = pLinuxSysmanImp->getProductFamily();
if (productFamily >= IGFX_XE_HP_SDV) {
@@ -62,11 +67,12 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
delete handle;
}
pSysmanDeviceImp->pFrequencyHandleContext->handleList.clear();
getFreqHandles(0);
}
void TearDown() override {
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
SysmanDeviceFixture::TearDown();
}
@@ -153,6 +159,51 @@ TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroAndValidPtrWhenEnume
EXPECT_EQ(handle, static_cast<zes_freq_handle_t>(0UL));
}
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequencyHandlesAndMediaFreqDomainIsPresentThenNonZeroCountIsReturnedAndCallSucceds) {
auto mockProductHelper = std::make_unique<MockProductHelperFreq>();
mockProductHelper->isMediaFreqDomainPresent = true;
std::unique_ptr<ProductHelper> productHelper = std::move(mockProductHelper);
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->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 = pLinuxSysmanImp->getParentSysmanDeviceImp()->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, GivenActualComponentCountTwoWhenTryingToGetOneComponentOnlyThenOneComponentIsReturnedAndCountUpdated) {
auto subDeviceCount = pLinuxSysmanImp->getSubDeviceCount();
ze_bool_t onSubdevice = (subDeviceCount == 0) ? false : true;
@@ -174,7 +225,8 @@ TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFreq
zes_freq_properties_t properties;
EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetProperties(handle, &properties));
EXPECT_EQ(nullptr, properties.pNext);
EXPECT_EQ(ZES_FREQ_DOMAIN_GPU, properties.type);
EXPECT_GE(properties.type, ZES_FREQ_DOMAIN_GPU);
EXPECT_LE(properties.type, ZES_FREQ_DOMAIN_MEDIA);
EXPECT_FALSE(properties.onSubdevice);
EXPECT_DOUBLE_EQ(maxFreq, properties.max);
EXPECT_DOUBLE_EQ(minFreq, properties.min);
@@ -857,6 +909,7 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
L0::Sysman::SysmanDevice *device = nullptr;
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
L0::Sysman::SysfsAccess *pSysfsAccessOld = nullptr;
std::unique_ptr<ProductHelper> pProductHelper;
void SetUp() override {
SysmanMultiDeviceFixture::SetUp();
@@ -864,6 +917,9 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
pSysfsAccess = std::make_unique<MockFrequencySysfsAccess>();
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
pProductHelper = std::make_unique<MockProductHelperFreq>();
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
// delete handles created in initial SysmanDeviceHandleContext::init() call
for (auto handle : pSysmanDeviceImp->pFrequencyHandleContext->handleList) {
delete handle;
@@ -874,6 +930,8 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
void TearDown() override {
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
SysmanMultiDeviceFixture::TearDown();
}

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();
}