1506aa0f3SVishwanatha Subbanna #pragma once 2506aa0f3SVishwanatha Subbanna 3506aa0f3SVishwanatha Subbanna #include <sdbusplus/bus.hpp> 4506aa0f3SVishwanatha Subbanna #include <sdbusplus/server/object.hpp> 5506aa0f3SVishwanatha Subbanna #include <xyz/openbmc_project/Ipmi/Internal/SoftPowerOff/server.hpp> 6*bcb76886SVishwanatha Subbanna #include "timer.hpp" 7506aa0f3SVishwanatha Subbanna namespace phosphor 8506aa0f3SVishwanatha Subbanna { 9506aa0f3SVishwanatha Subbanna namespace ipmi 10506aa0f3SVishwanatha Subbanna { 11506aa0f3SVishwanatha Subbanna 12506aa0f3SVishwanatha Subbanna namespace Base = sdbusplus::xyz::openbmc_project::Ipmi::Internal::server; 13506aa0f3SVishwanatha Subbanna 14506aa0f3SVishwanatha Subbanna /** @class SoftPowerOff 15506aa0f3SVishwanatha Subbanna * @brief Responsible for coordinating Host SoftPowerOff operation 16506aa0f3SVishwanatha Subbanna */ 17506aa0f3SVishwanatha Subbanna class SoftPowerOff : public sdbusplus::server::object::object< 18506aa0f3SVishwanatha Subbanna Base::SoftPowerOff> 19506aa0f3SVishwanatha Subbanna { 20506aa0f3SVishwanatha Subbanna public: 21506aa0f3SVishwanatha Subbanna /** @brief Constructs SoftPowerOff object. 22506aa0f3SVishwanatha Subbanna * 23506aa0f3SVishwanatha Subbanna * @param[in] bus - system dbus handler 24*bcb76886SVishwanatha Subbanna * @param[in] event - sd_event handler 25*bcb76886SVishwanatha Subbanna * @param[in] objPath - The Dbus path hosting SoftPowerOff function 26506aa0f3SVishwanatha Subbanna */ 27506aa0f3SVishwanatha Subbanna SoftPowerOff(sdbusplus::bus::bus& bus, 28*bcb76886SVishwanatha Subbanna sd_event* event, 29506aa0f3SVishwanatha Subbanna const char* objPath) : 307cc9d716SVishwanatha Subbanna sdbusplus::server::object::object< 31*bcb76886SVishwanatha Subbanna Base::SoftPowerOff>(bus, objPath, false), 32*bcb76886SVishwanatha Subbanna bus(bus), 33*bcb76886SVishwanatha Subbanna timer(event) 34506aa0f3SVishwanatha Subbanna { 35*bcb76886SVishwanatha Subbanna // Need to announce since we may get the response 36*bcb76886SVishwanatha Subbanna // very quickly on SMS_ATN 37*bcb76886SVishwanatha Subbanna emit_object_added(); 38*bcb76886SVishwanatha Subbanna 397cc9d716SVishwanatha Subbanna // The whole purpose of this application is to send SMS_ATTN 407cc9d716SVishwanatha Subbanna // and watch for the soft power off to go through. We need the 417cc9d716SVishwanatha Subbanna // interface added signal emitted before we send SMS_ATN just to 427cc9d716SVishwanatha Subbanna // attend to lightning fast response from host 437cc9d716SVishwanatha Subbanna sendSMSAttn(); 44506aa0f3SVishwanatha Subbanna } 457cc9d716SVishwanatha Subbanna 46*bcb76886SVishwanatha Subbanna /** @brief Tells if the objective of this application is completed */ 47*bcb76886SVishwanatha Subbanna inline auto isCompleted() 48*bcb76886SVishwanatha Subbanna { 49*bcb76886SVishwanatha Subbanna return completed; 50*bcb76886SVishwanatha Subbanna } 51*bcb76886SVishwanatha Subbanna 52*bcb76886SVishwanatha Subbanna /** @brief Tells if the referenced timer is expired or not */ 53*bcb76886SVishwanatha Subbanna inline auto isTimerExpired() 54*bcb76886SVishwanatha Subbanna { 55*bcb76886SVishwanatha Subbanna return timer.isExpired(); 56*bcb76886SVishwanatha Subbanna } 57*bcb76886SVishwanatha Subbanna 587cc9d716SVishwanatha Subbanna private: 59*bcb76886SVishwanatha Subbanna // Need this to send SMS_ATTN 60*bcb76886SVishwanatha Subbanna // TODO : Switch over to using mapper service in a different patch 61*bcb76886SVishwanatha Subbanna static constexpr auto HOST_IPMI_BUS = "org.openbmc.HostIpmi"; 62*bcb76886SVishwanatha Subbanna static constexpr auto HOST_IPMI_OBJ = "/org/openbmc/HostIpmi/1"; 63*bcb76886SVishwanatha Subbanna static constexpr auto HOST_IPMI_INTF = "org.openbmc.HostIpmi"; 64*bcb76886SVishwanatha Subbanna 65*bcb76886SVishwanatha Subbanna /* @brief sdbusplus handle */ 66*bcb76886SVishwanatha Subbanna sdbusplus::bus::bus& bus; 67*bcb76886SVishwanatha Subbanna 68*bcb76886SVishwanatha Subbanna /** @brief Reference to Timer object */ 69*bcb76886SVishwanatha Subbanna Timer timer; 70*bcb76886SVishwanatha Subbanna 71*bcb76886SVishwanatha Subbanna /** @brief Marks the end of life of this application. 72*bcb76886SVishwanatha Subbanna * 73*bcb76886SVishwanatha Subbanna * This is set to true if host gives appropriate responses 74*bcb76886SVishwanatha Subbanna * for the sequence of commands. 75*bcb76886SVishwanatha Subbanna */ 76*bcb76886SVishwanatha Subbanna bool completed = false; 77*bcb76886SVishwanatha Subbanna 787cc9d716SVishwanatha Subbanna /** @brief Sends SMS_ATN to host to initiate soft power off process. 797cc9d716SVishwanatha Subbanna * 80*bcb76886SVishwanatha Subbanna * After sending the SMS_ATN, starts a timer for 30 817cc9d716SVishwanatha Subbanna * seconds and expects a initial response from the host. 82*bcb76886SVishwanatha Subbanna * After receiving the initial response, starts another 837cc9d716SVishwanatha Subbanna * timer for 30 minutes to let host do a clean shutdown of 847cc9d716SVishwanatha Subbanna * partitions. When the second response is received from the 857cc9d716SVishwanatha Subbanna * host, it indicates that BMC can do a power off. 867cc9d716SVishwanatha Subbanna * If BMC fails to get any response, then a hard power off would 877cc9d716SVishwanatha Subbanna * be forced. 887cc9d716SVishwanatha Subbanna * 897cc9d716SVishwanatha Subbanna * @return - Does not return anything. Error will result in exception 907cc9d716SVishwanatha Subbanna * being thrown 917cc9d716SVishwanatha Subbanna */ 927cc9d716SVishwanatha Subbanna void sendSMSAttn(); 93506aa0f3SVishwanatha Subbanna }; 94506aa0f3SVishwanatha Subbanna } // namespace ipmi 95506aa0f3SVishwanatha Subbanna } // namespace phosphor 96