xref: /openbmc/phosphor-host-ipmid/softoff/softoff.hpp (revision f0f496c11835d07bab6957aee6f8da61116821cb)
1506aa0f3SVishwanatha Subbanna #pragma once
2506aa0f3SVishwanatha Subbanna 
3506aa0f3SVishwanatha Subbanna #include <sdbusplus/bus.hpp>
4506aa0f3SVishwanatha Subbanna #include <sdbusplus/server/object.hpp>
5*f0f496c1SAndrew Geissler #include <functional>
6*f0f496c1SAndrew Geissler #include <xyz/openbmc_project/Control/Host/server.hpp>
7506aa0f3SVishwanatha Subbanna #include <xyz/openbmc_project/Ipmi/Internal/SoftPowerOff/server.hpp>
8bcb76886SVishwanatha Subbanna #include "timer.hpp"
9*f0f496c1SAndrew Geissler #include "config.h"
10506aa0f3SVishwanatha Subbanna namespace phosphor
11506aa0f3SVishwanatha Subbanna {
12506aa0f3SVishwanatha Subbanna namespace ipmi
13506aa0f3SVishwanatha Subbanna {
14506aa0f3SVishwanatha Subbanna 
15506aa0f3SVishwanatha Subbanna namespace Base = sdbusplus::xyz::openbmc_project::Ipmi::Internal::server;
16*f0f496c1SAndrew Geissler using namespace sdbusplus::xyz::openbmc_project::Control::server;
17*f0f496c1SAndrew Geissler 
18*f0f496c1SAndrew Geissler namespace sdbusRule = sdbusplus::bus::match::rules;
19506aa0f3SVishwanatha Subbanna 
20506aa0f3SVishwanatha Subbanna /** @class SoftPowerOff
21506aa0f3SVishwanatha Subbanna  *  @brief Responsible for coordinating Host SoftPowerOff operation
22506aa0f3SVishwanatha Subbanna  */
23506aa0f3SVishwanatha Subbanna class SoftPowerOff : public sdbusplus::server::object::object<
24506aa0f3SVishwanatha Subbanna                      Base::SoftPowerOff>
25506aa0f3SVishwanatha Subbanna {
26506aa0f3SVishwanatha Subbanna     public:
27506aa0f3SVishwanatha Subbanna         /** @brief Constructs SoftPowerOff object.
28506aa0f3SVishwanatha Subbanna          *
29506aa0f3SVishwanatha Subbanna          *  @param[in] bus       - system dbus handler
30bcb76886SVishwanatha Subbanna          *  @param[in] event     - sd_event handler
31bcb76886SVishwanatha Subbanna          *  @param[in] objPath   - The Dbus path hosting SoftPowerOff function
32506aa0f3SVishwanatha Subbanna          */
33506aa0f3SVishwanatha Subbanna         SoftPowerOff(sdbusplus::bus::bus& bus,
34bcb76886SVishwanatha Subbanna                      sd_event* event,
35506aa0f3SVishwanatha Subbanna                      const char* objPath) :
367cc9d716SVishwanatha Subbanna             sdbusplus::server::object::object<
37bcb76886SVishwanatha Subbanna                 Base::SoftPowerOff>(bus, objPath, false),
38bcb76886SVishwanatha Subbanna                 bus(bus),
39*f0f496c1SAndrew Geissler                 timer(event),
40*f0f496c1SAndrew Geissler                 hostControlSignal(
41*f0f496c1SAndrew Geissler                         bus,
42*f0f496c1SAndrew Geissler                         sdbusRule::type::signal() +
43*f0f496c1SAndrew Geissler                         sdbusRule::member("CommandComplete") +
44*f0f496c1SAndrew Geissler                         sdbusRule::path("/xyz/openbmc_project/control/host0") +
45*f0f496c1SAndrew Geissler                         sdbusRule::interface(CONTROL_HOST_BUSNAME) +
46*f0f496c1SAndrew Geissler                         sdbusRule::argN(0,convertForMessage(
47*f0f496c1SAndrew Geissler                                 Host::Command::SoftOff)),
48*f0f496c1SAndrew Geissler                         std::bind(std::mem_fn(&SoftPowerOff::hostControlEvent),
49*f0f496c1SAndrew Geissler                                   this, std::placeholders::_1))
50506aa0f3SVishwanatha Subbanna         {
51bcb76886SVishwanatha Subbanna             // Need to announce since we may get the response
52*f0f496c1SAndrew Geissler             // very quickly on host shutdown command
53bcb76886SVishwanatha Subbanna             emit_object_added();
54bcb76886SVishwanatha Subbanna 
55*f0f496c1SAndrew Geissler             // The whole purpose of this application is to send a host shutdown
56*f0f496c1SAndrew Geissler             // command and watch for the soft power off to go through. We need
57*f0f496c1SAndrew Geissler             // the interface added signal emitted before we send the shutdown
58*f0f496c1SAndrew Geissler             // command just to attend to lightning fast response from host
59*f0f496c1SAndrew Geissler             sendHostShutDownCmd();
60506aa0f3SVishwanatha Subbanna         }
617cc9d716SVishwanatha Subbanna 
62bcb76886SVishwanatha Subbanna         /** @brief Tells if the objective of this application is completed */
63bcb76886SVishwanatha Subbanna         inline auto isCompleted()
64bcb76886SVishwanatha Subbanna         {
65bcb76886SVishwanatha Subbanna             return completed;
66bcb76886SVishwanatha Subbanna         }
67bcb76886SVishwanatha Subbanna 
68bcb76886SVishwanatha Subbanna         /** @brief Tells if the referenced timer is expired or not */
69bcb76886SVishwanatha Subbanna         inline auto isTimerExpired()
70bcb76886SVishwanatha Subbanna         {
71bcb76886SVishwanatha Subbanna             return timer.isExpired();
72bcb76886SVishwanatha Subbanna         }
73bcb76886SVishwanatha Subbanna 
7431272b84SVishwanatha Subbanna         /** @brief overloaded property setter function
7531272b84SVishwanatha Subbanna          *
7631272b84SVishwanatha Subbanna          *  @param[in] value - One of SoftOffReceived / HostShutdown
7731272b84SVishwanatha Subbanna          *
7831272b84SVishwanatha Subbanna          *  @return Success or exception thrown
7931272b84SVishwanatha Subbanna          */
8031272b84SVishwanatha Subbanna         HostResponse responseReceived(HostResponse value) override;
8131272b84SVishwanatha Subbanna 
82917454bbSVishwanatha Subbanna         /** @brief Using the base class's getter method */
83917454bbSVishwanatha Subbanna         using Base::SoftPowerOff::responseReceived;
84917454bbSVishwanatha Subbanna 
85917454bbSVishwanatha Subbanna         /** @brief Calls to start a timer
86917454bbSVishwanatha Subbanna          *
87917454bbSVishwanatha Subbanna          *  @param[in] usec - Time in microseconds
88917454bbSVishwanatha Subbanna          *
89917454bbSVishwanatha Subbanna          *  @return Success or exception thrown
90917454bbSVishwanatha Subbanna          */
91917454bbSVishwanatha Subbanna         int startTimer(const std::chrono::microseconds& usec);
92917454bbSVishwanatha Subbanna 
937cc9d716SVishwanatha Subbanna     private:
94bcb76886SVishwanatha Subbanna         // Need this to send SMS_ATTN
95bcb76886SVishwanatha Subbanna         // TODO : Switch over to using mapper service in a different patch
96bcb76886SVishwanatha Subbanna         static constexpr auto HOST_IPMI_BUS  = "org.openbmc.HostIpmi";
97bcb76886SVishwanatha Subbanna         static constexpr auto HOST_IPMI_OBJ  = "/org/openbmc/HostIpmi/1";
98bcb76886SVishwanatha Subbanna         static constexpr auto HOST_IPMI_INTF = "org.openbmc.HostIpmi";
99bcb76886SVishwanatha Subbanna 
100bcb76886SVishwanatha Subbanna         /* @brief sdbusplus handle */
101bcb76886SVishwanatha Subbanna         sdbusplus::bus::bus& bus;
102bcb76886SVishwanatha Subbanna 
103bcb76886SVishwanatha Subbanna         /** @brief Reference to Timer object */
104bcb76886SVishwanatha Subbanna         Timer timer;
105bcb76886SVishwanatha Subbanna 
106bcb76886SVishwanatha Subbanna         /** @brief Marks the end of life of this application.
107bcb76886SVishwanatha Subbanna          *
108bcb76886SVishwanatha Subbanna          *  This is set to true if host gives appropriate responses
109bcb76886SVishwanatha Subbanna          *  for the sequence of commands.
110bcb76886SVishwanatha Subbanna          */
111bcb76886SVishwanatha Subbanna         bool completed = false;
112bcb76886SVishwanatha Subbanna 
113*f0f496c1SAndrew Geissler         /** @brief Subscribe to host control signals
1147cc9d716SVishwanatha Subbanna          *
115*f0f496c1SAndrew Geissler          *  Protocol is to send the host power off request to the host
116*f0f496c1SAndrew Geissler          *  control interface and then wait for a signal indicating pass/fail
117*f0f496c1SAndrew Geissler          **/
118*f0f496c1SAndrew Geissler         sdbusplus::bus::match_t hostControlSignal;
119*f0f496c1SAndrew Geissler 
120*f0f496c1SAndrew Geissler         /** @brief Sends host control command to tell host to shut down
121*f0f496c1SAndrew Geissler          *
122*f0f496c1SAndrew Geissler          *  After sending the command, wait for a signal indicating the status
123*f0f496c1SAndrew Geissler          *  of the command.
124*f0f496c1SAndrew Geissler          *
125*f0f496c1SAndrew Geissler          *  After receiving the initial response, start a timer for 30 minutes
126*f0f496c1SAndrew Geissler          *  to let host do a clean shutdown of partitions. When the response is
127*f0f496c1SAndrew Geissler          *  received from the host, it indicates that BMC can do a power off.
1287cc9d716SVishwanatha Subbanna          *  If BMC fails to get any response, then a hard power off would
1297cc9d716SVishwanatha Subbanna          *  be forced.
1307cc9d716SVishwanatha Subbanna          *
1317cc9d716SVishwanatha Subbanna          *  @return - Does not return anything. Error will result in exception
1327cc9d716SVishwanatha Subbanna          *            being thrown
1337cc9d716SVishwanatha Subbanna          */
134*f0f496c1SAndrew Geissler         void sendHostShutDownCmd();
135*f0f496c1SAndrew Geissler 
136*f0f496c1SAndrew Geissler         /** @brief Callback function on host control signals
137*f0f496c1SAndrew Geissler          *
138*f0f496c1SAndrew Geissler          * @param[in]  msg       - Data associated with subscribed signal
139*f0f496c1SAndrew Geissler          *
140*f0f496c1SAndrew Geissler          */
141*f0f496c1SAndrew Geissler         void hostControlEvent(sdbusplus::message::message& msg);
142*f0f496c1SAndrew Geissler 
143506aa0f3SVishwanatha Subbanna };
144506aa0f3SVishwanatha Subbanna } // namespace ipmi
145506aa0f3SVishwanatha Subbanna } // namespace phosphor
146