diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/usr/fapiwrap/fapiWrapif.H | 15 | ||||
-rw-r--r-- | src/usr/fapiwrap/fapiWrap.C | 51 | ||||
-rw-r--r-- | src/usr/fapiwrap/makefile | 2 | ||||
-rw-r--r-- | src/usr/i2c/i2cTargetPres.C | 37 |
4 files changed, 81 insertions, 24 deletions
diff --git a/src/include/usr/fapiwrap/fapiWrapif.H b/src/include/usr/fapiwrap/fapiWrapif.H index e3a50f3b7..6a59e4c3f 100644 --- a/src/include/usr/fapiwrap/fapiWrapif.H +++ b/src/include/usr/fapiwrap/fapiWrapif.H @@ -60,12 +60,19 @@ namespace FAPIWRAP * @brief This function wraps around the FAPI2 HWP "get_pmic_i2c_addr" which * takes in a DDIMM's DDR4 SPD data and a PMIC's position relative to * its parent OCMB's chip and returns the device address of that pmic - * @param[in] i_spd - Binary blob containing addresses a given OCMB's PMICs + * This wrapper will actually lookup the SPD of a given ocmb target so + * the caller doesnt need to worry about it. + * @param[in] i_ocmbChip - Parent ocmb of the PMIC we wish to find the device addres of * @param[in] i_pmic_id - PMIC's position relative to parent OCMB - * @return uint8_t 0 if invalid pmic_id is passed, PMIC's devAddress otherwise + * @param[out]o_pmic_devAddr - If this pmic exists on the ocmb then return the device address + found in the SPD. Otherwise return NO_PMIC_DEV_ADDR + * @return errlHndl_t - nullptr if no error, otherwise contains error */ - uint8_t get_pmic_dev_addr( const char* i_spd, - const uint8_t i_pmic_id); + errlHndl_t get_pmic_dev_addr( TARGETING::Target * i_ocmbChip, + const uint8_t i_pmic_id, + uint8_t& o_pmic_devAddr); + + constexpr uint8_t NO_PMIC_DEV_ADDR = 0xFF; } diff --git a/src/usr/fapiwrap/fapiWrap.C b/src/usr/fapiwrap/fapiWrap.C index a65b7c233..8950e0a92 100644 --- a/src/usr/fapiwrap/fapiWrap.C +++ b/src/usr/fapiwrap/fapiWrap.C @@ -23,12 +23,18 @@ /* */ /* IBM_PROLOG_END_TAG */ -#include <fapiwrap/fapiWrapif.H> // interface definitions +// Platform includes +#include <fapiwrap/fapiWrapif.H> // interface definitions #include <fapi2/plat_hwp_invoker.H> // FAPI_INVOKE_HWP -#include <trace/interface.H> // tracing includes +#include <trace/interface.H> // tracing includes +#include <vpd/spdenums.H> // DDIMM_DDR4_SPD_SIZE +#include <devicefw/driverif.H> // deviceRead +// Imported Includes #include <exp_getidec.H> // exp_getidec #include <pmic_i2c_addr_get.H> // get_pmic_i2c_addr +#include <chipids.H> // for GEMINI ID + trace_desc_t* g_trac_fapiwrap; TRAC_INIT(&g_trac_fapiwrap, FAPIWRAP_COMP_NAME, 6*KILOBYTE, TRACE::BUFFER_SLOW); @@ -57,9 +63,44 @@ namespace FAPIWRAP return l_errl; } - uint8_t get_pmic_dev_addr( const char* i_spd, - const uint8_t i_pmic_id) + errlHndl_t get_pmic_dev_addr( TARGETING::Target * i_ocmbChip, + const uint8_t i_pmic_id, + uint8_t& o_pmic_devAddr) { - return get_pmic_i2c_addr(i_spd, i_pmic_id); + errlHndl_t l_errl = nullptr; + + do{ + + auto l_chipId = i_ocmbChip->getAttr< TARGETING::ATTR_CHIP_ID>(); + + if( l_chipId == POWER_CHIPID::GEMINI_16) + { + // If this is a Gemini OCMB then there are no PMIC targets + // so just set the out parm to NO_PMIC_DEV_ADDR and break + o_pmic_devAddr = NO_PMIC_DEV_ADDR; + break; + } + + uint8_t l_spdBlob[SPD::DDIMM_DDR4_SPD_SIZE]; + size_t l_spdSize = SPD::DDIMM_DDR4_SPD_SIZE; + + l_errl = deviceRead(i_ocmbChip, + l_spdBlob, + l_spdSize, + DEVICE_SPD_ADDRESS(SPD::ENTIRE_SPD_WITHOUT_EFD)); + + if(l_errl) + { + TRACFCOMP( g_trac_fapiwrap, ERR_MRK"get_pmic_dev_addr() " + "Error reading SPD associated with OCMB 0x%.08X", + TARGETING::get_huid(i_ocmbChip)); + break; + } + + o_pmic_devAddr = get_pmic_i2c_addr(reinterpret_cast<char *>(l_spdBlob), + i_pmic_id); + + }while(0); + return l_errl; } }
\ No newline at end of file diff --git a/src/usr/fapiwrap/makefile b/src/usr/fapiwrap/makefile index 96d96e48b..1916630db 100644 --- a/src/usr/fapiwrap/makefile +++ b/src/usr/fapiwrap/makefile @@ -35,6 +35,8 @@ EXTRAINCDIR += ${ROOTPATH}/src/include/usr/fapi2/ EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/imageProcs/ # to get ffdc_includes.H EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/ffdc/ +# to get chipids.H +EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils # HWP include directories : EXTRAINCDIR += ${ROOTPATH}/src/import/chips/ocmb/explorer/procedures/hwp/memory/ diff --git a/src/usr/i2c/i2cTargetPres.C b/src/usr/i2c/i2cTargetPres.C index 2aba61de3..c7c9421a3 100644 --- a/src/usr/i2c/i2cTargetPres.C +++ b/src/usr/i2c/i2cTargetPres.C @@ -32,7 +32,6 @@ #include <initservice/initserviceif.H> #include <errl/errlmanager.H> #include "i2c_common.H" -#include <vpd/spdenums.H> #include <fapiwrap/fapiWrapif.H> extern trace_desc_t* g_trac_i2c; @@ -269,23 +268,16 @@ errlHndl_t pmicI2CPresencePerformOp(DeviceFW::OperationType i_opType, errlHndl_t l_errl = nullptr; bool l_pmicPresent = 0; + uint8_t l_devAddr; TARGETING::Target* l_parentOcmb = TARGETING::getImmediateParentByAffinity(i_target); - - uint8_t l_spdBlob[SPD::DDIMM_DDR4_SPD_SIZE]; - size_t l_spdSize = SPD::DDIMM_DDR4_SPD_SIZE; + auto l_parentHwasState = l_parentOcmb->getAttr<TARGETING::ATTR_HWAS_STATE>(); do{ - l_errl = deviceRead(l_parentOcmb, - l_spdBlob, - l_spdSize, - DEVICE_SPD_ADDRESS(SPD::ENTIRE_SPD_WITHOUT_EFD)); - - if(l_errl) + if(! l_parentHwasState.present) { - TRACFCOMP( g_trac_i2c, ERR_MRK"pmicI2CPresencePerformOp() " - "Error reading SPD associated with PMIC 0x%.08X, failed to determine presence", - TARGETING::get_huid(i_target)); + // If the parent chip is not present, then neither is the pmic + // so just break out and return not present break; } @@ -294,13 +286,28 @@ errlHndl_t pmicI2CPresencePerformOp(DeviceFW::OperationType i_opType, // PMICs will have a different device address depending on the vendor. // Prior to doing present detection on a pmic we must first query the // device address from the parent OCMB's SPD - uint8_t l_devAddr = FAPIWRAP::get_pmic_dev_addr(reinterpret_cast<char *>(l_spdBlob), - l_relPos); + l_errl = FAPIWRAP::get_pmic_dev_addr(l_parentOcmb, + l_relPos, + l_devAddr); + if (l_errl) + { + TRACFCOMP( g_trac_i2c, ERR_MRK"pmicI2CPresencePerformOp() " + "Error attempting to read pmic device address on OCMB 0x%.08X", + TARGETING::get_huid(l_parentOcmb)); + break; + } assert(l_devAddr != 0, "Found devAddr for PMIC 0x%.08x to be 0, this cannot be. Check SPD and REL_POS on target", TARGETING::get_huid(i_target)); + if(l_devAddr == FAPIWRAP::NO_PMIC_DEV_ADDR) + { + // There is no pmic device address for this rel position on this ocmb so + // break and return not present. + break; + } + i_target->setAttr<TARGETING::ATTR_DYNAMIC_I2C_DEVICE_ADDRESS>(l_devAddr); l_errl = genericI2CTargetPresenceDetect(i_target, |