From d9c89943d7b0aa00ee99b7c11278ac272a47a790 Mon Sep 17 00:00:00 2001 From: Ren Yu 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 --- 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 2ffaae3..e9b7a9c 100644 --- a/app/watchdog.cpp +++ b/app/watchdog.cpp @@ -81,6 +81,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 wdTimerUseMask = 0x7; static constexpr uint8_t wdTimerUseResTimer1 = 0x0; @@ -130,6 +131,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, @@ -257,6 +297,13 @@ ipmi_ret_t ipmi_app_watchdog_set(ipmi_netfn_t netfn, ipmi_cmd_t cmd, // Mark as initialized so that future resets behave correctly wd_service.setInitialized(true); + // pretimeOutAction + const auto ipmiPreTimeoutInterrupt = + static_cast((req.timer_action >> 4) & + wdPreTimeoutInterruptMask); + wd_service.setPreTimeoutInterrupt( + ipmiPreTimeoutInterruptToWdAction(ipmiPreTimeoutInterrupt)); + lastCallSuccessful = true; return IPMI_CC_OK; } diff --git a/app/watchdog_service.cpp b/app/watchdog_service.cpp index 77663b4..0c4ea28 100644 --- a/app/watchdog_service.cpp +++ b/app/watchdog_service.cpp @@ -203,3 +203,9 @@ void WatchdogService::setTimeRemaining(uint64_t timeRemaining) { setProperty("TimeRemaining", timeRemaining); } + +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 ed64a3c..b550f37 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; @@ -99,6 +101,13 @@ class WatchdogService */ void setTimeRemaining(uint64_t timeRemaining); + /** @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; -- 2.7.4