summaryrefslogtreecommitdiffstats
path: root/src/include/usr/ipmi
diff options
context:
space:
mode:
authorDonald Washburn <dwashbur@us.ibm.com>2017-06-14 13:08:22 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-06-27 13:21:34 -0400
commit31d097409bd233008676e4779c9e6a7582e8156f (patch)
treeca1c9afa82e0a5aa987b545f160cdbeb37cc4517 /src/include/usr/ipmi
parentd408402dfb499755ed265496498fabb5b0400ff0 (diff)
downloadtalos-hostboot-31d097409bd233008676e4779c9e6a7582e8156f.tar.gz
talos-hostboot-31d097409bd233008676e4779c9e6a7582e8156f.zip
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 <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Prachi Gupta <pragupta@us.ibm.com> Reviewed-by: ILYA SMIRNOV <ismirno@us.ibm.com> Reviewed-by: Richard J. Knight <rjknight@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/include/usr/ipmi')
-rw-r--r--src/include/usr/ipmi/ipmi_reasoncodes.H18
-rw-r--r--src/include/usr/ipmi/ipmiconfiglookup.H244
2 files changed, 255 insertions, 7 deletions
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 <errl/errlentry.H>
+#include <targeting/common/target.H>
+
+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<uint8_t>(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<uint8_t>(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<TARGETING::ATTR_IPMI_SENSORS>::Type
+ l_ipmiArray;
+ return i_tgt->tryGetAttr<TARGETING::ATTR_IPMI_SENSORS>(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
OpenPOWER on IntegriCloud