From 31d097409bd233008676e4779c9e6a7582e8156f Mon Sep 17 00:00:00 2001 From: Donald Washburn Date: Wed, 14 Jun 2017 13:08:22 -0500 Subject: Replaced calls to bmc for sensor type with static information. The sendErrLogToBMC function was calling to the bmc in order to determine the type of a sensor based upon a sensor number. It was determined that the sensor type can be obtained from the sensor number by data loaded during initialization via the TARGETING namespace. The ipmi call from SenorBase::getSensorType was removed from the sendErrLogToBMC function and replaced with a call to IpmiConfigLookup::getSensorType. The getSensorType function from the new IpmiConfigLookup class retrieves sensor data from target attributes and as such does not call the bmc for the type information. * Added the new IpmiConfigLookup class in the IPMI namespace. This class provides static methods to retrive sensor data provided by the IPMI_SENSOR target attribute. In addition to sensor type, the sensor entity id and sensor name can be obtined from this class based upon a sensor number. * Changed sendErrLogToBMC to call IpmiConfigLookup::getSensorType instead of Sensor::SensorBase::getSensorInfo. RTC: 164493 Change-Id: Ie8e7fa5c37fa972d6cecd1e4b69e2d0cb7504533 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/42128 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: FSP CI Jenkins Reviewed-by: Prachi Gupta Reviewed-by: ILYA SMIRNOV Reviewed-by: Richard J. Knight Reviewed-by: Daniel M. Crowell --- src/include/usr/ipmi/ipmi_reasoncodes.H | 18 +- src/include/usr/ipmi/ipmiconfiglookup.H | 244 ++++++++++++++++++++ src/include/usr/targeting/targplatutil.H | 2 +- src/usr/errl/errlmanager_common.C | 18 +- src/usr/ipmi/ipmi.mk | 3 +- src/usr/ipmi/ipmiconfiglookup.C | 384 +++++++++++++++++++++++++++++++ src/usr/targeting/targplatutil.C | 2 +- 7 files changed, 651 insertions(+), 20 deletions(-) create mode 100644 src/include/usr/ipmi/ipmiconfiglookup.H create mode 100644 src/usr/ipmi/ipmiconfiglookup.C (limited to 'src') diff --git a/src/include/usr/ipmi/ipmi_reasoncodes.H b/src/include/usr/ipmi/ipmi_reasoncodes.H index f4f08cf65..c8931bdb0 100644 --- a/src/include/usr/ipmi/ipmi_reasoncodes.H +++ b/src/include/usr/ipmi/ipmi_reasoncodes.H @@ -32,13 +32,16 @@ namespace IPMI { enum IPMIModuleId { - MOD_IPMISRV_SEND = 0x01, // IPMI::send/IPMI::sendrecv - MOD_IPMISRV_REPLY = 0x02, // IPMI::respond - MOD_IPMISENSOR = 0x03, // IPMI::sensor - MOD_IPMIDCMI = 0x04, // IPMI::sensor - MOD_IPMIRT = 0x05, // rt IPMI::send/IPMI::sendrecv - MOD_IPMISRV_POSTEVENT = 0x06, // IpmiRP::postEvent - MOD_IPMIFRU_INV = 0x07, // IPMI:fruInventory + MOD_IPMISRV_SEND = 0x01, // IPMI::send/IPMI::sendrecv + MOD_IPMISRV_REPLY = 0x02, // IPMI::respond + MOD_IPMISENSOR = 0x03, // IPMI::sensor + MOD_IPMIDCMI = 0x04, // IPMI::sensor + MOD_IPMIRT = 0x05, // rt IPMI::send/IPMI::sendrecv + MOD_IPMISRV_POSTEVENT = 0x06, // IpmiRP::postEvent + MOD_IPMIFRU_INV = 0x07, // IPMI:fruInventory + MOD_IPMISENSOR_TYPE = 0x08, // IPMI::getSensorType + MOD_IPMISENSOR_ENTITY_ID = 0x09, // IPMI::getSensorEntityId + MOD_IPMISENSOR_NAME = 0x0A, // IPMI::getSensorName }; enum IPMIReasonCode @@ -57,6 +60,7 @@ namespace IPMI RC_GET_SENSOR_TYPE_CMD_FAILED = IPMI_COMP_ID | 0x0c, RC_SENSOR_NOT_FOUND = IPMI_COMP_ID | 0x0d, RC_INVALID_VPD_DATA = IPMI_COMP_ID | 0x0e, + RC_INVALID_SENSOR_NUMBER = IPMI_COMP_ID | 0x0f, }; }; diff --git a/src/include/usr/ipmi/ipmiconfiglookup.H b/src/include/usr/ipmi/ipmiconfiglookup.H new file mode 100644 index 000000000..bc3290096 --- /dev/null +++ b/src/include/usr/ipmi/ipmiconfiglookup.H @@ -0,0 +1,244 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/usr/ipmi/ipmiconfiglookup.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2017 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ +#ifndef __IPMI_IPMICONFIG_LOOKUP_H +#define __IPMI_IPMICONFIG_LOOKUP_H + + +#include +#include + +namespace IPMI +{ + +/** + * @brief - Classs to read IPMI sensor information from the targetting + * namespace. This class does not send IPMI messages but rather + * looks up static configuration data. + * + */ +class IpmiConfigLookup +{ + public: + + /** + * @brief getSensorType. Returns the sensor type of a sensor identified + * by a sensor number. + * + * @param[in] i_sensorNumber. The IPMI sensor whose information we wish + * to gather. + * + * @param[out] o_sensorType. The sensor type as read from the + * IPMI_SENSOR_ARRAY. + * + * @param[in] i_sensorTarget. A Target to use for looking up sensor + * information. If this parameter is equal to nullptr + * then all targets will be searched for the sensor that + * matches the supplied sensor number. + * + * @return An errlHndl_t (aka ErrlEntry*) if an error occurred. If + * the call was successful, the method returns a NULL + * pointer. + * + */ + static errlHndl_t getSensorType(uint32_t i_sensorNumber, + uint8_t & o_sensorType, + TARGETING::Target * i_sensorTarget = nullptr + ); + + /** + * @brief getEntityId. Returns a sensor entity id of a sensor identified + * by a sensor number. + * + * @param[in] i_sensorNumber. The IPMI sensor whose information we wish + * to gather. + * + * @param[out] o_entityId. The sensor entity id as read from the + * IPMI_SENSOR_ARRAY. + * + * @param[in] i_sensorTarget. A Target to use for looking up sensor + * information. If this parameter is equal to nullptr + * then all targets will be searched for the sensor that + * matches the supplied sensor number. + * + * @return An errlHndl_t (aka ErrlEntry*) if an error occurred. If + * the call was successful, the method returns a NULL + * pointer. + * + */ + static errlHndl_t getEntityId(uint32_t i_sensorNumber, + uint8_t & o_entityId, + TARGETING::Target * i_sensorTarget = nullptr + ); + + /** + * @brief getSensorName. Returns the sensor name of a sensor identified by + * by a sensor number. + * + * @param[in] i_sensorNumber. The IPMI sensor whose information we wish + * to gather. + * + * @param[out] o_sensorName. Optional parameter to the sensor name. + * The sensor name by definition will be + * (SENSOR_TYPE << 16) | (ENTITY_ID). + * Pass nullptr if the caller is not interested in obtaining + * this value. At least one of o_sensorType, o_entityId or + * o_sensorName must be non-null + * + * @param[in] i_sensorTarget. A Target to use for looking up sensor + * information. If this parameter is equal to nullptr + * then all targets will be searched for the sensor that + * matches the supplied sensor number. + * + * @return An errlHndl_t (aka ErrlEntry*) if an error occurred. If + * the call was successful, the method returns a NULL + * pointer. + * + */ + static errlHndl_t getSensorName(uint32_t i_sensorNumber, + TARGETING::SENSOR_NAME & o_sensorName, + TARGETING::Target * i_sensorTarget = nullptr + ); + + /** + * @brief getSensorType. Parses a SENSOR_NAME for the sensor type + * + * @param[in] i_sensorName. SENSOR_NAME (SENSOR_TYPE | ENTITY_ID) + * + * @param[out] o_sensorType. The sensor type parsed from the SENSOR_NAME + * + */ + inline static void getSensorType(TARGETING::SENSOR_NAME i_sensorName, + uint8_t & o_sensorType + ) + { + o_sensorType = static_cast(i_sensorName >> 8 & 0x000000FF); + } + + /** + * @brief getEntityId. Parses a SENSOR_NAME for the entity id. + * + * @param[in] i_sensorName. SENSOR_NAME (SENSOR_TYPE | ENTITY_ID) + * + * @param[out] o_sensorType. The sensor type parsed from the SENSOR_NAME + */ + inline static void getEntityId(TARGETING::SENSOR_NAME i_sensorName, + uint8_t & o_entityId + ) + { + o_entityId = static_cast(i_sensorName & 0x000000FF); + } + + private: + /** + * @brief Returns parsed IPMI_SENSOR_ARRAY attribute information based upon + * a given sensor number. + * + * @param[in] i_sensorNumber. The IPMI sensor whose information we wish + * to gather. + * + * @param[out] o_sensorType. Optional parameter to the sensor type as read + * from the IPMI_SENSOR_ARRAY. Pass nullptr if the caller is not + * interested in obtaining this value. At least one of + * o_sensorType, o_entityId or o_sensorName must be non-null. + * + * @param[out] o_entityId. Optional parameter to the entity id associated with + * the sensor as read from the IPMI_SENSOR_ARRAY. Pass nullptr if + * the caller is not interested in obtaining this value. At least + * one of o_sensorType, o_entityId or o_sensorName must be + * non-null. + * + * @param[out] o_sensorName. Optional parameter to the sensor name. The sensor + * name by definition will be (SENSOR_TYPE << 16) | (ENTITY_ID). + * Pass nullptr if the caller is not interested in obtaining this + * value. At least one of o_sensorType, o_entityId or o_sensorName + * must be non-null. + * + * @param[in] i_sensorTarget. A Target to use for looking up sensor information. + * If this parameter is equal to nullptr all targets will be searched + * for the sensor that matches the supplied sensor number. + * + * @return True if the sensor was found in the IPMI_SENSOR_ARRAY attribute, + * false otherwise. + */ + static bool getIPMISensorInfo(uint32_t i_sensorNumber, + uint8_t * o_sensorType, + uint8_t * o_entityId = nullptr, + TARGETING::SENSOR_NAME * o_sensorName = nullptr, + TARGETING::Target * i_sensorTarget = nullptr + ); + +/** + * @brief Determines whether the passed in target has the IPMI_SENSOR + * attribute. + * + * @param[in] i_tgt. The target to test. + * + * @reurn True if the target has the IPMI_SENSOR attribute, false otherwise. + * + */ + inline static bool doesTargetHaveIpmiSensorAttr(TARGETING::Target * i_tgt) + { + if(!i_tgt) + { + return false; + } + + TARGETING::AttributeTraits::Type + l_ipmiArray; + return i_tgt->tryGetAttr(l_ipmiArray); + } + +/** + * @brief Given a passed in target, looks up IPMI_SENSOR data based upon + * the passed in sensor number. + * + * @param[in] i_target. The target whose IPMI_SENSOR attribute will be + * searched for information based upon the passed + * in sensor number. + * + * @param[in] i_sensorNumber. The IPMI sensor whose information we wish + * to gather. + * + * @param[out] o_sensorType. The sensor type as read from the + * from the IPMI_SENSOR_ARRAY. + * + * @param[out] o_entityId. The entity id associated with + * the sensor as read from the IPMI_SENSOR_ARRAY. + * + * @param[out] o_sensorName. The sensor name as read from + * the IPMI_SENSOR_ARRAY. + * + */ + static bool lookupIPMISensorInfo(TARGETING::Target * i_target, + uint32_t i_sensorNumber, + uint8_t& o_sensorType, + uint8_t& o_entityId, + TARGETING::SENSOR_NAME& o_sensorName + ); +}; + +} + +#endif diff --git a/src/include/usr/targeting/targplatutil.H b/src/include/usr/targeting/targplatutil.H index 40a587dec..198be1423 100644 --- a/src/include/usr/targeting/targplatutil.H +++ b/src/include/usr/targeting/targplatutil.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2015 */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ diff --git a/src/usr/errl/errlmanager_common.C b/src/usr/errl/errlmanager_common.C index 385042748..a0a54da5e 100644 --- a/src/usr/errl/errlmanager_common.C +++ b/src/usr/errl/errlmanager_common.C @@ -29,6 +29,7 @@ #ifdef CONFIG_BMC_IPMI #include #include +#include #endif #include #include @@ -711,21 +712,18 @@ void ErrlManager::sendErrLogToBmc(errlHndl_t &io_err, bool i_sendSels) // grab the sensor type so the bmc knows how to use the // offset - uint8_t unused = 0; - errlHndl_t e = - SENSOR::SensorBase::getSensorType( - l_sensorNumber[j], - l_sensorType[j],unused); - - if( e ) + errlHndl_t l_errl = + IPMI::IpmiConfigLookup::getSensorType(l_sensorNumber[j], + l_sensorType[j] + ); + if(l_errl) { TRACFCOMP(g_trac_errl, ERR_MRK"Failed to get sensor type for sensor %d", l_sensorNumber[j]); l_sensorType[j] = 0; - // since we are in the commit path, lets just delete - // this error and move on. - delete e; + + delete l_errl; } // this call will modify the sensor if any procedure diff --git a/src/usr/ipmi/ipmi.mk b/src/usr/ipmi/ipmi.mk index 4b8b244e3..9e4459543 100644 --- a/src/usr/ipmi/ipmi.mk +++ b/src/usr/ipmi/ipmi.mk @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2015 +# Contributors Listed Below - COPYRIGHT 2015,2017 # [+] International Business Machines Corp. # # @@ -26,3 +26,4 @@ OBJS += ipmisel.o OBJS += ipmisensor.o OBJS += ipmidcmi.o +OBJS += ipmiconfiglookup.o diff --git a/src/usr/ipmi/ipmiconfiglookup.C b/src/usr/ipmi/ipmiconfiglookup.C new file mode 100644 index 000000000..0cea60a55 --- /dev/null +++ b/src/usr/ipmi/ipmiconfiglookup.C @@ -0,0 +1,384 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/ipmi/ipmiconfiglookup.C $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2017 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ +#include + +#include +#include + +#include +#include +#include +#include + +extern trace_desc_t * g_trac_ipmi; + +namespace IPMI +{ + +//----------------------------------------------------------------------------- +// Private method used to lookup sensor information from the IPMI_SENSOR_ARRAY +// attribute of the i_target parameter. +// +// Returns true if the sensor was found, false otherwise. +//----------------------------------------------------------------------------- +bool IpmiConfigLookup::lookupIPMISensorInfo(TARGETING::Target * i_target, + uint32_t i_sensorNumber, + uint8_t& o_sensorType, + uint8_t& o_entityId, + TARGETING::SENSOR_NAME& o_sensorName + ) +{ + using IPMI_ARRAY_ELEMENT = uint16_t[2]; + bool l_result{false}; + + assert(nullptr != i_target); + assert(TARGETING::UTIL::INVALID_IPMI_SENSOR != i_sensorNumber); + + //Get the IPMI_SENSOR_ARRAY attribute from i_target. + TARGETING::AttributeTraits::Type l_ipmiArray; + if(!i_target->tryGetAttr(l_ipmiArray)) + { + return l_result; + } + + //Search the IPMI_SENSOR_ARRAY for the desired sensor. + uint32_t elementCount = (sizeof(l_ipmiArray)/sizeof(l_ipmiArray[0])); + const IPMI_ARRAY_ELEMENT * begin = &l_ipmiArray[0]; + const IPMI_ARRAY_ELEMENT * end = &l_ipmiArray[elementCount]; + const IPMI_ARRAY_ELEMENT * itr{nullptr}; + + itr = std::find_if(begin, + end, + [i_sensorNumber] (const IPMI_ARRAY_ELEMENT& a) + { + return a[TARGETING::IPMI_SENSOR_ARRAY_NUMBER_OFFSET] + == i_sensorNumber; + } + ); + + if(itr != end) + { + l_result = true; + uint16_t l_sensorName = (*itr) + [TARGETING::IPMI_SENSOR_ARRAY_NAME_OFFSET]; + o_sensorName = static_cast(l_sensorName); + o_sensorType = static_cast((l_sensorName >> 8) & 0x00FF); + o_entityId = static_cast(l_sensorName & 0x00FF); + } + + return l_result; +} + + +//-------------------------------------------------------------------------- +//Given a sensor number, lookup and parse SENSOR_NAME into SENSOR_TYPE +//and ENTITY_ID values. +//-------------------------------------------------------------------------- +bool IpmiConfigLookup::getIPMISensorInfo(uint32_t i_sensorNumber, + uint8_t * o_sensorType, + uint8_t * o_entityId, + TARGETING::SENSOR_NAME * o_sensorName, + TARGETING::Target * i_sensorTarget + ) +{ + bool l_result{false}; + + //Ensure that the sensor number is not the invalid id. + assert(TARGETING::UTIL::INVALID_IPMI_SENSOR != i_sensorNumber); + + TARGETING::SENSOR_NAME l_sensorName = + static_cast(0); + uint8_t l_sensorType = TARGETING::SENSOR_TYPE_NA; + uint8_t l_entityId = TARGETING::ENTITY_ID_NA; + + //Ensure that at least one optional out parameter was given. + assert(nullptr != o_sensorType || + nullptr != o_sensorName || + nullptr != o_entityId); + + //If the caller passed in a target then find sensor data within the + //context of the passed in target. + if(i_sensorTarget) + { + if(doesTargetHaveIpmiSensorAttr(i_sensorTarget)) + { + l_result = lookupIPMISensorInfo(i_sensorTarget, + i_sensorNumber, + l_sensorType, + l_entityId, + l_sensorName); + } + } + else + { + //The caller did not supply a target context for the sensor. + //Search for the sensor amoung all targets. + for(auto itr = TARGETING::targetService().begin(); + itr != TARGETING::targetService().end(); ++itr) + { + if(doesTargetHaveIpmiSensorAttr(*itr)) + { + l_result = lookupIPMISensorInfo((*itr), + i_sensorNumber, + l_sensorType, + l_entityId, + l_sensorName); + if(l_result) + { + break; + } + } + } + } + + //set any out parameters that are desired by the caller. + if(o_sensorName) + { + *o_sensorName = l_sensorName; + } + + if(o_sensorType) + { + *o_sensorType = l_sensorType; + } + + if(o_entityId) + { + *o_entityId = l_entityId; + } + + return l_result; +} + +//------------------------------------------------------------------ +errlHndl_t IpmiConfigLookup::getSensorType(uint32_t i_sensorNumber, + uint8_t & o_sensorType, + TARGETING::Target * i_sensorTarget + ) +{ + errlHndl_t l_errl{}; + + //Ensure that the sensor number is not the invalid id. + if(TARGETING::UTIL::INVALID_IPMI_SENSOR == i_sensorNumber) + { + TRACFCOMP(g_trac_ipmi, + ERR_MRK"The i_sensorNumber parameter " + "is the invalid sensor number (%X).", + i_sensorNumber + ); + /*@ + * @errortype ERRL_SEV_UNRECOVERABLE + * @moduleid IPMI::MOD_IPMISENSOR_TYPE + * @reasoncode IPMI::RC_INVALID_SENSOR_NUMBER + * @userdata1 IPMI Sensor Number + * @userdata2 + * @devdesc The passed in sensor number is not valid. + * @custdesc The passed in sensor number is not valid. + */ + l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + IPMI::MOD_IPMISENSOR_TYPE, + IPMI::RC_INVALID_SENSOR_NUMBER, + i_sensorNumber, + 0, + false); + return l_errl; + } + + bool l_rc = getIPMISensorInfo(i_sensorNumber, + &o_sensorType, + nullptr, + nullptr, + i_sensorTarget + ); + + if(!l_rc) + { + + TRACFCOMP(g_trac_ipmi, + ERR_MRK"Did not find a sensor with number %X.", + i_sensorNumber); + + /*@ + * @errortype ERRL_SEV_UNRECOVERABLE + * @moduleid IPMI::MOD_IPMISENSOR_TYPE + * @reasoncode IPMI::RC_SENSOR_NOT_FOUND + * @userdata1 IPMI Sensor Number + * @userdata2 + * @devdesc The sensor could not be found based upon + * the sensor number. + * @custdesc Unable to determine sensor information. + */ + l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + IPMI::MOD_IPMISENSOR_TYPE, + IPMI::RC_SENSOR_NOT_FOUND, + i_sensorNumber, + 0, + false); + } + + return l_errl; +} + +//-------------------------------------------------------------------------- +errlHndl_t IpmiConfigLookup::getEntityId(uint32_t i_sensorNumber, + uint8_t & o_entityId, + TARGETING::Target * i_sensorTarget + ) +{ + errlHndl_t l_errl{}; + + if(TARGETING::UTIL::INVALID_IPMI_SENSOR == i_sensorNumber) + { + + TRACFCOMP(g_trac_ipmi, + ERR_MRK"The i_sensorNumber parameter " + "is an invalid sensor number (%X).", + i_sensorNumber + ); + /*@ + * @errortype ERRL_SEV_UNRECOVERABLE + * @moduleid IPMI::MOD_IPMISENSOR_ENTITY_ID + * @reasoncode IPMI::RC_INVALID_SENSOR_NUMBER + * @userdata1 IPMI Sensor Number + * @userdata2 + * @devdesc The passed in sensor number is not valid. + * @custdesc The passed in sensor number is not valid. + */ + l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + IPMI::MOD_IPMISENSOR_ENTITY_ID, + IPMI::RC_INVALID_SENSOR_NUMBER, + i_sensorNumber, + 0, + false); + return l_errl; + } + + bool l_rc = getIPMISensorInfo(i_sensorNumber, + nullptr, + &o_entityId, + nullptr, + i_sensorTarget + ); + + if(!l_rc) + { + + TRACFCOMP(g_trac_ipmi, + ERR_MRK"Did not find a sensor with number %X.", + i_sensorNumber); + + /*@ + * @errortype ERRL_SEV_UNRECOVERABLE + * @moduleid IPMI::MOD_IPMISENSOR_ENTITY_ID + * @reasoncode IPMI::RC_SENSOR_NOT_FOUND + * @userdata1 IPMI Sensor Number + * @userdata2 + * @devdesc The sensor could not be found based upon + * the sensor number. + * @custdesc Unable to determine sensor information. + */ + l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + IPMI::MOD_IPMISENSOR_ENTITY_ID, + IPMI::RC_SENSOR_NOT_FOUND, + i_sensorNumber, + 0, + false); + } + + return l_errl; +} + +//----------------------------------------------------------------------- +errlHndl_t IpmiConfigLookup::getSensorName(uint32_t i_sensorNumber, + TARGETING::SENSOR_NAME & o_sensorName, + TARGETING::Target * i_sensorTarget + ) +{ + errlHndl_t l_errl{}; + + if(TARGETING::UTIL::INVALID_IPMI_SENSOR == i_sensorNumber) + { + + TRACFCOMP(g_trac_ipmi, + ERR_MRK"The i_sensorNumber parameter " + "is an invalid sensor number (%X).", + i_sensorNumber + ); + + /*@ + * @errortype ERRL_SEV_UNRECOVERABLE + * @moduleid IPMI::MOD_IPMISENSOR_NAME + * @reasoncode IPMI::RC_INVALID_SENSOR_NUMBER + * @userdata1 IPMI Sensor Number + * @userdata2 + * @devdesc The passed in sensor number is not valid. + * @custdesc The passed in sensor number is not valid. + */ + l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + IPMI::MOD_IPMISENSOR_NAME, + IPMI::RC_INVALID_SENSOR_NUMBER, + i_sensorNumber, + 0, + false); + return l_errl; + } + + bool l_rc = getIPMISensorInfo(i_sensorNumber, + nullptr, + nullptr, + &o_sensorName, + i_sensorTarget + ); + + if(!l_rc) + { + + TRACFCOMP(g_trac_ipmi, + ERR_MRK"Did not find a sensor with number %X.", + i_sensorNumber); + + /*@ + * @errortype ERRL_SEV_UNRECOVERABLE + * @moduleid IPMI::MOD_IPMISENSOR_NAME + * @reasoncode IPMI::RC_SENSOR_NOT_FOUND + * @userdata1 IPMI Sensor Number + * @userdata2 + * @devdesc The sensor could not be found based upon + * the sensor number. + * @custdesc Unable to determine sensor information. + */ + l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + IPMI::MOD_IPMISENSOR_NAME, + IPMI::RC_SENSOR_NOT_FOUND, + i_sensorNumber, + 0, + false); + } + + return l_errl; +} + +} //End namespace + diff --git a/src/usr/targeting/targplatutil.C b/src/usr/targeting/targplatutil.C index a1b483473..5ecad55b9 100644 --- a/src/usr/targeting/targplatutil.C +++ b/src/usr/targeting/targplatutil.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2015 */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ -- cgit v1.2.1