blob: 06f3861b1f791f406245e88e4bb4259ee3e4d253 [file] [log] [blame]
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +05301#pragma once
2
3#include <sdbusplus/bus.hpp>
4#include <sdbusplus/server/object.hpp>
5#include <xyz/openbmc_project/Ipmi/Internal/SoftPowerOff/server.hpp>
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +05306#include "timer.hpp"
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +05307namespace phosphor
8{
9namespace ipmi
10{
11
12namespace Base = sdbusplus::xyz::openbmc_project::Ipmi::Internal::server;
13
14/** @class SoftPowerOff
15 * @brief Responsible for coordinating Host SoftPowerOff operation
16 */
17class SoftPowerOff : public sdbusplus::server::object::object<
18 Base::SoftPowerOff>
19{
20 public:
21 /** @brief Constructs SoftPowerOff object.
22 *
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053023 * @param[in] bus - system dbus handler
24 * @param[in] event - sd_event handler
25 * @param[in] objPath - The Dbus path hosting SoftPowerOff function
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053026 */
27 SoftPowerOff(sdbusplus::bus::bus& bus,
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053028 sd_event* event,
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053029 const char* objPath) :
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053030 sdbusplus::server::object::object<
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053031 Base::SoftPowerOff>(bus, objPath, false),
32 bus(bus),
33 timer(event)
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053034 {
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053035 // Need to announce since we may get the response
36 // very quickly on SMS_ATN
37 emit_object_added();
38
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053039 // The whole purpose of this application is to send SMS_ATTN
40 // and watch for the soft power off to go through. We need the
41 // interface added signal emitted before we send SMS_ATN just to
42 // attend to lightning fast response from host
43 sendSMSAttn();
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053044 }
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053045
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053046 /** @brief Tells if the objective of this application is completed */
47 inline auto isCompleted()
48 {
49 return completed;
50 }
51
52 /** @brief Tells if the referenced timer is expired or not */
53 inline auto isTimerExpired()
54 {
55 return timer.isExpired();
56 }
57
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053058 private:
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053059 // Need this to send SMS_ATTN
60 // TODO : Switch over to using mapper service in a different patch
61 static constexpr auto HOST_IPMI_BUS = "org.openbmc.HostIpmi";
62 static constexpr auto HOST_IPMI_OBJ = "/org/openbmc/HostIpmi/1";
63 static constexpr auto HOST_IPMI_INTF = "org.openbmc.HostIpmi";
64
65 /* @brief sdbusplus handle */
66 sdbusplus::bus::bus& bus;
67
68 /** @brief Reference to Timer object */
69 Timer timer;
70
71 /** @brief Marks the end of life of this application.
72 *
73 * This is set to true if host gives appropriate responses
74 * for the sequence of commands.
75 */
76 bool completed = false;
77
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053078 /** @brief Sends SMS_ATN to host to initiate soft power off process.
79 *
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053080 * After sending the SMS_ATN, starts a timer for 30
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053081 * seconds and expects a initial response from the host.
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053082 * After receiving the initial response, starts another
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053083 * timer for 30 minutes to let host do a clean shutdown of
84 * partitions. When the second response is received from the
85 * host, it indicates that BMC can do a power off.
86 * If BMC fails to get any response, then a hard power off would
87 * be forced.
88 *
89 * @return - Does not return anything. Error will result in exception
90 * being thrown
91 */
92 void sendSMSAttn();
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053093};
94} // namespace ipmi
95} // namespace phosphor