blob: 0d398ce35c44cdbefd0d5643990ed57adc7639fc [file] [log] [blame]
Manojkiran Edaa31ceb92021-07-22 09:19:02 +05301#pragma once
2
3#include "libpldmresponder/platform.hpp"
4
5#include <libpldm/pdr.h>
6#include <libpldm/platform.h>
7
8#include <sdbusplus/bus/match.hpp>
9#include <sdeventplus/event.hpp>
10#include <sdeventplus/utility/timer.hpp>
11
12#include <memory>
13
14namespace pldm
15{
16
17using namespace sdbusplus::bus::match::rules;
18
19namespace responder
20{
21
22using ObjectPath = std::string;
23using AssociatedEntityMap = std::map<ObjectPath, pldm_entity>;
24
25/** @class SlotHandler
26 *
27 * @brief This class performs the necessary operation in pldm for
28 * Slot Enable operation. That includes taking actions on the
29 * setStateEffecterStates calls from Host and also sending
30 * notification to inventory manager application
31 */
32class SlotHandler
33{
34 public:
35 SlotHandler() = delete;
36 ~SlotHandler() = default;
37 SlotHandler(const SlotHandler&) = delete;
38 SlotHandler& operator=(const SlotHandler&) = delete;
39 SlotHandler(SlotHandler&&) = delete;
40 SlotHandler& operator=(SlotHandler&&) = delete;
41
42 /** @brief SlotHandler Constructor
43 *
44 * @param[in] event - reference for the main event loop
45 * @param[in] repo - pointer to the BMC's Primary PDR repo
46 *
47 */
48 SlotHandler(const sdeventplus::Event& event, pldm_pdr* repo) :
49 timer(event,
50 std::bind(std::mem_fn(&SlotHandler::timeOutHandler), this)),
51 pdrRepo(repo)
52 {
53 fruPresenceMatch = nullptr;
54 currentOnGoingSlotEntity.entity_type = 0;
55 currentOnGoingSlotEntity.entity_instance_num = 0;
56 currentOnGoingSlotEntity.entity_container_id = 0;
57 }
58
59 /** @brief Method to be called when enabling a Slot for ADD/REMOVE/REPLACE
60 * @param[in] effecterID - The effecter ID of the effecter that is set from
61 * host
62 * @param[in] fruAssociationMap - the dbus path to pldm entity stored while
63 * creating the pldm fru records
64 * @param[in] stateFieldValue - the current Effecter stateFieldValue
65 */
66 void enableSlot(uint16_t effecterId,
67 const AssociatedEntityMap& fruAssociationMap,
68 uint8_t stateFieldValue);
69
70 /** @brief Method to be used for fetching the slot sensor value
71 * @param[in] slotObjectPath - the dbus object path for slot object
72 * @return - returns the sensor state for the respective slot sensor
73 */
74 uint8_t fetchSlotSensorState(const std::string& slotObjectPath);
75
76 /** @brief Method to set the oem platform handler in SlotHandler class
77 * @param[in] handler - pointer to the oem platform handler
78 */
79 void setOemPlatformHandler(pldm::responder::oem_platform::Handler* handler);
80
81 private:
82 /** @brief call back method called when the timer is expired. This handler
83 * is called when the change of state cannot be made for a slot.
84 */
85 void timeOutHandler();
86
87 /** @brief Abstracted method for obtaining the entityID from effecterID
88 * @param[in] effecterID - The effecterID of the BMC effecter
89 * @return - pldm entity ID for the given effecter ID
90 */
91 pldm_entity getEntityIDfromEffecterID(uint16_t effecterID);
92
93 /** @brief Abstracted method for processing the Slot Operations
94 * @param[in] slotObjPath - The slot dbus object path
95 * @param[in] entity - the current slot pldm entity under operation
96 * @param[in] stateFieldValue - the current Effecter stateFieldValue
97 */
98 void processSlotOperations(const std::string& slotObjectPath,
99 const pldm_entity& entity,
100 uint8_t stateFieldValue);
101
102 /** @brief Method to obtain the Adapter dbus Object Path from Slot Adapter
103 * path
104 * @param[in] slotObjPath - The slot dbus object path
105 * @return - if Successfull, returns the adapter dbus object path
106 */
107 std::optional<std::string>
108 getAdapterObjPath(const std::string& slotObjPath);
109
110 /** @brief Method to call VPD collection & VPD removal API's
111 * @param[in] adapterObjectPath - The adapter D-Bus object path
112 * @param[in] stateFieldvalue - The current stateField value from set
113 * effecter call
114 */
115 void callVPDManager(const std::string& adapterObjPath,
116 uint8_t stateFieldValue);
117
118 /** @brief Method to create a matcher to catch the property change signal
119 * @param[in] adapterObjectPath - The adapter D-Bus object path
120 * @param[in] stateFieldvalue - The current stateField value from set
121 * effecter call
122 * @param[in] entity - the current slot pldm entity under operation
123 */
124 void createPresenceMatch(const std::string& adapterObjectPath,
125 const pldm_entity& entity,
126 uint8_t stateFieldValue);
127
128 /** @brief Method to process the Property change signal from Preset Property
129 * @param[in] presentValue - The current value of present Value
130 * @param[in] stateFieldvalue - The current stateField value from set
131 * effecter call
132 * @param[in] entity - the current slot pldm entity under operation
133 */
134 void processPresentPropertyChange(
135 bool presentValue, uint8_t stateFieldvalue, const pldm_entity& entity);
136
137 /** @brief Get the sensor state from D-Bus
138 * @param[in] adapterObjectPath - reference of the Adapter dbus object path
139 * @return - Boolean value of sensor state
140 */
141
142 bool fetchSensorStateFromDbus(const std::string& adapterObjectPath);
143
144 /* @brief Method to send a state sensor event to Host from SlotHandler class
145 * @param[in] sensorId - sensor id for the event
146 * @param[in] sensorEventClass - sensor event class wrt DSP0248
147 * @param[in] sensorOffset - sensor offset
148 * @param[in] eventState - new event state
149 * @param[in] prevEventState - previous state
150 */
151 void sendStateSensorEvent(uint16_t sensorId,
152 enum sensor_event_class_states sensorEventClass,
153 uint8_t sensorOffset, uint8_t eventState,
154 uint8_t prevEventState);
155
156 pldm::responder::oem_platform::Handler* oemPlatformHandler =
157 nullptr; //!< oem platform handler
158
159 /** @brief pointer to tha matcher for Present State for adapter object*/
160 std::unique_ptr<sdbusplus::bus::match_t> fruPresenceMatch;
161
162 /** @brief Timer used for Slot VPD Collection operation */
163 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;
164
165 /** @brief pointer to BMC's primary PDR repo */
166 const pldm_pdr* pdrRepo;
167
168 /** @brief variable to store the current slot entity under operation */
169 pldm_entity currentOnGoingSlotEntity;
170};
171
172} // namespace responder
173} // namespace pldm