blob: 567d14f72c99fa8f435ba94af0d3ebf39ca8b8f9 [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 }
Archana Kakanic00d5bf2025-02-25 07:06:28 -0600167 else if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
168 stateSetId == PLDM_OEM_IBM_BOOT_SIDE_RENAME)
169 {
170 if (stateField[currState].effecter_state ==
171 PLDM_OEM_IBM_BOOT_SIDE_RENAME_STATE_RENAMED)
172 {
173 codeUpdate->processRenameEvent();
174 }
175 }
Sampa Misraaea5dde2020-08-31 08:33:47 -0500176 else
177 {
178 rc = PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE;
179 }
180 }
181 if (rc != PLDM_SUCCESS)
182 {
183 break;
184 }
185 }
186 return rc;
187}
188
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530189void buildAllCodeUpdateEffecterPDR(oem_ibm_platform::Handler* platformHandler,
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600190 uint16_t entityType, uint16_t entityInstance,
191 uint16_t stateSetID, pdr_utils::Repo& repo)
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500192{
193 size_t pdrSize = 0;
194 pdrSize = sizeof(pldm_state_effecter_pdr) +
195 sizeof(state_effecter_possible_states);
196 std::vector<uint8_t> entry{};
197 entry.resize(pdrSize);
198 pldm_state_effecter_pdr* pdr =
199 reinterpret_cast<pldm_state_effecter_pdr*>(entry.data());
200 if (!pdr)
201 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500202 error("Failed to get record by PDR type, error - {ERROR}", "ERROR",
Riya Dixit49cfb132023-03-02 04:26:53 -0600203 lg2::hex,
204 static_cast<unsigned>(PLDM_PLATFORM_INVALID_EFFECTER_ID));
Manojkiran Edabcf91ac2021-03-14 13:50:48 +0530205 return;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500206 }
207 pdr->hdr.record_handle = 0;
208 pdr->hdr.version = 1;
209 pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
210 pdr->hdr.record_change_num = 0;
211 pdr->hdr.length = sizeof(pldm_state_effecter_pdr) - sizeof(pldm_pdr_hdr);
Manojkiran Edacc5f1582021-09-29 17:03:06 +0530212 pdr->terminus_handle = TERMINUS_HANDLE;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500213 pdr->effecter_id = platformHandler->getNextEffecterId();
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600214 pdr->entity_type = entityType;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500215 pdr->entity_instance = entityInstance;
Sagar Srinivas97296e02021-08-26 09:40:41 -0500216 pdr->container_id = 1;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500217 pdr->effecter_semantic_id = 0;
218 pdr->effecter_init = PLDM_NO_INIT;
219 pdr->has_description_pdr = false;
220 pdr->composite_effecter_count = 1;
221
222 auto* possibleStatesPtr = pdr->possible_states;
223 auto possibleStates =
224 reinterpret_cast<state_effecter_possible_states*>(possibleStatesPtr);
225 possibleStates->state_set_id = stateSetID;
226 possibleStates->possible_states_size = 2;
227 auto state =
228 reinterpret_cast<state_effecter_possible_states*>(possibleStates);
Archana Kakanic00d5bf2025-02-25 07:06:28 -0600229 if ((stateSetID == PLDM_OEM_IBM_BOOT_STATE) ||
230 (stateSetID == PLDM_OEM_IBM_BOOT_SIDE_RENAME))
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500231 state->states[0].byte = 6;
232 else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
233 state->states[0].byte = 126;
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600234 else if (stateSetID == PLDM_OEM_IBM_SYSTEM_POWER_STATE)
235 state->states[0].byte = 2;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500236 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
237 pdrEntry.data = entry.data();
238 pdrEntry.size = pdrSize;
239 repo.addRecord(pdrEntry);
240}
241
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530242void buildAllSlotEnableEffecterPDR(oem_ibm_platform::Handler* platformHandler,
243 pdr_utils::Repo& repo,
244 const std::vector<std::string>& slotobjpaths)
245{
246 size_t pdrSize = 0;
247 pdrSize = sizeof(pldm_state_effecter_pdr) +
248 sizeof(state_effecter_possible_states);
249 std::vector<uint8_t> entry{};
250 entry.resize(pdrSize);
251 pldm_state_effecter_pdr* pdr =
252 reinterpret_cast<pldm_state_effecter_pdr*>(entry.data());
253 if (!pdr)
254 {
255 error("Failed to get record by PDR type, ERROR:{ERR}", "ERR", lg2::hex,
256 static_cast<unsigned>(PLDM_PLATFORM_INVALID_EFFECTER_ID));
257 return;
258 }
259
260 auto& associatedEntityMap = platformHandler->getAssociateEntityMap();
261 for (const auto& entity_path : slotobjpaths)
262 {
263 pdr->hdr.record_handle = 0;
264 pdr->hdr.version = 1;
265 pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
266 pdr->hdr.record_change_num = 0;
267 pdr->hdr.length =
268 sizeof(pldm_state_effecter_pdr) - sizeof(pldm_pdr_hdr);
269 pdr->terminus_handle = TERMINUS_HANDLE;
270 pdr->effecter_id = platformHandler->getNextEffecterId();
271
272 if (entity_path != "" && associatedEntityMap.contains(entity_path))
273 {
274 pdr->entity_type = associatedEntityMap.at(entity_path).entity_type;
275 pdr->entity_instance =
276 associatedEntityMap.at(entity_path).entity_instance_num;
277 pdr->container_id =
278 associatedEntityMap.at(entity_path).entity_container_id;
279 platformHandler->effecterIdToDbusMap[pdr->effecter_id] =
280 entity_path;
281 }
282 else
283 {
284 // the slots are not present, dont create the PDR
285 continue;
286 }
287 pdr->effecter_semantic_id = 0;
288 pdr->effecter_init = PLDM_NO_INIT;
289 pdr->has_description_pdr = false;
290 pdr->composite_effecter_count = 1;
291
292 auto* possibleStatesPtr = pdr->possible_states;
293 auto possibleStates = reinterpret_cast<state_effecter_possible_states*>(
294 possibleStatesPtr);
295 possibleStates->state_set_id = PLDM_OEM_IBM_PCIE_SLOT_EFFECTER_STATE;
296 possibleStates->possible_states_size = 2;
297 auto state =
298 reinterpret_cast<state_effecter_possible_states*>(possibleStates);
299 state->states[0].byte = 14;
300 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
301 pdrEntry.data = entry.data();
302 pdrEntry.size = pdrSize;
303 repo.addRecord(pdrEntry);
304 }
305}
306
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530307void buildAllCodeUpdateSensorPDR(oem_ibm_platform::Handler* platformHandler,
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500308 uint16_t entityType, uint16_t entityInstance,
309 uint16_t stateSetID, pdr_utils::Repo& repo)
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500310{
311 size_t pdrSize = 0;
Patrick Williams6da4f912023-05-10 07:50:53 -0500312 pdrSize = sizeof(pldm_state_sensor_pdr) +
313 sizeof(state_sensor_possible_states);
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500314 std::vector<uint8_t> entry{};
315 entry.resize(pdrSize);
316 pldm_state_sensor_pdr* pdr =
317 reinterpret_cast<pldm_state_sensor_pdr*>(entry.data());
318 if (!pdr)
319 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500320 error("Failed to get record by PDR type, error - {ERROR}", "ERROR",
Riya Dixit49cfb132023-03-02 04:26:53 -0600321 lg2::hex, static_cast<unsigned>(PLDM_PLATFORM_INVALID_SENSOR_ID));
Manojkiran Edabcf91ac2021-03-14 13:50:48 +0530322 return;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500323 }
324 pdr->hdr.record_handle = 0;
325 pdr->hdr.version = 1;
326 pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
327 pdr->hdr.record_change_num = 0;
328 pdr->hdr.length = sizeof(pldm_state_sensor_pdr) - sizeof(pldm_pdr_hdr);
Manojkiran Edacc5f1582021-09-29 17:03:06 +0530329 pdr->terminus_handle = TERMINUS_HANDLE;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500330 pdr->sensor_id = platformHandler->getNextSensorId();
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500331 pdr->entity_type = entityType;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500332 pdr->entity_instance = entityInstance;
Sagar Srinivas97296e02021-08-26 09:40:41 -0500333 pdr->container_id = 1;
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500334 pdr->sensor_init = PLDM_NO_INIT;
335 pdr->sensor_auxiliary_names_pdr = false;
336 pdr->composite_sensor_count = 1;
337
338 auto* possibleStatesPtr = pdr->possible_states;
339 auto possibleStates =
340 reinterpret_cast<state_sensor_possible_states*>(possibleStatesPtr);
341 possibleStates->state_set_id = stateSetID;
342 possibleStates->possible_states_size = 2;
343 auto state =
344 reinterpret_cast<state_sensor_possible_states*>(possibleStates);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500345 if ((stateSetID == PLDM_OEM_IBM_BOOT_STATE) ||
Archana Kakanic23b6142025-02-19 04:04:20 -0600346 (stateSetID == PLDM_OEM_IBM_VERIFICATION_STATE) ||
347 (stateSetID == PLDM_OEM_IBM_BOOT_SIDE_RENAME))
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500348 state->states[0].byte = 6;
349 else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
350 state->states[0].byte = 126;
351 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
352 pdrEntry.data = entry.data();
353 pdrEntry.size = pdrSize;
354 repo.addRecord(pdrEntry);
355}
356
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530357void buildAllSlotEnableSensorPDR(oem_ibm_platform::Handler* platformHandler,
358 pdr_utils::Repo& repo,
359 const std::vector<std::string>& slotobjpaths)
360{
361 size_t pdrSize = 0;
362 pdrSize = sizeof(pldm_state_sensor_pdr) +
363 sizeof(state_sensor_possible_states);
364 std::vector<uint8_t> entry{};
365 entry.resize(pdrSize);
366 pldm_state_sensor_pdr* pdr =
367 reinterpret_cast<pldm_state_sensor_pdr*>(entry.data());
368 if (!pdr)
369 {
370 error("Failed to get record by PDR type, ERROR:{ERR}", "ERR", lg2::hex,
371 static_cast<unsigned>(PLDM_PLATFORM_INVALID_SENSOR_ID));
372 return;
373 }
374 auto& associatedEntityMap = platformHandler->getAssociateEntityMap();
375 for (const auto& entity_path : slotobjpaths)
376 {
377 pdr->hdr.record_handle = 0;
378 pdr->hdr.version = 1;
379 pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
380 pdr->hdr.record_change_num = 0;
381 pdr->hdr.length = sizeof(pldm_state_sensor_pdr) - sizeof(pldm_pdr_hdr);
382 pdr->terminus_handle = TERMINUS_HANDLE;
383 pdr->sensor_id = platformHandler->getNextSensorId();
384 if (entity_path != "" && associatedEntityMap.contains(entity_path))
385 {
386 pdr->entity_type = associatedEntityMap.at(entity_path).entity_type;
387 pdr->entity_instance =
388 associatedEntityMap.at(entity_path).entity_instance_num;
389 pdr->container_id =
390 associatedEntityMap.at(entity_path).entity_container_id;
391 }
392 else
393 {
394 // the slots are not present, dont create the PDR
395 continue;
396 }
397
398 pdr->sensor_init = PLDM_NO_INIT;
399 pdr->sensor_auxiliary_names_pdr = false;
400 pdr->composite_sensor_count = 1;
401
402 auto* possibleStatesPtr = pdr->possible_states;
403 auto possibleStates =
404 reinterpret_cast<state_sensor_possible_states*>(possibleStatesPtr);
405 possibleStates->state_set_id = PLDM_OEM_IBM_PCIE_SLOT_SENSOR_STATE;
406 possibleStates->possible_states_size = 1;
407 auto state =
408 reinterpret_cast<state_sensor_possible_states*>(possibleStates);
409 state->states[0].byte = 15;
410 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
411 pdrEntry.data = entry.data();
412 pdrEntry.size = pdrSize;
413 repo.addRecord(pdrEntry);
414 }
415}
416
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500417void pldm::responder::oem_ibm_platform::Handler::buildOEMPDR(
418 pdr_utils::Repo& repo)
419{
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530420 buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
421 ENTITY_INSTANCE_0, PLDM_OEM_IBM_BOOT_STATE,
422 repo);
423 buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
424 ENTITY_INSTANCE_1, PLDM_OEM_IBM_BOOT_STATE,
425 repo);
426 buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
427 ENTITY_INSTANCE_0,
428 PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
429 buildAllCodeUpdateEffecterPDR(this, PLDM_ENTITY_SYSTEM_CHASSIS,
Sagar Srinivas1b8d35f2021-11-10 10:54:40 -0600430 ENTITY_INSTANCE_1,
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600431 PLDM_OEM_IBM_SYSTEM_POWER_STATE, repo);
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500432
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530433 static constexpr auto objectPath = "/xyz/openbmc_project/inventory/system";
434 const std::vector<std::string> slotInterface = {
435 "xyz.openbmc_project.Inventory.Item.PCIeSlot"};
436 auto slotPaths = dBusIntf->getSubTreePaths(objectPath, 0, slotInterface);
437 buildAllSlotEnableEffecterPDR(this, repo, slotPaths);
438 buildAllSlotEnableSensorPDR(this, repo, slotPaths);
439
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530440 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
441 ENTITY_INSTANCE_0, PLDM_OEM_IBM_BOOT_STATE,
442 repo);
443 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
444 ENTITY_INSTANCE_1, PLDM_OEM_IBM_BOOT_STATE,
445 repo);
446 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
447 ENTITY_INSTANCE_0,
448 PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
449 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
450 ENTITY_INSTANCE_0,
451 PLDM_OEM_IBM_VERIFICATION_STATE, repo);
Archana Kakanic23b6142025-02-19 04:04:20 -0600452 buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
453 ENTITY_INSTANCE_0,
454 PLDM_OEM_IBM_BOOT_SIDE_RENAME, repo);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500455 auto sensorId = findStateSensorId(
456 repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
Sagar Srinivasf4a7dd72021-10-20 04:45:37 -0500457 ENTITY_INSTANCE_0, 1, PLDM_OEM_IBM_VERIFICATION_STATE);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500458 codeUpdate->setMarkerLidSensor(sensorId);
459 sensorId = findStateSensorId(
460 repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
Sagar Srinivasf4a7dd72021-10-20 04:45:37 -0500461 ENTITY_INSTANCE_0, 1, PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE);
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500462 codeUpdate->setFirmwareUpdateSensor(sensorId);
Archana Kakanic23b6142025-02-19 04:04:20 -0600463 sensorId =
464 findStateSensorId(repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
Archana Kakanie26d13f2025-03-09 23:17:46 -0500465 ENTITY_INSTANCE_0, 1, PLDM_OEM_IBM_BOOT_SIDE_RENAME);
Archana Kakanic23b6142025-02-19 04:04:20 -0600466 codeUpdate->setBootSideRenameStateSensor(sensorId);
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500467}
468
Sampa Misraaea5dde2020-08-31 08:33:47 -0500469void pldm::responder::oem_ibm_platform::Handler::setPlatformHandler(
470 pldm::responder::platform::Handler* handler)
471{
472 platformHandler = handler;
473}
474
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500475int pldm::responder::oem_ibm_platform::Handler::sendEventToHost(
Sampa Misrac0c79482021-06-02 08:01:54 -0500476 std::vector<uint8_t>& requestMsg, uint8_t instanceId)
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500477{
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500478 if (requestMsg.size())
479 {
480 std::ostringstream tempStream;
481 for (int byte : requestMsg)
482 {
483 tempStream << std::setfill('0') << std::setw(2) << std::hex << byte
484 << " ";
485 }
486 std::cout << tempStream.str() << std::endl;
487 }
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400488 auto oemPlatformEventMessageResponseHandler = [](mctp_eid_t /*eid*/,
489 const pldm_msg* response,
490 size_t respMsgLen) {
Riya Dixit49cfb132023-03-02 04:26:53 -0600491 uint8_t completionCode{};
492 uint8_t status{};
493 auto rc = decode_platform_event_message_resp(response, respMsgLen,
494 &completionCode, &status);
495 if (rc || completionCode)
496 {
497 error(
Riya Dixitfc84f632024-04-06 14:00:02 -0500498 "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 -0500499 "RC", rc, "CC", completionCode);
Riya Dixit49cfb132023-03-02 04:26:53 -0600500 }
501 };
Sampa Misrac0c79482021-06-02 08:01:54 -0500502 auto rc = handler->registerRequest(
503 mctp_eid, instanceId, PLDM_PLATFORM, PLDM_PLATFORM_EVENT_MESSAGE,
504 std::move(requestMsg),
505 std::move(oemPlatformEventMessageResponseHandler));
506 if (rc)
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500507 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600508 error("Failed to send BIOS attribute change event message ");
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500509 }
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500510
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500511 return rc;
512}
513
514int encodeEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec,
515 std::vector<uint8_t>& requestMsg, uint8_t instanceId)
516{
517 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
518
519 auto rc = encode_platform_event_message_req(
ArchanaKakani6c39c7a2022-12-05 04:36:35 -0600520 instanceId, 1 /*formatVersion*/, TERMINUS_ID /*tId*/, eventType,
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500521 eventDataVec.data(), eventDataVec.size(), request,
522 eventDataVec.size() + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500523
524 return rc;
525}
526
527void pldm::responder::oem_ibm_platform::Handler::sendStateSensorEvent(
528 uint16_t sensorId, enum sensor_event_class_states sensorEventClass,
529 uint8_t sensorOffset, uint8_t eventState, uint8_t prevEventState)
530{
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500531 std::vector<uint8_t> sensorEventDataVec{};
532 size_t sensorEventSize = PLDM_SENSOR_EVENT_DATA_MIN_LENGTH + 1;
533 sensorEventDataVec.resize(sensorEventSize);
534 auto eventData = reinterpret_cast<struct pldm_sensor_event_data*>(
535 sensorEventDataVec.data());
536 eventData->sensor_id = sensorId;
537 eventData->sensor_event_class_type = sensorEventClass;
538 auto eventClassStart = eventData->event_class;
539 auto eventClass =
540 reinterpret_cast<struct pldm_sensor_event_state_sensor_state*>(
541 eventClassStart);
542 eventClass->sensor_offset = sensorOffset;
543 eventClass->event_state = eventState;
544 eventClass->previous_event_state = prevEventState;
ManojKiran Eda22bcb072025-07-11 23:49:43 +0000545 auto instanceId = instanceIdDb.next(mctp_eid);
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400546 std::vector<uint8_t> requestMsg(
547 sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
548 sensorEventDataVec.size());
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500549 auto rc = encodeEventMsg(PLDM_SENSOR_EVENT, sensorEventDataVec, requestMsg,
550 instanceId);
551 if (rc != PLDM_SUCCESS)
552 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500553 error("Failed to encode state sensor event with response code '{RC}'",
554 "RC", rc);
Andrew Jefferya330b2f2023-05-04 14:55:37 +0930555 instanceIdDb.free(mctp_eid, instanceId);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500556 return;
557 }
Sampa Misrac0c79482021-06-02 08:01:54 -0500558 rc = sendEventToHost(requestMsg, instanceId);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500559 if (rc != PLDM_SUCCESS)
560 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500561 error(
562 "Failed to send event to remote terminus with response code '{RC}'",
563 "RC", rc);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500564 }
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500565 return;
566}
567
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500568void pldm::responder::oem_ibm_platform::Handler::_processEndUpdate(
569 sdeventplus::source::EventBase& /*source */)
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500570{
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500571 assembleImageEvent.reset();
Adriana Kobylak9296f242021-09-22 15:52:00 +0000572 int retc = codeUpdate->assembleCodeUpdateImage();
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500573 if (retc != PLDM_SUCCESS)
574 {
575 codeUpdate->setCodeUpdateProgress(false);
576 auto sensorId = codeUpdate->getFirmwareUpdateSensor();
577 sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
578 uint8_t(CodeUpdateState::FAIL),
579 uint8_t(CodeUpdateState::START));
580 }
581}
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500582
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500583void pldm::responder::oem_ibm_platform::Handler::_processStartUpdate(
584 sdeventplus::source::EventBase& /*source */)
585{
586 codeUpdate->deleteImage();
587 CodeUpdateState state = CodeUpdateState::START;
588 auto rc = codeUpdate->setRequestedApplyTime();
589 if (rc != PLDM_SUCCESS)
590 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600591 error("setRequestedApplyTime failed");
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500592 state = CodeUpdateState::FAIL;
593 }
594 auto sensorId = codeUpdate->getFirmwareUpdateSensor();
595 sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0, uint8_t(state),
596 uint8_t(CodeUpdateState::END));
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500597}
598
Kamalkumar Patel15ce5a12024-05-07 11:45:11 -0500599void pldm::responder::oem_ibm_platform::Handler::updateOemDbusPaths(
600 std::string& dbusPath)
601{
602 std::string toFind("system1/chassis1/motherboard1");
603 if (dbusPath.find(toFind) != std::string::npos)
604 {
605 size_t pos = dbusPath.find(toFind);
606 dbusPath.replace(pos, toFind.length(), "system/chassis/motherboard");
607 }
608 toFind = "system1";
609 if (dbusPath.find(toFind) != std::string::npos)
610 {
611 size_t pos = dbusPath.find(toFind);
612 dbusPath.replace(pos, toFind.length(), "system");
613 }
614 /* below logic to replace path 'motherboard/socket/chassis' to
615 'motherboard/chassis' or 'motherboard/socket123/chassis' to
616 'motherboard/chassis' */
617 toFind = "socket";
618 size_t pos1 = dbusPath.find(toFind);
619 // while loop to detect multiple substring 'socket' in the path
620 while (pos1 != std::string::npos)
621 {
622 size_t pos2 = dbusPath.substr(pos1 + 1).find('/') + 1;
Manojkiran Eda2576aec2024-06-17 12:05:17 +0530623 // Replacing starting from substring to next occurrence of char '/'
Kamalkumar Patel15ce5a12024-05-07 11:45:11 -0500624 dbusPath.replace(pos1, pos2 + 1, "");
625 pos1 = dbusPath.find(toFind);
626 }
627}
628
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600629void pldm::responder::oem_ibm_platform::Handler::_processSystemReboot(
630 sdeventplus::source::EventBase& /*source */)
631{
632 pldm::utils::PropertyValue value =
633 "xyz.openbmc_project.State.Chassis.Transition.Off";
634 pldm::utils::DBusMapping dbusMapping{"/xyz/openbmc_project/state/chassis0",
635 "xyz.openbmc_project.State.Chassis",
636 "RequestedPowerTransition", "string"};
637 try
638 {
639 dBusIntf->setDbusProperty(dbusMapping, value);
640 }
641 catch (const std::exception& e)
642 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600643 error(
Riya Dixitfc84f632024-04-06 14:00:02 -0500644 "Failure in chassis State transition to Off, unable to set property RequestedPowerTransition, error - {ERROR}",
645 "ERROR", e);
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600646 }
647
648 using namespace sdbusplus::bus::match::rules;
Patrick Williams84b790c2022-07-22 19:26:56 -0500649 chassisOffMatch = std::make_unique<sdbusplus::bus::match_t>(
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600650 pldm::utils::DBusHandler::getBus(),
651 propertiesChanged("/xyz/openbmc_project/state/chassis0",
652 "xyz.openbmc_project.State.Chassis"),
Patrick Williams84b790c2022-07-22 19:26:56 -0500653 [this](sdbusplus::message_t& msg) {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400654 DbusChangedProps props{};
655 std::string intf;
656 msg.read(intf, props);
657 const auto itr = props.find("CurrentPowerState");
658 if (itr != props.end())
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600659 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400660 PropertyValue value = itr->second;
661 auto propVal = std::get<std::string>(value);
662 if (propVal ==
663 "xyz.openbmc_project.State.Chassis.PowerState.Off")
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600664 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400665 pldm::utils::DBusMapping dbusMapping{
666 "/xyz/openbmc_project/control/host0/"
667 "power_restore_policy/one_time",
668 "xyz.openbmc_project.Control.Power.RestorePolicy",
669 "PowerRestorePolicy", "string"};
670 value = "xyz.openbmc_project.Control.Power.RestorePolicy."
671 "Policy.AlwaysOn";
672 try
673 {
674 dBusIntf->setDbusProperty(dbusMapping, value);
675 }
676 catch (const std::exception& e)
677 {
678 error(
679 "Failure in setting one-time restore policy, unable to set property PowerRestorePolicy, error - {ERROR}",
680 "ERROR", e);
681 }
682 dbusMapping = pldm::utils::DBusMapping{
683 "/xyz/openbmc_project/state/bmc0",
684 "xyz.openbmc_project.State.BMC",
685 "RequestedBMCTransition", "string"};
686 value = "xyz.openbmc_project.State.BMC.Transition.Reboot";
687 try
688 {
689 dBusIntf->setDbusProperty(dbusMapping, value);
690 }
691 catch (const std::exception& e)
692 {
693 error(
694 "Failure in BMC state transition to reboot, unable to set property RequestedBMCTransition , error - {ERROR}",
695 "ERROR", e);
696 }
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600697 }
698 }
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400699 });
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600700}
Sagar Srinivas79669c92021-04-28 15:43:30 -0500701
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500702void pldm::responder::oem_ibm_platform::Handler::checkAndDisableWatchDog()
703{
704 if (!hostOff && setEventReceiverCnt == SET_EVENT_RECEIVER_SENT)
705 {
706 disableWatchDogTimer();
707 }
708
709 return;
710}
711
Sagar Srinivas79669c92021-04-28 15:43:30 -0500712bool pldm::responder::oem_ibm_platform::Handler::watchDogRunning()
713{
714 static constexpr auto watchDogObjectPath =
715 "/xyz/openbmc_project/watchdog/host0";
716 static constexpr auto watchDogEnablePropName = "Enabled";
717 static constexpr auto watchDogInterface =
718 "xyz.openbmc_project.State.Watchdog";
719 bool isWatchDogRunning = false;
720 try
721 {
722 isWatchDogRunning = pldm::utils::DBusHandler().getDbusProperty<bool>(
723 watchDogObjectPath, watchDogEnablePropName, watchDogInterface);
724 }
Kamalkumar Patel58cbcaf2023-10-06 03:48:25 -0500725 catch (const std::exception&)
Sagar Srinivas79669c92021-04-28 15:43:30 -0500726 {
727 return false;
728 }
729 return isWatchDogRunning;
730}
731
732void pldm::responder::oem_ibm_platform::Handler::resetWatchDogTimer()
733{
734 static constexpr auto watchDogService = "xyz.openbmc_project.Watchdog";
735 static constexpr auto watchDogObjectPath =
736 "/xyz/openbmc_project/watchdog/host0";
737 static constexpr auto watchDogInterface =
738 "xyz.openbmc_project.State.Watchdog";
739 static constexpr auto watchDogResetPropName = "ResetTimeRemaining";
740
741 bool wdStatus = watchDogRunning();
742 if (wdStatus == false)
743 {
744 return;
745 }
746 try
747 {
748 auto& bus = pldm::utils::DBusHandler::getBus();
749 auto resetMethod =
750 bus.new_method_call(watchDogService, watchDogObjectPath,
751 watchDogInterface, watchDogResetPropName);
752 resetMethod.append(true);
vkaverap@in.ibm.com5b71b862023-08-21 05:19:04 +0000753 bus.call_noreply(resetMethod, dbusTimeout);
Sagar Srinivas79669c92021-04-28 15:43:30 -0500754 }
755 catch (const std::exception& e)
756 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500757 error("Failed to reset watchdog timer, error - {ERROR}", "ERROR", e);
Sagar Srinivas79669c92021-04-28 15:43:30 -0500758 return;
759 }
760}
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500761
762void pldm::responder::oem_ibm_platform::Handler::disableWatchDogTimer()
763{
764 setEventReceiverCnt = 0;
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400765 pldm::utils::DBusMapping dbusMapping{
766 "/xyz/openbmc_project/watchdog/host0",
767 "xyz.openbmc_project.State.Watchdog", "Enabled", "bool"};
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500768 bool wdStatus = watchDogRunning();
769
770 if (!wdStatus)
771 {
772 return;
773 }
774 try
775 {
776 pldm::utils::DBusHandler().setDbusProperty(dbusMapping, false);
777 }
778 catch (const std::exception& e)
779 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500780 error("Failed to disable watchdog timer, error - {ERROR}", "ERROR", e);
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500781 }
782}
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500783int pldm::responder::oem_ibm_platform::Handler::checkBMCState()
784{
Pavithra Barithaya7b4d59a2024-02-05 09:09:30 -0600785 using BMC = sdbusplus::client::xyz::openbmc_project::state::BMC<>;
786 auto bmcPath = sdbusplus::message::object_path(BMC::namespace_path::value) /
787 BMC::namespace_path::bmc;
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500788 try
789 {
790 pldm::utils::PropertyValue propertyValue =
791 pldm::utils::DBusHandler().getDbusPropertyVariant(
Pavithra Barithaya7b4d59a2024-02-05 09:09:30 -0600792 bmcPath.str.c_str(), "CurrentBMCState", BMC::interface);
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500793
Archana Kakani44757532025-06-02 11:15:13 -0500794 if (std::get<std::string>(propertyValue) !=
795 "xyz.openbmc_project.State.BMC.BMCState.Ready")
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500796 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600797 error("GetPDR : PLDM stack is not ready for PDR exchange");
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500798 return PLDM_ERROR_NOT_READY;
799 }
800 }
801 catch (const std::exception& e)
802 {
Riya Dixitfc84f632024-04-06 14:00:02 -0500803 error("Error getting the current BMC state, error - {ERROR}", "ERROR",
804 e);
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500805 return PLDM_ERROR;
806 }
807 return PLDM_SUCCESS;
808}
809
Sagar Srinivas3687e2b2023-04-10 05:08:28 -0500810const pldm_pdr_record*
811 pldm::responder::oem_ibm_platform::Handler::fetchLastBMCRecord(
812 const pldm_pdr* repo)
813{
814 return pldm_pdr_find_last_in_range(repo, BMC_PDR_START_RANGE,
815 BMC_PDR_END_RANGE);
816}
817
818bool pldm::responder::oem_ibm_platform::Handler::checkRecordHandleInRange(
819 const uint32_t& record_handle)
820{
821 return record_handle >= HOST_PDR_START_RANGE &&
822 record_handle <= HOST_PDR_END_RANGE;
823}
824
Sagar Srinivas90314a32023-10-17 10:38:03 -0500825void Handler::processSetEventReceiver()
826{
827 this->setEventReceiver();
828}
829
Sagar Srinivas18145f72022-04-11 07:38:26 -0500830void pldm::responder::oem_ibm_platform::Handler::startStopTimer(bool value)
831{
832 if (value)
833 {
834 timer.restart(
835 std::chrono::seconds(HEARTBEAT_TIMEOUT + HEARTBEAT_TIMEOUT_DELTA));
836 }
837 else
838 {
839 timer.setEnabled(value);
840 }
841}
842
843void pldm::responder::oem_ibm_platform::Handler::setSurvTimer(uint8_t tid,
844 bool value)
845{
846 if ((hostOff || hostTransitioningToOff || (tid != HYPERVISOR_TID)) &&
847 timer.isEnabled())
848 {
849 startStopTimer(false);
850 return;
851 }
852 if (value)
853 {
854 startStopTimer(value);
855 }
856 else if (timer.isEnabled())
857 {
858 info(
859 "Failed to stop surveillance timer while remote terminus status is ‘{HOST_TRANST_OFF}’ with Terminus ID ‘{TID}’ ",
860 "HOST_TRANST_OFF", hostTransitioningToOff, "TID", tid);
861 startStopTimer(value);
862 pldm::utils::reportError(
863 "xyz.openbmc_project.PLDM.Error.setSurvTimer.RecvSurveillancePingFail");
864 }
865}
866
Sampa Misraaea5dde2020-08-31 08:33:47 -0500867} // namespace oem_ibm_platform
Sampa Misraaea5dde2020-08-31 08:33:47 -0500868} // namespace responder
Sampa Misraaea5dde2020-08-31 08:33:47 -0500869} // namespace pldm