blob: 0cb0178d662df3899f5f5927cc4dfe17c298b3f0 [file] [log] [blame]
Gilbert Chen6c7fed42022-02-22 15:40:17 +00001#pragma once
2
3#include "libpldm/pldm.h"
4
5#include "common/instance_id.hpp"
6#include "common/types.hpp"
Gilbert Chen77e6fe72024-08-06 09:23:30 +00007#include "event_manager.hpp"
Gilbert Chen6c7fed42022-02-22 15:40:17 +00008#include "platform_manager.hpp"
9#include "requester/handler.hpp"
10#include "requester/mctp_endpoint_discovery.hpp"
Gilbert Cheneac61a42022-02-23 20:56:19 +000011#include "sensor_manager.hpp"
Gilbert Chen6c7fed42022-02-22 15:40:17 +000012#include "terminus_manager.hpp"
13
14namespace pldm
15{
16namespace platform_mc
17{
18
19/**
20 * @brief Manager
21 *
22 * This class handles all the aspect of the PLDM Platform Monitoring and Control
23 * specification for the MCTP devices
24 */
25class Manager : public pldm::MctpDiscoveryHandlerIntf
26{
27 public:
28 Manager() = delete;
29 Manager(const Manager&) = delete;
30 Manager(Manager&&) = delete;
31 Manager& operator=(const Manager&) = delete;
32 Manager& operator=(Manager&&) = delete;
33 ~Manager() = default;
34
35 explicit Manager(sdeventplus::Event& event, RequesterHandler& handler,
36 pldm::InstanceIdDb& instanceIdDb) :
Thu Nguyen51d66b52024-08-06 09:15:55 +000037 terminusManager(event, handler, instanceIdDb, termini, this,
38 pldm::BmcMctpEid),
Gilbert Cheneac61a42022-02-23 20:56:19 +000039 platformManager(terminusManager, termini),
Gilbert Chen77e6fe72024-08-06 09:23:30 +000040 sensorManager(event, terminusManager, termini, this),
41 eventManager(terminusManager, termini)
Gilbert Chen6c7fed42022-02-22 15:40:17 +000042 {}
43
44 /** @brief Helper function to do the actions before discovering terminus
45 *
46 * @return coroutine return_value - PLDM completion code
47 */
48 exec::task<int> beforeDiscoverTerminus();
49
50 /** @brief Helper function to do the actions after discovering terminus
51 *
52 * @return coroutine return_value - PLDM completion code
53 */
54 exec::task<int> afterDiscoverTerminus();
55
56 /** @brief Helper function to invoke registered handlers for
57 * the added MCTP endpoints
58 *
59 * @param[in] mctpInfos - list information of the MCTP endpoints
60 */
61 void handleMctpEndpoints(const MctpInfos& mctpInfos)
62 {
63 terminusManager.discoverMctpTerminus(mctpInfos);
64 }
65
66 /** @brief Helper function to invoke registered handlers for
67 * the removed MCTP endpoints
68 *
69 * @param[in] mctpInfos - list information of the MCTP endpoints
70 */
71 void handleRemovedMctpEndpoints(const MctpInfos& mctpInfos)
72 {
73 terminusManager.removeMctpTerminus(mctpInfos);
74 }
75
Gilbert Cheneac61a42022-02-23 20:56:19 +000076 /** @brief Helper function to start sensor polling of the terminus TID
77 */
78 void startSensorPolling(pldm_tid_t tid)
79 {
80 sensorManager.startPolling(tid);
81 }
82
83 /** @brief Helper function to set available state for pldm request (sensor
84 * polling and event polling) of the terminus TID. The `false` state
85 * will trigger stop flow in coroutine of sensor polling/event
86 * polling task to stop.
87 */
88 void updateAvailableState(pldm_tid_t tid, Availability state)
89 {
90 if (termini.contains(tid))
91 {
92 sensorManager.updateAvailableState(tid, state);
Gilbert Chen77e6fe72024-08-06 09:23:30 +000093 eventManager.updateAvailableState(tid, state);
Gilbert Cheneac61a42022-02-23 20:56:19 +000094 }
95 }
96
97 /** @brief Helper function to stop sensor polling of the terminus TID
98 */
99 void stopSensorPolling(pldm_tid_t tid)
100 {
101 sensorManager.stopPolling(tid);
102 }
103
Thu Nguyen9fc79122024-09-10 10:15:01 +0000104 /** @brief Sensor event handler function
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000105 *
106 * @param[in] request - Event message
107 * @param[in] payloadLength - Event message payload size
108 * @param[in] tid - Terminus ID
109 * @param[in] eventDataOffset - Event data offset
110 *
111 * @return PLDM error code: PLDM_SUCCESS when there is no error in handling
112 * the event
113 */
114 int handleSensorEvent(const pldm_msg* request, size_t payloadLength,
115 uint8_t /* formatVersion */, uint8_t tid,
116 size_t eventDataOffset)
117 {
118 auto eventData = reinterpret_cast<const uint8_t*>(request->payload) +
119 eventDataOffset;
120 auto eventDataSize = payloadLength - eventDataOffset;
Thu Nguyen9fc79122024-09-10 10:15:01 +0000121 eventManager.handlePlatformEvent(tid, PLDM_PLATFORM_EVENT_ID_NULL,
122 PLDM_SENSOR_EVENT, eventData,
123 eventDataSize);
124 return PLDM_SUCCESS;
125 }
126
127 /** @brief CPER event handler function
128 *
129 * @param[in] request - Event message
130 * @param[in] payloadLength - Event message payload size
131 * @param[in] tid - Terminus ID
132 * @param[in] eventDataOffset - Event data offset
133 *
134 * @return PLDM error code: PLDM_SUCCESS when there is no error in handling
135 * the event
136 */
137 int handleCperEvent(const pldm_msg* request, size_t payloadLength,
138 uint8_t /* formatVersion */, uint8_t tid,
139 size_t eventDataOffset)
140 {
141 auto eventData =
142 const_cast<const uint8_t*>(request->payload) + eventDataOffset;
143 auto eventDataSize = payloadLength - eventDataOffset;
144 eventManager.handlePlatformEvent(tid, PLDM_PLATFORM_EVENT_ID_NULL,
145 PLDM_CPER_EVENT, eventData,
146 eventDataSize);
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000147 return PLDM_SUCCESS;
148 }
149
Dung Caof48015b2023-11-21 04:38:29 +0000150 /** @brief PLDM POLL event handler function
151 *
152 * @param[in] request - Event message
153 * @param[in] payloadLength - Event message payload size
154 * @param[in] tid - Terminus ID
155 * @param[in] eventDataOffset - Event data offset
156 *
157 * @return PLDM error code: PLDM_SUCCESS when there is no error in handling
158 * the event
159 */
160 int handlePldmMessagePollEvent(
161 const pldm_msg* request, size_t payloadLength,
162 uint8_t /* formatVersion */, uint8_t tid, size_t eventDataOffset)
163 {
164 auto eventData = reinterpret_cast<const uint8_t*>(request->payload) +
165 eventDataOffset;
166 auto eventDataSize = payloadLength - eventDataOffset;
167 eventManager.handlePlatformEvent(tid, PLDM_PLATFORM_EVENT_ID_NULL,
168 PLDM_MESSAGE_POLL_EVENT, eventData,
169 eventDataSize);
170 return PLDM_SUCCESS;
171 }
172
173 /** @brief The function to trigger the event polling
174 *
175 * @param[in] tid - Terminus ID
176 * @param[in] pollEventId - The source eventID from pldmMessagePollEvent
177 * @param[in] pollDataTransferHandle - The dataTransferHandle from
178 * pldmMessagePollEvent event
179 * @return coroutine return_value - PLDM completion code
180 */
181 exec::task<int> pollForPlatformEvent(pldm_tid_t tid, uint16_t pollEventId,
182 uint32_t pollDataTransferHandle);
183
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000184 private:
185 /** @brief List of discovered termini */
186 TerminiMapper termini{};
187
188 /** @brief Terminus interface for calling the hook functions */
189 TerminusManager terminusManager;
190
191 /** @brief Platform interface for calling the hook functions */
192 PlatformManager platformManager;
Gilbert Cheneac61a42022-02-23 20:56:19 +0000193
194 /** @brief Store platform manager handler */
195 SensorManager sensorManager;
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000196
197 /** @brief Store event manager handler */
198 EventManager eventManager;
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000199};
200} // namespace platform_mc
201} // namespace pldm