diff options
-rw-r--r-- | src/include/usr/isteps/istep_reasoncodes.H | 3 | ||||
-rw-r--r-- | src/include/usr/pnor/pnorif.H | 17 | ||||
-rw-r--r-- | src/usr/isteps/istep06/host_set_ipl_parms.C | 63 | ||||
-rw-r--r-- | src/usr/pnor/pnor_hiomapdd.C | 23 | ||||
-rw-r--r-- | src/usr/pnor/pnor_hiomapdd.H | 3 |
5 files changed, 103 insertions, 6 deletions
diff --git a/src/include/usr/isteps/istep_reasoncodes.H b/src/include/usr/isteps/istep_reasoncodes.H index 163191443..610232614 100644 --- a/src/include/usr/isteps/istep_reasoncodes.H +++ b/src/include/usr/isteps/istep_reasoncodes.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2018 */ +/* Contributors Listed Below - COPYRIGHT 2015,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -135,6 +135,7 @@ namespace ISTEP RC_LINK_TRAIN_ERRORS_FROM_HWP = ISTEP_COMP_ID | 0x4A, RC_RISK_LEVEL_TOO_LOW = ISTEP_COMP_ID | 0x4B, RC_INVALID_HX_KEYWORD_DATA = ISTEP_COMP_ID | 0x4C, + RC_PNOR_IPMI_NOT_ENABLED = ISTEP_COMP_ID | 0x4D, }; }; diff --git a/src/include/usr/pnor/pnorif.H b/src/include/usr/pnor/pnorif.H index 205bd453e..11cc98a10 100644 --- a/src/include/usr/pnor/pnorif.H +++ b/src/include/usr/pnor/pnorif.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2011,2018 */ +/* Contributors Listed Below - COPYRIGHT 2011,2019 */ /* [+] Google Inc. */ /* [+] International Business Machines Corp. */ /* */ @@ -60,6 +60,14 @@ struct PnorInfo_t uint32_t flashSize; //< Size of PNOR in bytes }; +/** PNOR access mode */ +enum hiomapMode +{ + PNOR_IPMI, + PNOR_MBOX, + PNOR_UNKNOWN +}; + /** * @brief Returns information about a given side of pnor * @@ -203,6 +211,13 @@ errlHndl_t validateAltMaster( void ); */ void getPnorInfo( PnorInfo_t& o_pnorInfo ); +/** + * @brief Get HIOMAP PNOR access mode + * + * @return hiomapMode Pnor access mode (ipmi/mbox) + */ +hiomapMode getPnorAccessMode( void ); + /** * @brief Check if PNOR section appears to be secure and sets the diff --git a/src/usr/isteps/istep06/host_set_ipl_parms.C b/src/usr/isteps/istep06/host_set_ipl_parms.C index 79262f6d4..72434e5a6 100644 --- a/src/usr/isteps/istep06/host_set_ipl_parms.C +++ b/src/usr/isteps/istep06/host_set_ipl_parms.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2018 */ +/* Contributors Listed Below - COPYRIGHT 2015,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -36,6 +36,10 @@ #include <console/consoleif.H> #include <initservice/initserviceif.H> +#if (defined(CONFIG_PNORDD_IS_BMCMBOX) || defined(CONFIG_PNORDD_IS_IPMI)) +#include <pnor/pnorif.H> +#endif + namespace ISTEP_06 { @@ -125,6 +129,63 @@ void* host_set_ipl_parms( void *io_pArgs ) } +#if (defined(CONFIG_PNORDD_IS_BMCMBOX) || defined(CONFIG_PNORDD_IS_IPMI)) + // Add a check to indicate the BMC does not support HIOMAP pnor-ipmi access + // and the BMC firmware should be updated + PNOR::hiomapMode l_mode = PNOR::getPnorAccessMode(); + if( l_mode != PNOR::PNOR_IPMI ) + { +#ifdef CONFIG_CONSOLE + CONSOLE::displayf(ISTEP_COMP_NAME, + "HIOMAP PNOR-IPMI not enabled, BMC firmware needs to be updated."); +#endif + + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "HIOMAP PNOR-IPMI not enabled, BMC firmware needs to be updated."); + +#ifdef CONFIG_PNORDD_IS_BMCMBOX + bool l_IS_BMCMBOX = true; +#else + bool l_IS_BMCMBOX = false; +#endif + +#ifdef CONFIG_PNORDD_IS_IPMI + bool l_IS_IPMI = true; +#else + bool l_IS_IPMI = false; +#endif + + /*@ + * @errortype + * @moduleid ISTEP::MOD_SET_IPL_PARMS + * @reasoncode ISTEP::RC_PNOR_IPMI_NOT_ENABLED + * @userdata1 HIOMAP Mode + * @userdata2[0-31] CONFIG_PNORDD_IS_BMCMBOX + * @userdata2[32:63] CONFIG_PNORDD_IS_IPMI + * @devdesc PNOR-IPMI not enabled, BMC firmware needs to be updated + * @custdesc PNOR-IPMI not enabled, BMC firmware needs to be updated + */ + l_err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_PREDICTIVE, + ISTEP::MOD_SET_IPL_PARMS, + ISTEP::RC_PNOR_IPMI_NOT_ENABLED, + l_mode, + TWO_UINT32_TO_UINT64( + l_IS_BMCMBOX, + l_IS_IPMI)); + + l_err->addProcedureCallout(HWAS::EPUB_PRC_SP_CODE, + HWAS::SRCI_PRIORITY_HIGH); + + l_err->collectTrace(PNOR_COMP_NAME); + l_err->collectTrace("ISTEPS_TRACE",256); + + // Create IStep error log and cross ref error that occurred + l_stepError.addErrorDetails( l_err ); + errlCommit( l_err, ISTEP_COMP_ID ); + } +#endif + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "host_set_ipl_parms exit" ); return l_stepError.getErrorHandle(); diff --git a/src/usr/pnor/pnor_hiomapdd.C b/src/usr/pnor/pnor_hiomapdd.C index 5f998fca1..2b7acf863 100644 --- a/src/usr/pnor/pnor_hiomapdd.C +++ b/src/usr/pnor/pnor_hiomapdd.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2011,2018 */ +/* Contributors Listed Below - COPYRIGHT 2011,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -181,6 +181,14 @@ void getPnorInfo( PnorInfo_t& o_pnorInfo ) Singleton<PnorHiomapDD>::instance().getNorSize(); } +/** + * @brief Get HIOMAP PNOR access mode + */ +PNOR::hiomapMode getPnorAccessMode(void) +{ + return Singleton<PnorHiomapDD>::instance().getAccessMode(); +} + // Register access functions to DD framework DEVICE_REGISTER_ROUTE(DeviceFW::READ, DeviceFW::PNOR, @@ -218,18 +226,26 @@ uint32_t PnorHiomapDD::getNorWorkarounds(void) return iv_pnor->getNorWorkarounds(); } -static PnorIf* probeHiomapTransport(TARGETING::Target* i_target) +PNOR::hiomapMode PnorHiomapDD::getAccessMode(void) +{ + return iv_mode; +} + +static PnorIf* probeHiomapTransport(TARGETING::Target* i_target, + PNOR::hiomapMode& io_mode) { PnorIf* pnor; do { if ((pnor = PnorIpmiDD::probe(i_target))) { + io_mode = PNOR::PNOR_IPMI; break; } if ((pnor = PnorMboxDD::probe(i_target))) { + io_mode = PNOR::PNOR_MBOX; break; } } while (0); @@ -250,8 +266,9 @@ static PnorIf* probeHiomapTransport(TARGETING::Target* i_target) } PnorHiomapDD::PnorHiomapDD(TARGETING::Target* i_target) +:iv_mode(PNOR::PNOR_UNKNOWN) { - iv_pnor = probeHiomapTransport(i_target); + iv_pnor = probeHiomapTransport(i_target, iv_mode); } PnorHiomapDD::~PnorHiomapDD() diff --git a/src/usr/pnor/pnor_hiomapdd.H b/src/usr/pnor/pnor_hiomapdd.H index 8bda811d5..49e1e824d 100644 --- a/src/usr/pnor/pnor_hiomapdd.H +++ b/src/usr/pnor/pnor_hiomapdd.H @@ -49,6 +49,8 @@ class PnorHiomapDD : public PnorIf PnorHiomapDD(TARGETING::Target* i_target = NULL); ~PnorHiomapDD(); + PNOR::hiomapMode getAccessMode(void); + virtual errlHndl_t readFlash(void* o_buffer, size_t& io_buflen, uint64_t i_address); @@ -63,6 +65,7 @@ class PnorHiomapDD : public PnorIf private: PnorIf* iv_pnor; + PNOR::hiomapMode iv_mode; }; #endif |