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