diff options
-rw-r--r-- | chassis_state_manager.cpp | 29 | ||||
-rw-r--r-- | chassis_state_manager.hpp | 9 |
2 files changed, 38 insertions, 0 deletions
diff --git a/chassis_state_manager.cpp b/chassis_state_manager.cpp index a2b6dbf..fb0c2a3 100644 --- a/chassis_state_manager.cpp +++ b/chassis_state_manager.cpp @@ -13,6 +13,17 @@ namespace server = sdbusplus::xyz::openbmc_project::State::server; using namespace phosphor::logging; +/* Map a transition to it's systemd target */ +const std::map<server::Chassis::Transition,std::string> SYSTEMD_TARGET_TABLE = +{ + {server::Chassis::Transition::Off, "obmc-power-chassis-off@0.target"}, + {server::Chassis::Transition::On, "obmc-power-chassis-on@0.target"} +}; + +constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1"; +constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1"; +constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager"; + /* TODO:Issue 774 - Use systemd target signals to control chassis state */ int Chassis::handlePgoodOn(sd_bus_message* /*msg*/, void* usrData, sd_bus_error* retError) @@ -73,12 +84,30 @@ void Chassis::determineInitialState() return; } +void Chassis::executeTransition(Transition tranReq) +{ + auto sysdTarget = SYSTEMD_TARGET_TABLE.find(tranReq)->second; + + auto method = this->bus.new_method_call(SYSTEMD_SERVICE, + SYSTEMD_OBJ_PATH, + SYSTEMD_INTERFACE, + "StartUnit"); + + method.append(sysdTarget); + method.append("replace"); + + this->bus.call_noreply(method); + + return; +} + Chassis::Transition Chassis::requestedPowerTransition(Transition value) { log<level::INFO>("Change to Chassis Requested Power State", entry("CHASSIS_REQUESTED_POWER_STATE=%s", convertForMessage(value).c_str())); + executeTransition(value); return server::Chassis::requestedPowerTransition(value); } diff --git a/chassis_state_manager.hpp b/chassis_state_manager.hpp index 16456bf..181d75c 100644 --- a/chassis_state_manager.hpp +++ b/chassis_state_manager.hpp @@ -61,6 +61,15 @@ class Chassis : public sdbusplus::server::object::object< PowerState currentPowerState(PowerState value) override; private: + /** @brief Execute the transition request + * + * This function calls the appropriate systemd target for the input + * transition. + * + * @param[in] tranReq - Transition requested + */ + void executeTransition(Transition tranReq); + /** @brief Callback function for pgood going to on state * * Update chassis object state to reflect pgood going to on state |