| /* |
| * Copyright (c) 2018-present Facebook. All Rights Reserved. |
| * |
| * 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. |
| */ |
| |
| #pragma once |
| #include "sdrutils.hpp" |
| |
| #define SEL_JSON_DATA_FILE "/var/log/fbSelRaw.json" |
| #define KEY_SEL_COUNT "SelCount" |
| #define KEY_SEL_ENTRY_RAW "SelEntry" |
| #define KEY_ADD_TIME "AddTimeStamp" |
| #define KEY_ERASE_TIME "EraseTimeStamp" |
| #define KEY_FREE_SPACE "FreeSpace" |
| #define KEY_OPER_SUPP "OperationalSupport" |
| #define KEY_SEL_VER "SELVersion" |
| #define BIT(value, index) ((value >> index) & 1) |
| |
| static constexpr uint8_t ipmiSdrVersion = 0x51; |
| |
| #pragma pack(push, 1) |
| |
| struct GetSDRReq |
| { |
| uint16_t reservationID; |
| uint16_t recordID; |
| uint8_t offset; |
| uint8_t bytesToRead; |
| }; |
| |
| struct GetFRUAreaResp |
| { |
| uint8_t inventorySizeLSB; |
| uint8_t inventorySizeMSB; |
| uint8_t accessType; |
| }; |
| |
| struct GetFRUAreaReq |
| { |
| uint8_t fruDeviceID; |
| uint16_t fruInventoryOffset; |
| uint8_t countToRead; |
| }; |
| |
| struct WriteFRUDataReq |
| { |
| uint8_t fruDeviceID; |
| uint16_t fruInventoryOffset; |
| uint8_t data[]; |
| }; |
| |
| #pragma pack(pop) |
| |
| enum class GetFRUAreaAccessType : uint8_t |
| { |
| byte = 0x0, |
| words = 0x1 |
| }; |
| |
| enum class IPMINetfnStorageCmds : ipmi_cmd_t |
| { |
| ipmiCmdGetFRUInvAreaInfo = 0x10, |
| ipmiCmdReadFRUData = 0x11, |
| ipmiCmdWriteFRUData = 0x12, |
| ipmiCmdGetRepositoryInfo = 0x20, |
| ipmiCmdGetSDRAllocationInfo = 0x21, |
| ipmiCmdReserveSDR = 0x22, |
| ipmiCmdGetSDR = 0x23, |
| ipmiCmdGetSELInfo = 0x40, |
| ipmiCmdReserveSEL = 0x42, |
| ipmiCmdGetSELEntry = 0x43, |
| ipmiCmdAddSEL = 0x44, |
| ipmiCmdDeleteSEL = 0x46, |
| ipmiCmdClearSEL = 0x47, |
| ipmiCmdGetSELTime = 0x48, |
| ipmiCmdSetSELTime = 0x49, |
| }; |
| |
| #pragma pack(push, 1) |
| struct FRUHeader |
| { |
| uint8_t commonHeaderFormat; |
| uint8_t internalOffset; |
| uint8_t chassisOffset; |
| uint8_t boardOffset; |
| uint8_t productOffset; |
| uint8_t multiRecordOffset; |
| uint8_t pad; |
| uint8_t checksum; |
| }; |
| #pragma pack(pop) |
| |
| namespace fb_oem::ipmi::sel |
| { |
| |
| static constexpr auto selVersion = 0x51; |
| static constexpr auto invalidTimeStamp = 0xFFFFFFFF; |
| /* Spec indicates that more than 64kB is free */ |
| static constexpr auto freeSpace = 0xFFFF; |
| static constexpr uint8_t selOperationSupport = 0x02; |
| |
| static constexpr auto firstEntry = 0x0000; |
| static constexpr auto lastEntry = 0xFFFF; |
| static constexpr auto entireRecord = 0xFF; |
| static constexpr auto selRecordSize = 16; |
| |
| static constexpr auto stdErr = "Standard"; |
| static constexpr auto oemTSErr = "OEM timestamped"; |
| static constexpr auto fbUniSELErr = "Facebook Unified SEL"; |
| static constexpr auto oemNTSErr = "OEM non-timestamped"; |
| static constexpr auto unknownErr = "Unknown"; |
| |
| static constexpr uint8_t stdErrType = 0x02; |
| static constexpr uint8_t oemTSErrTypeMin = 0xC0; |
| static constexpr uint8_t oemTSErrTypeMax = 0xDF; |
| static constexpr uint8_t oemNTSErrTypeMin = 0xE0; |
| static constexpr uint8_t fbUniErrType = 0xFB; |
| static constexpr uint8_t oemNTSErrTypeMax = 0xFF; |
| |
| static constexpr uint8_t unifiedPcieErr = 0; |
| static constexpr uint8_t unifiedMemErr = 1; |
| static constexpr uint8_t unifiedIioErr = 3; |
| static constexpr uint8_t unifiedPostEvt = 8; |
| static constexpr uint8_t unifiedPcieEvt = 9; |
| static constexpr uint8_t unifiedMemEvt = 10; |
| static constexpr uint8_t unifiedBootGuard = 12; |
| static constexpr uint8_t unifiedPprEvt = 13; |
| |
| /* event sensor name in processing SEL */ |
| static constexpr uint8_t memoryEccError = 0x63; |
| static constexpr uint8_t memoryErrLogDIS = 0x87; |
| |
| /** @struct GetSELInfoData |
| * |
| * IPMI response payload data for Get SEL Info request |
| */ |
| struct GetSELInfoData |
| { |
| uint8_t selVersion; |
| uint16_t entries; |
| uint16_t freeSpace; |
| uint32_t addTimeStamp; |
| uint32_t eraseTimeStamp; |
| uint8_t operationSupport; |
| }; |
| |
| /** @struct GetSELEntryRequest |
| * |
| * IPMI payload for Get SEL Entry command request. |
| */ |
| struct GetSELEntryRequest |
| { |
| uint16_t reservID; //!< Reservation ID. |
| uint16_t recordID; //!< SEL Record ID. |
| uint8_t offset; //!< Offset into record. |
| uint8_t readLen; //!< Bytes to read. |
| } __attribute__((packed)); |
| |
| /** @struct GetSELEntryResponse |
| * |
| * IPMI payload for Get SEL Entry command response. |
| */ |
| struct GetSELEntryResponse |
| { |
| uint16_t nextRecordID; //!< Next RecordID. |
| uint8_t recordData[16]; //!< Record Data. |
| } __attribute__((packed)); |
| |
| /** @struct AddSELEntryRequest |
| * |
| * IPMI payload for ADD SEL Entry command request. |
| */ |
| struct StdSELEntry |
| { |
| uint16_t recordID; //!< Record ID. |
| uint8_t recordType; //!< Record Type. |
| uint32_t timeStamp; //!< Timestamp. |
| uint16_t generatorID; //!< Generator ID. |
| uint8_t eventMsgRevision; //!< Event Message Revision. |
| uint8_t sensorType; //!< Sensor Type. |
| uint8_t sensorNum; //!< Sensor Number. |
| uint8_t eventType; //!< Event Dir | Event Type. |
| uint8_t eventData1; //!< Event Data 1. |
| uint8_t eventData2; //!< Event Data 2. |
| uint8_t eventData3; //!< Event Data 3. |
| } __attribute__((packed)); |
| |
| struct TsOemSELEntry |
| { |
| uint16_t recordID; //!< Record ID. |
| uint8_t recordType; //!< Record Type. |
| uint32_t timeStamp; //!< Timestamp. |
| uint8_t mfrId[3]; //!< Manufacturer Id. |
| uint8_t oemData[6]; //!< OEM Data. |
| } __attribute__((packed)); |
| |
| struct NtsOemSELEntry |
| { |
| uint16_t recordID; //!< Record ID. |
| uint8_t recordType; //!< Record Type. |
| uint8_t oemData[13]; //!< OEM Data. |
| } __attribute__((packed)); |
| |
| static constexpr auto initiateErase = 0xAA; |
| static constexpr auto getEraseStatus = 0x00; |
| static constexpr auto eraseComplete = 0x01; |
| |
| } // namespace fb_oem::ipmi::sel |