mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-25 21:42:53 +08:00
115 lines
6.6 KiB
C++
115 lines
6.6 KiB
C++
/*
|
|
* Copyright (C) 2023 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
*/
|
|
|
|
#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;
|
|
auto drmVersion = drm.getDrmVersion(drm.getFileDescriptor());
|
|
if ("xe" == drmVersion) {
|
|
pSysmanKmdInterface = std::make_unique<SysmanKmdInterfaceXe>();
|
|
} else {
|
|
pSysmanKmdInterface = std::make_unique<SysmanKmdInterfaceI915>();
|
|
}
|
|
return pSysmanKmdInterface;
|
|
}
|
|
|
|
std::string SysmanKmdInterfaceI915::getBasePath(int subDeviceId) const {
|
|
return "gt/gt" + std::to_string(subDeviceId) + "/";
|
|
}
|
|
|
|
std::string SysmanKmdInterfaceXe::getBasePath(int subDeviceId) const {
|
|
return "device/gt" + std::to_string(subDeviceId) + "/";
|
|
}
|
|
|
|
void SysmanKmdInterfaceI915::initSysfsNameToFileMap() {
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMinFrequency] = std::make_pair("rps_min_freq_mhz", "gt_min_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMaxFrequency] = std::make_pair("rps_max_freq_mhz", "gt_max_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMinDefaultFrequency] = std::make_pair(".defaults/rps_min_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMaxDefaultFrequency] = std::make_pair(".defaults/rps_max_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameBoostFrequency] = std::make_pair("rps_boost_freq_mhz", "gt_boost_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameCurrentFrequency] = std::make_pair("punit_req_freq_mhz", "gt_cur_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameTdpFrequency] = std::make_pair("rapl_PL1_freq_mhz", "rapl_PL1_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameActualFrequency] = std::make_pair("rps_act_freq_mhz", "gt_act_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameEfficientFrequency] = std::make_pair("rps_RP1_freq_mhz", "gt_RP1_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMaxValueFrequency] = std::make_pair("rps_RP0_freq_mhz", "gt_RP0_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMinValueFrequency] = std::make_pair("rps_RPn_freq_mhz", "gt_RPn_freq_mhz");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonStatus] = std::make_pair("throttle_reason_status", "gt_throttle_reason_status");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonPL1] = std::make_pair("throttle_reason_pl1", "gt_throttle_reason_status_pl1");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonPL2] = std::make_pair("throttle_reason_pl2", "gt_throttle_reason_status_pl2");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonPL4] = std::make_pair("throttle_reason_pl4", "gt_throttle_reason_status_pl4");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonThermal] = std::make_pair("throttle_reason_thermal", "gt_throttle_reason_status_thermal");
|
|
}
|
|
|
|
void SysmanKmdInterfaceXe::initSysfsNameToFileMap() {
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMinFrequency] = std::make_pair("rps_min_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMaxFrequency] = std::make_pair("rps_max_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMinDefaultFrequency] = std::make_pair(".defaults/rps_min_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMaxDefaultFrequency] = std::make_pair(".defaults/rps_max_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameBoostFrequency] = std::make_pair("rps_boost_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameCurrentFrequency] = std::make_pair("punit_req_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameTdpFrequency] = std::make_pair("rapl_PL1_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameActualFrequency] = std::make_pair("rps_act_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameEfficientFrequency] = std::make_pair("rps_RP1_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMaxValueFrequency] = std::make_pair("rps_RP0_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameMinValueFrequency] = std::make_pair("rps_RPn_freq_mhz", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonStatus] = std::make_pair("throttle_reason_status", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonPL1] = std::make_pair("throttle_reason_pl1", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonPL2] = std::make_pair("throttle_reason_pl2", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonPL4] = std::make_pair("throttle_reason_pl4", "");
|
|
sysfsNameToFileMap[SysfsName::sysfsNameThrottleReasonThermal] = std::make_pair("throttle_reason_thermal", "");
|
|
}
|
|
|
|
std::string SysmanKmdInterfaceI915::getSysfsFilePath(SysfsName sysfsName, int subDeviceId, bool baseDirectoryExists) {
|
|
std::string filePath = baseDirectoryExists ? getBasePath(subDeviceId) + sysfsNameToFileMap[sysfsName].first : sysfsNameToFileMap[sysfsName].second;
|
|
return filePath;
|
|
}
|
|
|
|
std::string SysmanKmdInterfaceXe::getSysfsFilePath(SysfsName sysfsName, int subDeviceId, bool baseDirectoryExists) {
|
|
std::string filePath = baseDirectoryExists ? getBasePath(subDeviceId) + sysfsNameToFileMap[sysfsName].first : sysfsNameToFileMap[sysfsName].second;
|
|
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
|