#pragma once #include "libpldm/pldm.h" #include "common/instance_id.hpp" #include "common/types.hpp" #include "oem_event_manager.hpp" #include "platform-mc/manager.hpp" #include "requester/handler.hpp" #include "requester/request.hpp" namespace pldm { namespace oem_ampere { using namespace pldm::pdr; using EventToMsgMap_t = std::unordered_map<uint8_t, std::string>; enum sensor_ids { PCIE_HOT_PLUG = 169, BOOT_OVERALL = 175, }; namespace boot { namespace status { enum boot_status { BOOT_STATUS_SUCCESS = 0x80, BOOT_STATUS_FAILURE = 0x81, }; } // namespace status namespace stage { enum boot_stage { UEFI_STATUS_CLASS_CODE_MIN = 0x00, UEFI_STATUS_CLASS_CODE_MAX = 0x7f, SECPRO = 0x90, MPRO = 0x91, ATF_BL1 = 0x92, ATF_BL2 = 0x93, DDR_INITIALIZATION = 0x94, DDR_TRAINING = 0x95, S0_DDR_TRAINING_FAILURE = 0x96, ATF_BL31 = 0x97, ATF_BL32 = 0x98, S1_DDR_TRAINING_FAILURE = 0x99, }; } // namespace stage } // namespace boot enum class log_level : int { OK, WARNING, CRITICAL, BIOSFWPANIC, }; /* * PresentReading value format * FIELD | COMMENT * Bit 31 | Reserved * Bit 30:24 | Media slot number (0 - 63) This field can be used by UEFI * | to indicate the media slot number (such as NVMe/SSD slot) * | (7 bits) * Bit 23 | Operation status: 1 = operation failed * | 0 = operation successful * Bit 22 | Action: 0 - Insertion 1 - Removal * Bit 21:18 | Function (4 bits) * Bit 17:13 | Device (5 bits) * Bit 12:5 | Bus (8 bits) * Bit 4:0 | Segment (5 bits) */ typedef union { uint32_t value; struct { uint32_t segment:5; uint32_t bus:8; uint32_t device:5; uint32_t function:4; uint32_t action:1; uint32_t opStatus:1; uint32_t mediaSlot:7; uint32_t reserved:1; } __attribute__((packed)) bits; } PCIeHotPlugEventRecord_t; /** * @brief OemEventManager * * */ class OemEventManager { public: OemEventManager() = delete; OemEventManager(const OemEventManager&) = delete; OemEventManager(OemEventManager&&) = delete; OemEventManager& operator=(const OemEventManager&) = delete; OemEventManager& operator=(OemEventManager&&) = delete; virtual ~OemEventManager() = default; explicit OemEventManager( sdeventplus::Event& event, requester::Handler<requester::Request>* /* handler */, pldm::InstanceIdDb& /* instanceIdDb */) : event(event) {}; /** @brief Decode sensor event messages and handle correspondingly. * * @param[in] request - the request message of sensor event * @param[in] payloadLength - the payload length of sensor event * @param[in] formatVersion - the format version of sensor event * @param[in] tid - TID * @param[in] eventDataOffset - the event data offset of sensor event * * @return int - returned error code */ int handleSensorEvent(const pldm_msg* request, size_t payloadLength, uint8_t /* formatVersion */, pldm_tid_t tid, size_t eventDataOffset); protected: /** @brief Create prefix string for logging message. * * @param[in] tid - TID * @param[in] sensorId - Sensor ID * * @return std::string - the prefeix string */ std::string prefixMsgStrCreation(pldm_tid_t tid, uint16_t sensorId); /** @brief Log the message into Redfish SEL. * * @param[in] description - the logging message * @param[in] logLevel - the logging level */ void sendJournalRedfish(const std::string& description, log_level& logLevel); /** @brief Convert the one-hot DIMM index byte into a string of DIMM * indexes. * * @param[in] dimmIdxs - the one-hot DIMM index byte * * @return std::string - the string of DIMM indexes */ std::string dimmIdxsToString(uint32_t dimmIdxs); /** @brief Handle numeric sensor event message from PCIe hot-plug sensor. * * @param[in] tid - TID * @param[in] sensorId - Sensor ID * @param[in] presentReading - the present reading of the sensor */ void handlePCIeHotPlugEvent(pldm_tid_t tid, uint16_t sensorId, uint32_t presentReading); /** @brief Handle numeric sensor event message from boot overall sensor. * * @param[in] tid - TID * @param[in] sensorId - Sensor ID * @param[in] presentReading - the present reading of the sensor */ void handleBootOverallEvent(pldm_tid_t /*tid*/, uint16_t /*sensorId*/, uint32_t presentReading); /** @brief Handle numeric sensor event messages. * * @param[in] tid - TID * @param[in] sensorId - Sensor ID * @param[in] sensorData - the sensor data * @param[in] sensorDataLength - the length of sensor data * * @return int - returned error code */ int processNumericSensorEvent(pldm_tid_t tid, uint16_t sensorId, const uint8_t* sensorData, size_t sensorDataLength); /** @brief Handle state sensor event messages. * * @param[in] tid - TID * @param[in] sensorId - Sensor ID * @param[in] sensorData - the sensor data * @param[in] sensorDataLength - the length of sensor data * * @return int - returned error code */ int processStateSensorEvent(pldm_tid_t tid, uint16_t sensorId, const uint8_t* sensorData, size_t sensorDataLength); /** @brief Handle op state sensor event messages. * * @param[in] tid - TID * @param[in] sensorId - Sensor ID * @param[in] sensorData - the sensor data * @param[in] sensorDataLength - the length of sensor data * * @return int - returned error code */ int processSensorOpStateEvent(pldm_tid_t tid, uint16_t sensorId, const uint8_t* sensorData, size_t sensorDataLength); /** @brief reference of main event loop of pldmd, primarily used to schedule * work */ sdeventplus::Event& event; }; } // namespace oem_ampere } // namespace pldm