summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorKuiying Wang <kuiying.wang@intel.com>2018-06-05 13:16:56 +0300
committerKuiying Wang <kuiying.wang@intel.com>2018-06-07 13:03:04 +0300
commitd68245ebf1f0072333bbdcade2124b2c2ec5e756 (patch)
tree053ac9e0297205a57584bd5eada8481e59f57696 /services
parent51e53cc5e11e74b4b07eadf2190fc25669b84625 (diff)
downloadprovingground-d68245ebf1f0072333bbdcade2124b2c2ec5e756.tar.xz
Enable reset button.
handle reset button pressed signal and call reboot target. Change-Id: I02de566997a8471774d3ae976fb658e88fd1086b Signed-off-by: Kuiying Wang <kuiying.wang@intel.com>
Diffstat (limited to 'services')
-rw-r--r--services/chassis/ChassisControl/inc/ChassisControl.hpp35
-rw-r--r--services/chassis/ChassisControl/src/ChassisControl.cpp32
2 files changed, 45 insertions, 22 deletions
diff --git a/services/chassis/ChassisControl/inc/ChassisControl.hpp b/services/chassis/ChassisControl/inc/ChassisControl.hpp
index 7f6ab8f..f88708d 100644
--- a/services/chassis/ChassisControl/inc/ChassisControl.hpp
+++ b/services/chassis/ChassisControl/inc/ChassisControl.hpp
@@ -7,6 +7,9 @@
constexpr auto POWER_BUTTON_PATH =
"/xyz/openbmc_project/Chassis/Buttons/Power0";
constexpr auto POWER_BUTTON_INTF = "xyz.openbmc_project.Chassis.Buttons.Power";
+constexpr auto RESET_BUTTON_PATH =
+ "/xyz/openbmc_project/Chassis/Buttons/Reset0";
+constexpr auto RESET_BUTTON_INTF = "xyz.openbmc_project.Chassis.Buttons.Reset";
const static int32_t POWER_OFF = 0;
const static int32_t POWER_ON = 1;
@@ -31,8 +34,34 @@ struct ChassisControl
sdbusRule::type::signal() + sdbusRule::member("Pressed") +
sdbusRule::path(POWER_BUTTON_PATH) +
sdbusRule::interface(POWER_BUTTON_INTF),
- std::bind(std::mem_fn(&ChassisControl::powerButtonPressed), this,
- std::placeholders::_1)) {
+ [this](sdbusplus::message::message &msg) {
+ phosphor::logging::log<phosphor::logging::level::INFO>(
+ "powerButtonPressed callback function is called...");
+ int32_t state = -1;
+ state = this->getPowerState();
+ if (POWER_ON == state) {
+ this->powerOff();
+ } else if (POWER_OFF == state) {
+ this->powerOn();
+ } else {
+ phosphor::logging::log<phosphor::logging::level::ERR>(
+ "UNKNOWN power state");
+ }
+ return;
+ }
+ ),
+ resetButtonPressedSignal(
+ bus,
+ sdbusRule::type::signal() + sdbusRule::member("Pressed") +
+ sdbusRule::path(RESET_BUTTON_PATH) +
+ sdbusRule::interface(RESET_BUTTON_INTF),
+ [this](sdbusplus::message::message &msg) {
+ phosphor::logging::log<phosphor::logging::level::INFO>(
+ "resetButtonPressed callback function is called...");
+ this->reboot();
+ return;
+ }
+ ){
phosphor::logging::log<phosphor::logging::level::DEBUG>(
"ChassisControl is created.");
}
@@ -49,5 +78,5 @@ private:
sdbusplus::bus::bus &mBus;
sdbusplus::bus::match_t powerButtonPressedSignal;
- void powerButtonPressed(sdbusplus::message::message &m);
+ sdbusplus::bus::match_t resetButtonPressedSignal;
};
diff --git a/services/chassis/ChassisControl/src/ChassisControl.cpp b/services/chassis/ChassisControl/src/ChassisControl.cpp
index d90d81f..e902786 100644
--- a/services/chassis/ChassisControl/src/ChassisControl.cpp
+++ b/services/chassis/ChassisControl/src/ChassisControl.cpp
@@ -33,6 +33,8 @@ constexpr auto POWER_CONTROL_OBJ_PATH =
"/xyz/openbmc_project/Chassis/Control/Power0";
constexpr auto POWER_CONTROL_INTERFACE =
"xyz.openbmc_project.Chassis.Control.Power";
+constexpr auto HOST_STATE_REBOOT_TGT = "obmc-host-reboot@0.target";
+
int32_t ChassisControl::powerOn() {
auto method = mBus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
@@ -67,8 +69,17 @@ int32_t ChassisControl::softPowerOff() {
return 0;
}
int32_t ChassisControl::reboot() {
- // TODO
- return 0;
+ auto method = mBus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
+ SYSTEMD_INTERFACE, "StartUnit");
+ method.append(HOST_STATE_REBOOT_TGT, "replace");
+ auto response = mBus.call(method);
+ if (response.is_method_error()) {
+ phosphor::logging::log<phosphor::logging::level::ERR>(
+ "ERROR: Failed to run obmc-host-reboot@0.target");
+ return -1;
+ }
+
+ return 0;
}
int32_t ChassisControl::softReboot() {
// TODO
@@ -94,20 +105,3 @@ int32_t ChassisControl::getPowerState() {
return state;
}
-void ChassisControl::powerButtonPressed(sdbusplus::message::message &msg) {
-
- phosphor::logging::log<phosphor::logging::level::INFO>(
- "powerButtonPressed callback function is called...");
- int32_t state = -1;
- state = getPowerState();
- if (POWER_ON == state) {
- powerOff();
- } else if (POWER_OFF == state) {
- powerOn();
- } else {
- phosphor::logging::log<phosphor::logging::level::ERR>(
- "UNKNOWN power state");
- }
-
- return;
-}