mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 14:55:24 +08:00
feature: Add support for pcie downgrade in BMG
Related-To: NEO-15270 Signed-off-by: shubham kumar <shubham.kumar@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
6033a10513
commit
5a1d6ac552
@@ -34,6 +34,7 @@ class FirmwareUtil {
|
||||
virtual ze_result_t fwGetEccConfigurable(ze_bool_t *pConfigurable) = 0;
|
||||
virtual ze_result_t fwGetEccConfig(uint8_t *currentState, uint8_t *pendingState, uint8_t *defaultState) = 0;
|
||||
virtual ze_result_t fwSetEccConfig(uint8_t newState, uint8_t *currentState, uint8_t *pendingState) = 0;
|
||||
virtual ze_result_t fwSetDowngradeConfig(uint8_t newState, uint8_t *pendingState) = 0;
|
||||
virtual void getDeviceSupportedFwTypes(std::vector<std::string> &fwTypes) = 0;
|
||||
virtual void fwGetMemoryHealthIndicator(zes_mem_health_t *health) = 0;
|
||||
virtual void getLateBindingSupportedFwTypes(std::vector<std::string> &fwTypes) = 0;
|
||||
|
||||
@@ -125,13 +125,13 @@ typedef struct {
|
||||
|
||||
namespace GfspHeciConstants {
|
||||
enum Cmd {
|
||||
setEccConfigurationCmd8 = 0x8,
|
||||
getEccConfigurationCmd9 = 0x9,
|
||||
setEccConfigurationCmd15 = 0xf,
|
||||
getEccConfigurationCmd16 = 0x10
|
||||
setConfigurationCmd8 = 0x8,
|
||||
getConfigurationCmd9 = 0x9,
|
||||
setConfigurationCmd15 = 0xf,
|
||||
getConfigurationCmd16 = 0x10
|
||||
};
|
||||
|
||||
enum SetEccCmd15BytePostition {
|
||||
enum SetCmd15BytePostition {
|
||||
request = 0,
|
||||
response = 0
|
||||
};
|
||||
@@ -172,6 +172,7 @@ class FirmwareUtilImp : public FirmwareUtil, NEO::NonCopyableAndNonMovableClass
|
||||
ze_result_t fwGetEccConfigurable(ze_bool_t *pConfigurable) override;
|
||||
ze_result_t fwGetEccConfig(uint8_t *currentState, uint8_t *pendingState, uint8_t *defaultState) override;
|
||||
ze_result_t fwSetEccConfig(uint8_t newState, uint8_t *currentState, uint8_t *pendingState) override;
|
||||
ze_result_t fwSetDowngradeConfig(uint8_t newState, uint8_t *pendingState) override;
|
||||
void getDeviceSupportedFwTypes(std::vector<std::string> &fwTypes) override;
|
||||
void fwGetMemoryHealthIndicator(zes_mem_health_t *health) override;
|
||||
void getLateBindingSupportedFwTypes(std::vector<std::string> &fwTypes) override;
|
||||
|
||||
@@ -152,7 +152,7 @@ ze_result_t FirmwareUtilImp::fwGetEccConfig(uint8_t *currentState, uint8_t *pend
|
||||
std::vector<uint8_t> outBuf(maxGfspHeciOutBuffer, 0);
|
||||
size_t receivedSize = 0;
|
||||
// Need to call gfspHeciCmd 0x10 cmd first and if not available, fallback and call 0x9.
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getEccConfigurationCmd16, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getConfigurationCmd16, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
*currentState = outBuf[GfspHeciConstants::GetEccCmd16BytePostition::eccCurrentState] & 0x1;
|
||||
@@ -162,7 +162,7 @@ ze_result_t FirmwareUtilImp::fwGetEccConfig(uint8_t *currentState, uint8_t *pend
|
||||
}
|
||||
receivedSize = 0;
|
||||
std::fill(outBuf.begin(), outBuf.end(), 0);
|
||||
ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getEccConfigurationCmd9, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getConfigurationCmd9, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
*currentState = outBuf[GfspHeciConstants::GetEccCmd9BytePostition::currentState];
|
||||
@@ -183,7 +183,7 @@ ze_result_t FirmwareUtilImp::fwGetEccAvailable(ze_bool_t *pAvailable) {
|
||||
std::vector<uint8_t> outBuf(maxGfspHeciOutBuffer, 0);
|
||||
size_t receivedSize = 0;
|
||||
// Need to call gfspHeciCmd 0x10 cmd first and if not available, fallback and call 0x9.
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getEccConfigurationCmd16, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getConfigurationCmd16, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
*pAvailable = outBuf[GfspHeciConstants::GetEccCmd16BytePostition::eccAvailable] & 0x1;
|
||||
@@ -191,7 +191,7 @@ ze_result_t FirmwareUtilImp::fwGetEccAvailable(ze_bool_t *pAvailable) {
|
||||
}
|
||||
receivedSize = 0;
|
||||
std::fill(outBuf.begin(), outBuf.end(), 0);
|
||||
ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getEccConfigurationCmd9, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getConfigurationCmd9, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
uint8_t currentState = outBuf[GfspHeciConstants::GetEccCmd9BytePostition::currentState];
|
||||
@@ -215,7 +215,7 @@ ze_result_t FirmwareUtilImp::fwGetEccConfigurable(ze_bool_t *pConfigurable) {
|
||||
std::vector<uint8_t> outBuf(maxGfspHeciOutBuffer, 0);
|
||||
size_t receivedSize = 0;
|
||||
// Need to call gfspHeciCmd 0x10 cmd first and if not available, fallback and call 0x9.
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getEccConfigurationCmd16, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getConfigurationCmd16, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
*pConfigurable = outBuf[GfspHeciConstants::GetEccCmd16BytePostition::eccConfigurable] & 0x1;
|
||||
@@ -223,7 +223,7 @@ ze_result_t FirmwareUtilImp::fwGetEccConfigurable(ze_bool_t *pConfigurable) {
|
||||
}
|
||||
receivedSize = 0;
|
||||
std::fill(outBuf.begin(), outBuf.end(), 0);
|
||||
ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getEccConfigurationCmd9, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::getConfigurationCmd9, nullptr, 0, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
uint8_t currentState = outBuf[GfspHeciConstants::GetEccCmd9BytePostition::currentState];
|
||||
@@ -246,9 +246,9 @@ ze_result_t FirmwareUtilImp::fwSetEccConfig(uint8_t newState, uint8_t *currentSt
|
||||
std::vector<uint8_t> inBuf(maxGfspHeciInBuffer, 0);
|
||||
std::vector<uint8_t> outBuf(maxGfspHeciOutBuffer, 0);
|
||||
size_t receivedSize = 0;
|
||||
inBuf[GfspHeciConstants::SetEccCmd15BytePostition::request] = newState;
|
||||
inBuf[GfspHeciConstants::SetCmd15BytePostition::request] = newState;
|
||||
// Need to call gfspHeciCmd 0x15 cmd first and if not available, fallback and call 0x8.
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::setEccConfigurationCmd15, inBuf.data(), maxGfspHeciInBuffer, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::setConfigurationCmd15, inBuf.data(), maxGfspHeciInBuffer, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
lock.unlock();
|
||||
@@ -258,14 +258,14 @@ ze_result_t FirmwareUtilImp::fwSetEccConfig(uint8_t newState, uint8_t *currentSt
|
||||
if (status != ZE_RESULT_SUCCESS) {
|
||||
return status;
|
||||
}
|
||||
*pendingState = outBuf[GfspHeciConstants::SetEccCmd15BytePostition::response] & 0x1;
|
||||
*pendingState = outBuf[GfspHeciConstants::SetCmd15BytePostition::response] & 0x1;
|
||||
return ZE_RESULT_SUCCESS;
|
||||
}
|
||||
receivedSize = 0;
|
||||
std::fill(inBuf.begin(), inBuf.end(), 0);
|
||||
inBuf[GfspHeciConstants::SetEccCmd8BytePostition::setRequest] = newState;
|
||||
std::fill(outBuf.begin(), outBuf.end(), 0);
|
||||
ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::setEccConfigurationCmd8, inBuf.data(), maxGfspHeciInBuffer, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::setConfigurationCmd8, inBuf.data(), maxGfspHeciInBuffer, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
*currentState = outBuf[GfspHeciConstants::SetEccCmd8BytePostition::responseCurrentState];
|
||||
@@ -277,6 +277,25 @@ ze_result_t FirmwareUtilImp::fwSetEccConfig(uint8_t newState, uint8_t *currentSt
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
||||
}
|
||||
|
||||
ze_result_t FirmwareUtilImp::fwSetDowngradeConfig(uint8_t newState, uint8_t *pendingState) {
|
||||
const std::lock_guard<std::mutex> lock(this->fwLock);
|
||||
gfspHeciCmd = reinterpret_cast<pIgscGfspHeciCmd>(libraryHandle->getProcAddress(fwGfspHeciCmd));
|
||||
if (gfspHeciCmd != nullptr) {
|
||||
std::vector<uint8_t> inBuf(maxGfspHeciInBuffer, 0);
|
||||
std::vector<uint8_t> outBuf(maxGfspHeciOutBuffer, 0);
|
||||
size_t receivedSize = 0;
|
||||
inBuf[GfspHeciConstants::SetCmd15BytePostition::request] = newState << 1;
|
||||
int ret = gfspHeciCmd(&fwDeviceHandle, GfspHeciConstants::Cmd::setConfigurationCmd15, inBuf.data(), maxGfspHeciInBuffer, outBuf.data(), maxGfspHeciOutBuffer, &receivedSize);
|
||||
|
||||
if (ret == IGSC_SUCCESS) {
|
||||
*pendingState = (outBuf[GfspHeciConstants::SetCmd15BytePostition::response] >> 1) & 0x1;
|
||||
return ZE_RESULT_SUCCESS;
|
||||
}
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
||||
}
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
||||
}
|
||||
|
||||
ze_result_t FirmwareUtilImp::fwSupportedDiagTests(std::vector<std::string> &supportedDiagTests) {
|
||||
uint32_t supportedTests = 0;
|
||||
uint32_t prevErrors = 0;
|
||||
|
||||
@@ -185,6 +185,7 @@ class SysmanKmdInterface {
|
||||
virtual std::string getFreqMediaDomainBasePath() = 0;
|
||||
const std::string getSysmanDeviceDirName() const;
|
||||
ze_result_t checkErrorNumberAndReturnStatus();
|
||||
virtual ze_result_t readPcieDowngradeAttribute(std::string sysfsName, uint32_t &val) { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; }
|
||||
|
||||
protected:
|
||||
std::unique_ptr<FsAccessInterface> pFsAccess;
|
||||
@@ -394,6 +395,7 @@ class SysmanKmdInterfaceXe : public SysmanKmdInterface {
|
||||
void setSysmanDeviceDirName(const bool isIntegratedDevice) override;
|
||||
std::string getBurstPowerLimitFile(SysfsName sysfsName, uint32_t subDeviceId, bool baseDirectoryExists) override;
|
||||
std::string getFreqMediaDomainBasePath() override;
|
||||
ze_result_t readPcieDowngradeAttribute(std::string sysfsName, uint32_t &val) override;
|
||||
|
||||
protected:
|
||||
std::map<SysfsName, valuePair> sysfsNameToFileMap;
|
||||
|
||||
@@ -321,5 +321,15 @@ void SysmanKmdInterfaceXe::setSysmanDeviceDirName(const bool isIntegratedDevice)
|
||||
updateSysmanDeviceDirName(sysmanDeviceDirName);
|
||||
}
|
||||
|
||||
ze_result_t SysmanKmdInterfaceXe::readPcieDowngradeAttribute(std::string sysfsName, uint32_t &val) {
|
||||
std::map<std::string, std::string_view> pciSysfsNameToFileMap = {{"pcieDowngradeCapable", "device/auto_link_downgrade_capable"}, {"pcieDowngradeStatus", "device/auto_link_downgrade_status"}};
|
||||
auto key = pciSysfsNameToFileMap.find(sysfsName);
|
||||
if (key == pciSysfsNameToFileMap.end()) {
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
||||
}
|
||||
ze_result_t result = pSysfsAccess->read(key->second.data(), val);
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace Sysman
|
||||
} // namespace L0
|
||||
|
||||
@@ -101,6 +101,8 @@ class SysmanProductHelper {
|
||||
// Pci
|
||||
virtual ze_result_t getPciProperties(zes_pci_properties_t *pProperties) = 0;
|
||||
virtual ze_result_t getPciStats(zes_pci_stats_t *pStats, LinuxSysmanImp *pLinuxSysmanImp) = 0;
|
||||
virtual bool isPcieDowngradeSupported() = 0;
|
||||
virtual int32_t maxPcieGenSupported() = 0;
|
||||
|
||||
// Engine
|
||||
virtual bool isAggregationOfSingleEnginesSupported() = 0;
|
||||
|
||||
@@ -75,6 +75,8 @@ class SysmanProductHelperHw : public SysmanProductHelper {
|
||||
// Pci
|
||||
ze_result_t getPciProperties(zes_pci_properties_t *pProperties) override;
|
||||
ze_result_t getPciStats(zes_pci_stats_t *pStats, LinuxSysmanImp *pLinuxSysmanImp) override;
|
||||
bool isPcieDowngradeSupported() override;
|
||||
int32_t maxPcieGenSupported() override;
|
||||
|
||||
// Engine
|
||||
bool isAggregationOfSingleEnginesSupported() override;
|
||||
|
||||
@@ -381,6 +381,16 @@ ze_result_t SysmanProductHelperHw<gfxProduct>::getPciStats(zes_pci_stats_t *pSta
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
||||
};
|
||||
|
||||
template <PRODUCT_FAMILY gfxProduct>
|
||||
bool SysmanProductHelperHw<gfxProduct>::isPcieDowngradeSupported() {
|
||||
return false;
|
||||
};
|
||||
|
||||
template <PRODUCT_FAMILY gfxProduct>
|
||||
int32_t SysmanProductHelperHw<gfxProduct>::maxPcieGenSupported() {
|
||||
return -1;
|
||||
};
|
||||
|
||||
template <PRODUCT_FAMILY gfxProduct>
|
||||
bool SysmanProductHelperHw<gfxProduct>::isZesInitSupported() {
|
||||
return false;
|
||||
|
||||
@@ -1756,6 +1756,17 @@ bool SysmanProductHelperHw<gfxProduct>::isLateBindingSupported() {
|
||||
return true;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool SysmanProductHelperHw<gfxProduct>::isPcieDowngradeSupported() {
|
||||
return true;
|
||||
}
|
||||
|
||||
template <>
|
||||
int32_t SysmanProductHelperHw<gfxProduct>::maxPcieGenSupported() {
|
||||
constexpr int32_t maxPcieGenSupported = 5;
|
||||
return maxPcieGenSupported;
|
||||
}
|
||||
|
||||
template class SysmanProductHelperHw<gfxProduct>;
|
||||
|
||||
} // namespace Sysman
|
||||
|
||||
Reference in New Issue
Block a user