summaryrefslogtreecommitdiffstats
path: root/softoff/softoff.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'softoff/softoff.hpp')
-rw-r--r--softoff/softoff.hpp61
1 files changed, 46 insertions, 15 deletions
diff --git a/softoff/softoff.hpp b/softoff/softoff.hpp
index f0e992c..43bc303 100644
--- a/softoff/softoff.hpp
+++ b/softoff/softoff.hpp
@@ -2,14 +2,20 @@
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>
+#include <functional>
+#include <xyz/openbmc_project/Control/Host/server.hpp>
#include <xyz/openbmc_project/Ipmi/Internal/SoftPowerOff/server.hpp>
#include "timer.hpp"
+#include "config.h"
namespace phosphor
{
namespace ipmi
{
namespace Base = sdbusplus::xyz::openbmc_project::Ipmi::Internal::server;
+using namespace sdbusplus::xyz::openbmc_project::Control::server;
+
+namespace sdbusRule = sdbusplus::bus::match::rules;
/** @class SoftPowerOff
* @brief Responsible for coordinating Host SoftPowerOff operation
@@ -30,17 +36,27 @@ class SoftPowerOff : public sdbusplus::server::object::object<
sdbusplus::server::object::object<
Base::SoftPowerOff>(bus, objPath, false),
bus(bus),
- timer(event)
+ timer(event),
+ hostControlSignal(
+ bus,
+ sdbusRule::type::signal() +
+ sdbusRule::member("CommandComplete") +
+ sdbusRule::path("/xyz/openbmc_project/control/host0") +
+ sdbusRule::interface(CONTROL_HOST_BUSNAME) +
+ sdbusRule::argN(0,convertForMessage(
+ Host::Command::SoftOff)),
+ std::bind(std::mem_fn(&SoftPowerOff::hostControlEvent),
+ this, std::placeholders::_1))
{
// Need to announce since we may get the response
- // very quickly on SMS_ATN
+ // very quickly on host shutdown command
emit_object_added();
- // The whole purpose of this application is to send SMS_ATTN
- // and watch for the soft power off to go through. We need the
- // interface added signal emitted before we send SMS_ATN just to
- // attend to lightning fast response from host
- sendSMSAttn();
+ // The whole purpose of this application is to send a host shutdown
+ // command and watch for the soft power off to go through. We need
+ // the interface added signal emitted before we send the shutdown
+ // command just to attend to lightning fast response from host
+ sendHostShutDownCmd();
}
/** @brief Tells if the objective of this application is completed */
@@ -94,21 +110,36 @@ class SoftPowerOff : public sdbusplus::server::object::object<
*/
bool completed = false;
- /** @brief Sends SMS_ATN to host to initiate soft power off process.
+ /** @brief Subscribe to host control signals
+ *
+ * Protocol is to send the host power off request to the host
+ * control interface and then wait for a signal indicating pass/fail
+ **/
+ sdbusplus::bus::match_t hostControlSignal;
+
+ /** @brief Sends host control command to tell host to shut down
*
- * After sending the SMS_ATN, starts a timer for 30
- * seconds and expects a initial response from the host.
- * After receiving the initial response, starts another
- * timer for 30 minutes to let host do a clean shutdown of
- * partitions. When the second response is received from the
- * host, it indicates that BMC can do a power off.
+ * After sending the command, wait for a signal indicating the status
+ * of the command.
+ *
+ * After receiving the initial response, start a timer for 30 minutes
+ * to let host do a clean shutdown of partitions. When the response is
+ * received from the host, it indicates that BMC can do a power off.
* If BMC fails to get any response, then a hard power off would
* be forced.
*
* @return - Does not return anything. Error will result in exception
* being thrown
*/
- void sendSMSAttn();
+ void sendHostShutDownCmd();
+
+ /** @brief Callback function on host control signals
+ *
+ * @param[in] msg - Data associated with subscribed signal
+ *
+ */
+ void hostControlEvent(sdbusplus::message::message& msg);
+
};
} // namespace ipmi
} // namespace phosphor
OpenPOWER on IntegriCloud