1*77e6fe7aSGilbert Chen #pragma once 2*77e6fe7aSGilbert Chen 3*77e6fe7aSGilbert Chen #include "libpldm/platform.h" 4*77e6fe7aSGilbert Chen #include "libpldm/pldm.h" 5*77e6fe7aSGilbert Chen 6*77e6fe7aSGilbert Chen #include "common/types.hpp" 7*77e6fe7aSGilbert Chen #include "numeric_sensor.hpp" 8*77e6fe7aSGilbert Chen #include "pldmd/dbus_impl_requester.hpp" 9*77e6fe7aSGilbert Chen #include "requester/handler.hpp" 10*77e6fe7aSGilbert Chen #include "terminus.hpp" 11*77e6fe7aSGilbert Chen #include "terminus_manager.hpp" 12*77e6fe7aSGilbert Chen 13*77e6fe7aSGilbert Chen namespace pldm 14*77e6fe7aSGilbert Chen { 15*77e6fe7aSGilbert Chen namespace platform_mc 16*77e6fe7aSGilbert Chen { 17*77e6fe7aSGilbert Chen 18*77e6fe7aSGilbert Chen /** 19*77e6fe7aSGilbert Chen * @brief EventManager 20*77e6fe7aSGilbert Chen * 21*77e6fe7aSGilbert Chen * This class manages PLDM events from terminus. The function includes providing 22*77e6fe7aSGilbert Chen * the API for process event data and using phosphor-logging API to log the 23*77e6fe7aSGilbert Chen * event. 24*77e6fe7aSGilbert Chen * 25*77e6fe7aSGilbert Chen */ 26*77e6fe7aSGilbert Chen class EventManager 27*77e6fe7aSGilbert Chen { 28*77e6fe7aSGilbert Chen public: 29*77e6fe7aSGilbert Chen EventManager() = delete; 30*77e6fe7aSGilbert Chen EventManager(const EventManager&) = delete; 31*77e6fe7aSGilbert Chen EventManager(EventManager&&) = delete; 32*77e6fe7aSGilbert Chen EventManager& operator=(const EventManager&) = delete; 33*77e6fe7aSGilbert Chen EventManager& operator=(EventManager&&) = delete; 34*77e6fe7aSGilbert Chen virtual ~EventManager() = default; 35*77e6fe7aSGilbert Chen 36*77e6fe7aSGilbert Chen explicit EventManager(TerminusManager& terminusManager, 37*77e6fe7aSGilbert Chen TerminiMapper& termini) : 38*77e6fe7aSGilbert Chen terminusManager(terminusManager), termini(termini) {}; 39*77e6fe7aSGilbert Chen 40*77e6fe7aSGilbert Chen /** @brief Handle platform event 41*77e6fe7aSGilbert Chen * 42*77e6fe7aSGilbert Chen * @param[in] tid - tid where the event is from 43*77e6fe7aSGilbert Chen * @param[in] eventId - event Id 44*77e6fe7aSGilbert Chen * @param[in] eventClass - event class 45*77e6fe7aSGilbert Chen * @param[in] eventData - event data 46*77e6fe7aSGilbert Chen * @param[in] eventDataSize - size of event data 47*77e6fe7aSGilbert Chen * @return PLDM completion code 48*77e6fe7aSGilbert Chen */ 49*77e6fe7aSGilbert Chen int handlePlatformEvent(pldm_tid_t tid, uint16_t eventId, 50*77e6fe7aSGilbert Chen uint8_t eventClass, const uint8_t* eventData, 51*77e6fe7aSGilbert Chen size_t eventDataSize); 52*77e6fe7aSGilbert Chen 53*77e6fe7aSGilbert Chen /** @brief Set available state of terminus for pldm request. 54*77e6fe7aSGilbert Chen * 55*77e6fe7aSGilbert Chen * @param[in] tid - terminus ID 56*77e6fe7aSGilbert Chen * @param[in] state - Terminus available state for PLDM request messages 57*77e6fe7aSGilbert Chen */ 58*77e6fe7aSGilbert Chen void updateAvailableState(pldm_tid_t tid, Availability state) 59*77e6fe7aSGilbert Chen { 60*77e6fe7aSGilbert Chen availableState[tid] = state; 61*77e6fe7aSGilbert Chen }; 62*77e6fe7aSGilbert Chen 63*77e6fe7aSGilbert Chen /** @brief Get available state of terminus for pldm request. 64*77e6fe7aSGilbert Chen * 65*77e6fe7aSGilbert Chen * @param[in] tid - terminus ID 66*77e6fe7aSGilbert Chen */ 67*77e6fe7aSGilbert Chen bool getAvailableState(pldm_tid_t tid) 68*77e6fe7aSGilbert Chen { 69*77e6fe7aSGilbert Chen if (!availableState.contains(tid)) 70*77e6fe7aSGilbert Chen { 71*77e6fe7aSGilbert Chen return false; 72*77e6fe7aSGilbert Chen } 73*77e6fe7aSGilbert Chen return availableState[tid]; 74*77e6fe7aSGilbert Chen }; 75*77e6fe7aSGilbert Chen 76*77e6fe7aSGilbert Chen protected: 77*77e6fe7aSGilbert Chen /** @brief Helper method to process the PLDM Numeric sensor event class 78*77e6fe7aSGilbert Chen * 79*77e6fe7aSGilbert Chen * @param[in] tid - tid where the event is from 80*77e6fe7aSGilbert Chen * @param[in] sensorId - Sensor ID which is the source of event 81*77e6fe7aSGilbert Chen * @param[in] sensorData - Numeric sensor event data 82*77e6fe7aSGilbert Chen * @param[in] sensorDataLength - event data length 83*77e6fe7aSGilbert Chen * 84*77e6fe7aSGilbert Chen * @return PLDM completion code 85*77e6fe7aSGilbert Chen */ 86*77e6fe7aSGilbert Chen int processNumericSensorEvent(pldm_tid_t tid, uint16_t sensorId, 87*77e6fe7aSGilbert Chen const uint8_t* sensorData, 88*77e6fe7aSGilbert Chen size_t sensorDataLength); 89*77e6fe7aSGilbert Chen 90*77e6fe7aSGilbert Chen /** @brief Reference of terminusManager */ 91*77e6fe7aSGilbert Chen TerminusManager& terminusManager; 92*77e6fe7aSGilbert Chen 93*77e6fe7aSGilbert Chen /** @brief List of discovered termini */ 94*77e6fe7aSGilbert Chen TerminiMapper& termini; 95*77e6fe7aSGilbert Chen 96*77e6fe7aSGilbert Chen /** @brief Available state for pldm request of terminus */ 97*77e6fe7aSGilbert Chen std::unordered_map<pldm_tid_t, Availability> availableState; 98*77e6fe7aSGilbert Chen }; 99*77e6fe7aSGilbert Chen } // namespace platform_mc 100*77e6fe7aSGilbert Chen } // namespace pldm 101