blob: d815cde72e84e845f01c72bf13089ee12fa6f46c [file] [log] [blame]
From 9deb72959477700216326c033c930236e58f965f Mon Sep 17 00:00:00 2001
From: Ren Yu <yux.ren@intel.com>
Date: Tue, 28 May 2019 17:11:17 +0800
Subject: [PATCH] Save the pre-timeout interrupt in dbus property
Get the watchdog pre-timeout interrupt value from ipmi watchdog set command,
and store it into dbus property.
Tested:
Config IPMI watchdog: BIOS FRB2 Power Cycle after 1 seconds:
ipmitool raw 0x06 0x24 0x01 0x13 0x0 0x2 0xa 0x00
Start watchdog:
Ipmitool mc watchdog reset
Check the watchdog pre-timeout interrupt in below:
https://BMCIP/redfish/v1/Systems/system/LogServices/EventLog/Entries
Signed-off-by: Ren Yu <yux.ren@intel.com>
---
app/watchdog.cpp | 47 ++++++++++++++++++++++++++++++++++++++++
app/watchdog_service.cpp | 6 +++++
app/watchdog_service.hpp | 9 ++++++++
3 files changed, 62 insertions(+)
diff --git a/app/watchdog.cpp b/app/watchdog.cpp
index 03c373e..cb0b1fd 100644
--- a/app/watchdog.cpp
+++ b/app/watchdog.cpp
@@ -80,6 +80,7 @@ ipmi::RspType<> ipmiAppResetWatchdogTimer()
static constexpr uint8_t wd_dont_stop = 0x1 << 6;
static constexpr uint8_t wd_timeout_action_mask = 0x3;
+static constexpr uint8_t wdPreTimeoutInterruptMask = 0x3;
static constexpr uint8_t wdTimerUseResTimer1 = 0x0;
static constexpr uint8_t wdTimerUseResTimer2 = 0x6;
@@ -127,6 +128,45 @@ WatchdogService::Action ipmiActionToWdAction(IpmiAction ipmi_action)
}
}
+enum class IpmiPreTimeoutInterrupt : uint8_t
+{
+ None = 0x0,
+ SMI = 0x1,
+ NMI = 0x2,
+ MI = 0x3,
+};
+/** @brief Converts an IPMI Watchdog PreTimeoutInterrupt to DBUS defined action
+ * @param[in] ipmi_action The IPMI Watchdog PreTimeoutInterrupt
+ * @return The Watchdog PreTimeoutInterrupt that the ipmi_action maps to
+ */
+WatchdogService::PreTimeoutInterruptAction ipmiPreTimeoutInterruptToWdAction(
+ IpmiPreTimeoutInterrupt ipmiPreTimeOutInterrupt)
+{
+ switch (ipmiPreTimeOutInterrupt)
+ {
+ case IpmiPreTimeoutInterrupt::None:
+ {
+ return WatchdogService::PreTimeoutInterruptAction::None;
+ }
+ case IpmiPreTimeoutInterrupt::SMI:
+ {
+ return WatchdogService::PreTimeoutInterruptAction::SMI;
+ }
+ case IpmiPreTimeoutInterrupt::NMI:
+ {
+ return WatchdogService::PreTimeoutInterruptAction::NMI;
+ }
+ case IpmiPreTimeoutInterrupt::MI:
+ {
+ return WatchdogService::PreTimeoutInterruptAction::MI;
+ }
+ default:
+ {
+ throw std::domain_error("IPMI PreTimeoutInterrupt is invalid");
+ }
+ }
+}
+
enum class IpmiTimerUse : uint8_t
{
Reserved = 0x0,
@@ -250,6 +290,13 @@ ipmi::RspType<>
// Mark as initialized so that future resets behave correctly
wd_service.setInitialized(true);
+ // pretimeOutAction
+ const auto ipmiPreTimeoutInterrupt =
+ static_cast<IpmiPreTimeoutInterrupt>(wdPreTimeoutInterruptMask &
+ (static_cast<uint8_t>(preTimeoutInterrupt)));
+ wd_service.setPreTimeoutInterrupt(
+ ipmiPreTimeoutInterruptToWdAction(ipmiPreTimeoutInterrupt));
+
lastCallSuccessful = true;
return ipmi::responseSuccess();
}
diff --git a/app/watchdog_service.cpp b/app/watchdog_service.cpp
index 3534e89..4df1ab6 100644
--- a/app/watchdog_service.cpp
+++ b/app/watchdog_service.cpp
@@ -198,3 +198,9 @@ void WatchdogService::setInterval(uint64_t interval)
{
setProperty("Interval", interval);
}
+
+void WatchdogService::setPreTimeoutInterrupt(
+ PreTimeoutInterruptAction preTimeoutInterrupt)
+{
+ setProperty("PreTimeoutInterrupt", convertForMessage(preTimeoutInterrupt));
+}
\ No newline at end of file
diff --git a/app/watchdog_service.hpp b/app/watchdog_service.hpp
index 141bdb7..32b7461 100644
--- a/app/watchdog_service.hpp
+++ b/app/watchdog_service.hpp
@@ -15,6 +15,8 @@ class WatchdogService
using Action =
sdbusplus::xyz::openbmc_project::State::server::Watchdog::Action;
+ using PreTimeoutInterruptAction = sdbusplus::xyz::openbmc_project::State::
+ server::Watchdog::PreTimeoutInterruptAction;
using TimerUse =
sdbusplus::xyz::openbmc_project::State::server::Watchdog::TimerUse;
@@ -92,6 +94,13 @@ class WatchdogService
*/
void setInterval(uint64_t interval);
+ /** @brief Sets the value of the PreTimeoutInterrupt property on the host
+ * watchdog
+ *
+ * @param[in] PreTimeoutInterrupt - The new PreTimeoutInterrupt value
+ */
+ void setPreTimeoutInterrupt(PreTimeoutInterruptAction preTimeoutInterrupt);
+
private:
/** @brief sdbusplus handle */
sdbusplus::bus::bus bus;