summaryrefslogtreecommitdiffstats
path: root/src/include/usr/ipmi
diff options
context:
space:
mode:
authorBrian Horton <brianh@linux.ibm.com>2015-01-31 22:04:46 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-02-16 14:52:32 -0600
commit7ff96947e3424a8d8909f7de37c1442b6e8d7a18 (patch)
tree80092d07d0af9f6b14f5a3c9fb2203902880dfe6 /src/include/usr/ipmi
parent8fcc72d4f487e90f5d9c5bc333a50a5d25703da6 (diff)
downloadtalos-hostboot-7ff96947e3424a8d8909f7de37c1442b6e8d7a18.tar.gz
talos-hostboot-7ff96947e3424a8d8909f7de37c1442b6e8d7a18.zip
error log to esel integration
Change-Id: I2f134d73b114e4177e3e285defd85fbc21153913 RTC: 117454 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/15466 Tested-by: Jenkins Server Reviewed-by: STEPHEN M. CPREK <smcprek@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/include/usr/ipmi')
-rw-r--r--src/include/usr/ipmi/ipmiif.H5
-rw-r--r--src/include/usr/ipmi/ipmisel.H264
2 files changed, 267 insertions, 2 deletions
diff --git a/src/include/usr/ipmi/ipmiif.H b/src/include/usr/ipmi/ipmiif.H
index 29867f5eb..19d62c114 100644
--- a/src/include/usr/ipmi/ipmiif.H
+++ b/src/include/usr/ipmi/ipmiif.H
@@ -78,7 +78,8 @@ namespace IPMI
NETFUN_STORAGE = (0x0a << 2),
NETFUN_TRANPORT = (0x0c << 2),
NETFUN_GRPEXT = (0x2c << 2),
- NETFUN_IBM = (0x3a << 2),
+ NETFUN_AMI = (0x32 << 2),
+ NETFUN_IBM = (0x3a << 2),
// Overload the OEM netfun for a "none" netfun. We use this as a
// default for objects which will have their netfun filled in
@@ -218,7 +219,7 @@ namespace IPMI
//AMI-specific storage messages
inline const command_t partial_add_esel(void)
- { return std::make_pair(NETFUN_STORAGE, 0x32); }
+ { return std::make_pair(NETFUN_AMI, 0xf0); }
// event messages
inline const command_t platform_event(void)
diff --git a/src/include/usr/ipmi/ipmisel.H b/src/include/usr/ipmi/ipmisel.H
new file mode 100644
index 000000000..82d86bf6f
--- /dev/null
+++ b/src/include/usr/ipmi/ipmisel.H
@@ -0,0 +1,264 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/ipmi/ipmisel.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2014,2015 */
+/* [+] 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_IPMISEL_H
+#define __IPMI_IPMISEL_H
+
+/**
+ * @file ipmisel.H
+ * @brief IPMI system error log transport definition
+ */
+
+#include <stdint.h>
+#include <builtins.h>
+#include <ipmi/ipmiif.H>
+
+/**
+ *
+ */
+
+namespace IPMISEL
+{
+ enum msg_type
+ {
+ MSG_SEND_ESEL,
+ MSG_STATE_SHUTDOWN,
+ MSG_LAST_TYPE = MSG_STATE_SHUTDOWN,
+ };
+
+ enum sel_size_constants
+ {
+ // size of the partial_add_esel request (command) data
+ PARTIAL_ADD_ESEL_REQ = 7,
+
+ // per MegaRAC SP-X spec
+ // The size of the eSEL is configurable via PRJ
+ // it can be set to 2KB per eSEL packet.
+ ESEL_MAX_SIZE = 2 * KILOBYTE,
+ };
+
+ /**
+ * @brief Send the eSEL data to the BMC
+ * @param[in] pointer to eSEL data
+ * @param[in] size of eSEL data
+ * @param[in] eid of errorlog for this eSEL (for ack)
+ * @param[in] event_dir_type for this eSEL
+ * @param[in] sensorType that caused the error/eSEL
+ * @param[in] sensorNumber that caused the error/eSEL
+ */
+ void sendESEL(uint8_t* i_eselData, uint32_t i_dataSize,
+ uint32_t i_eid, uint8_t i_eventDirType,
+ uint8_t i_sensorType, uint8_t i_sensorNumber);
+
+ // per IPMI Spec, section 32.1 SEL Event Records
+ enum sel_record_type
+ {
+ record_type_system_event = 0x02,
+ record_type_ami_esel = 0xDF,
+ };
+
+ enum sel_evm_format_version
+ {
+ format_ipmi_version_1_0 = 0x03,
+ format_ipmi_version_2_0 = 0x04,
+ };
+
+ enum sel_event_dir_type
+ {
+ event_unspecified = 0x00,
+ event_threshhold = 0x01,
+ event_state = 0x03,
+ event_predictive = 0x04,
+ event_limit = 0x05,
+ event_permformance = 0x06,
+ };
+
+ enum sel_event_data
+ {
+ event_data1_ami = 0xAA,
+ };
+
+ enum sel_generator_id
+ {
+ generator_id_ami = 0x2000,
+ };
+
+ struct selRecord
+ {
+ // ID used for SEL Record access. The Record ID values 0000h and FFFFh
+ // have special meaning in the Event Access commands and must not be
+ // used as Record ID values for stored SEL Event Records.
+ uint16_t recordID;
+
+ // [7:0] - Record Type
+ // 02h = system event record
+ // C0h-DFh = OEM timestamped, bytes 8-16 OEM defined
+ // E0h-FFh = OEM non-timestamped, bytes 4-16 OEM defined
+ uint8_t record_type;
+
+ // Time when event was logged. LS byte first.
+ uint32_t timestamp;
+
+ // RqSA & LUN if event was generated from IPMB. Software ID if event was
+ // generated from system software.
+ // Byte 1
+ // [7:1] - 7-bit I2C. Slave Address, or 7-bit system software ID
+ // [0] 0b = ID is IPMB Slave Address
+ // 1b = system software ID
+ // Byte 2
+ // [7:4] - Channel number. Channel that event message was received over.
+ // 0h if the event message was received via the system interface,
+ // primary IPMB, or internally generated by the BMC.
+ // [3:2] - reserved. Write as 00b.
+ // [1:0] - IPMB device LUN if byte 1 holds Slave Address. 00b otherwise.
+ uint16_t generator_id;
+
+ // Event Message format version
+ // (=04h for events in this specification,
+ // 03h for IPMI v1.0 Event Messages.)
+ uint8_t evm_format_version;
+
+ // Sensor Type Code for sensor that generated the event
+ uint8_t sensor_type;
+
+ // Number of sensor that generated the event
+ uint8_t sensor_number;
+
+ // Event Dir
+ // [7 ] 0b = Assertion event.
+ // 1b = Deassertion event.
+ // Event Type
+ // Type of trigger for the event, e.g. critical threshold going high,
+ // state asserted, etc. Also indicates class of the event. E.g.
+ // discrete, threshold, or OEM. The Event Type field is encoded
+ // using the Event/Reading Type Code.
+ // [6:0] - Event Type Code
+ uint8_t event_dir_type;
+
+ uint8_t event_data1;
+ uint8_t event_data2;
+ uint8_t event_data3;
+
+ // ctor
+ selRecord():
+ recordID(0),
+ record_type(0),
+ timestamp(0),
+ generator_id(0),
+ evm_format_version(0),
+ sensor_type(0),
+ sensor_number(0),
+ event_dir_type(0),
+ event_data1(0),
+ event_data2(0),
+ event_data3(0)
+ { };
+
+ } PACKED; // selRecord
+
+ // local structure needed to pass data between sendESEL command and the sel
+ // thread
+ struct eselInitData
+ {
+ size_t dataSize;
+ uint8_t eSel[sizeof(selRecord)];
+ uint8_t *eSelExtra;
+
+ // ctor
+ eselInitData(selRecord* i_eSEL,
+ uint8_t* i_extraData, uint32_t i_dataSize)
+ {
+ dataSize = i_dataSize;
+ memcpy(eSel,i_eSEL,sizeof(selRecord));
+ eSelExtra = new uint8_t[i_dataSize];
+ memcpy(eSelExtra, i_extraData, i_dataSize);
+ }
+
+ // dtor
+ ~eselInitData()
+ {
+ delete eSelExtra;
+ }
+ };
+} // namespace IPMISEL
+
+class IpmiSEL
+{
+ public:
+
+ /**
+ * Thread start routine for the resource provider
+ * @param[in] void*, unused
+ */
+ static void* start(void* unused);
+
+ /**
+ * Default constructor
+ */
+ IpmiSEL(void);
+
+ /**
+ * Destructor
+ */
+ ~IpmiSEL(void);
+
+ /**
+ * @brief Get the message queue associated with this FRU
+ * @param[in] void
+ * @return, a msg_q_t which is the message queue
+ */
+ msg_q_t msgQueue(void) const
+ { return iv_msgQ; }
+
+ private:
+ /**
+ * Entry point for the SEL transport definition
+ */
+ void execute(void);
+
+ /**
+ * @brief parse the msg and call send_esel to send the esel (handles if
+ * the SEL reservation is lost)
+ * @param[in] i_msg
+ */
+ void process_esel(msg_t *i_msg) const;
+
+ /**
+ * @brief do the actual ipmi calls to send the esel data to the bmc
+ * @param[in] i_data esel data
+ * @param[in] o_err any error generated during the send
+ * @param[in] o_cc ipmi completion code from last sendrecv
+ */
+ void send_esel(IPMISEL::eselInitData * i_data,
+ errlHndl_t &o_err, IPMI::completion_code &o_cc) const;
+
+ msg_q_t iv_msgQ; //!< ipmi message queue
+
+ //Disallow copying of this class.
+ IpmiSEL& operator=(const IpmiSEL&);
+ IpmiSEL(const IpmiSEL&);
+};
+
+#endif
OpenPOWER on IntegriCloud