George Hung | fee51df | 2020-07-14 20:58:04 +0800 | [diff] [blame] | 1 | From 9deb72959477700216326c033c930236e58f965f Mon Sep 17 00:00:00 2001 |
| 2 | From: Ren Yu <yux.ren@intel.com> |
| 3 | Date: Tue, 28 May 2019 17:11:17 +0800 |
| 4 | Subject: [PATCH] Save the pre-timeout interrupt in dbus property |
| 5 | |
| 6 | Get the watchdog pre-timeout interrupt value from ipmi watchdog set command, |
| 7 | and store it into dbus property. |
| 8 | |
| 9 | Tested: |
| 10 | Config IPMI watchdog: BIOS FRB2 Power Cycle after 1 seconds: |
| 11 | ipmitool raw 0x06 0x24 0x01 0x13 0x0 0x2 0xa 0x00 |
| 12 | Start watchdog: |
| 13 | Ipmitool mc watchdog reset |
| 14 | Check the watchdog pre-timeout interrupt in below: |
| 15 | https://BMCIP/redfish/v1/Systems/system/LogServices/EventLog/Entries |
| 16 | |
| 17 | Signed-off-by: Ren Yu <yux.ren@intel.com> |
| 18 | |
| 19 | --- |
| 20 | app/watchdog.cpp | 47 ++++++++++++++++++++++++++++++++++++++++ |
| 21 | app/watchdog_service.cpp | 6 +++++ |
| 22 | app/watchdog_service.hpp | 9 ++++++++ |
| 23 | 3 files changed, 62 insertions(+) |
| 24 | |
| 25 | diff --git a/app/watchdog.cpp b/app/watchdog.cpp |
| 26 | index 03c373e..cb0b1fd 100644 |
| 27 | --- a/app/watchdog.cpp |
| 28 | +++ b/app/watchdog.cpp |
| 29 | @@ -80,6 +80,7 @@ ipmi::RspType<> ipmiAppResetWatchdogTimer() |
| 30 | |
| 31 | static constexpr uint8_t wd_dont_stop = 0x1 << 6; |
| 32 | static constexpr uint8_t wd_timeout_action_mask = 0x3; |
| 33 | +static constexpr uint8_t wdPreTimeoutInterruptMask = 0x3; |
| 34 | |
| 35 | static constexpr uint8_t wdTimerUseResTimer1 = 0x0; |
| 36 | static constexpr uint8_t wdTimerUseResTimer2 = 0x6; |
| 37 | @@ -127,6 +128,45 @@ WatchdogService::Action ipmiActionToWdAction(IpmiAction ipmi_action) |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | +enum class IpmiPreTimeoutInterrupt : uint8_t |
| 42 | +{ |
| 43 | + None = 0x0, |
| 44 | + SMI = 0x1, |
| 45 | + NMI = 0x2, |
| 46 | + MI = 0x3, |
| 47 | +}; |
| 48 | +/** @brief Converts an IPMI Watchdog PreTimeoutInterrupt to DBUS defined action |
| 49 | + * @param[in] ipmi_action The IPMI Watchdog PreTimeoutInterrupt |
| 50 | + * @return The Watchdog PreTimeoutInterrupt that the ipmi_action maps to |
| 51 | + */ |
| 52 | +WatchdogService::PreTimeoutInterruptAction ipmiPreTimeoutInterruptToWdAction( |
| 53 | + IpmiPreTimeoutInterrupt ipmiPreTimeOutInterrupt) |
| 54 | +{ |
| 55 | + switch (ipmiPreTimeOutInterrupt) |
| 56 | + { |
| 57 | + case IpmiPreTimeoutInterrupt::None: |
| 58 | + { |
| 59 | + return WatchdogService::PreTimeoutInterruptAction::None; |
| 60 | + } |
| 61 | + case IpmiPreTimeoutInterrupt::SMI: |
| 62 | + { |
| 63 | + return WatchdogService::PreTimeoutInterruptAction::SMI; |
| 64 | + } |
| 65 | + case IpmiPreTimeoutInterrupt::NMI: |
| 66 | + { |
| 67 | + return WatchdogService::PreTimeoutInterruptAction::NMI; |
| 68 | + } |
| 69 | + case IpmiPreTimeoutInterrupt::MI: |
| 70 | + { |
| 71 | + return WatchdogService::PreTimeoutInterruptAction::MI; |
| 72 | + } |
| 73 | + default: |
| 74 | + { |
| 75 | + throw std::domain_error("IPMI PreTimeoutInterrupt is invalid"); |
| 76 | + } |
| 77 | + } |
| 78 | +} |
| 79 | + |
| 80 | enum class IpmiTimerUse : uint8_t |
| 81 | { |
| 82 | Reserved = 0x0, |
| 83 | @@ -250,6 +290,13 @@ ipmi::RspType<> |
| 84 | // Mark as initialized so that future resets behave correctly |
| 85 | wd_service.setInitialized(true); |
| 86 | |
| 87 | + // pretimeOutAction |
| 88 | + const auto ipmiPreTimeoutInterrupt = |
| 89 | + static_cast<IpmiPreTimeoutInterrupt>(wdPreTimeoutInterruptMask & |
| 90 | + (static_cast<uint8_t>(preTimeoutInterrupt))); |
| 91 | + wd_service.setPreTimeoutInterrupt( |
| 92 | + ipmiPreTimeoutInterruptToWdAction(ipmiPreTimeoutInterrupt)); |
| 93 | + |
| 94 | lastCallSuccessful = true; |
| 95 | return ipmi::responseSuccess(); |
| 96 | } |
| 97 | diff --git a/app/watchdog_service.cpp b/app/watchdog_service.cpp |
| 98 | index 3534e89..4df1ab6 100644 |
| 99 | --- a/app/watchdog_service.cpp |
| 100 | +++ b/app/watchdog_service.cpp |
| 101 | @@ -198,3 +198,9 @@ void WatchdogService::setInterval(uint64_t interval) |
| 102 | { |
| 103 | setProperty("Interval", interval); |
| 104 | } |
| 105 | + |
| 106 | +void WatchdogService::setPreTimeoutInterrupt( |
| 107 | + PreTimeoutInterruptAction preTimeoutInterrupt) |
| 108 | +{ |
| 109 | + setProperty("PreTimeoutInterrupt", convertForMessage(preTimeoutInterrupt)); |
| 110 | +} |
| 111 | \ No newline at end of file |
| 112 | diff --git a/app/watchdog_service.hpp b/app/watchdog_service.hpp |
| 113 | index 141bdb7..32b7461 100644 |
| 114 | --- a/app/watchdog_service.hpp |
| 115 | +++ b/app/watchdog_service.hpp |
| 116 | @@ -15,6 +15,8 @@ class WatchdogService |
| 117 | |
| 118 | using Action = |
| 119 | sdbusplus::xyz::openbmc_project::State::server::Watchdog::Action; |
| 120 | + using PreTimeoutInterruptAction = sdbusplus::xyz::openbmc_project::State:: |
| 121 | + server::Watchdog::PreTimeoutInterruptAction; |
| 122 | using TimerUse = |
| 123 | sdbusplus::xyz::openbmc_project::State::server::Watchdog::TimerUse; |
| 124 | |
| 125 | @@ -92,6 +94,13 @@ class WatchdogService |
| 126 | */ |
| 127 | void setInterval(uint64_t interval); |
| 128 | |
| 129 | + /** @brief Sets the value of the PreTimeoutInterrupt property on the host |
| 130 | + * watchdog |
| 131 | + * |
| 132 | + * @param[in] PreTimeoutInterrupt - The new PreTimeoutInterrupt value |
| 133 | + */ |
| 134 | + void setPreTimeoutInterrupt(PreTimeoutInterruptAction preTimeoutInterrupt); |
| 135 | + |
| 136 | private: |
| 137 | /** @brief sdbusplus handle */ |
| 138 | sdbusplus::bus::bus bus; |