142 lines
4.6 KiB
Diff
Executable File
142 lines
4.6 KiB
Diff
Executable File
From cfb5e13388531e1317eeb3ccf0f8eef0c6eeca60 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>
|
|
Upstream-Status: Pending
|
|
---
|
|
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_t bus;
|
|
--
|
|
2.17.1
|
|
|