diff options
author | Matt Derksen <mderkse1@us.ibm.com> | 2017-12-14 11:52:15 -0600 |
---|---|---|
committer | William G. Hoffa <wghoffa@us.ibm.com> | 2017-12-21 16:51:42 -0500 |
commit | 6141805efc9ca2e9109ca29c837ee3f51d63b141 (patch) | |
tree | de6945f3e0ee156a152a9829467bb8cf09199c8a | |
parent | 25cb28c5a6cf36e77719a1ae3e8bd142e09cd491 (diff) | |
download | talos-hostboot-6141805efc9ca2e9109ca29c837ee3f51d63b141.tar.gz talos-hostboot-6141805efc9ca2e9109ca29c837ee3f51d63b141.zip |
Add HB_VOLATILE sensor so OpenBMC can mark volatile sections
Set sensor to 1 to tell OpenBMC code to allow hostboot
volatile section to be cleared.
RTC: 180772
Change-Id: Id63e3ae8a24facd5e01e8bf94688a60f066ba838
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/51101
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Martin Gloff <mgloff@us.ibm.com>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
-rw-r--r-- | src/include/usr/ipmi/ipmi_reasoncodes.H | 1 | ||||
-rw-r--r-- | src/include/usr/ipmi/ipmisensor.H | 68 | ||||
-rw-r--r-- | src/usr/ipmi/ipmisensor.C | 79 | ||||
-rw-r--r-- | src/usr/isteps/istep16/call_host_ipl_complete.C | 21 | ||||
-rwxr-xr-x | src/usr/targeting/common/xmltohb/attribute_types_hb.xml | 4 |
5 files changed, 172 insertions, 1 deletions
diff --git a/src/include/usr/ipmi/ipmi_reasoncodes.H b/src/include/usr/ipmi/ipmi_reasoncodes.H index 972391675..65d8e64d3 100644 --- a/src/include/usr/ipmi/ipmi_reasoncodes.H +++ b/src/include/usr/ipmi/ipmi_reasoncodes.H @@ -43,6 +43,7 @@ namespace IPMI MOD_IPMISENSOR_ENTITY_ID = 0x09, // IPMI::getSensorEntityId MOD_IPMISENSOR_NAME = 0x0A, // IPMI::getSensorName MOD_IPMISENSOR_REBOOTCNTRL = 0x0B, // IPMI::SENSOR getRebootControl + MOD_IPMISENSOR_HBVOLATILE = 0x0C, // IPMI::SENSOR getHbVolatile }; enum IPMIReasonCode diff --git a/src/include/usr/ipmi/ipmisensor.H b/src/include/usr/ipmi/ipmisensor.H index 15499ce13..676833309 100644 --- a/src/include/usr/ipmi/ipmisensor.H +++ b/src/include/usr/ipmi/ipmisensor.H @@ -908,6 +908,74 @@ namespace SENSOR GpuSensor(); }; + + /** + * @class HbVolatileSensor + * + * @brief Specialized class for the hostboot volatile memory setup + * + * @par Detailed Description: + * Provides the functionality needed by OpenBMC to set hostboot + * section as volatile or not + * + * Usage: + * HbVolatileSensor l_hbVolatileCtl; + * l_hbVolatileCtl.setHbVolatile( HbVolatileSensor::ENABLE_VOLATILE ); + * l_hbVolatileCtl.setHbVolatile( HbVolatileSensor::DISABLE_VOLATILE ); + * + */ + class HbVolatileSensor : public SensorBase + { + + public: + + /** + * @enum hbVolatileSetting + * enum to define the contr + */ + enum hbVolatileSetting + { + DISABLE_VOLATILE = 0x00, // (default) + ENABLE_VOLATILE = 0x01, // allow volatile memory to be cleared + }; + + /** + * @brief Constructor for the HbVolatileSensor + * + * The system target holds the IPMI sensor number for this sensor. + * + */ + HbVolatileSensor(); + + /** + * @brief Destructor for the HbVolatileSensor + * + */ + ~HbVolatileSensor(); + + /** + * @brief Set hostboot volatile section to volatile or not + * + * @param[in] i_setting - enable/disable volatility of section + * + * @return Errorlog handle + * + */ + errlHndl_t setHbVolatile( hbVolatileSetting i_setting ); + + /** + * @brief get the value of the hostboot volatile + * section from the BMC. + * + * @param[o] i_setting - value = volatile or not + * + * @return Errorlog handle + * + */ + errlHndl_t getHbVolatile( hbVolatileSetting & o_setting ); + + }; + /** * @brief Updates initial state of Hostboot relevant fault sensors on the * BMC diff --git a/src/usr/ipmi/ipmisensor.C b/src/usr/ipmi/ipmisensor.C index 5eb850c6a..fadb65e05 100644 --- a/src/usr/ipmi/ipmisensor.C +++ b/src/usr/ipmi/ipmisensor.C @@ -1679,4 +1679,83 @@ namespace SENSOR } // end of GPU loop } // end of if check for non-default values } // end of updateGpuSensorStatus() + + + // + // HbVolatileSensor constructor - uses system target + // + HbVolatileSensor::HbVolatileSensor() + :SensorBase(TARGETING::SENSOR_NAME_HB_VOLATILE, NULL) + { + // message buffer created and initialized in base object. + } + + // + // HbVolatileSensor destructor + // + HbVolatileSensor::~HbVolatileSensor(){}; + + // + // setHbVolatile - tell BMC to make hostboot volatile memory + // (volatile(1) or not(0)) + // + errlHndl_t HbVolatileSensor::setHbVolatile( hbVolatileSetting i_setting ) + { + // adjust the operation to overwrite the sensor reading + // to the value we send. + iv_msg->iv_operation = SET_SENSOR_VALUE_OPERATION; + + // the HB_VOLATILE Sensor is defined as a discrete sensor + // but the assertion bytes are being used to transfer the state + iv_msg->iv_assertion_mask = le16toh(i_setting); + + TRACFCOMP(g_trac_ipmi,"HbVolatileSensor::setHbVolatile(%d)", + i_setting); + + return writeSensorData(); + } + + // + // getHbVolatile - get the HB volatile memory setting from the BMC + // + errlHndl_t HbVolatileSensor::getHbVolatile( hbVolatileSetting &o_setting ) + { + // the HB_VOLATILE sensor is defined as a discrete sensor + getSensorReadingData l_data; + + errlHndl_t l_err = readSensorData( l_data ); + + if( l_err == nullptr ) + { + // check if in valid range of hbVolatileSetting enums + if (l_data.event_status <= ENABLE_VOLATILE) + { + o_setting = static_cast<hbVolatileSetting>(l_data.event_status); + } + else + { + TRACFCOMP(g_trac_ipmi,"Unknown hb volatile setting: %d", + l_data.event_status); + + /*@ + * @errortype ERRL_SEV_UNRECOVERABLE + * @moduleid IPMI::MOD_IPMISENSOR_HBVOLATILE + * @reasoncode IPMI::RC_INVALID_SENSOR_SETTING + * @userdata1 Invalid hb volatile control setting + * @userdata2 <unused> + * @devdesc The sensor returned an invalid setting + * @custdesc Unable to find a valid sensor setting. + */ + l_err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_UNRECOVERABLE, + IPMI::MOD_IPMISENSOR_HBVOLATILE, + IPMI::RC_INVALID_SENSOR_SETTING, + l_data.event_status, + 0, + false); + } + } + return l_err; + } + }; // end name space diff --git a/src/usr/isteps/istep16/call_host_ipl_complete.C b/src/usr/isteps/istep16/call_host_ipl_complete.C index 40484d107..484faa070 100644 --- a/src/usr/isteps/istep16/call_host_ipl_complete.C +++ b/src/usr/isteps/istep16/call_host_ipl_complete.C @@ -48,7 +48,9 @@ #include <util/utilsemipersist.H> #include <hwas/common/deconfigGard.H> - +#ifdef CONFIG_BMC_IPMI +#include <ipmi/ipmisensor.H> +#endif using namespace ERRORLOG; using namespace TARGETING; using namespace ISTEP; @@ -88,6 +90,23 @@ void* call_host_ipl_complete (void *io_pArgs) errlCommit( l_err, ISTEP_COMP_ID ); } +#ifdef CONFIG_BMC_IPMI + // Alert BMC to clear HB volatile memory + SENSOR::HbVolatileSensor l_hbVolatileCtl; + l_err = l_hbVolatileCtl.setHbVolatile( + SENSOR::HbVolatileSensor::ENABLE_VOLATILE ); + if(l_err) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "Failure in notifying BMC to clear hostboot volatile section," + " RC=%X", ERRL_GETRC_SAFE(l_err) ); + + // This error could come from OpenPower system without + // updated OpenBMC code so just delete the error + delete l_err; + l_err = nullptr; + } +#endif // Setup the TCEs needed for the FSP to DMA the PAYLOAD if (TCE::utilUseTcesForDmas()) diff --git a/src/usr/targeting/common/xmltohb/attribute_types_hb.xml b/src/usr/targeting/common/xmltohb/attribute_types_hb.xml index 28e58dbe4..a28b7e96f 100755 --- a/src/usr/targeting/common/xmltohb/attribute_types_hb.xml +++ b/src/usr/targeting/common/xmltohb/attribute_types_hb.xml @@ -521,6 +521,10 @@ <value>0x0C20</value> </enumerator> <enumerator> + <name>HB_VOLATILE</name> + <value>0x0C21</value> + </enumerator> + <enumerator> <name>MEMBUF_STATE</name> <value>0x0CD1</value> </enumerator> |