blob: cb2862d44383c54bd999b3f7477850f316f13947 [file] [log] [blame]
Sampa Misraaea5dde2020-08-31 08:33:47 -05001#include "oem_ibm_handler.hpp"
2
Manojkiran Edaa31ceb92021-07-22 09:19:02 +05303#include "collect_slot_vpd.hpp"
Sagar Srinivascfdbca72020-09-22 10:03:35 -05004#include "file_io_type_lid.hpp"
5#include "libpldmresponder/file_io.hpp"
Sagar Srinivas78a225a2020-08-27 00:52:20 -05006#include "libpldmresponder/pdr_utils.hpp"
Brad Bishop5079ac42021-08-19 18:35:06 -04007
George Liuc453e162022-12-21 17:16:23 +08008#include <libpldm/entity.h>
Andrew Jeffery21f128d2024-01-15 15:34:26 +10309#include <libpldm/oem/ibm/entity.h>
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053010#include <libpldm/pldm.h>
Brad Bishop27403f42021-12-01 21:37:44 -050011
Riya Dixit49cfb132023-03-02 04:26:53 -060012#include <phosphor-logging/lg2.hpp>
Pavithra Barithaya7b4d59a2024-02-05 09:09:30 -060013#include <xyz/openbmc_project/State/BMC/client.hpp>
Riya Dixit49cfb132023-03-02 04:26:53 -060014
15PHOSPHOR_LOG2_USING;
16
Brad Bishop5079ac42021-08-19 18:35:06 -040017using namespace pldm::pdr;
18using namespace pldm::utils;
19
Sampa Misraaea5dde2020-08-31 08:33:47 -050020namespace pldm
21{
Sampa Misraaea5dde2020-08-31 08:33:47 -050022namespace responder
23{
Sampa Misraaea5dde2020-08-31 08:33:47 -050024namespace oem_ibm_platform
25{
Sampa Misraaea5dde2020-08-31 08:33:47 -050026int pldm::responder::oem_ibm_platform::Handler::
27 getOemStateSensorReadingsHandler(
Kamalkumar Patel7d427f12024-05-16 03:44:00 -050028 pldm::pdr::EntityType entityType, EntityInstance entityInstance,
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053029 ContainerID containerId, StateSetId stateSetId,
30 CompositeCount compSensorCnt, uint16_t /*sensorId*/,
Sampa Misraaea5dde2020-08-31 08:33:47 -050031 std::vector<get_sensor_state_field>& stateField)
32{
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053033 auto& entityAssociationMap = getAssociateEntityMap();
Sampa Misraaea5dde2020-08-31 08:33:47 -050034 int rc = PLDM_SUCCESS;
35 stateField.clear();
36
37 for (size_t i = 0; i < compSensorCnt; i++)
38 {
39 uint8_t sensorOpState{};
Sagar Srinivas78a225a2020-08-27 00:52:20 -050040 if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
Sampa Misraaea5dde2020-08-31 08:33:47 -050041 stateSetId == PLDM_OEM_IBM_BOOT_STATE)
42 {
43 sensorOpState = fetchBootSide(entityInstance, codeUpdate);
44 }
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053045 else if (entityType == PLDM_ENTITY_SLOT &&
46 stateSetId == PLDM_OEM_IBM_PCIE_SLOT_SENSOR_STATE)
47 {
48 for (const auto& [key, value] : entityAssociationMap)
49 {
50 if (value.entity_type == entityType &&
51 value.entity_instance_num == entityInstance &&
52 value.entity_container_id == containerId)
53 {
54 sensorOpState = slotHandler->fetchSlotSensorState(key);
55 break;
56 }
57 }
58 }
Sampa Misraaea5dde2020-08-31 08:33:47 -050059 else
60 {
61 rc = PLDM_PLATFORM_INVALID_STATE_VALUE;
62 break;
63 }
64 stateField.push_back({PLDM_SENSOR_ENABLED, PLDM_SENSOR_UNKNOWN,
65 PLDM_SENSOR_UNKNOWN, sensorOpState});
66 }
67 return rc;
68}
69
70int pldm::responder::oem_ibm_platform::Handler::
Sampa Misra3a0e3b92020-10-21 05:58:00 -050071 oemSetStateEffecterStatesHandler(
Varsha Kaverappa3fbd39e2020-09-28 01:40:22 -050072 uint16_t entityType, uint16_t entityInstance, uint16_t stateSetId,
73 uint8_t compEffecterCnt,
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053074 std::vector<set_effecter_state_field>& stateField, uint16_t effecterId)
Sampa Misraaea5dde2020-08-31 08:33:47 -050075{
76 int rc = PLDM_SUCCESS;
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053077 auto& entityAssociationMap = getAssociateEntityMap();
Sampa Misraaea5dde2020-08-31 08:33:47 -050078
79 for (uint8_t currState = 0; currState < compEffecterCnt; ++currState)
80 {
81 if (stateField[currState].set_request == PLDM_REQUEST_SET)
82 {
Sagar Srinivas78a225a2020-08-27 00:52:20 -050083 if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
Sampa Misraaea5dde2020-08-31 08:33:47 -050084 stateSetId == PLDM_OEM_IBM_BOOT_STATE)
85 {
86 rc = setBootSide(entityInstance, currState, stateField,
87 codeUpdate);
88 }
Sagar Srinivascfdbca72020-09-22 10:03:35 -050089 else if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
90 stateSetId == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
91 {
92 if (stateField[currState].effecter_state ==
93 uint8_t(CodeUpdateState::START))
94 {
95 codeUpdate->setCodeUpdateProgress(true);
Sampa Misra3a0e3b92020-10-21 05:58:00 -050096 startUpdateEvent =
97 std::make_unique<sdeventplus::source::Defer>(
98 event,
99 std::bind(std::mem_fn(&oem_ibm_platform::Handler::
100 _processStartUpdate),
101 this, std::placeholders::_1));
Sagar Srinivascfdbca72020-09-22 10:03:35 -0500102 }
103 else if (stateField[currState].effecter_state ==
104 uint8_t(CodeUpdateState::END))
105 {
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500106 rc = PLDM_SUCCESS;
107 assembleImageEvent = std::make_unique<
108 sdeventplus::source::Defer>(
109 event,
110 std::bind(
111 std::mem_fn(
112 &oem_ibm_platform::Handler::_processEndUpdate),
113 this, std::placeholders::_1));
114
115 // sendCodeUpdateEvent(effecterId, END, START);
Sagar Srinivascfdbca72020-09-22 10:03:35 -0500116 }
117 else if (stateField[currState].effecter_state ==
118 uint8_t(CodeUpdateState::ABORT))
119 {
120 codeUpdate->setCodeUpdateProgress(false);
121 codeUpdate->clearDirPath(LID_STAGING_DIR);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500122 auto sensorId = codeUpdate->getFirmwareUpdateSensor();
123 sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
124 uint8_t(CodeUpdateState::ABORT),
125 uint8_t(CodeUpdateState::START));
126 // sendCodeUpdateEvent(effecterId, ABORT, END);
Sagar Srinivascfdbca72020-09-22 10:03:35 -0500127 }
128 else if (stateField[currState].effecter_state ==
129 uint8_t(CodeUpdateState::ACCEPT))
130 {
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500131 auto sensorId = codeUpdate->getFirmwareUpdateSensor();
132 sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
133 uint8_t(CodeUpdateState::ACCEPT),
134 uint8_t(CodeUpdateState::END));
Sagar Srinivascfdbca72020-09-22 10:03:35 -0500135 // TODO Set new Dbus property provided by code update app
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500136 // sendCodeUpdateEvent(effecterId, ACCEPT, END);
Sagar Srinivascfdbca72020-09-22 10:03:35 -0500137 }
138 else if (stateField[currState].effecter_state ==
139 uint8_t(CodeUpdateState::REJECT))
140 {
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500141 auto sensorId = codeUpdate->getFirmwareUpdateSensor();
142 sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
143 uint8_t(CodeUpdateState::REJECT),
144 uint8_t(CodeUpdateState::END));
Sagar Srinivascfdbca72020-09-22 10:03:35 -0500145 // TODO Set new Dbus property provided by code update app
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500146 // sendCodeUpdateEvent(effecterId, REJECT, END);
Sagar Srinivascfdbca72020-09-22 10:03:35 -0500147 }
148 }
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600149 else if (entityType == PLDM_ENTITY_SYSTEM_CHASSIS &&
150 stateSetId == PLDM_OEM_IBM_SYSTEM_POWER_STATE)
151 {
152 if (stateField[currState].effecter_state == POWER_CYCLE_HARD)
153 {
154 systemRebootEvent =
155 std::make_unique<sdeventplus::source::Defer>(
156 event,
157 std::bind(std::mem_fn(&oem_ibm_platform::Handler::
158 _processSystemReboot),
159 this, std::placeholders::_1));
160 }
161 }
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530162 else if (stateSetId == PLDM_OEM_IBM_PCIE_SLOT_EFFECTER_STATE)
163 {
164 slotHandler->enableSlot(effecterId, entityAssociationMap,
165 stateField[currState].effecter_state);
166 }
Sampa Misraaea5dde2020-08-31 08:33:47 -0500167 else
168 {
169 rc = PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE;
170 }
171 }
172 if (rc != PLDM_SUCCESS)
173 {
174 break;
175 }
176 }
177 return rc;
178}
179
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530180void buildAllCodeUpdateEffecterPDR(oem_ibm_platform::Handler* platformHandler,
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600181 uint16_t entityType, uint16_t entityInstance,
182 uint16_t stateSetID, pdr_utils::Repo& repo)
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500183{
184 size_t pdrSize = 0;
185 pdrSize = sizeof(pldm_state_effecter_pdr) +
186 sizeof(state_effecter_possible_states);
187 std::vector<uint8_t> entry{};
188 entry.resize(pdrSize);
189 pldm_state_effecter_pdr* pdr =
190 reinterpret_cast<pldm_state_effecter_pdr*>(entry.data());
191 if (!pdr)
192 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500193 error("Failed to get record by PDR type, error - {ERROR}", "ERROR",
Riya Dixit49cfb132023-03-02 04:26:53 -0600194 lg2::hex,
195 static_cast<unsigned>(PLDM_PLATFORM_INVALID_EFFECTER_ID));
Manojkiran Edabcf91ac2021-03-14 13:50:48 +0530196 return;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500197 }
198 pdr->hdr.record_handle = 0;
199 pdr->hdr.version = 1;
200 pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
201 pdr->hdr.record_change_num = 0;
202 pdr->hdr.length = sizeof(pldm_state_effecter_pdr) - sizeof(pldm_pdr_hdr);
Manojkiran Edacc5f1582021-09-29 17:03:06 +0530203 pdr->terminus_handle = TERMINUS_HANDLE;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500204 pdr->effecter_id = platformHandler->getNextEffecterId();
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600205 pdr->entity_type = entityType;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500206 pdr->entity_instance = entityInstance;
Sagar Srinivas97296e02021-08-26 09:40:41 -0500207 pdr->container_id = 1;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500208 pdr->effecter_semantic_id = 0;
209 pdr->effecter_init = PLDM_NO_INIT;
210 pdr->has_description_pdr = false;
211 pdr->composite_effecter_count = 1;
212
213 auto* possibleStatesPtr = pdr->possible_states;
214 auto possibleStates =
215 reinterpret_cast<state_effecter_possible_states*>(possibleStatesPtr);
216 possibleStates->state_set_id = stateSetID;
217 possibleStates->possible_states_size = 2;
218 auto state =
219 reinterpret_cast<state_effecter_possible_states*>(possibleStates);
220 if (stateSetID == PLDM_OEM_IBM_BOOT_STATE)
221 state->states[0].byte = 6;
222 else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
223 state->states[0].byte = 126;
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600224 else if (stateSetID == PLDM_OEM_IBM_SYSTEM_POWER_STATE)
225 state->states[0].byte = 2;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500226 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
227 pdrEntry.data = entry.data();
228 pdrEntry.size = pdrSize;
229 repo.addRecord(pdrEntry);
230}
231
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530232void buildAllSlotEnableEffecterPDR(oem_ibm_platform::Handler* platformHandler,
233 pdr_utils::Repo& repo,
234 const std::vector<std::string>& slotobjpaths)
235{
236 size_t pdrSize = 0;
237 pdrSize = sizeof(pldm_state_effecter_pdr) +
238 sizeof(state_effecter_possible_states);
239 std::vector<uint8_t> entry{};
240 entry.resize(pdrSize);
241 pldm_state_effecter_pdr* pdr =
242 reinterpret_cast<pldm_state_effecter_pdr*>(entry.data());
243 if (!pdr)
244 {
245 error("Failed to get record by PDR type, ERROR:{ERR}", "ERR", lg2::hex,
246 static_cast<unsigned>(PLDM_PLATFORM_INVALID_EFFECTER_ID));
247 return;
248 }
249
250 auto& associatedEntityMap = platformHandler->getAssociateEntityMap();
251 for (const auto& entity_path : slotobjpaths)
252 {
253 pdr->hdr.record_handle = 0;
254 pdr->hdr.version = 1;
255 pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
256 pdr->hdr.record_change_num = 0;
257 pdr->hdr.length =
258 sizeof(pldm_state_effecter_pdr) - sizeof(pldm_pdr_hdr);
259 pdr->terminus_handle = TERMINUS_HANDLE;
260 pdr->effecter_id = platformHandler->getNextEffecterId();
261
262 if (entity_path != "" && associatedEntityMap.contains(entity_path))
263 {
264 pdr->entity_type = associatedEntityMap.at(entity_path).entity_type;
265 pdr->entity_instance =
266 associatedEntityMap.at(entity_path).entity_instance_num;
267 pdr->container_id =
268 associatedEntityMap.at(entity_path).entity_container_id;
269 platformHandler->effecterIdToDbusMap[pdr->effecter_id] =
270 entity_path;
271 }
272 else
273 {
274 // the slots are not present, dont create the PDR
275 continue;
276 }
277 pdr->effecter_semantic_id = 0;
278 pdr->effecter_init = PLDM_NO_INIT;
279 pdr->has_description_pdr = false;
280 pdr->composite_effecter_count = 1;
281
282 auto* possibleStatesPtr = pdr->possible_states;
283 auto possibleStates = reinterpret_cast<state_effecter_possible_states*>(
284 possibleStatesPtr);
285 possibleStates->state_set_id = PLDM_OEM_IBM_PCIE_SLOT_EFFECTER_STATE;
286 possibleStates->possible_states_size = 2;
287 auto state =
288 reinterpret_cast<state_effecter_possible_states*>(possibleStates);
289 state->states[0].byte = 14;
290 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
291 pdrEntry.data = entry.data();
292 pdrEntry.size = pdrSize;
293 repo.addRecord(pdrEntry);
294 }
295}
296
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530297void buildAllCodeUpdateSensorPDR(oem_ibm_platform::Handler* platformHandler,
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500298 uint16_t entityType, uint16_t entityInstance,
299 uint16_t stateSetID, pdr_utils::Repo& repo)
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500300{
301 size_t pdrSize = 0;
Patrick Williams6da4f912023-05-10 07:50:53 -0500302 pdrSize = sizeof(pldm_state_sensor_pdr) +
303 sizeof(state_sensor_possible_states);
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500304 std::vector<uint8_t> entry{};
305 entry.resize(pdrSize);
306 pldm_state_sensor_pdr* pdr =
307 reinterpret_cast<pldm_state_sensor_pdr*>(entry.data());
308 if (!pdr)
309 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500310 error("Failed to get record by PDR type, error - {ERROR}", "ERROR",
Riya Dixit49cfb132023-03-02 04:26:53 -0600311 lg2::hex, static_cast<unsigned>(PLDM_PLATFORM_INVALID_SENSOR_ID));
Manojkiran Edabcf91ac2021-03-14 13:50:48 +0530312 return;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500313 }
314 pdr->hdr.record_handle = 0;
315 pdr->hdr.version = 1;
316 pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
317 pdr->hdr.record_change_num = 0;
318 pdr->hdr.length = sizeof(pldm_state_sensor_pdr) - sizeof(pldm_pdr_hdr);
Manojkiran Edacc5f1582021-09-29 17:03:06 +0530319 pdr->terminus_handle = TERMINUS_HANDLE;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500320 pdr->sensor_id = platformHandler->getNextSensorId();
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500321 pdr->entity_type = entityType;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500322 pdr->entity_instance = entityInstance;
Sagar Srinivas97296e02021-08-26 09:40:41 -0500323 pdr->container_id = 1;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500324 pdr->sensor_init = PLDM_NO_INIT;
325 pdr->sensor_auxiliary_names_pdr = false;
326 pdr->composite_sensor_count = 1;
327
328 auto* possibleStatesPtr = pdr->possible_states;
329 auto possibleStates =
330 reinterpret_cast<state_sensor_possible_states*>(possibleStatesPtr);
331 possibleStates->state_set_id = stateSetID;
332 possibleStates->possible_states_size = 2;
333 auto state =
334 reinterpret_cast<state_sensor_possible_states*>(possibleStates);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500335 if ((stateSetID == PLDM_OEM_IBM_BOOT_STATE) ||
Archana Kakanic23b6142025-02-19 04:04:20 -0600336 (stateSetID == PLDM_OEM_IBM_VERIFICATION_STATE) ||
337 (stateSetID == PLDM_OEM_IBM_BOOT_SIDE_RENAME))
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500338 state->states[0].byte = 6;
339 else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
340 state->states[0].byte = 126;
341 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
342 pdrEntry.data = entry.data();
343 pdrEntry.size = pdrSize;
344 repo.addRecord(pdrEntry);
345}
346
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530347void buildAllSlotEnableSensorPDR(oem_ibm_platform::Handler* platformHandler,
348 pdr_utils::Repo& repo,
349 const std::vector<std::string>& slotobjpaths)
350{
351 size_t pdrSize = 0;
352 pdrSize = sizeof(pldm_state_sensor_pdr) +
353 sizeof(state_sensor_possible_states);
354 std::vector<uint8_t> entry{};
355 entry.resize(pdrSize);
356 pldm_state_sensor_pdr* pdr =
357 reinterpret_cast<pldm_state_sensor_pdr*>(entry.data());
358 if (!pdr)
359 {
360 error("Failed to get record by PDR type, ERROR:{ERR}", "ERR", lg2::hex,
361 static_cast<unsigned>(PLDM_PLATFORM_INVALID_SENSOR_ID));
362 return;
363 }
364 auto& associatedEntityMap = platformHandler->getAssociateEntityMap();
365 for (const auto& entity_path : slotobjpaths)
366 {
367 pdr->hdr.record_handle = 0;
368 pdr->hdr.version = 1;
369 pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
370 pdr->hdr.record_change_num = 0;
371 pdr->hdr.length = sizeof(pldm_state_sensor_pdr) - sizeof(pldm_pdr_hdr);
372 pdr->terminus_handle = TERMINUS_HANDLE;
373 pdr->sensor_id = platformHandler->getNextSensorId();
374 if (entity_path != "" && associatedEntityMap.contains(entity_path))
375 {
376 pdr->entity_type = associatedEntityMap.at(entity_path).entity_type;
377 pdr->entity_instance =
378 associatedEntityMap.at(entity_path).entity_instance_num;
379 pdr->container_id =
380 associatedEntityMap.at(entity_path).entity_container_id;
381 }
382 else
383 {
384 // the slots are not present, dont create the PDR
385 continue;
386 }
387
388 pdr->sensor_init = PLDM_NO_INIT;
389 pdr->sensor_auxiliary_names_pdr = false;
390 pdr->composite_sensor_count = 1;
391
392 auto* possibleStatesPtr = pdr->possible_states;
393 auto possibleStates =
394 reinterpret_cast<state_sensor_possible_states*>(possibleStatesPtr);
395 possibleStates->state_set_id = PLDM_OEM_IBM_PCIE_SLOT_SENSOR_STATE;
396 possibleStates->possible_states_size = 1;
397 auto state =
398 reinterpret_cast<state_sensor_possible_states*>(possibleStates);
399 state->states[0].byte = 15;
400 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
401 pdrEntry.data = entry.data();
402 pdrEntry.size = pdrSize;
403 repo.addRecord(pdrEntry);
404 }
405}
406
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500407void pldm::responder::oem_ibm_platform::Handler::buildOEMPDR(
408 pdr_utils::Repo& repo)
409{
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530410 buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
411 ENTITY_INSTANCE_0, PLDM_OEM_IBM_BOOT_STATE,
412 repo);
413 buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
414 ENTITY_INSTANCE_1, PLDM_OEM_IBM_BOOT_STATE,
415 repo);
416 buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
417 ENTITY_INSTANCE_0,
418 PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
419 buildAllCodeUpdateEffecterPDR(this, PLDM_ENTITY_SYSTEM_CHASSIS,
Sagar Srinivas1b8d35f2021-11-10 10:54:40 -0600420 ENTITY_INSTANCE_1,
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600421 PLDM_OEM_IBM_SYSTEM_POWER_STATE, repo);
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500422
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530423 static constexpr auto objectPath = "/xyz/openbmc_project/inventory/system";
424 const std::vector<std::string> slotInterface = {
425 "xyz.openbmc_project.Inventory.Item.PCIeSlot"};
426 auto slotPaths = dBusIntf->getSubTreePaths(objectPath, 0, slotInterface);
427 buildAllSlotEnableEffecterPDR(this, repo, slotPaths);
428 buildAllSlotEnableSensorPDR(this, repo, slotPaths);
429
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530430 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
431 ENTITY_INSTANCE_0, PLDM_OEM_IBM_BOOT_STATE,
432 repo);
433 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
434 ENTITY_INSTANCE_1, PLDM_OEM_IBM_BOOT_STATE,
435 repo);
436 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
437 ENTITY_INSTANCE_0,
438 PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
439 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
440 ENTITY_INSTANCE_0,
441 PLDM_OEM_IBM_VERIFICATION_STATE, repo);
Archana Kakanic23b6142025-02-19 04:04:20 -0600442 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
443 ENTITY_INSTANCE_0,
444 PLDM_OEM_IBM_BOOT_SIDE_RENAME, repo);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500445 auto sensorId = findStateSensorId(
446 repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
Sagar Srinivasf4a7dd72021-10-20 04:45:37 -0500447 ENTITY_INSTANCE_0, 1, PLDM_OEM_IBM_VERIFICATION_STATE);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500448 codeUpdate->setMarkerLidSensor(sensorId);
449 sensorId = findStateSensorId(
450 repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
Sagar Srinivasf4a7dd72021-10-20 04:45:37 -0500451 ENTITY_INSTANCE_0, 1, PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500452 codeUpdate->setFirmwareUpdateSensor(sensorId);
Archana Kakanic23b6142025-02-19 04:04:20 -0600453 sensorId =
454 findStateSensorId(repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
455 ENTITY_INSTANCE_0, 0, PLDM_OEM_IBM_BOOT_SIDE_RENAME);
456 codeUpdate->setBootSideRenameStateSensor(sensorId);
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500457}
458
Sampa Misraaea5dde2020-08-31 08:33:47 -0500459void pldm::responder::oem_ibm_platform::Handler::setPlatformHandler(
460 pldm::responder::platform::Handler* handler)
461{
462 platformHandler = handler;
463}
464
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500465int pldm::responder::oem_ibm_platform::Handler::sendEventToHost(
Sampa Misrac0c79482021-06-02 08:01:54 -0500466 std::vector<uint8_t>& requestMsg, uint8_t instanceId)
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500467{
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500468 if (requestMsg.size())
469 {
470 std::ostringstream tempStream;
471 for (int byte : requestMsg)
472 {
473 tempStream << std::setfill('0') << std::setw(2) << std::hex << byte
474 << " ";
475 }
476 std::cout << tempStream.str() << std::endl;
477 }
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400478 auto oemPlatformEventMessageResponseHandler = [](mctp_eid_t /*eid*/,
479 const pldm_msg* response,
480 size_t respMsgLen) {
Riya Dixit49cfb132023-03-02 04:26:53 -0600481 uint8_t completionCode{};
482 uint8_t status{};
483 auto rc = decode_platform_event_message_resp(response, respMsgLen,
484 &completionCode, &status);
485 if (rc || completionCode)
486 {
487 error(
Riya Dixitfc84f632024-04-06 14:00:02 -0500488 "Failed to decode platform event message response for code update event with response code '{RC}' and completion code '{CC}'",
Riya Dixit1e5c81e2024-05-03 07:54:00 -0500489 "RC", rc, "CC", completionCode);
Riya Dixit49cfb132023-03-02 04:26:53 -0600490 }
491 };
Sampa Misrac0c79482021-06-02 08:01:54 -0500492 auto rc = handler->registerRequest(
493 mctp_eid, instanceId, PLDM_PLATFORM, PLDM_PLATFORM_EVENT_MESSAGE,
494 std::move(requestMsg),
495 std::move(oemPlatformEventMessageResponseHandler));
496 if (rc)
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500497 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600498 error("Failed to send BIOS attribute change event message ");
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500499 }
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500500
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500501 return rc;
502}
503
504int encodeEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec,
505 std::vector<uint8_t>& requestMsg, uint8_t instanceId)
506{
507 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
508
509 auto rc = encode_platform_event_message_req(
ArchanaKakani6c39c7a2022-12-05 04:36:35 -0600510 instanceId, 1 /*formatVersion*/, TERMINUS_ID /*tId*/, eventType,
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500511 eventDataVec.data(), eventDataVec.size(), request,
512 eventDataVec.size() + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500513
514 return rc;
515}
516
517void pldm::responder::oem_ibm_platform::Handler::sendStateSensorEvent(
518 uint16_t sensorId, enum sensor_event_class_states sensorEventClass,
519 uint8_t sensorOffset, uint8_t eventState, uint8_t prevEventState)
520{
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500521 std::vector<uint8_t> sensorEventDataVec{};
522 size_t sensorEventSize = PLDM_SENSOR_EVENT_DATA_MIN_LENGTH + 1;
523 sensorEventDataVec.resize(sensorEventSize);
524 auto eventData = reinterpret_cast<struct pldm_sensor_event_data*>(
525 sensorEventDataVec.data());
526 eventData->sensor_id = sensorId;
527 eventData->sensor_event_class_type = sensorEventClass;
528 auto eventClassStart = eventData->event_class;
529 auto eventClass =
530 reinterpret_cast<struct pldm_sensor_event_state_sensor_state*>(
531 eventClassStart);
532 eventClass->sensor_offset = sensorOffset;
533 eventClass->event_state = eventState;
534 eventClass->previous_event_state = prevEventState;
ManojKiran Eda22bcb072025-07-11 23:49:43 +0000535 auto instanceId = instanceIdDb.next(mctp_eid);
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400536 std::vector<uint8_t> requestMsg(
537 sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
538 sensorEventDataVec.size());
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500539 auto rc = encodeEventMsg(PLDM_SENSOR_EVENT, sensorEventDataVec, requestMsg,
540 instanceId);
541 if (rc != PLDM_SUCCESS)
542 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500543 error("Failed to encode state sensor event with response code '{RC}'",
544 "RC", rc);
Andrew Jefferya330b2f2023-05-04 14:55:37 +0930545 instanceIdDb.free(mctp_eid, instanceId);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500546 return;
547 }
Sampa Misrac0c79482021-06-02 08:01:54 -0500548 rc = sendEventToHost(requestMsg, instanceId);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500549 if (rc != PLDM_SUCCESS)
550 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500551 error(
552 "Failed to send event to remote terminus with response code '{RC}'",
553 "RC", rc);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500554 }
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500555 return;
556}
557
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500558void pldm::responder::oem_ibm_platform::Handler::_processEndUpdate(
559 sdeventplus::source::EventBase& /*source */)
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500560{
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500561 assembleImageEvent.reset();
Adriana Kobylak9296f242021-09-22 15:52:00 +0000562 int retc = codeUpdate->assembleCodeUpdateImage();
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500563 if (retc != PLDM_SUCCESS)
564 {
565 codeUpdate->setCodeUpdateProgress(false);
566 auto sensorId = codeUpdate->getFirmwareUpdateSensor();
567 sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
568 uint8_t(CodeUpdateState::FAIL),
569 uint8_t(CodeUpdateState::START));
570 }
571}
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500572
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500573void pldm::responder::oem_ibm_platform::Handler::_processStartUpdate(
574 sdeventplus::source::EventBase& /*source */)
575{
576 codeUpdate->deleteImage();
577 CodeUpdateState state = CodeUpdateState::START;
578 auto rc = codeUpdate->setRequestedApplyTime();
579 if (rc != PLDM_SUCCESS)
580 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600581 error("setRequestedApplyTime failed");
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500582 state = CodeUpdateState::FAIL;
583 }
584 auto sensorId = codeUpdate->getFirmwareUpdateSensor();
585 sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0, uint8_t(state),
586 uint8_t(CodeUpdateState::END));
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500587}
588
Kamalkumar Patel15ce5a12024-05-07 11:45:11 -0500589void pldm::responder::oem_ibm_platform::Handler::updateOemDbusPaths(
590 std::string& dbusPath)
591{
592 std::string toFind("system1/chassis1/motherboard1");
593 if (dbusPath.find(toFind) != std::string::npos)
594 {
595 size_t pos = dbusPath.find(toFind);
596 dbusPath.replace(pos, toFind.length(), "system/chassis/motherboard");
597 }
598 toFind = "system1";
599 if (dbusPath.find(toFind) != std::string::npos)
600 {
601 size_t pos = dbusPath.find(toFind);
602 dbusPath.replace(pos, toFind.length(), "system");
603 }
604 /* below logic to replace path 'motherboard/socket/chassis' to
605 'motherboard/chassis' or 'motherboard/socket123/chassis' to
606 'motherboard/chassis' */
607 toFind = "socket";
608 size_t pos1 = dbusPath.find(toFind);
609 // while loop to detect multiple substring 'socket' in the path
610 while (pos1 != std::string::npos)
611 {
612 size_t pos2 = dbusPath.substr(pos1 + 1).find('/') + 1;
Manojkiran Eda2576aec2024-06-17 12:05:17 +0530613 // Replacing starting from substring to next occurrence of char '/'
Kamalkumar Patel15ce5a12024-05-07 11:45:11 -0500614 dbusPath.replace(pos1, pos2 + 1, "");
615 pos1 = dbusPath.find(toFind);
616 }
617}
618
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600619void pldm::responder::oem_ibm_platform::Handler::_processSystemReboot(
620 sdeventplus::source::EventBase& /*source */)
621{
622 pldm::utils::PropertyValue value =
623 "xyz.openbmc_project.State.Chassis.Transition.Off";
624 pldm::utils::DBusMapping dbusMapping{"/xyz/openbmc_project/state/chassis0",
625 "xyz.openbmc_project.State.Chassis",
626 "RequestedPowerTransition", "string"};
627 try
628 {
629 dBusIntf->setDbusProperty(dbusMapping, value);
630 }
631 catch (const std::exception& e)
632 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600633 error(
Riya Dixitfc84f632024-04-06 14:00:02 -0500634 "Failure in chassis State transition to Off, unable to set property RequestedPowerTransition, error - {ERROR}",
635 "ERROR", e);
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600636 }
637
638 using namespace sdbusplus::bus::match::rules;
Patrick Williams84b790c2022-07-22 19:26:56 -0500639 chassisOffMatch = std::make_unique<sdbusplus::bus::match_t>(
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600640 pldm::utils::DBusHandler::getBus(),
641 propertiesChanged("/xyz/openbmc_project/state/chassis0",
642 "xyz.openbmc_project.State.Chassis"),
Patrick Williams84b790c2022-07-22 19:26:56 -0500643 [this](sdbusplus::message_t& msg) {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400644 DbusChangedProps props{};
645 std::string intf;
646 msg.read(intf, props);
647 const auto itr = props.find("CurrentPowerState");
648 if (itr != props.end())
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600649 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400650 PropertyValue value = itr->second;
651 auto propVal = std::get<std::string>(value);
652 if (propVal ==
653 "xyz.openbmc_project.State.Chassis.PowerState.Off")
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600654 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400655 pldm::utils::DBusMapping dbusMapping{
656 "/xyz/openbmc_project/control/host0/"
657 "power_restore_policy/one_time",
658 "xyz.openbmc_project.Control.Power.RestorePolicy",
659 "PowerRestorePolicy", "string"};
660 value = "xyz.openbmc_project.Control.Power.RestorePolicy."
661 "Policy.AlwaysOn";
662 try
663 {
664 dBusIntf->setDbusProperty(dbusMapping, value);
665 }
666 catch (const std::exception& e)
667 {
668 error(
669 "Failure in setting one-time restore policy, unable to set property PowerRestorePolicy, error - {ERROR}",
670 "ERROR", e);
671 }
672 dbusMapping = pldm::utils::DBusMapping{
673 "/xyz/openbmc_project/state/bmc0",
674 "xyz.openbmc_project.State.BMC",
675 "RequestedBMCTransition", "string"};
676 value = "xyz.openbmc_project.State.BMC.Transition.Reboot";
677 try
678 {
679 dBusIntf->setDbusProperty(dbusMapping, value);
680 }
681 catch (const std::exception& e)
682 {
683 error(
684 "Failure in BMC state transition to reboot, unable to set property RequestedBMCTransition , error - {ERROR}",
685 "ERROR", e);
686 }
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600687 }
688 }
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400689 });
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600690}
Sagar Srinivas79669c92021-04-28 15:43:30 -0500691
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500692void pldm::responder::oem_ibm_platform::Handler::checkAndDisableWatchDog()
693{
694 if (!hostOff && setEventReceiverCnt == SET_EVENT_RECEIVER_SENT)
695 {
696 disableWatchDogTimer();
697 }
698
699 return;
700}
701
Sagar Srinivas79669c92021-04-28 15:43:30 -0500702bool pldm::responder::oem_ibm_platform::Handler::watchDogRunning()
703{
704 static constexpr auto watchDogObjectPath =
705 "/xyz/openbmc_project/watchdog/host0";
706 static constexpr auto watchDogEnablePropName = "Enabled";
707 static constexpr auto watchDogInterface =
708 "xyz.openbmc_project.State.Watchdog";
709 bool isWatchDogRunning = false;
710 try
711 {
712 isWatchDogRunning = pldm::utils::DBusHandler().getDbusProperty<bool>(
713 watchDogObjectPath, watchDogEnablePropName, watchDogInterface);
714 }
Kamalkumar Patel58cbcaf2023-10-06 03:48:25 -0500715 catch (const std::exception&)
Sagar Srinivas79669c92021-04-28 15:43:30 -0500716 {
717 return false;
718 }
719 return isWatchDogRunning;
720}
721
722void pldm::responder::oem_ibm_platform::Handler::resetWatchDogTimer()
723{
724 static constexpr auto watchDogService = "xyz.openbmc_project.Watchdog";
725 static constexpr auto watchDogObjectPath =
726 "/xyz/openbmc_project/watchdog/host0";
727 static constexpr auto watchDogInterface =
728 "xyz.openbmc_project.State.Watchdog";
729 static constexpr auto watchDogResetPropName = "ResetTimeRemaining";
730
731 bool wdStatus = watchDogRunning();
732 if (wdStatus == false)
733 {
734 return;
735 }
736 try
737 {
738 auto& bus = pldm::utils::DBusHandler::getBus();
739 auto resetMethod =
740 bus.new_method_call(watchDogService, watchDogObjectPath,
741 watchDogInterface, watchDogResetPropName);
742 resetMethod.append(true);
vkaverap@in.ibm.com5b71b862023-08-21 05:19:04 +0000743 bus.call_noreply(resetMethod, dbusTimeout);
Sagar Srinivas79669c92021-04-28 15:43:30 -0500744 }
745 catch (const std::exception& e)
746 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500747 error("Failed to reset watchdog timer, error - {ERROR}", "ERROR", e);
Sagar Srinivas79669c92021-04-28 15:43:30 -0500748 return;
749 }
750}
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500751
752void pldm::responder::oem_ibm_platform::Handler::disableWatchDogTimer()
753{
754 setEventReceiverCnt = 0;
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400755 pldm::utils::DBusMapping dbusMapping{
756 "/xyz/openbmc_project/watchdog/host0",
757 "xyz.openbmc_project.State.Watchdog", "Enabled", "bool"};
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500758 bool wdStatus = watchDogRunning();
759
760 if (!wdStatus)
761 {
762 return;
763 }
764 try
765 {
766 pldm::utils::DBusHandler().setDbusProperty(dbusMapping, false);
767 }
768 catch (const std::exception& e)
769 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500770 error("Failed to disable watchdog timer, error - {ERROR}", "ERROR", e);
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500771 }
772}
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500773int pldm::responder::oem_ibm_platform::Handler::checkBMCState()
774{
Pavithra Barithaya7b4d59a2024-02-05 09:09:30 -0600775 using BMC = sdbusplus::client::xyz::openbmc_project::state::BMC<>;
776 auto bmcPath = sdbusplus::message::object_path(BMC::namespace_path::value) /
777 BMC::namespace_path::bmc;
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500778 try
779 {
780 pldm::utils::PropertyValue propertyValue =
781 pldm::utils::DBusHandler().getDbusPropertyVariant(
Pavithra Barithaya7b4d59a2024-02-05 09:09:30 -0600782 bmcPath.str.c_str(), "CurrentBMCState", BMC::interface);
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500783
Archana Kakani44757532025-06-02 11:15:13 -0500784 if (std::get<std::string>(propertyValue) !=
785 "xyz.openbmc_project.State.BMC.BMCState.Ready")
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500786 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600787 error("GetPDR : PLDM stack is not ready for PDR exchange");
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500788 return PLDM_ERROR_NOT_READY;
789 }
790 }
791 catch (const std::exception& e)
792 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500793 error("Error getting the current BMC state, error - {ERROR}", "ERROR",
794 e);
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500795 return PLDM_ERROR;
796 }
797 return PLDM_SUCCESS;
798}
799
Sagar Srinivas3687e2b2023-04-10 05:08:28 -0500800const pldm_pdr_record*
801 pldm::responder::oem_ibm_platform::Handler::fetchLastBMCRecord(
802 const pldm_pdr* repo)
803{
804 return pldm_pdr_find_last_in_range(repo, BMC_PDR_START_RANGE,
805 BMC_PDR_END_RANGE);
806}
807
808bool pldm::responder::oem_ibm_platform::Handler::checkRecordHandleInRange(
809 const uint32_t& record_handle)
810{
811 return record_handle >= HOST_PDR_START_RANGE &&
812 record_handle <= HOST_PDR_END_RANGE;
813}
814
Sagar Srinivas90314a32023-10-17 10:38:03 -0500815void Handler::processSetEventReceiver()
816{
817 this->setEventReceiver();
818}
819
Sagar Srinivas18145f72022-04-11 07:38:26 -0500820void pldm::responder::oem_ibm_platform::Handler::startStopTimer(bool value)
821{
822 if (value)
823 {
824 timer.restart(
825 std::chrono::seconds(HEARTBEAT_TIMEOUT + HEARTBEAT_TIMEOUT_DELTA));
826 }
827 else
828 {
829 timer.setEnabled(value);
830 }
831}
832
833void pldm::responder::oem_ibm_platform::Handler::setSurvTimer(uint8_t tid,
834 bool value)
835{
836 if ((hostOff || hostTransitioningToOff || (tid != HYPERVISOR_TID)) &&
837 timer.isEnabled())
838 {
839 startStopTimer(false);
840 return;
841 }
842 if (value)
843 {
844 startStopTimer(value);
845 }
846 else if (timer.isEnabled())
847 {
848 info(
849 "Failed to stop surveillance timer while remote terminus status is ‘{HOST_TRANST_OFF}’ with Terminus ID ‘{TID}’ ",
850 "HOST_TRANST_OFF", hostTransitioningToOff, "TID", tid);
851 startStopTimer(value);
852 pldm::utils::reportError(
853 "xyz.openbmc_project.PLDM.Error.setSurvTimer.RecvSurveillancePingFail");
854 }
855}
856
Sampa Misraaea5dde2020-08-31 08:33:47 -0500857} // namespace oem_ibm_platform
Sampa Misraaea5dde2020-08-31 08:33:47 -0500858} // namespace responder
Sampa Misraaea5dde2020-08-31 08:33:47 -0500859} // namespace pldm