diff options
Diffstat (limited to 'src/include/usr/ipmi/ipmisel.H')
-rw-r--r-- | src/include/usr/ipmi/ipmisel.H | 264 |
1 files changed, 264 insertions, 0 deletions
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 |