blob: 302144c9f8f1bd44c4b9d265974eecf083176535 [file] [log] [blame]
Chicago Duan184f6022020-04-17 11:30:49 +08001#pragma once
2
3#include "libpldm/requester/pldm.h"
4
5#include "common/types.hpp"
6
7#include <sdbusplus/bus.hpp>
8#include <sdbusplus/server.hpp>
9#include <sdbusplus/server/object.hpp>
10#include <sdbusplus/timer.hpp>
11#include <sdeventplus/event.hpp>
12
13namespace pldm
14{
15
16/** @class SoftPowerOff
17 * @brief Responsible for coordinating Host SoftPowerOff operation
18 */
19class SoftPowerOff
20{
21 public:
22 /** @brief Constructs SoftPowerOff object.
23 *
24 * @param[in] bus - system D-Bus handler
25 * @param[in] event - sd_event handler
26 */
27 SoftPowerOff(sdbusplus::bus::bus& bus, sd_event* event);
28
29 /** @brief Is the pldm-softpoweroff has error.
30 * if hasError is true, that means the pldm-softpoweroff failed to
31 * trigger the host soft off,so the pldm-softpoweroff will exit.
32 */
33 inline bool isError()
34 {
35 return hasError;
36 }
37
38 /** @brief Is the timer expired.
39 */
40 inline bool isTimerExpired()
41 {
42 return timer.isExpired();
43 }
44
45 /** @brief Is the host soft off completed.
46 */
47 inline bool isCompleted()
48 {
49 return completed;
50 }
51
52 /** @brief Is receive the response for the PLDM request msg.
53 */
54 inline bool isReceiveResponse()
55 {
56 return responseReceived;
57 }
58
59 /** @brief Send PLDM Set State Effecter States command and
60 * wait the host gracefully shutdown.
61 *
62 * @param[in] event - The event loop.
63 *
64 * @return PLDM_SUCCESS or PLDM_ERROR.
65 */
66 int hostSoftOff(sdeventplus::Event& event);
67
68 private:
69 /** @brief Getting the host current state.
70 */
71 int getHostState();
72
73 /** @brief Stop the timer.
74 */
75 inline auto stopTimer()
76 {
77 return timer.stop();
78 }
79
80 /** @brief When host soft off completed, stop the timer and
81 * set the completed to true.
82 *
83 * @param[in] msg - Data associated with subscribed signal
84 */
85 void hostSoftOffComplete(sdbusplus::message::message& msg);
86
87 /** @brief Start the timer.
88 *
89 * @param[in] usec - Time to wait for the Host to gracefully shutdown.
90 *
91 * @return Success or exception thrown
92 */
93 int startTimer(const std::chrono::microseconds& usec);
94
95 /** @brief Get effecterID from PDRs.
96 *
97 * @return PLDM_SUCCESS or PLDM_ERROR
98 */
99 int getEffecterID();
100
101 /** @brief Get VMM/SystemFirmware Sensor info from PDRs.
102 *
103 * @return PLDM_SUCCESS or PLDM_ERROR
104 */
105 int getSensorInfo();
106
107 /** @brief effecterID
108 */
109 uint16_t effecterID;
110
111 /** @brief sensorID.
112 */
113 pldm::pdr::SensorID sensorID;
114
115 /** @brief sensorOffset.
116 */
117 pldm::pdr::SensorOffset sensorOffset;
118
119 /** @brief Failed to send host soft off command flag.
120 */
121 bool hasError = false;
122
123 /** @brief Host soft off completed flag.
124 */
125 bool completed = false;
126
127 /** @brief The response for the PLDM request msg is received flag.
128 */
129 bool responseReceived = false;
130
131 /** @brief Is the Virtual Machine Manager/VMM state effecter available.
132 */
133 bool VMMPdrExist = true;
134
135 /* @brief sdbusplus handle */
136 sdbusplus::bus::bus& bus;
137
138 /** @brief Reference to Timer object */
139 phosphor::Timer timer;
140
141 /** @brief Used to subscribe to dbus pldm StateSensorEvent signal
142 * When the host soft off is complete, it sends an platform event message
143 * to BMC's pldmd, and the pldmd will emit the StateSensorEvent signal.
144 **/
145 std::unique_ptr<sdbusplus::bus::match_t> pldmEventSignal;
146};
147
148} // namespace pldm