mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 23:03:02 +08:00
feature: Add support for media freq domain on linux
Related-To: LOCI-4552 Signed-off-by: Mayank Raghuwanshi <mayank.raghuwanshi@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
e3a408f536
commit
175ceb9bd1
@@ -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) {}
|
||||
|
||||
@@ -36,6 +36,7 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
|
||||
std::vector<ze_device_handle_t> deviceHandles;
|
||||
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
|
||||
SysfsAccess *pSysfsAccessOld = nullptr;
|
||||
std::unique_ptr<ProductHelper> pProductHelper;
|
||||
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);
|
||||
@@ -855,6 +905,7 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
|
||||
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
|
||||
SysfsAccess *pSysfsAccessOld = nullptr;
|
||||
std::vector<ze_device_handle_t> deviceHandles;
|
||||
std::unique_ptr<ProductHelper> pProductHelper;
|
||||
|
||||
void SetUp() override {
|
||||
if (!sysmanUltsEnable) {
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user