summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chassis_state_manager.cpp29
-rw-r--r--chassis_state_manager.hpp9
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
OpenPOWER on IntegriCloud