1a90a31a9SAndrew Geissler #pragma once 2a90a31a9SAndrew Geissler 3*e426b589SAndrew Geissler #include "config.h" 4*e426b589SAndrew Geissler 5*e426b589SAndrew Geissler #include "xyz/openbmc_project/State/Chassis/server.hpp" 6*e426b589SAndrew Geissler #include "xyz/openbmc_project/State/PowerOnHours/server.hpp" 7*e426b589SAndrew Geissler 8cb781fe1SNagaraju Goruganti #include <cereal/cereal.hpp> 9a90a31a9SAndrew Geissler #include <sdbusplus/bus.hpp> 10d998f82bSWilliam A. Kennington III #include <sdeventplus/clock.hpp> 11d998f82bSWilliam A. Kennington III #include <sdeventplus/event.hpp> 12d998f82bSWilliam A. Kennington III #include <sdeventplus/utility/timer.hpp> 13*e426b589SAndrew Geissler 14*e426b589SAndrew Geissler #include <chrono> 15*e426b589SAndrew Geissler #include <experimental/filesystem> 16*e426b589SAndrew Geissler #include <functional> 17a90a31a9SAndrew Geissler 18a90a31a9SAndrew Geissler namespace phosphor 19a90a31a9SAndrew Geissler { 20a90a31a9SAndrew Geissler namespace state 21a90a31a9SAndrew Geissler { 22a90a31a9SAndrew Geissler namespace manager 23a90a31a9SAndrew Geissler { 24a90a31a9SAndrew Geissler 258f8ba39fSPatrick Williams using ChassisInherit = sdbusplus::server::object::object< 26cb781fe1SNagaraju Goruganti sdbusplus::xyz::openbmc_project::State::server::Chassis, 27cb781fe1SNagaraju Goruganti sdbusplus::xyz::openbmc_project::State::server::PowerOnHours>; 288f8ba39fSPatrick Williams namespace sdbusRule = sdbusplus::bus::match::rules; 29cb781fe1SNagaraju Goruganti namespace fs = std::experimental::filesystem; 308f8ba39fSPatrick Williams 31a90a31a9SAndrew Geissler /** @class Chassis 32a90a31a9SAndrew Geissler * @brief OpenBMC chassis state management implementation. 33a90a31a9SAndrew Geissler * @details A concrete implementation for xyz.openbmc_project.State.Chassis 34a90a31a9SAndrew Geissler * DBus API. 35a90a31a9SAndrew Geissler */ 368f8ba39fSPatrick Williams class Chassis : public ChassisInherit 37a90a31a9SAndrew Geissler { 38a90a31a9SAndrew Geissler public: 39a90a31a9SAndrew Geissler /** @brief Constructs Chassis State Manager 40a90a31a9SAndrew Geissler * 41dff50ed6SAndrew Geissler * @note This constructor passes 'true' to the base class in order to 42dff50ed6SAndrew Geissler * defer dbus object registration until we can run 43dff50ed6SAndrew Geissler * determineInitialState() and set our properties 44dff50ed6SAndrew Geissler * 45a90a31a9SAndrew Geissler * @param[in] bus - The Dbus bus object 46a90a31a9SAndrew Geissler * @param[in] objPath - The Dbus object path 47a90a31a9SAndrew Geissler */ 48769a62f1SAndrew Geissler Chassis(sdbusplus::bus::bus& bus, const char* objPath) : 49769a62f1SAndrew Geissler ChassisInherit(bus, objPath, true), bus(bus), 5058a18013SAndrew Geissler systemdSignals( 5158a18013SAndrew Geissler bus, 5258a18013SAndrew Geissler sdbusRule::type::signal() + sdbusRule::member("JobRemoved") + 538f8ba39fSPatrick Williams sdbusRule::path("/org/freedesktop/systemd1") + 5458a18013SAndrew Geissler sdbusRule::interface("org.freedesktop.systemd1.Manager"), 5558a18013SAndrew Geissler std::bind(std::mem_fn(&Chassis::sysStateChange), this, 56d998f82bSWilliam A. Kennington III std::placeholders::_1)), 57d998f82bSWilliam A. Kennington III pOHTimer(sdeventplus::Event::get_default(), 58d998f82bSWilliam A. Kennington III std::bind(&Chassis::pOHCallback, this), std::chrono::hours{1}, 59d998f82bSWilliam A. Kennington III std::chrono::minutes{1}) 60dff50ed6SAndrew Geissler { 610029a5d2SAndrew Geissler subscribeToSystemdSignals(); 620029a5d2SAndrew Geissler 639eab9861SMatt Spinler restoreChassisStateChangeTime(); 649eab9861SMatt Spinler 65dff50ed6SAndrew Geissler determineInitialState(); 66dff50ed6SAndrew Geissler 67cb781fe1SNagaraju Goruganti restorePOHCounter(); // restore POHCounter from persisted file 68cb781fe1SNagaraju Goruganti 69dff50ed6SAndrew Geissler // We deferred this until we could get our property correct 70dff50ed6SAndrew Geissler this->emit_object_added(); 71dff50ed6SAndrew Geissler } 72dff50ed6SAndrew Geissler 73a90a31a9SAndrew Geissler /** @brief Set value of RequestedPowerTransition */ 74a90a31a9SAndrew Geissler Transition requestedPowerTransition(Transition value) override; 75a90a31a9SAndrew Geissler 76a90a31a9SAndrew Geissler /** @brief Set value of CurrentPowerState */ 77a90a31a9SAndrew Geissler PowerState currentPowerState(PowerState value) override; 78a90a31a9SAndrew Geissler 79cb781fe1SNagaraju Goruganti /** @brief Get value of POHCounter */ 80cb781fe1SNagaraju Goruganti using ChassisInherit::pOHCounter; 81cb781fe1SNagaraju Goruganti 82cb781fe1SNagaraju Goruganti /** @brief Increment POHCounter if Chassis Power state is ON */ 83cb781fe1SNagaraju Goruganti void startPOHCounter(); 84cb781fe1SNagaraju Goruganti 85a90a31a9SAndrew Geissler private: 860029a5d2SAndrew Geissler /** @brief Determine initial chassis state and set internally */ 870029a5d2SAndrew Geissler void determineInitialState(); 880029a5d2SAndrew Geissler 890029a5d2SAndrew Geissler /** 900029a5d2SAndrew Geissler * @brief subscribe to the systemd signals 910029a5d2SAndrew Geissler * 920029a5d2SAndrew Geissler * This object needs to capture when it's systemd targets complete 930029a5d2SAndrew Geissler * so it can keep it's state updated 940029a5d2SAndrew Geissler * 950029a5d2SAndrew Geissler **/ 960029a5d2SAndrew Geissler void subscribeToSystemdSignals(); 970029a5d2SAndrew Geissler 98ce80f24cSAndrew Geissler /** @brief Execute the transition request 99ce80f24cSAndrew Geissler * 100ce80f24cSAndrew Geissler * This function calls the appropriate systemd target for the input 101ce80f24cSAndrew Geissler * transition. 102ce80f24cSAndrew Geissler * 103ce80f24cSAndrew Geissler * @param[in] tranReq - Transition requested 104ce80f24cSAndrew Geissler */ 105ce80f24cSAndrew Geissler void executeTransition(Transition tranReq); 106ce80f24cSAndrew Geissler 107697474c5SJosh D. King /** 108697474c5SJosh D. King * @brief Determine if target is active 109697474c5SJosh D. King * 110697474c5SJosh D. King * This function determines if the target is active and 111697474c5SJosh D. King * helps prevent misleading log recorded states. 112697474c5SJosh D. King * 113697474c5SJosh D. King * @param[in] target - Target string to check on 114697474c5SJosh D. King * 115697474c5SJosh D. King * @return boolean corresponding to state active 116697474c5SJosh D. King **/ 117697474c5SJosh D. King bool stateActive(const std::string& target); 118697474c5SJosh D. King 1190029a5d2SAndrew Geissler /** @brief Check if systemd state change is relevant to this object 1202ec3a7e9SAndrew Geissler * 1210029a5d2SAndrew Geissler * Instance specific interface to handle the detected systemd state 1220029a5d2SAndrew Geissler * change 1232ec3a7e9SAndrew Geissler * 1242ec3a7e9SAndrew Geissler * @param[in] msg - Data associated with subscribed signal 1252ec3a7e9SAndrew Geissler * 1262ec3a7e9SAndrew Geissler */ 1278f8ba39fSPatrick Williams int sysStateChange(sdbusplus::message::message& msg); 1282ec3a7e9SAndrew Geissler 129a90a31a9SAndrew Geissler /** @brief Persistent sdbusplus DBus connection. */ 130a90a31a9SAndrew Geissler sdbusplus::bus::bus& bus; 1312ec3a7e9SAndrew Geissler 1320029a5d2SAndrew Geissler /** @brief Used to subscribe to dbus systemd signals **/ 1338f8ba39fSPatrick Williams sdbusplus::bus::match_t systemdSignals; 134cb781fe1SNagaraju Goruganti 135cb781fe1SNagaraju Goruganti /** @brief Used to Set value of POHCounter */ 136cb781fe1SNagaraju Goruganti uint32_t pOHCounter(uint32_t value) override; 137cb781fe1SNagaraju Goruganti 138d998f82bSWilliam A. Kennington III /** @brief Used by the timer to update the POHCounter */ 139d998f82bSWilliam A. Kennington III void pOHCallback(); 140d998f82bSWilliam A. Kennington III 141cb781fe1SNagaraju Goruganti /** @brief Used to restore POHCounter value from persisted file */ 142cb781fe1SNagaraju Goruganti void restorePOHCounter(); 143cb781fe1SNagaraju Goruganti 144cb781fe1SNagaraju Goruganti /** @brief Serialize and persist requested POH counter. 145cb781fe1SNagaraju Goruganti * 146cb781fe1SNagaraju Goruganti * @param[in] dir - pathname of file where the serialized POH counter will 147cb781fe1SNagaraju Goruganti * be placed. 148cb781fe1SNagaraju Goruganti * 149cb781fe1SNagaraju Goruganti * @return fs::path - pathname of persisted requested POH counter. 150cb781fe1SNagaraju Goruganti */ 151cb781fe1SNagaraju Goruganti fs::path 15281957841SMatt Spinler serializePOH(const fs::path& dir = fs::path(POH_COUNTER_PERSIST_PATH)); 153cb781fe1SNagaraju Goruganti 15481957841SMatt Spinler /** @brief Deserialize a persisted requested POH counter. 155cb781fe1SNagaraju Goruganti * 156cb781fe1SNagaraju Goruganti * @param[in] path - pathname of persisted POH counter file 157cb781fe1SNagaraju Goruganti * @param[in] retCounter - deserialized POH counter value 158cb781fe1SNagaraju Goruganti * 159cb781fe1SNagaraju Goruganti * @return bool - true if the deserialization was successful, false 160cb781fe1SNagaraju Goruganti * otherwise. 161cb781fe1SNagaraju Goruganti */ 16281957841SMatt Spinler bool deserializePOH(const fs::path& path, uint32_t& retCounter); 163cb781fe1SNagaraju Goruganti 1649eab9861SMatt Spinler /** @brief Sets the LastStateChangeTime property and persists it. */ 1659eab9861SMatt Spinler void setStateChangeTime(); 1669eab9861SMatt Spinler 1679eab9861SMatt Spinler /** @brief Serialize the last power state change time. 1689eab9861SMatt Spinler * 1699eab9861SMatt Spinler * Save the time the state changed and the state itself. 1709eab9861SMatt Spinler * The state needs to be saved as well so that during rediscovery 1719eab9861SMatt Spinler * on reboots there's a way to know not to update the time again. 1729eab9861SMatt Spinler */ 1739eab9861SMatt Spinler void serializeStateChangeTime(); 1749eab9861SMatt Spinler 1759eab9861SMatt Spinler /** @brief Deserialize the last power state change time. 1769eab9861SMatt Spinler * 1779eab9861SMatt Spinler * @param[out] time - Deserialized time 1789eab9861SMatt Spinler * @param[out] state - Deserialized power state 1799eab9861SMatt Spinler * 1809eab9861SMatt Spinler * @return bool - true if successful, false otherwise. 1819eab9861SMatt Spinler */ 1829eab9861SMatt Spinler bool deserializeStateChangeTime(uint64_t& time, PowerState& state); 1839eab9861SMatt Spinler 1849eab9861SMatt Spinler /** @brief Restores the power state change time. 1859eab9861SMatt Spinler * 1869eab9861SMatt Spinler * The time is loaded into the LastStateChangeTime D-Bus property. 1879eab9861SMatt Spinler * On the very first start after this code has been applied but 1889eab9861SMatt Spinler * before the state has changed, the LastStateChangeTime value 1899eab9861SMatt Spinler * will be zero. 1909eab9861SMatt Spinler */ 1919eab9861SMatt Spinler void restoreChassisStateChangeTime(); 1929eab9861SMatt Spinler 193d998f82bSWilliam A. Kennington III /** @brief Timer used for tracking power on hours */ 194d998f82bSWilliam A. Kennington III sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> pOHTimer; 195a90a31a9SAndrew Geissler }; 196a90a31a9SAndrew Geissler 197a90a31a9SAndrew Geissler } // namespace manager 198a90a31a9SAndrew Geissler } // namespace state 199a90a31a9SAndrew Geissler } // namespace phosphor 200