#pragma once #include #include #include namespace phosphor { namespace ipmi { namespace Base = sdbusplus::xyz::openbmc_project::Ipmi::Internal::server; /** @class SoftPowerOff * @brief Responsible for coordinating Host SoftPowerOff operation */ class SoftPowerOff : public sdbusplus::server::object::object< Base::SoftPowerOff> { public: /** @brief Constructs SoftPowerOff object. * * @param[in] bus - system dbus handler * @param[in] objPath - The Dbus path that hosts SoftPowerOff function */ SoftPowerOff(sdbusplus::bus::bus& bus, const char* objPath) : sdbusplus::server::object::object< Base::SoftPowerOff>(bus, objPath), bus(bus) { // 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(); } private: /** @brief Sends SMS_ATN to host to initiate soft power off process. * * After sending the SMS_ATN, starts a watchdog timer for 30 * seconds and expects a initial response from the host. * After receiving the initial response, starts another watchdog * 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. * 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(); /* @brief sdbusplus handle */ sdbusplus::bus::bus& bus; }; } // namespace ipmi } // namespace phosphor