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:
shubham kumar
2025-07-14 17:16:22 +00:00
committed by Compute-Runtime-Automation
parent 6033a10513
commit 5a1d6ac552
53 changed files with 901 additions and 66 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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