diff options
author | Brian Horton <brianh@linux.ibm.com> | 2015-01-31 22:04:46 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2015-02-16 14:52:32 -0600 |
commit | 7ff96947e3424a8d8909f7de37c1442b6e8d7a18 (patch) | |
tree | 80092d07d0af9f6b14f5a3c9fb2203902880dfe6 /src/include/usr/ipmi | |
parent | 8fcc72d4f487e90f5d9c5bc333a50a5d25703da6 (diff) | |
download | talos-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.H | 5 | ||||
-rw-r--r-- | src/include/usr/ipmi/ipmisel.H | 264 |
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 |