mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-05 09:09:04 +08:00
feature: Xe Porting for sysman engine module
Related-To: LOCI-4243 Signed-off-by: Mayank Raghuwanshi <mayank.raghuwanshi@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
e27046af1f
commit
ea7d9fe106
@@ -17,6 +17,7 @@
|
||||
namespace L0 {
|
||||
namespace Sysman {
|
||||
|
||||
class SysmanKmdInterface;
|
||||
class PmuInterface;
|
||||
struct Device;
|
||||
class LinuxEngineImp : public OsEngine, NEO::NonCopyableOrMovableClass {
|
||||
@@ -35,6 +36,7 @@ class LinuxEngineImp : public OsEngine, NEO::NonCopyableOrMovableClass {
|
||||
}
|
||||
|
||||
protected:
|
||||
SysmanKmdInterface *pSysmanKmdInterface = nullptr;
|
||||
zes_engine_group_t engineGroup = ZES_ENGINE_GROUP_ALL;
|
||||
uint32_t engineInstance = 0;
|
||||
PmuInterface *pPmuInterface = nullptr;
|
||||
|
||||
@@ -13,29 +13,11 @@
|
||||
#include "level_zero/sysman/source/linux/pmu/sysman_pmu_imp.h"
|
||||
#include "level_zero/sysman/source/linux/sysman_hw_device_id_linux.h"
|
||||
#include "level_zero/sysman/source/linux/zes_os_sysman_imp.h"
|
||||
#include "level_zero/sysman/source/sysman_const.h"
|
||||
#include "level_zero/sysman/source/shared/linux/sysman_kmd_interface.h"
|
||||
|
||||
namespace L0 {
|
||||
namespace Sysman {
|
||||
|
||||
using NEO::PrelimI915::I915_SAMPLE_BUSY;
|
||||
|
||||
static const std::multimap<__u16, zes_engine_group_t> i915ToEngineMap = {
|
||||
{static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_RENDER), ZES_ENGINE_GROUP_RENDER_SINGLE},
|
||||
{static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE},
|
||||
{static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE},
|
||||
{static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_COPY), ZES_ENGINE_GROUP_COPY_SINGLE},
|
||||
{static_cast<__u16>(prelim_drm_i915_gem_engine_class::PRELIM_I915_ENGINE_CLASS_COMPUTE), ZES_ENGINE_GROUP_COMPUTE_SINGLE},
|
||||
{static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO_ENHANCE), ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE}};
|
||||
|
||||
static const std::multimap<zes_engine_group_t, __u16> engineToI915Map = {
|
||||
{ZES_ENGINE_GROUP_RENDER_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_RENDER)},
|
||||
{ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO)},
|
||||
{ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO)},
|
||||
{ZES_ENGINE_GROUP_COPY_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_COPY)},
|
||||
{ZES_ENGINE_GROUP_COMPUTE_SINGLE, static_cast<__u16>(prelim_drm_i915_gem_engine_class::PRELIM_I915_ENGINE_CLASS_COMPUTE)},
|
||||
{ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO_ENHANCE)}};
|
||||
|
||||
zes_engine_group_t LinuxEngineImp::getGroupFromEngineType(zes_engine_group_t type) {
|
||||
if (type == ZES_ENGINE_GROUP_RENDER_SINGLE) {
|
||||
return ZES_ENGINE_GROUP_RENDER_ALL;
|
||||
@@ -66,12 +48,13 @@ ze_result_t OsEngine::getNumEngineTypeAndInstances(std::set<std::pair<zes_engine
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
||||
}
|
||||
auto engineInfo = pDrm->getEngineInfo();
|
||||
for (auto itr = engineInfo->engines.begin(); itr != engineInfo->engines.end(); ++itr) {
|
||||
uint32_t subDeviceId = engineInfo->getEngineTileIndex(itr->engine);
|
||||
auto i915ToEngineMapRange = i915ToEngineMap.equal_range(static_cast<__u16>(itr->engine.engineClass));
|
||||
for (auto l0EngineEntryInMap = i915ToEngineMapRange.first; l0EngineEntryInMap != i915ToEngineMapRange.second; l0EngineEntryInMap++) {
|
||||
auto engineTileMap = engineInfo->getEngineTileInfo();
|
||||
for (auto itr = engineTileMap.begin(); itr != engineTileMap.end(); ++itr) {
|
||||
uint32_t subDeviceId = itr->first;
|
||||
auto engineGroupRange = engineClassToEngineGroup.equal_range(static_cast<__u16>(itr->second.engineClass));
|
||||
for (auto l0EngineEntryInMap = engineGroupRange.first; l0EngineEntryInMap != engineGroupRange.second; l0EngineEntryInMap++) {
|
||||
auto l0EngineType = l0EngineEntryInMap->second;
|
||||
engineGroupInstance.insert({l0EngineType, {static_cast<uint32_t>(itr->engine.engineInstance), subDeviceId}});
|
||||
engineGroupInstance.insert({l0EngineType, {static_cast<uint32_t>(itr->second.engineInstance), subDeviceId}});
|
||||
engineGroupInstance.insert({LinuxEngineImp::getGroupFromEngineType(l0EngineType), {0u, subDeviceId}});
|
||||
engineGroupInstance.insert({ZES_ENGINE_GROUP_ALL, {0u, subDeviceId}});
|
||||
}
|
||||
@@ -104,27 +87,7 @@ ze_result_t LinuxEngineImp::getProperties(zes_engine_properties_t &properties) {
|
||||
}
|
||||
|
||||
void LinuxEngineImp::init() {
|
||||
uint64_t config = UINT64_MAX;
|
||||
switch (engineGroup) {
|
||||
case ZES_ENGINE_GROUP_ALL:
|
||||
config = __PRELIM_I915_PMU_ANY_ENGINE_GROUP_BUSY(subDeviceId);
|
||||
break;
|
||||
case ZES_ENGINE_GROUP_COMPUTE_ALL:
|
||||
case ZES_ENGINE_GROUP_RENDER_ALL:
|
||||
config = __PRELIM_I915_PMU_RENDER_GROUP_BUSY(subDeviceId);
|
||||
break;
|
||||
case ZES_ENGINE_GROUP_COPY_ALL:
|
||||
config = __PRELIM_I915_PMU_COPY_GROUP_BUSY(subDeviceId);
|
||||
break;
|
||||
case ZES_ENGINE_GROUP_MEDIA_ALL:
|
||||
config = __PRELIM_I915_PMU_MEDIA_GROUP_BUSY(subDeviceId);
|
||||
break;
|
||||
default:
|
||||
auto i915EngineClass = engineToI915Map.find(engineGroup);
|
||||
config = I915_PMU_ENGINE_BUSY(i915EngineClass->second, engineInstance);
|
||||
break;
|
||||
}
|
||||
fd = pPmuInterface->pmuInterfaceOpen(config, -1, PERF_FORMAT_TOTAL_TIME_ENABLED);
|
||||
fd = pSysmanKmdInterface->getEngineActivityFd(engineGroup, engineInstance, subDeviceId, pPmuInterface);
|
||||
}
|
||||
|
||||
bool LinuxEngineImp::isEngineModuleSupported() {
|
||||
@@ -140,6 +103,7 @@ LinuxEngineImp::LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uin
|
||||
pDrm = pLinuxSysmanImp->getDrm();
|
||||
pDevice = pLinuxSysmanImp->getSysmanDeviceImp();
|
||||
pPmuInterface = pLinuxSysmanImp->getPmuInterface();
|
||||
pSysmanKmdInterface = pLinuxSysmanImp->getSysmanKmdInterface();
|
||||
init();
|
||||
}
|
||||
|
||||
@@ -149,4 +113,4 @@ std::unique_ptr<OsEngine> OsEngine::create(OsSysman *pOsSysman, zes_engine_group
|
||||
}
|
||||
|
||||
} // namespace Sysman
|
||||
} // namespace L0
|
||||
} // namespace L0
|
||||
@@ -8,9 +8,13 @@
|
||||
#include "level_zero/sysman/source/shared/linux/sysman_kmd_interface.h"
|
||||
|
||||
#include "shared/source/os_interface/linux/drm_neo.h"
|
||||
#include "shared/source/os_interface/linux/i915_prelim.h"
|
||||
|
||||
#include "level_zero/sysman/source/linux/pmu/sysman_pmu_imp.h"
|
||||
|
||||
namespace L0 {
|
||||
namespace Sysman {
|
||||
using NEO::PrelimI915::I915_SAMPLE_BUSY;
|
||||
|
||||
std::unique_ptr<SysmanKmdInterface> SysmanKmdInterface::create(const NEO::Drm &drm) {
|
||||
std::unique_ptr<SysmanKmdInterface> pSysmanKmdInterface;
|
||||
@@ -79,5 +83,33 @@ std::string SysmanKmdInterfaceXe::getSysfsFilePath(SysfsName sysfsName, int subD
|
||||
return filePath;
|
||||
}
|
||||
|
||||
int64_t SysmanKmdInterfaceI915::getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface) {
|
||||
uint64_t config = UINT64_MAX;
|
||||
switch (engineGroup) {
|
||||
case ZES_ENGINE_GROUP_ALL:
|
||||
config = __PRELIM_I915_PMU_ANY_ENGINE_GROUP_BUSY(subDeviceId);
|
||||
break;
|
||||
case ZES_ENGINE_GROUP_COMPUTE_ALL:
|
||||
case ZES_ENGINE_GROUP_RENDER_ALL:
|
||||
config = __PRELIM_I915_PMU_RENDER_GROUP_BUSY(subDeviceId);
|
||||
break;
|
||||
case ZES_ENGINE_GROUP_COPY_ALL:
|
||||
config = __PRELIM_I915_PMU_COPY_GROUP_BUSY(subDeviceId);
|
||||
break;
|
||||
case ZES_ENGINE_GROUP_MEDIA_ALL:
|
||||
config = __PRELIM_I915_PMU_MEDIA_GROUP_BUSY(subDeviceId);
|
||||
break;
|
||||
default:
|
||||
auto engineClass = engineGroupToEngineClass.find(engineGroup);
|
||||
config = I915_PMU_ENGINE_BUSY(engineClass->second, engineInstance);
|
||||
break;
|
||||
}
|
||||
return pPmuInterface->pmuInterfaceOpen(config, -1, PERF_FORMAT_TOTAL_TIME_ENABLED);
|
||||
}
|
||||
|
||||
int64_t SysmanKmdInterfaceXe::getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
} // namespace Sysman
|
||||
} // namespace L0
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <level_zero/zes_api.h>
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
@@ -17,8 +19,34 @@ class Drm;
|
||||
namespace L0 {
|
||||
namespace Sysman {
|
||||
|
||||
class PmuInterface;
|
||||
typedef std::pair<std::string, std::string> valuePair;
|
||||
|
||||
enum EngineClass {
|
||||
ENGINE_CLASS_RENDER = 0,
|
||||
ENGINE_CLASS_COPY = 1,
|
||||
ENGINE_CLASS_VIDEO = 2,
|
||||
ENGINE_CLASS_VIDEO_ENHANCE = 3,
|
||||
ENGINE_CLASS_COMPUTE = 4,
|
||||
ENGINE_CLASS_INVALID = -1
|
||||
};
|
||||
|
||||
const std::multimap<uint16_t, zes_engine_group_t> engineClassToEngineGroup = {
|
||||
{static_cast<uint16_t>(EngineClass::ENGINE_CLASS_RENDER), ZES_ENGINE_GROUP_RENDER_SINGLE},
|
||||
{static_cast<uint16_t>(EngineClass::ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE},
|
||||
{static_cast<uint16_t>(EngineClass::ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE},
|
||||
{static_cast<uint16_t>(EngineClass::ENGINE_CLASS_COPY), ZES_ENGINE_GROUP_COPY_SINGLE},
|
||||
{static_cast<uint16_t>(EngineClass::ENGINE_CLASS_COMPUTE), ZES_ENGINE_GROUP_COMPUTE_SINGLE},
|
||||
{static_cast<uint16_t>(EngineClass::ENGINE_CLASS_VIDEO_ENHANCE), ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE}};
|
||||
|
||||
const std::multimap<zes_engine_group_t, uint16_t> engineGroupToEngineClass = {
|
||||
{ZES_ENGINE_GROUP_RENDER_SINGLE, static_cast<uint16_t>(EngineClass::ENGINE_CLASS_RENDER)},
|
||||
{ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, static_cast<uint16_t>(EngineClass::ENGINE_CLASS_VIDEO)},
|
||||
{ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, static_cast<uint16_t>(EngineClass::ENGINE_CLASS_VIDEO)},
|
||||
{ZES_ENGINE_GROUP_COPY_SINGLE, static_cast<uint16_t>(EngineClass::ENGINE_CLASS_COPY)},
|
||||
{ZES_ENGINE_GROUP_COMPUTE_SINGLE, static_cast<uint16_t>(EngineClass::ENGINE_CLASS_COMPUTE)},
|
||||
{ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, static_cast<uint16_t>(EngineClass::ENGINE_CLASS_VIDEO_ENHANCE)}};
|
||||
|
||||
enum class SysfsName {
|
||||
sysfsNameMinFrequency,
|
||||
sysfsNameMaxFrequency,
|
||||
@@ -45,6 +73,7 @@ class SysmanKmdInterface {
|
||||
|
||||
virtual std::string getBasePath(int subDeviceId) const = 0;
|
||||
virtual std::string getSysfsFilePath(SysfsName sysfsName, int subDeviceId, bool baseDirectoryExists) = 0;
|
||||
virtual int64_t getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pmuInterface) = 0;
|
||||
};
|
||||
|
||||
class SysmanKmdInterfaceI915 : public SysmanKmdInterface {
|
||||
@@ -54,6 +83,7 @@ class SysmanKmdInterfaceI915 : public SysmanKmdInterface {
|
||||
|
||||
std::string getBasePath(int subDeviceId) const override;
|
||||
std::string getSysfsFilePath(SysfsName sysfsName, int subDeviceId, bool baseDirectoryExists) override;
|
||||
int64_t getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pmuInterface) override;
|
||||
|
||||
protected:
|
||||
std::map<SysfsName, valuePair> sysfsNameToFileMap;
|
||||
@@ -67,6 +97,7 @@ class SysmanKmdInterfaceXe : public SysmanKmdInterface {
|
||||
|
||||
std::string getBasePath(int subDeviceId) const override;
|
||||
std::string getSysfsFilePath(SysfsName sysfsName, int subDeviceId, bool baseDirectoryExists) override;
|
||||
int64_t getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pmuInterface) override;
|
||||
|
||||
protected:
|
||||
std::map<SysfsName, valuePair> sysfsNameToFileMap;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include "shared/test/common/libult/linux/drm_mock.h"
|
||||
|
||||
#include "level_zero/sysman/source/shared/linux/sysman_kmd_interface.h"
|
||||
#include "level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_prelim.h"
|
||||
#include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h"
|
||||
#include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_hw_device_id.h"
|
||||
@@ -27,6 +28,7 @@ class ZesEngineFixture : public SysmanDeviceFixture {
|
||||
L0::Sysman::SysfsAccess *pSysfsAccessOriginal = nullptr;
|
||||
std::unique_ptr<MockEngineFsAccess> pFsAccess;
|
||||
L0::Sysman::FsAccess *pFsAccessOriginal = nullptr;
|
||||
std::unique_ptr<SysmanKmdInterface> pSysmanKmdInterface;
|
||||
|
||||
L0::Sysman::SysmanDevice *device = nullptr;
|
||||
|
||||
@@ -49,6 +51,8 @@ class ZesEngineFixture : public SysmanDeviceFixture {
|
||||
pPmuInterface = std::make_unique<MockEnginePmuInterfaceImp>(pLinuxSysmanImp);
|
||||
pOriginalPmuInterface = pLinuxSysmanImp->pPmuInterface;
|
||||
pLinuxSysmanImp->pPmuInterface = pPmuInterface.get();
|
||||
pSysmanKmdInterface = std::make_unique<SysmanKmdInterfaceI915>();
|
||||
std::swap(pLinuxSysmanImp->pSysmanKmdInterface, pSysmanKmdInterface);
|
||||
|
||||
pSysmanDeviceImp->pEngineHandleContext->handleList.clear();
|
||||
pSysmanDeviceImp->getRootDeviceEnvironment().getMutableHardwareInfo()->capabilityTable.isIntegratedDevice = true;
|
||||
@@ -60,6 +64,7 @@ class ZesEngineFixture : public SysmanDeviceFixture {
|
||||
pLinuxSysmanImp->pPmuInterface = pOriginalPmuInterface;
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOriginal;
|
||||
pLinuxSysmanImp->pFsAccess = pFsAccessOriginal;
|
||||
std::swap(pLinuxSysmanImp->pSysmanKmdInterface, pSysmanKmdInterface);
|
||||
|
||||
SysmanDeviceFixture::TearDown();
|
||||
}
|
||||
@@ -278,6 +283,7 @@ class ZesEngineMultiFixture : public SysmanMultiDeviceFixture {
|
||||
std::unique_ptr<MockEngineFsAccess> pFsAccess;
|
||||
L0::Sysman::FsAccess *pFsAccessOriginal = nullptr;
|
||||
L0::Sysman::SysmanDevice *device = nullptr;
|
||||
std::unique_ptr<SysmanKmdInterface> pSysmanKmdInterface;
|
||||
|
||||
void SetUp() override {
|
||||
SysmanMultiDeviceFixture::SetUp();
|
||||
@@ -297,6 +303,8 @@ class ZesEngineMultiFixture : public SysmanMultiDeviceFixture {
|
||||
pPmuInterface = std::make_unique<MockEnginePmuInterfaceImp>(pLinuxSysmanImp);
|
||||
pOriginalPmuInterface = pLinuxSysmanImp->pPmuInterface;
|
||||
pLinuxSysmanImp->pPmuInterface = pPmuInterface.get();
|
||||
pSysmanKmdInterface = std::make_unique<SysmanKmdInterfaceI915>();
|
||||
std::swap(pLinuxSysmanImp->pSysmanKmdInterface, pSysmanKmdInterface);
|
||||
|
||||
pDrm->mockReadSysmanQueryEngineInfoMultiDevice = true;
|
||||
pSysfsAccess->mockReadSymLinkSuccess = true;
|
||||
@@ -312,6 +320,7 @@ class ZesEngineMultiFixture : public SysmanMultiDeviceFixture {
|
||||
pLinuxSysmanImp->pPmuInterface = pOriginalPmuInterface;
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOriginal;
|
||||
pLinuxSysmanImp->pFsAccess = pFsAccessOriginal;
|
||||
std::swap(pLinuxSysmanImp->pSysmanKmdInterface, pSysmanKmdInterface);
|
||||
}
|
||||
|
||||
std::vector<zes_engine_handle_t> getEngineHandles(uint32_t count) {
|
||||
|
||||
@@ -40,6 +40,7 @@ class PublicLinuxSysmanImp : public L0::Sysman::LinuxSysmanImp {
|
||||
using LinuxSysmanImp::pPmuInterface;
|
||||
using LinuxSysmanImp::pProcfsAccess;
|
||||
using LinuxSysmanImp::pSysfsAccess;
|
||||
using LinuxSysmanImp::pSysmanKmdInterface;
|
||||
using LinuxSysmanImp::rootPath;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user