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