177e6fe7aSGilbert Chen #pragma once 277e6fe7aSGilbert Chen 377e6fe7aSGilbert Chen #include "libpldm/platform.h" 477e6fe7aSGilbert Chen #include "libpldm/pldm.h" 577e6fe7aSGilbert Chen 677e6fe7aSGilbert Chen #include "common/types.hpp" 777e6fe7aSGilbert Chen #include "numeric_sensor.hpp" 877e6fe7aSGilbert Chen #include "pldmd/dbus_impl_requester.hpp" 977e6fe7aSGilbert Chen #include "requester/handler.hpp" 1077e6fe7aSGilbert Chen #include "terminus.hpp" 1177e6fe7aSGilbert Chen #include "terminus_manager.hpp" 1277e6fe7aSGilbert Chen 1377e6fe7aSGilbert Chen namespace pldm 1477e6fe7aSGilbert Chen { 1577e6fe7aSGilbert Chen namespace platform_mc 1677e6fe7aSGilbert Chen { 1777e6fe7aSGilbert Chen 1877e6fe7aSGilbert Chen /** 1977e6fe7aSGilbert Chen * @brief EventManager 2077e6fe7aSGilbert Chen * 2177e6fe7aSGilbert Chen * This class manages PLDM events from terminus. The function includes providing 2277e6fe7aSGilbert Chen * the API for process event data and using phosphor-logging API to log the 2377e6fe7aSGilbert Chen * event. 2477e6fe7aSGilbert Chen * 2577e6fe7aSGilbert Chen */ 2677e6fe7aSGilbert Chen class EventManager 2777e6fe7aSGilbert Chen { 2877e6fe7aSGilbert Chen public: 2977e6fe7aSGilbert Chen EventManager() = delete; 3077e6fe7aSGilbert Chen EventManager(const EventManager&) = delete; 3177e6fe7aSGilbert Chen EventManager(EventManager&&) = delete; 3277e6fe7aSGilbert Chen EventManager& operator=(const EventManager&) = delete; 3377e6fe7aSGilbert Chen EventManager& operator=(EventManager&&) = delete; 3477e6fe7aSGilbert Chen virtual ~EventManager() = default; 3577e6fe7aSGilbert Chen EventManager(TerminusManager & terminusManager,TerminiMapper & termini)3677e6fe7aSGilbert Chen explicit EventManager(TerminusManager& terminusManager, 3777e6fe7aSGilbert Chen TerminiMapper& termini) : 3877e6fe7aSGilbert Chen terminusManager(terminusManager), termini(termini) {}; 3977e6fe7aSGilbert Chen 4077e6fe7aSGilbert Chen /** @brief Handle platform event 4177e6fe7aSGilbert Chen * 4277e6fe7aSGilbert Chen * @param[in] tid - tid where the event is from 4377e6fe7aSGilbert Chen * @param[in] eventId - event Id 4477e6fe7aSGilbert Chen * @param[in] eventClass - event class 4577e6fe7aSGilbert Chen * @param[in] eventData - event data 4677e6fe7aSGilbert Chen * @param[in] eventDataSize - size of event data 4777e6fe7aSGilbert Chen * @return PLDM completion code 4877e6fe7aSGilbert Chen */ 4977e6fe7aSGilbert Chen int handlePlatformEvent(pldm_tid_t tid, uint16_t eventId, 5077e6fe7aSGilbert Chen uint8_t eventClass, const uint8_t* eventData, 5177e6fe7aSGilbert Chen size_t eventDataSize); 5277e6fe7aSGilbert Chen 5377e6fe7aSGilbert Chen /** @brief Set available state of terminus for pldm request. 5477e6fe7aSGilbert Chen * 5577e6fe7aSGilbert Chen * @param[in] tid - terminus ID 5677e6fe7aSGilbert Chen * @param[in] state - Terminus available state for PLDM request messages 5777e6fe7aSGilbert Chen */ updateAvailableState(pldm_tid_t tid,Availability state)5877e6fe7aSGilbert Chen void updateAvailableState(pldm_tid_t tid, Availability state) 5977e6fe7aSGilbert Chen { 6077e6fe7aSGilbert Chen availableState[tid] = state; 6177e6fe7aSGilbert Chen }; 6277e6fe7aSGilbert Chen 6377e6fe7aSGilbert Chen /** @brief Get available state of terminus for pldm request. 6477e6fe7aSGilbert Chen * 6577e6fe7aSGilbert Chen * @param[in] tid - terminus ID 6677e6fe7aSGilbert Chen */ getAvailableState(pldm_tid_t tid)6777e6fe7aSGilbert Chen bool getAvailableState(pldm_tid_t tid) 6877e6fe7aSGilbert Chen { 6977e6fe7aSGilbert Chen if (!availableState.contains(tid)) 7077e6fe7aSGilbert Chen { 7177e6fe7aSGilbert Chen return false; 7277e6fe7aSGilbert Chen } 7377e6fe7aSGilbert Chen return availableState[tid]; 7477e6fe7aSGilbert Chen }; 7577e6fe7aSGilbert Chen 7677e6fe7aSGilbert Chen protected: 7777e6fe7aSGilbert Chen /** @brief Helper method to process the PLDM Numeric sensor event class 7877e6fe7aSGilbert Chen * 7977e6fe7aSGilbert Chen * @param[in] tid - tid where the event is from 8077e6fe7aSGilbert Chen * @param[in] sensorId - Sensor ID which is the source of event 8177e6fe7aSGilbert Chen * @param[in] sensorData - Numeric sensor event data 8277e6fe7aSGilbert Chen * @param[in] sensorDataLength - event data length 8377e6fe7aSGilbert Chen * 8477e6fe7aSGilbert Chen * @return PLDM completion code 8577e6fe7aSGilbert Chen */ 8677e6fe7aSGilbert Chen int processNumericSensorEvent(pldm_tid_t tid, uint16_t sensorId, 8777e6fe7aSGilbert Chen const uint8_t* sensorData, 8877e6fe7aSGilbert Chen size_t sensorDataLength); 8977e6fe7aSGilbert Chen 90*9fc79128SThu Nguyen /** @brief Helper method to process the PLDM CPER event class 91*9fc79128SThu Nguyen * 92*9fc79128SThu Nguyen * @param[in] tid - tid where the event is from 93*9fc79128SThu Nguyen * @param[in] eventId - Event ID which is the source of event 94*9fc79128SThu Nguyen * @param[in] eventData - CPER event data 95*9fc79128SThu Nguyen * @param[in] eventDataSize - event data length 96*9fc79128SThu Nguyen * 97*9fc79128SThu Nguyen * @return PLDM completion code 98*9fc79128SThu Nguyen */ 99*9fc79128SThu Nguyen int processCperEvent(pldm_tid_t tid, uint16_t eventId, 100*9fc79128SThu Nguyen const uint8_t* eventData, const size_t eventDataSize); 101*9fc79128SThu Nguyen 102*9fc79128SThu Nguyen /** @brief Helper method to create CPER dump log 103*9fc79128SThu Nguyen * 104*9fc79128SThu Nguyen * @param[in] dataType - CPER event data type 105*9fc79128SThu Nguyen * @param[in] dataPath - CPER event data fault log file path 106*9fc79128SThu Nguyen * @param[in] typeName - Terminus name which creates CPER event 107*9fc79128SThu Nguyen * 108*9fc79128SThu Nguyen * @return PLDM completion code 109*9fc79128SThu Nguyen */ 110*9fc79128SThu Nguyen int createCperDumpEntry(const std::string& dataType, 111*9fc79128SThu Nguyen const std::string& dataPath, 112*9fc79128SThu Nguyen const std::string& typeName); 113*9fc79128SThu Nguyen 11477e6fe7aSGilbert Chen /** @brief Reference of terminusManager */ 11577e6fe7aSGilbert Chen TerminusManager& terminusManager; 11677e6fe7aSGilbert Chen 11777e6fe7aSGilbert Chen /** @brief List of discovered termini */ 11877e6fe7aSGilbert Chen TerminiMapper& termini; 11977e6fe7aSGilbert Chen 12077e6fe7aSGilbert Chen /** @brief Available state for pldm request of terminus */ 12177e6fe7aSGilbert Chen std::unordered_map<pldm_tid_t, Availability> availableState; 12277e6fe7aSGilbert Chen }; 12377e6fe7aSGilbert Chen } // namespace platform_mc 12477e6fe7aSGilbert Chen } // namespace pldm 125