From cfb5e13388531e1317eeb3ccf0f8eef0c6eeca60 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 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(wdPreTimeoutInterruptMask & + (static_cast(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; -- 2.17.1