summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chassishandler.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/chassishandler.cpp b/chassishandler.cpp
index 305897b..053f29a 100644
--- a/chassishandler.cpp
+++ b/chassishandler.cpp
@@ -767,6 +767,38 @@ int initiate_state_transition(State::Host::Transition transition)
return rc;
}
+//------------------------------------------
+// Set Enabled property to inform NMI source
+// handling to trigger a NMI_OUT BSOD.
+//------------------------------------------
+int setNmiProperty(const bool value)
+{
+ constexpr const char* nmiSourceObjPath =
+ "/xyz/openbmc_project/Chassis/Control/NMISource";
+ constexpr const char* nmiSourceIntf =
+ "xyz.openbmc_project.Chassis.Control.NMISource";
+ std::string bmcSourceSignal = "xyz.openbmc_project.Chassis.Control."
+ "NMISource.BMCSourceSignal.ChassisCmd";
+ std::shared_ptr<sdbusplus::asio::connection> busp = getSdBus();
+
+ try
+ {
+ auto service = ipmi::getService(*busp, nmiSourceIntf, nmiSourceObjPath);
+ ipmi::setDbusProperty(*busp, service, nmiSourceObjPath, nmiSourceIntf,
+ "BMCSource", bmcSourceSignal);
+ ipmi::setDbusProperty(*busp, service, nmiSourceObjPath, nmiSourceIntf,
+ "Enabled", value);
+ }
+ catch (std::exception& e)
+ {
+ log<level::ERR>("Failed to trigger NMI_OUT",
+ entry("EXCEPTION=%s", e.what()));
+ return -1;
+ }
+
+ return 0;
+}
+
namespace power_policy
{
@@ -1172,6 +1204,10 @@ ipmi::RspType<> ipmiChassisControl(uint8_t chassisControl)
rc = initiate_state_transition(State::Host::Transition::Off);
break;
+ case CMD_PULSE_DIAGNOSTIC_INTR:
+ rc = setNmiProperty(true);
+ break;
+
default:
{
log<level::ERR>("Invalid Chassis Control command",
OpenPOWER on IntegriCloud