summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-phosphor/watchdog/phosphor-watchdog/0004-Standardize-watchdog-redfish-format-according-to-EPS.patch
blob: 578fa1257fd54e0074982b809627431e59c0ccfc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
From 3bead6316f653f14773e65b2f6b8facb08f200e7 Mon Sep 17 00:00:00 2001
From: Ren Yu <yux.ren@intel.com>
Date: Fri, 9 Aug 2019 14:54:13 +0800
Subject: [PATCH] Standardize watchdog redfish format according to EPS

According to EPS and test requirement, change the messageArgs
in redfish about watchdog action and pre-interrupt action and
add timer user display.

Tested:
Set a watchdog (Timer action and pre-interrupt action both are none).
    ipmitool raw 0x06 0x24 0x05 0x00 0x00 0x00 0x30 0x00
Get the watchdog.
    ipmitool mc watchdog get
Start the watchdog.
    ipmitool mc watchdog reset
When timer expired, check messageArgs in Redfish with below url:
https://IP/redfish/v1/Systems/system/LogServices/EventLog/Entries.

    "Message": "Host Watchdog Event: Power Cycle - System power cycle due to Watchdog timeout. timer use: SMS/OS",
    "MessageArgs": [
        "Power Cycle - System power cycle due to Watchdog timeout. timer use: SMS/OS"
    ],

    "Message": "Host Watchdog Event: Timer interrupt - Messaging Interrupt due to Watchdog timeout. timer use: OEM",
    "MessageArgs": [
        "Timer interrupt - Messaging Interrupt due to Watchdog timeout. timer use: OEM"
    ],

Signed-off-by: Ren Yu <yux.ren@intel.com>
---
 watchdog.cpp | 127 +++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 89 insertions(+), 38 deletions(-)

diff --git a/watchdog.cpp b/watchdog.cpp
index bdf65da..7cfcc75 100644
--- a/watchdog.cpp
+++ b/watchdog.cpp
@@ -25,25 +25,28 @@ const static constexpr char* currentPowerState = "CurrentPowerState";
 const static constexpr char* powerStatusOff =
     "xyz.openbmc_project.State.Chassis.PowerState.Off";
 
-const static constexpr char* powerActionHardReset =
-    "xyz.openbmc_project.State.Watchdog.Action.HardReset";
-const static constexpr char* powerActionOff =
-    "xyz.openbmc_project.State.Watchdog.Action.PowerOff";
-const static constexpr char* powerActionPowerCycle =
-    "xyz.openbmc_project.State.Watchdog.Action.PowerCycle";
-const static constexpr char* powerActionNone =
-    "xyz.openbmc_project.State.Watchdog.Action.None";
-const static constexpr char* preInterruptNoAction =
-    "xyz.openbmc_project.State.Watchdog.PreTimeoutInterruptAction.None";
-
-const static constexpr char* hardResteDescription =
-    "Hard Reset - System reset due to Watchdog timeout";
+const static constexpr char* actionDescription = " due to Watchdog timeout";
+const static constexpr char* hardResetDescription = "Hard Reset - System reset";
 const static constexpr char* powerOffDescription =
-    "Power Down - System power down due to Watchdog timeout";
+    "Power Down - System power down";
 const static constexpr char* powerCycleDescription =
-    "Power Cycle - System power cycle due to Watchdog timeout";
+    "Power Cycle - System power cycle";
 const static constexpr char* timerExpiredDescription = "Timer expired";
-const static constexpr char* preInterruptDescription = "Timer interrupt";
+
+const static constexpr char* preInterruptActionNone =
+    "xyz.openbmc_project.State.Watchdog.PreTimeoutInterruptAction.None";
+
+const static constexpr char* preInterruptDescriptionSMI = "SMI";
+const static constexpr char* preInterruptDescriptionNMI = "NMI";
+const static constexpr char* preInterruptDescriptionMI = "Messaging Interrupt";
+
+const static constexpr char* reservedDescription = "Reserved";
+
+const static constexpr char* timerUseDescriptionBIOSFRB2 = "BIOS FRB2";
+const static constexpr char* timerUseDescriptionBIOSPOST = "BIOS/POST";
+const static constexpr char* timerUseDescriptionOSLoad = "OSLoad";
+const static constexpr char* timerUseDescriptionSMSOS = "SMS/OS";
+const static constexpr char* timerUseDescriptionOEM = "OEM";
 
 namespace restart
 {
@@ -161,54 +164,102 @@ uint64_t Watchdog::interval(uint64_t value)
 void Watchdog::timeOutHandler()
 {
     PreTimeoutInterruptAction preTimeoutInterruptAction = preTimeoutInterrupt();
+    std::string preInterruptActionMessageArgs{};
+
     Action action = expireAction();
     std::string actionMessageArgs{};
 
+    expiredTimerUse(currentTimerUse());
+
+    TimerUse timeUser = expiredTimerUse();
+    std::string timeUserMessage{};
+
     if (!this->enabled())
     {
         action = fallback->action;
     }
 
-    if (convertForMessage(action) == powerActionHardReset)
-    {
-        actionMessageArgs = hardResteDescription;
-    }
-    else if (convertForMessage(action) == powerActionOff)
-    {
-        actionMessageArgs = powerOffDescription;
-    }
-    else if (convertForMessage(action) == powerActionPowerCycle)
+    switch (timeUser)
     {
-        actionMessageArgs = powerCycleDescription;
+        case Watchdog::TimerUse::BIOSFRB2:
+            timeUserMessage = timerUseDescriptionBIOSFRB2;
+            break;
+        case Watchdog::TimerUse::BIOSPOST:
+            timeUserMessage = timerUseDescriptionBIOSPOST;
+            break;
+        case Watchdog::TimerUse::OSLoad:
+            timeUserMessage = timerUseDescriptionOSLoad;
+            break;
+        case Watchdog::TimerUse::SMSOS:
+            timeUserMessage = timerUseDescriptionSMSOS;
+            break;
+        case Watchdog::TimerUse::OEM:
+            timeUserMessage = timerUseDescriptionOEM;
+            break;
+        default:
+            timeUserMessage = reservedDescription;
+            break;
     }
-    else if (convertForMessage(action) == powerActionNone)
-    {
-        actionMessageArgs = timerExpiredDescription;
-    }
-    else
+
+    switch (action)
     {
-        actionMessageArgs = "Reserved";
+        case Watchdog::Action::HardReset:
+            actionMessageArgs = std::string(hardResetDescription) +
+                                std::string(actionDescription);
+            break;
+        case Watchdog::Action::PowerOff:
+            actionMessageArgs = std::string(powerOffDescription) +
+                                std::string(actionDescription);
+            break;
+        case Watchdog::Action::PowerCycle:
+            actionMessageArgs = std::string(powerCycleDescription) +
+                                std::string(actionDescription);
+            break;
+        case Watchdog::Action::None:
+            actionMessageArgs = timerExpiredDescription;
+            break;
+        default:
+            actionMessageArgs = reservedDescription;
+            break;
     }
 
     // Log into redfish event log
     sd_journal_send("MESSAGE=IPMIWatchdog: Timed out ACTION=%s",
                     convertForMessage(action).c_str(), "PRIORITY=%i", LOG_INFO,
                     "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.IPMIWatchdog",
-                    "REDFISH_MESSAGE_ARGS=%s", actionMessageArgs.c_str(), NULL);
+                    "REDFISH_MESSAGE_ARGS=%s. timer use: %s",
+                    actionMessageArgs.c_str(), timeUserMessage.c_str(), NULL);
+
+    switch (preTimeoutInterruptAction)
+    {
+        case Watchdog::PreTimeoutInterruptAction::SMI:
+            preInterruptActionMessageArgs = preInterruptDescriptionSMI;
+            break;
+        case Watchdog::PreTimeoutInterruptAction::NMI:
+            preInterruptActionMessageArgs = preInterruptDescriptionNMI;
+            break;
+        case Watchdog::PreTimeoutInterruptAction::MI:
+            preInterruptActionMessageArgs = preInterruptDescriptionMI;
+            break;
+        default:
+            preInterruptActionMessageArgs = reservedDescription;
+            break;
+    }
 
-    if (preInterruptNoAction != convertForMessage(preTimeoutInterruptAction))
+    if (preInterruptActionNone != convertForMessage(preTimeoutInterruptAction))
     {
         preTimeoutInterruptOccurFlag(true);
 
         sd_journal_send("MESSAGE=IPMIWatchdog: Pre Timed out Interrupt=%s",
                         convertForMessage(preTimeoutInterruptAction).c_str(),
                         "PRIORITY=%i", LOG_INFO, "REDFISH_MESSAGE_ID=%s",
-                        "OpenBMC.0.1.IPMIWatchdog", "REDFISH_MESSAGE_ARGS=%s",
-                        preInterruptDescription, NULL);
+                        "OpenBMC.0.1.IPMIWatchdog",
+                        "REDFISH_MESSAGE_ARGS=Timer interrupt - %s due to "
+                        "Watchdog timeout. timer use: %s",
+                        preInterruptActionMessageArgs.c_str(),
+                        timeUserMessage.c_str(), NULL);
     }
 
-    expiredTimerUse(currentTimerUse());
-
     auto target = actionTargetMap.find(action);
     if (target == actionTargetMap.end())
     {
-- 
2.7.4