blob: da88fc595abeedc629c588fe4a654f5fa0190014 [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 Subbanna31272b82017-02-01 18:53:14 +053058 /** @brief overloaded property setter function
59 *
60 * @param[in] value - One of SoftOffReceived / HostShutdown
61 *
62 * @return Success or exception thrown
63 */
64 HostResponse responseReceived(HostResponse value) override;
65
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053066 private:
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053067 // Need this to send SMS_ATTN
68 // TODO : Switch over to using mapper service in a different patch
69 static constexpr auto HOST_IPMI_BUS = "org.openbmc.HostIpmi";
70 static constexpr auto HOST_IPMI_OBJ = "/org/openbmc/HostIpmi/1";
71 static constexpr auto HOST_IPMI_INTF = "org.openbmc.HostIpmi";
72
73 /* @brief sdbusplus handle */
74 sdbusplus::bus::bus& bus;
75
76 /** @brief Reference to Timer object */
77 Timer timer;
78
79 /** @brief Marks the end of life of this application.
80 *
81 * This is set to true if host gives appropriate responses
82 * for the sequence of commands.
83 */
84 bool completed = false;
85
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053086 /** @brief Sends SMS_ATN to host to initiate soft power off process.
87 *
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053088 * After sending the SMS_ATN, starts a timer for 30
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053089 * seconds and expects a initial response from the host.
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053090 * After receiving the initial response, starts another
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053091 * timer for 30 minutes to let host do a clean shutdown of
92 * partitions. When the second response is received from the
93 * host, it indicates that BMC can do a power off.
94 * If BMC fails to get any response, then a hard power off would
95 * be forced.
96 *
97 * @return - Does not return anything. Error will result in exception
98 * being thrown
99 */
100 void sendSMSAttn();
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +0530101};
102} // namespace ipmi
103} // namespace phosphor