1aea5dde1SSampa Misra #include "oem_ibm_handler.hpp"
2aea5dde1SSampa Misra
3cfdbca75SSagar Srinivas #include "file_io_type_lid.hpp"
4cfdbca75SSagar Srinivas #include "libpldmresponder/file_io.hpp"
578a225a2SSagar Srinivas #include "libpldmresponder/pdr_utils.hpp"
65079ac4aSBrad Bishop
7c453e164SGeorge Liu #include <libpldm/entity.h>
821f128d8SAndrew Jeffery #include <libpldm/oem/ibm/entity.h>
927403f46SBrad Bishop
1049cfb138SRiya Dixit #include <phosphor-logging/lg2.hpp>
117b4d59aaSPavithra Barithaya #include <xyz/openbmc_project/State/BMC/client.hpp>
1249cfb138SRiya Dixit
1349cfb138SRiya Dixit PHOSPHOR_LOG2_USING;
1449cfb138SRiya Dixit
155079ac4aSBrad Bishop using namespace pldm::pdr;
165079ac4aSBrad Bishop using namespace pldm::utils;
175079ac4aSBrad Bishop
18aea5dde1SSampa Misra namespace pldm
19aea5dde1SSampa Misra {
20aea5dde1SSampa Misra namespace responder
21aea5dde1SSampa Misra {
22aea5dde1SSampa Misra namespace oem_ibm_platform
23aea5dde1SSampa Misra {
24aea5dde1SSampa Misra int pldm::responder::oem_ibm_platform::Handler::
getOemStateSensorReadingsHandler(pldm::pdr::EntityType entityType,EntityInstance entityInstance,StateSetId stateSetId,CompositeCount compSensorCnt,std::vector<get_sensor_state_field> & stateField)25aea5dde1SSampa Misra getOemStateSensorReadingsHandler(
26*7d427f16SKamalkumar Patel pldm::pdr::EntityType entityType, EntityInstance entityInstance,
27aea5dde1SSampa Misra StateSetId stateSetId, CompositeCount compSensorCnt,
28aea5dde1SSampa Misra std::vector<get_sensor_state_field>& stateField)
29aea5dde1SSampa Misra {
30aea5dde1SSampa Misra int rc = PLDM_SUCCESS;
31aea5dde1SSampa Misra stateField.clear();
32aea5dde1SSampa Misra
33aea5dde1SSampa Misra for (size_t i = 0; i < compSensorCnt; i++)
34aea5dde1SSampa Misra {
35aea5dde1SSampa Misra uint8_t sensorOpState{};
3678a225a2SSagar Srinivas if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
37aea5dde1SSampa Misra stateSetId == PLDM_OEM_IBM_BOOT_STATE)
38aea5dde1SSampa Misra {
39aea5dde1SSampa Misra sensorOpState = fetchBootSide(entityInstance, codeUpdate);
40aea5dde1SSampa Misra }
41aea5dde1SSampa Misra else
42aea5dde1SSampa Misra {
43aea5dde1SSampa Misra rc = PLDM_PLATFORM_INVALID_STATE_VALUE;
44aea5dde1SSampa Misra break;
45aea5dde1SSampa Misra }
46aea5dde1SSampa Misra stateField.push_back({PLDM_SENSOR_ENABLED, PLDM_SENSOR_UNKNOWN,
47aea5dde1SSampa Misra PLDM_SENSOR_UNKNOWN, sensorOpState});
48aea5dde1SSampa Misra }
49aea5dde1SSampa Misra return rc;
50aea5dde1SSampa Misra }
51aea5dde1SSampa Misra
52aea5dde1SSampa Misra int pldm::responder::oem_ibm_platform::Handler::
oemSetStateEffecterStatesHandler(uint16_t entityType,uint16_t entityInstance,uint16_t stateSetId,uint8_t compEffecterCnt,std::vector<set_effecter_state_field> & stateField,uint16_t)533a0e3b9bSSampa Misra oemSetStateEffecterStatesHandler(
543fbd39ebSVarsha Kaverappa uint16_t entityType, uint16_t entityInstance, uint16_t stateSetId,
553fbd39ebSVarsha Kaverappa uint8_t compEffecterCnt,
563fbd39ebSVarsha Kaverappa std::vector<set_effecter_state_field>& stateField,
573fbd39ebSVarsha Kaverappa uint16_t /*effecterId*/)
58aea5dde1SSampa Misra {
59aea5dde1SSampa Misra int rc = PLDM_SUCCESS;
60aea5dde1SSampa Misra
61aea5dde1SSampa Misra for (uint8_t currState = 0; currState < compEffecterCnt; ++currState)
62aea5dde1SSampa Misra {
63aea5dde1SSampa Misra if (stateField[currState].set_request == PLDM_REQUEST_SET)
64aea5dde1SSampa Misra {
6578a225a2SSagar Srinivas if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
66aea5dde1SSampa Misra stateSetId == PLDM_OEM_IBM_BOOT_STATE)
67aea5dde1SSampa Misra {
68aea5dde1SSampa Misra rc = setBootSide(entityInstance, currState, stateField,
69aea5dde1SSampa Misra codeUpdate);
70aea5dde1SSampa Misra }
71cfdbca75SSagar Srinivas else if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
72cfdbca75SSagar Srinivas stateSetId == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
73cfdbca75SSagar Srinivas {
74cfdbca75SSagar Srinivas if (stateField[currState].effecter_state ==
75cfdbca75SSagar Srinivas uint8_t(CodeUpdateState::START))
76cfdbca75SSagar Srinivas {
77cfdbca75SSagar Srinivas codeUpdate->setCodeUpdateProgress(true);
783a0e3b9bSSampa Misra startUpdateEvent =
793a0e3b9bSSampa Misra std::make_unique<sdeventplus::source::Defer>(
803a0e3b9bSSampa Misra event,
813a0e3b9bSSampa Misra std::bind(std::mem_fn(&oem_ibm_platform::Handler::
823a0e3b9bSSampa Misra _processStartUpdate),
833a0e3b9bSSampa Misra this, std::placeholders::_1));
84cfdbca75SSagar Srinivas }
85cfdbca75SSagar Srinivas else if (stateField[currState].effecter_state ==
86cfdbca75SSagar Srinivas uint8_t(CodeUpdateState::END))
87cfdbca75SSagar Srinivas {
883a0e3b9bSSampa Misra rc = PLDM_SUCCESS;
893a0e3b9bSSampa Misra assembleImageEvent = std::make_unique<
903a0e3b9bSSampa Misra sdeventplus::source::Defer>(
913a0e3b9bSSampa Misra event,
923a0e3b9bSSampa Misra std::bind(
933a0e3b9bSSampa Misra std::mem_fn(
943a0e3b9bSSampa Misra &oem_ibm_platform::Handler::_processEndUpdate),
953a0e3b9bSSampa Misra this, std::placeholders::_1));
963a0e3b9bSSampa Misra
973a0e3b9bSSampa Misra // sendCodeUpdateEvent(effecterId, END, START);
98cfdbca75SSagar Srinivas }
99cfdbca75SSagar Srinivas else if (stateField[currState].effecter_state ==
100cfdbca75SSagar Srinivas uint8_t(CodeUpdateState::ABORT))
101cfdbca75SSagar Srinivas {
102cfdbca75SSagar Srinivas codeUpdate->setCodeUpdateProgress(false);
103cfdbca75SSagar Srinivas codeUpdate->clearDirPath(LID_STAGING_DIR);
1043a0e3b9bSSampa Misra auto sensorId = codeUpdate->getFirmwareUpdateSensor();
1053a0e3b9bSSampa Misra sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
1063a0e3b9bSSampa Misra uint8_t(CodeUpdateState::ABORT),
1073a0e3b9bSSampa Misra uint8_t(CodeUpdateState::START));
1083a0e3b9bSSampa Misra // sendCodeUpdateEvent(effecterId, ABORT, END);
109cfdbca75SSagar Srinivas }
110cfdbca75SSagar Srinivas else if (stateField[currState].effecter_state ==
111cfdbca75SSagar Srinivas uint8_t(CodeUpdateState::ACCEPT))
112cfdbca75SSagar Srinivas {
1133a0e3b9bSSampa Misra auto sensorId = codeUpdate->getFirmwareUpdateSensor();
1143a0e3b9bSSampa Misra sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
1153a0e3b9bSSampa Misra uint8_t(CodeUpdateState::ACCEPT),
1163a0e3b9bSSampa Misra uint8_t(CodeUpdateState::END));
117cfdbca75SSagar Srinivas // TODO Set new Dbus property provided by code update app
1183a0e3b9bSSampa Misra // sendCodeUpdateEvent(effecterId, ACCEPT, END);
119cfdbca75SSagar Srinivas }
120cfdbca75SSagar Srinivas else if (stateField[currState].effecter_state ==
121cfdbca75SSagar Srinivas uint8_t(CodeUpdateState::REJECT))
122cfdbca75SSagar Srinivas {
1233a0e3b9bSSampa Misra auto sensorId = codeUpdate->getFirmwareUpdateSensor();
1243a0e3b9bSSampa Misra sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
1253a0e3b9bSSampa Misra uint8_t(CodeUpdateState::REJECT),
1263a0e3b9bSSampa Misra uint8_t(CodeUpdateState::END));
127cfdbca75SSagar Srinivas // TODO Set new Dbus property provided by code update app
1283a0e3b9bSSampa Misra // sendCodeUpdateEvent(effecterId, REJECT, END);
129cfdbca75SSagar Srinivas }
130cfdbca75SSagar Srinivas }
1319a64b4a7SSagar Srinivas else if (entityType == PLDM_ENTITY_SYSTEM_CHASSIS &&
1329a64b4a7SSagar Srinivas stateSetId == PLDM_OEM_IBM_SYSTEM_POWER_STATE)
1339a64b4a7SSagar Srinivas {
1349a64b4a7SSagar Srinivas if (stateField[currState].effecter_state == POWER_CYCLE_HARD)
1359a64b4a7SSagar Srinivas {
1369a64b4a7SSagar Srinivas systemRebootEvent =
1379a64b4a7SSagar Srinivas std::make_unique<sdeventplus::source::Defer>(
1389a64b4a7SSagar Srinivas event,
1399a64b4a7SSagar Srinivas std::bind(std::mem_fn(&oem_ibm_platform::Handler::
1409a64b4a7SSagar Srinivas _processSystemReboot),
1419a64b4a7SSagar Srinivas this, std::placeholders::_1));
1429a64b4a7SSagar Srinivas }
1439a64b4a7SSagar Srinivas }
144aea5dde1SSampa Misra else
145aea5dde1SSampa Misra {
146aea5dde1SSampa Misra rc = PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE;
147aea5dde1SSampa Misra }
148aea5dde1SSampa Misra }
149aea5dde1SSampa Misra if (rc != PLDM_SUCCESS)
150aea5dde1SSampa Misra {
151aea5dde1SSampa Misra break;
152aea5dde1SSampa Misra }
153aea5dde1SSampa Misra }
154aea5dde1SSampa Misra return rc;
155aea5dde1SSampa Misra }
156aea5dde1SSampa Misra
buildAllCodeUpdateEffecterPDR(oem_ibm_platform::Handler * platformHandler,uint16_t entityType,uint16_t entityInstance,uint16_t stateSetID,pdr_utils::Repo & repo)1576b1d8830SManojkiran Eda void buildAllCodeUpdateEffecterPDR(oem_ibm_platform::Handler* platformHandler,
1589a64b4a7SSagar Srinivas uint16_t entityType, uint16_t entityInstance,
1599a64b4a7SSagar Srinivas uint16_t stateSetID, pdr_utils::Repo& repo)
16078a225a2SSagar Srinivas {
16178a225a2SSagar Srinivas size_t pdrSize = 0;
16278a225a2SSagar Srinivas pdrSize = sizeof(pldm_state_effecter_pdr) +
16378a225a2SSagar Srinivas sizeof(state_effecter_possible_states);
16478a225a2SSagar Srinivas std::vector<uint8_t> entry{};
16578a225a2SSagar Srinivas entry.resize(pdrSize);
16678a225a2SSagar Srinivas pldm_state_effecter_pdr* pdr =
16778a225a2SSagar Srinivas reinterpret_cast<pldm_state_effecter_pdr*>(entry.data());
16878a225a2SSagar Srinivas if (!pdr)
16978a225a2SSagar Srinivas {
170fc84f634SRiya Dixit error("Failed to get record by PDR type, error - {ERROR}", "ERROR",
17149cfb138SRiya Dixit lg2::hex,
17249cfb138SRiya Dixit static_cast<unsigned>(PLDM_PLATFORM_INVALID_EFFECTER_ID));
173bcf91accSManojkiran Eda return;
17478a225a2SSagar Srinivas }
17578a225a2SSagar Srinivas pdr->hdr.record_handle = 0;
17678a225a2SSagar Srinivas pdr->hdr.version = 1;
17778a225a2SSagar Srinivas pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
17878a225a2SSagar Srinivas pdr->hdr.record_change_num = 0;
17978a225a2SSagar Srinivas pdr->hdr.length = sizeof(pldm_state_effecter_pdr) - sizeof(pldm_pdr_hdr);
180cc5f1586SManojkiran Eda pdr->terminus_handle = TERMINUS_HANDLE;
18178a225a2SSagar Srinivas pdr->effecter_id = platformHandler->getNextEffecterId();
1829a64b4a7SSagar Srinivas pdr->entity_type = entityType;
18378a225a2SSagar Srinivas pdr->entity_instance = entityInstance;
18497296e03SSagar Srinivas pdr->container_id = 1;
18578a225a2SSagar Srinivas pdr->effecter_semantic_id = 0;
18678a225a2SSagar Srinivas pdr->effecter_init = PLDM_NO_INIT;
18778a225a2SSagar Srinivas pdr->has_description_pdr = false;
18878a225a2SSagar Srinivas pdr->composite_effecter_count = 1;
18978a225a2SSagar Srinivas
19078a225a2SSagar Srinivas auto* possibleStatesPtr = pdr->possible_states;
19178a225a2SSagar Srinivas auto possibleStates =
19278a225a2SSagar Srinivas reinterpret_cast<state_effecter_possible_states*>(possibleStatesPtr);
19378a225a2SSagar Srinivas possibleStates->state_set_id = stateSetID;
19478a225a2SSagar Srinivas possibleStates->possible_states_size = 2;
19578a225a2SSagar Srinivas auto state =
19678a225a2SSagar Srinivas reinterpret_cast<state_effecter_possible_states*>(possibleStates);
19778a225a2SSagar Srinivas if (stateSetID == PLDM_OEM_IBM_BOOT_STATE)
19878a225a2SSagar Srinivas state->states[0].byte = 6;
19978a225a2SSagar Srinivas else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
20078a225a2SSagar Srinivas state->states[0].byte = 126;
2019a64b4a7SSagar Srinivas else if (stateSetID == PLDM_OEM_IBM_SYSTEM_POWER_STATE)
2029a64b4a7SSagar Srinivas state->states[0].byte = 2;
20378a225a2SSagar Srinivas pldm::responder::pdr_utils::PdrEntry pdrEntry{};
20478a225a2SSagar Srinivas pdrEntry.data = entry.data();
20578a225a2SSagar Srinivas pdrEntry.size = pdrSize;
20678a225a2SSagar Srinivas repo.addRecord(pdrEntry);
20778a225a2SSagar Srinivas }
20878a225a2SSagar Srinivas
buildAllCodeUpdateSensorPDR(oem_ibm_platform::Handler * platformHandler,uint16_t entityType,uint16_t entityInstance,uint16_t stateSetID,pdr_utils::Repo & repo)2096b1d8830SManojkiran Eda void buildAllCodeUpdateSensorPDR(oem_ibm_platform::Handler* platformHandler,
2103a0e3b9bSSampa Misra uint16_t entityType, uint16_t entityInstance,
2113a0e3b9bSSampa Misra uint16_t stateSetID, pdr_utils::Repo& repo)
21278a225a2SSagar Srinivas {
21378a225a2SSagar Srinivas size_t pdrSize = 0;
2146da4f91bSPatrick Williams pdrSize = sizeof(pldm_state_sensor_pdr) +
2156da4f91bSPatrick Williams sizeof(state_sensor_possible_states);
21678a225a2SSagar Srinivas std::vector<uint8_t> entry{};
21778a225a2SSagar Srinivas entry.resize(pdrSize);
21878a225a2SSagar Srinivas pldm_state_sensor_pdr* pdr =
21978a225a2SSagar Srinivas reinterpret_cast<pldm_state_sensor_pdr*>(entry.data());
22078a225a2SSagar Srinivas if (!pdr)
22178a225a2SSagar Srinivas {
222fc84f634SRiya Dixit error("Failed to get record by PDR type, error - {ERROR}", "ERROR",
22349cfb138SRiya Dixit lg2::hex, static_cast<unsigned>(PLDM_PLATFORM_INVALID_SENSOR_ID));
224bcf91accSManojkiran Eda return;
22578a225a2SSagar Srinivas }
22678a225a2SSagar Srinivas pdr->hdr.record_handle = 0;
22778a225a2SSagar Srinivas pdr->hdr.version = 1;
22878a225a2SSagar Srinivas pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
22978a225a2SSagar Srinivas pdr->hdr.record_change_num = 0;
23078a225a2SSagar Srinivas pdr->hdr.length = sizeof(pldm_state_sensor_pdr) - sizeof(pldm_pdr_hdr);
231cc5f1586SManojkiran Eda pdr->terminus_handle = TERMINUS_HANDLE;
23278a225a2SSagar Srinivas pdr->sensor_id = platformHandler->getNextSensorId();
2333a0e3b9bSSampa Misra pdr->entity_type = entityType;
23478a225a2SSagar Srinivas pdr->entity_instance = entityInstance;
23597296e03SSagar Srinivas pdr->container_id = 1;
23678a225a2SSagar Srinivas pdr->sensor_init = PLDM_NO_INIT;
23778a225a2SSagar Srinivas pdr->sensor_auxiliary_names_pdr = false;
23878a225a2SSagar Srinivas pdr->composite_sensor_count = 1;
23978a225a2SSagar Srinivas
24078a225a2SSagar Srinivas auto* possibleStatesPtr = pdr->possible_states;
24178a225a2SSagar Srinivas auto possibleStates =
24278a225a2SSagar Srinivas reinterpret_cast<state_sensor_possible_states*>(possibleStatesPtr);
24378a225a2SSagar Srinivas possibleStates->state_set_id = stateSetID;
24478a225a2SSagar Srinivas possibleStates->possible_states_size = 2;
24578a225a2SSagar Srinivas auto state =
24678a225a2SSagar Srinivas reinterpret_cast<state_sensor_possible_states*>(possibleStates);
2473a0e3b9bSSampa Misra if ((stateSetID == PLDM_OEM_IBM_BOOT_STATE) ||
2487f9523cdSChristian Geddes (stateSetID == PLDM_OEM_IBM_VERIFICATION_STATE))
24978a225a2SSagar Srinivas state->states[0].byte = 6;
25078a225a2SSagar Srinivas else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
25178a225a2SSagar Srinivas state->states[0].byte = 126;
25278a225a2SSagar Srinivas pldm::responder::pdr_utils::PdrEntry pdrEntry{};
25378a225a2SSagar Srinivas pdrEntry.data = entry.data();
25478a225a2SSagar Srinivas pdrEntry.size = pdrSize;
25578a225a2SSagar Srinivas repo.addRecord(pdrEntry);
25678a225a2SSagar Srinivas }
25778a225a2SSagar Srinivas
buildOEMPDR(pdr_utils::Repo & repo)25878a225a2SSagar Srinivas void pldm::responder::oem_ibm_platform::Handler::buildOEMPDR(
25978a225a2SSagar Srinivas pdr_utils::Repo& repo)
26078a225a2SSagar Srinivas {
2616b1d8830SManojkiran Eda buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
2626b1d8830SManojkiran Eda ENTITY_INSTANCE_0, PLDM_OEM_IBM_BOOT_STATE,
2636b1d8830SManojkiran Eda repo);
2646b1d8830SManojkiran Eda buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
2656b1d8830SManojkiran Eda ENTITY_INSTANCE_1, PLDM_OEM_IBM_BOOT_STATE,
2666b1d8830SManojkiran Eda repo);
2676b1d8830SManojkiran Eda buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
2686b1d8830SManojkiran Eda ENTITY_INSTANCE_0,
26978a225a2SSagar Srinivas PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
2706b1d8830SManojkiran Eda buildAllCodeUpdateEffecterPDR(this, PLDM_ENTITY_SYSTEM_CHASSIS,
2711b8d35f5SSagar Srinivas ENTITY_INSTANCE_1,
2729a64b4a7SSagar Srinivas PLDM_OEM_IBM_SYSTEM_POWER_STATE, repo);
27378a225a2SSagar Srinivas
2746b1d8830SManojkiran Eda buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
2756b1d8830SManojkiran Eda ENTITY_INSTANCE_0, PLDM_OEM_IBM_BOOT_STATE,
2766b1d8830SManojkiran Eda repo);
2776b1d8830SManojkiran Eda buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
2786b1d8830SManojkiran Eda ENTITY_INSTANCE_1, PLDM_OEM_IBM_BOOT_STATE,
2796b1d8830SManojkiran Eda repo);
2806b1d8830SManojkiran Eda buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
2816b1d8830SManojkiran Eda ENTITY_INSTANCE_0,
28278a225a2SSagar Srinivas PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
2836b1d8830SManojkiran Eda buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
2846b1d8830SManojkiran Eda ENTITY_INSTANCE_0,
2853a0e3b9bSSampa Misra PLDM_OEM_IBM_VERIFICATION_STATE, repo);
2863a0e3b9bSSampa Misra auto sensorId = findStateSensorId(
2873a0e3b9bSSampa Misra repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
288f4a7dd79SSagar Srinivas ENTITY_INSTANCE_0, 1, PLDM_OEM_IBM_VERIFICATION_STATE);
2893a0e3b9bSSampa Misra codeUpdate->setMarkerLidSensor(sensorId);
2903a0e3b9bSSampa Misra sensorId = findStateSensorId(
2913a0e3b9bSSampa Misra repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
292f4a7dd79SSagar Srinivas ENTITY_INSTANCE_0, 1, PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE);
2933a0e3b9bSSampa Misra codeUpdate->setFirmwareUpdateSensor(sensorId);
29478a225a2SSagar Srinivas }
29578a225a2SSagar Srinivas
setPlatformHandler(pldm::responder::platform::Handler * handler)296aea5dde1SSampa Misra void pldm::responder::oem_ibm_platform::Handler::setPlatformHandler(
297aea5dde1SSampa Misra pldm::responder::platform::Handler* handler)
298aea5dde1SSampa Misra {
299aea5dde1SSampa Misra platformHandler = handler;
300aea5dde1SSampa Misra }
301aea5dde1SSampa Misra
sendEventToHost(std::vector<uint8_t> & requestMsg,uint8_t instanceId)302bb585b28SVarsha Kaverappa int pldm::responder::oem_ibm_platform::Handler::sendEventToHost(
303c0c79481SSampa Misra std::vector<uint8_t>& requestMsg, uint8_t instanceId)
304bb585b28SVarsha Kaverappa {
305bb585b28SVarsha Kaverappa if (requestMsg.size())
306bb585b28SVarsha Kaverappa {
307bb585b28SVarsha Kaverappa std::ostringstream tempStream;
308bb585b28SVarsha Kaverappa for (int byte : requestMsg)
309bb585b28SVarsha Kaverappa {
310bb585b28SVarsha Kaverappa tempStream << std::setfill('0') << std::setw(2) << std::hex << byte
311bb585b28SVarsha Kaverappa << " ";
312bb585b28SVarsha Kaverappa }
313bb585b28SVarsha Kaverappa std::cout << tempStream.str() << std::endl;
314bb585b28SVarsha Kaverappa }
3156da4f91bSPatrick Williams auto oemPlatformEventMessageResponseHandler =
3166da4f91bSPatrick Williams [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) {
317bb585b28SVarsha Kaverappa uint8_t completionCode{};
318bb585b28SVarsha Kaverappa uint8_t status{};
31949cfb138SRiya Dixit auto rc = decode_platform_event_message_resp(response, respMsgLen,
32049cfb138SRiya Dixit &completionCode, &status);
321c0c79481SSampa Misra if (rc || completionCode)
322bb585b28SVarsha Kaverappa {
32349cfb138SRiya Dixit error(
324fc84f634SRiya Dixit "Failed to decode platform event message response for code update event with response code '{RC}' and completion code '{CC}'",
3251e5c81e0SRiya Dixit "RC", rc, "CC", completionCode);
326bb585b28SVarsha Kaverappa }
327c0c79481SSampa Misra };
328c0c79481SSampa Misra auto rc = handler->registerRequest(
329c0c79481SSampa Misra mctp_eid, instanceId, PLDM_PLATFORM, PLDM_PLATFORM_EVENT_MESSAGE,
330c0c79481SSampa Misra std::move(requestMsg),
331c0c79481SSampa Misra std::move(oemPlatformEventMessageResponseHandler));
332c0c79481SSampa Misra if (rc)
333c0c79481SSampa Misra {
33449cfb138SRiya Dixit error("Failed to send BIOS attribute change event message ");
335c0c79481SSampa Misra }
336c0c79481SSampa Misra
3373a0e3b9bSSampa Misra return rc;
3383a0e3b9bSSampa Misra }
3393a0e3b9bSSampa Misra
encodeEventMsg(uint8_t eventType,const std::vector<uint8_t> & eventDataVec,std::vector<uint8_t> & requestMsg,uint8_t instanceId)3403a0e3b9bSSampa Misra int encodeEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec,
3413a0e3b9bSSampa Misra std::vector<uint8_t>& requestMsg, uint8_t instanceId)
3423a0e3b9bSSampa Misra {
3433a0e3b9bSSampa Misra auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3443a0e3b9bSSampa Misra
3453a0e3b9bSSampa Misra auto rc = encode_platform_event_message_req(
3466c39c7a7SArchanaKakani instanceId, 1 /*formatVersion*/, TERMINUS_ID /*tId*/, eventType,
3473a0e3b9bSSampa Misra eventDataVec.data(), eventDataVec.size(), request,
3483a0e3b9bSSampa Misra eventDataVec.size() + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
349bb585b28SVarsha Kaverappa
350bb585b28SVarsha Kaverappa return rc;
351bb585b28SVarsha Kaverappa }
352bb585b28SVarsha Kaverappa
sendStateSensorEvent(uint16_t sensorId,enum sensor_event_class_states sensorEventClass,uint8_t sensorOffset,uint8_t eventState,uint8_t prevEventState)353bb585b28SVarsha Kaverappa void pldm::responder::oem_ibm_platform::Handler::sendStateSensorEvent(
354bb585b28SVarsha Kaverappa uint16_t sensorId, enum sensor_event_class_states sensorEventClass,
355bb585b28SVarsha Kaverappa uint8_t sensorOffset, uint8_t eventState, uint8_t prevEventState)
356bb585b28SVarsha Kaverappa {
357bb585b28SVarsha Kaverappa std::vector<uint8_t> sensorEventDataVec{};
358bb585b28SVarsha Kaverappa size_t sensorEventSize = PLDM_SENSOR_EVENT_DATA_MIN_LENGTH + 1;
359bb585b28SVarsha Kaverappa sensorEventDataVec.resize(sensorEventSize);
360bb585b28SVarsha Kaverappa auto eventData = reinterpret_cast<struct pldm_sensor_event_data*>(
361bb585b28SVarsha Kaverappa sensorEventDataVec.data());
362bb585b28SVarsha Kaverappa eventData->sensor_id = sensorId;
363bb585b28SVarsha Kaverappa eventData->sensor_event_class_type = sensorEventClass;
364bb585b28SVarsha Kaverappa auto eventClassStart = eventData->event_class;
365bb585b28SVarsha Kaverappa auto eventClass =
366bb585b28SVarsha Kaverappa reinterpret_cast<struct pldm_sensor_event_state_sensor_state*>(
367bb585b28SVarsha Kaverappa eventClassStart);
368bb585b28SVarsha Kaverappa eventClass->sensor_offset = sensorOffset;
369bb585b28SVarsha Kaverappa eventClass->event_state = eventState;
370bb585b28SVarsha Kaverappa eventClass->previous_event_state = prevEventState;
371a330b2f0SAndrew Jeffery auto instanceId = instanceIdDb.next(mctp_eid);
372bb585b28SVarsha Kaverappa std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
373bb585b28SVarsha Kaverappa PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
374bb585b28SVarsha Kaverappa sensorEventDataVec.size());
375bb585b28SVarsha Kaverappa auto rc = encodeEventMsg(PLDM_SENSOR_EVENT, sensorEventDataVec, requestMsg,
376bb585b28SVarsha Kaverappa instanceId);
377bb585b28SVarsha Kaverappa if (rc != PLDM_SUCCESS)
378bb585b28SVarsha Kaverappa {
379fc84f634SRiya Dixit error("Failed to encode state sensor event with response code '{RC}'",
380fc84f634SRiya Dixit "RC", rc);
381a330b2f0SAndrew Jeffery instanceIdDb.free(mctp_eid, instanceId);
382bb585b28SVarsha Kaverappa return;
383bb585b28SVarsha Kaverappa }
384c0c79481SSampa Misra rc = sendEventToHost(requestMsg, instanceId);
385bb585b28SVarsha Kaverappa if (rc != PLDM_SUCCESS)
386bb585b28SVarsha Kaverappa {
387fc84f634SRiya Dixit error(
388fc84f634SRiya Dixit "Failed to send event to remote terminus with response code '{RC}'",
389fc84f634SRiya Dixit "RC", rc);
390bb585b28SVarsha Kaverappa }
391bb585b28SVarsha Kaverappa return;
392bb585b28SVarsha Kaverappa }
393bb585b28SVarsha Kaverappa
_processEndUpdate(sdeventplus::source::EventBase &)3943a0e3b9bSSampa Misra void pldm::responder::oem_ibm_platform::Handler::_processEndUpdate(
3953a0e3b9bSSampa Misra sdeventplus::source::EventBase& /*source */)
396bb585b28SVarsha Kaverappa {
3973a0e3b9bSSampa Misra assembleImageEvent.reset();
3989296f244SAdriana Kobylak int retc = codeUpdate->assembleCodeUpdateImage();
3993a0e3b9bSSampa Misra if (retc != PLDM_SUCCESS)
4003a0e3b9bSSampa Misra {
4013a0e3b9bSSampa Misra codeUpdate->setCodeUpdateProgress(false);
4023a0e3b9bSSampa Misra auto sensorId = codeUpdate->getFirmwareUpdateSensor();
4033a0e3b9bSSampa Misra sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
4043a0e3b9bSSampa Misra uint8_t(CodeUpdateState::FAIL),
4053a0e3b9bSSampa Misra uint8_t(CodeUpdateState::START));
4063a0e3b9bSSampa Misra }
4073a0e3b9bSSampa Misra }
408bb585b28SVarsha Kaverappa
_processStartUpdate(sdeventplus::source::EventBase &)4093a0e3b9bSSampa Misra void pldm::responder::oem_ibm_platform::Handler::_processStartUpdate(
4103a0e3b9bSSampa Misra sdeventplus::source::EventBase& /*source */)
4113a0e3b9bSSampa Misra {
4123a0e3b9bSSampa Misra codeUpdate->deleteImage();
4133a0e3b9bSSampa Misra CodeUpdateState state = CodeUpdateState::START;
4143a0e3b9bSSampa Misra auto rc = codeUpdate->setRequestedApplyTime();
4153a0e3b9bSSampa Misra if (rc != PLDM_SUCCESS)
4163a0e3b9bSSampa Misra {
41749cfb138SRiya Dixit error("setRequestedApplyTime failed");
4183a0e3b9bSSampa Misra state = CodeUpdateState::FAIL;
4193a0e3b9bSSampa Misra }
4203a0e3b9bSSampa Misra auto sensorId = codeUpdate->getFirmwareUpdateSensor();
4213a0e3b9bSSampa Misra sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0, uint8_t(state),
4223a0e3b9bSSampa Misra uint8_t(CodeUpdateState::END));
423bb585b28SVarsha Kaverappa }
424bb585b28SVarsha Kaverappa
updateOemDbusPaths(std::string & dbusPath)42515ce5a18SKamalkumar Patel void pldm::responder::oem_ibm_platform::Handler::updateOemDbusPaths(
42615ce5a18SKamalkumar Patel std::string& dbusPath)
42715ce5a18SKamalkumar Patel {
42815ce5a18SKamalkumar Patel std::string toFind("system1/chassis1/motherboard1");
42915ce5a18SKamalkumar Patel if (dbusPath.find(toFind) != std::string::npos)
43015ce5a18SKamalkumar Patel {
43115ce5a18SKamalkumar Patel size_t pos = dbusPath.find(toFind);
43215ce5a18SKamalkumar Patel dbusPath.replace(pos, toFind.length(), "system/chassis/motherboard");
43315ce5a18SKamalkumar Patel }
43415ce5a18SKamalkumar Patel toFind = "system1";
43515ce5a18SKamalkumar Patel if (dbusPath.find(toFind) != std::string::npos)
43615ce5a18SKamalkumar Patel {
43715ce5a18SKamalkumar Patel size_t pos = dbusPath.find(toFind);
43815ce5a18SKamalkumar Patel dbusPath.replace(pos, toFind.length(), "system");
43915ce5a18SKamalkumar Patel }
44015ce5a18SKamalkumar Patel /* below logic to replace path 'motherboard/socket/chassis' to
44115ce5a18SKamalkumar Patel 'motherboard/chassis' or 'motherboard/socket123/chassis' to
44215ce5a18SKamalkumar Patel 'motherboard/chassis' */
44315ce5a18SKamalkumar Patel toFind = "socket";
44415ce5a18SKamalkumar Patel size_t pos1 = dbusPath.find(toFind);
44515ce5a18SKamalkumar Patel // while loop to detect multiple substring 'socket' in the path
44615ce5a18SKamalkumar Patel while (pos1 != std::string::npos)
44715ce5a18SKamalkumar Patel {
44815ce5a18SKamalkumar Patel size_t pos2 = dbusPath.substr(pos1 + 1).find('/') + 1;
4492576aecdSManojkiran Eda // Replacing starting from substring to next occurrence of char '/'
45015ce5a18SKamalkumar Patel dbusPath.replace(pos1, pos2 + 1, "");
45115ce5a18SKamalkumar Patel pos1 = dbusPath.find(toFind);
45215ce5a18SKamalkumar Patel }
45315ce5a18SKamalkumar Patel }
45415ce5a18SKamalkumar Patel
_processSystemReboot(sdeventplus::source::EventBase &)4559a64b4a7SSagar Srinivas void pldm::responder::oem_ibm_platform::Handler::_processSystemReboot(
4569a64b4a7SSagar Srinivas sdeventplus::source::EventBase& /*source */)
4579a64b4a7SSagar Srinivas {
4589a64b4a7SSagar Srinivas pldm::utils::PropertyValue value =
4599a64b4a7SSagar Srinivas "xyz.openbmc_project.State.Chassis.Transition.Off";
4609a64b4a7SSagar Srinivas pldm::utils::DBusMapping dbusMapping{"/xyz/openbmc_project/state/chassis0",
4619a64b4a7SSagar Srinivas "xyz.openbmc_project.State.Chassis",
4629a64b4a7SSagar Srinivas "RequestedPowerTransition", "string"};
4639a64b4a7SSagar Srinivas try
4649a64b4a7SSagar Srinivas {
4659a64b4a7SSagar Srinivas dBusIntf->setDbusProperty(dbusMapping, value);
4669a64b4a7SSagar Srinivas }
4679a64b4a7SSagar Srinivas catch (const std::exception& e)
4689a64b4a7SSagar Srinivas {
46949cfb138SRiya Dixit error(
470fc84f634SRiya Dixit "Failure in chassis State transition to Off, unable to set property RequestedPowerTransition, error - {ERROR}",
471fc84f634SRiya Dixit "ERROR", e);
4729a64b4a7SSagar Srinivas }
4739a64b4a7SSagar Srinivas
4749a64b4a7SSagar Srinivas using namespace sdbusplus::bus::match::rules;
47584b790cbSPatrick Williams chassisOffMatch = std::make_unique<sdbusplus::bus::match_t>(
4769a64b4a7SSagar Srinivas pldm::utils::DBusHandler::getBus(),
4779a64b4a7SSagar Srinivas propertiesChanged("/xyz/openbmc_project/state/chassis0",
4789a64b4a7SSagar Srinivas "xyz.openbmc_project.State.Chassis"),
47984b790cbSPatrick Williams [this](sdbusplus::message_t& msg) {
4809a64b4a7SSagar Srinivas DbusChangedProps props{};
4819a64b4a7SSagar Srinivas std::string intf;
4829a64b4a7SSagar Srinivas msg.read(intf, props);
4839a64b4a7SSagar Srinivas const auto itr = props.find("CurrentPowerState");
4849a64b4a7SSagar Srinivas if (itr != props.end())
4859a64b4a7SSagar Srinivas {
4869a64b4a7SSagar Srinivas PropertyValue value = itr->second;
4879a64b4a7SSagar Srinivas auto propVal = std::get<std::string>(value);
4886da4f91bSPatrick Williams if (propVal == "xyz.openbmc_project.State.Chassis.PowerState.Off")
4899a64b4a7SSagar Srinivas {
4909a64b4a7SSagar Srinivas pldm::utils::DBusMapping dbusMapping{
4919a64b4a7SSagar Srinivas "/xyz/openbmc_project/control/host0/"
4929a64b4a7SSagar Srinivas "power_restore_policy/one_time",
4939a64b4a7SSagar Srinivas "xyz.openbmc_project.Control.Power.RestorePolicy",
4949a64b4a7SSagar Srinivas "PowerRestorePolicy", "string"};
4959a64b4a7SSagar Srinivas value = "xyz.openbmc_project.Control.Power.RestorePolicy."
4969a64b4a7SSagar Srinivas "Policy.AlwaysOn";
4979a64b4a7SSagar Srinivas try
4989a64b4a7SSagar Srinivas {
4999a64b4a7SSagar Srinivas dBusIntf->setDbusProperty(dbusMapping, value);
5009a64b4a7SSagar Srinivas }
5019a64b4a7SSagar Srinivas catch (const std::exception& e)
5029a64b4a7SSagar Srinivas {
50349cfb138SRiya Dixit error(
504fc84f634SRiya Dixit "Failure in setting one-time restore policy, unable to set property PowerRestorePolicy, error - {ERROR}",
505fc84f634SRiya Dixit "ERROR", e);
5069a64b4a7SSagar Srinivas }
5079a64b4a7SSagar Srinivas dbusMapping = pldm::utils::DBusMapping{
5089a64b4a7SSagar Srinivas "/xyz/openbmc_project/state/bmc0",
5096da4f91bSPatrick Williams "xyz.openbmc_project.State.BMC", "RequestedBMCTransition",
5106da4f91bSPatrick Williams "string"};
5119a64b4a7SSagar Srinivas value = "xyz.openbmc_project.State.BMC.Transition.Reboot";
5129a64b4a7SSagar Srinivas try
5139a64b4a7SSagar Srinivas {
5149a64b4a7SSagar Srinivas dBusIntf->setDbusProperty(dbusMapping, value);
5159a64b4a7SSagar Srinivas }
5169a64b4a7SSagar Srinivas catch (const std::exception& e)
5179a64b4a7SSagar Srinivas {
51849cfb138SRiya Dixit error(
519fc84f634SRiya Dixit "Failure in BMC state transition to reboot, unable to set property RequestedBMCTransition , error - {ERROR}",
520fc84f634SRiya Dixit "ERROR", e);
5219a64b4a7SSagar Srinivas }
5229a64b4a7SSagar Srinivas }
5239a64b4a7SSagar Srinivas }
5249a64b4a7SSagar Srinivas });
5259a64b4a7SSagar Srinivas }
52679669c94SSagar Srinivas
checkAndDisableWatchDog()5277f760b36SSagar Srinivas void pldm::responder::oem_ibm_platform::Handler::checkAndDisableWatchDog()
5287f760b36SSagar Srinivas {
5297f760b36SSagar Srinivas if (!hostOff && setEventReceiverCnt == SET_EVENT_RECEIVER_SENT)
5307f760b36SSagar Srinivas {
5317f760b36SSagar Srinivas disableWatchDogTimer();
5327f760b36SSagar Srinivas }
5337f760b36SSagar Srinivas
5347f760b36SSagar Srinivas return;
5357f760b36SSagar Srinivas }
5367f760b36SSagar Srinivas
watchDogRunning()53779669c94SSagar Srinivas bool pldm::responder::oem_ibm_platform::Handler::watchDogRunning()
53879669c94SSagar Srinivas {
53979669c94SSagar Srinivas static constexpr auto watchDogObjectPath =
54079669c94SSagar Srinivas "/xyz/openbmc_project/watchdog/host0";
54179669c94SSagar Srinivas static constexpr auto watchDogEnablePropName = "Enabled";
54279669c94SSagar Srinivas static constexpr auto watchDogInterface =
54379669c94SSagar Srinivas "xyz.openbmc_project.State.Watchdog";
54479669c94SSagar Srinivas bool isWatchDogRunning = false;
54579669c94SSagar Srinivas try
54679669c94SSagar Srinivas {
54779669c94SSagar Srinivas isWatchDogRunning = pldm::utils::DBusHandler().getDbusProperty<bool>(
54879669c94SSagar Srinivas watchDogObjectPath, watchDogEnablePropName, watchDogInterface);
54979669c94SSagar Srinivas }
55058cbcaf2SKamalkumar Patel catch (const std::exception&)
55179669c94SSagar Srinivas {
55279669c94SSagar Srinivas return false;
55379669c94SSagar Srinivas }
55479669c94SSagar Srinivas return isWatchDogRunning;
55579669c94SSagar Srinivas }
55679669c94SSagar Srinivas
resetWatchDogTimer()55779669c94SSagar Srinivas void pldm::responder::oem_ibm_platform::Handler::resetWatchDogTimer()
55879669c94SSagar Srinivas {
55979669c94SSagar Srinivas static constexpr auto watchDogService = "xyz.openbmc_project.Watchdog";
56079669c94SSagar Srinivas static constexpr auto watchDogObjectPath =
56179669c94SSagar Srinivas "/xyz/openbmc_project/watchdog/host0";
56279669c94SSagar Srinivas static constexpr auto watchDogInterface =
56379669c94SSagar Srinivas "xyz.openbmc_project.State.Watchdog";
56479669c94SSagar Srinivas static constexpr auto watchDogResetPropName = "ResetTimeRemaining";
56579669c94SSagar Srinivas
56679669c94SSagar Srinivas bool wdStatus = watchDogRunning();
56779669c94SSagar Srinivas if (wdStatus == false)
56879669c94SSagar Srinivas {
56979669c94SSagar Srinivas return;
57079669c94SSagar Srinivas }
57179669c94SSagar Srinivas try
57279669c94SSagar Srinivas {
57379669c94SSagar Srinivas auto& bus = pldm::utils::DBusHandler::getBus();
57479669c94SSagar Srinivas auto resetMethod =
57579669c94SSagar Srinivas bus.new_method_call(watchDogService, watchDogObjectPath,
57679669c94SSagar Srinivas watchDogInterface, watchDogResetPropName);
57779669c94SSagar Srinivas resetMethod.append(true);
5785b71b86fSvkaverap@in.ibm.com bus.call_noreply(resetMethod, dbusTimeout);
57979669c94SSagar Srinivas }
58079669c94SSagar Srinivas catch (const std::exception& e)
58179669c94SSagar Srinivas {
582fc84f634SRiya Dixit error("Failed to reset watchdog timer, error - {ERROR}", "ERROR", e);
58379669c94SSagar Srinivas return;
58479669c94SSagar Srinivas }
58579669c94SSagar Srinivas }
5867f760b36SSagar Srinivas
disableWatchDogTimer()5877f760b36SSagar Srinivas void pldm::responder::oem_ibm_platform::Handler::disableWatchDogTimer()
5887f760b36SSagar Srinivas {
5897f760b36SSagar Srinivas setEventReceiverCnt = 0;
5907f760b36SSagar Srinivas pldm::utils::DBusMapping dbusMapping{"/xyz/openbmc_project/watchdog/host0",
5917f760b36SSagar Srinivas "xyz.openbmc_project.State.Watchdog",
5927f760b36SSagar Srinivas "Enabled", "bool"};
5937f760b36SSagar Srinivas bool wdStatus = watchDogRunning();
5947f760b36SSagar Srinivas
5957f760b36SSagar Srinivas if (!wdStatus)
5967f760b36SSagar Srinivas {
5977f760b36SSagar Srinivas return;
5987f760b36SSagar Srinivas }
5997f760b36SSagar Srinivas try
6007f760b36SSagar Srinivas {
6017f760b36SSagar Srinivas pldm::utils::DBusHandler().setDbusProperty(dbusMapping, false);
6027f760b36SSagar Srinivas }
6037f760b36SSagar Srinivas catch (const std::exception& e)
6047f760b36SSagar Srinivas {
605fc84f634SRiya Dixit error("Failed to disable watchdog timer, error - {ERROR}", "ERROR", e);
6067f760b36SSagar Srinivas }
6077f760b36SSagar Srinivas }
checkBMCState()60899854a70SPavithra Barithaya int pldm::responder::oem_ibm_platform::Handler::checkBMCState()
60999854a70SPavithra Barithaya {
6107b4d59aaSPavithra Barithaya using BMC = sdbusplus::client::xyz::openbmc_project::state::BMC<>;
6117b4d59aaSPavithra Barithaya auto bmcPath = sdbusplus::message::object_path(BMC::namespace_path::value) /
6127b4d59aaSPavithra Barithaya BMC::namespace_path::bmc;
61399854a70SPavithra Barithaya try
61499854a70SPavithra Barithaya {
61599854a70SPavithra Barithaya pldm::utils::PropertyValue propertyValue =
61699854a70SPavithra Barithaya pldm::utils::DBusHandler().getDbusPropertyVariant(
6177b4d59aaSPavithra Barithaya bmcPath.str.c_str(), "CurrentBMCState", BMC::interface);
61899854a70SPavithra Barithaya
61999854a70SPavithra Barithaya if (std::get<std::string>(propertyValue) ==
62099854a70SPavithra Barithaya "xyz.openbmc_project.State.BMC.BMCState.NotReady")
62199854a70SPavithra Barithaya {
62249cfb138SRiya Dixit error("GetPDR : PLDM stack is not ready for PDR exchange");
62399854a70SPavithra Barithaya return PLDM_ERROR_NOT_READY;
62499854a70SPavithra Barithaya }
62599854a70SPavithra Barithaya }
62699854a70SPavithra Barithaya catch (const std::exception& e)
62799854a70SPavithra Barithaya {
628fc84f634SRiya Dixit error("Error getting the current BMC state, error - {ERROR}", "ERROR",
629fc84f634SRiya Dixit e);
63099854a70SPavithra Barithaya return PLDM_ERROR;
63199854a70SPavithra Barithaya }
63299854a70SPavithra Barithaya return PLDM_SUCCESS;
63399854a70SPavithra Barithaya }
63499854a70SPavithra Barithaya
6353687e2b6SSagar Srinivas const pldm_pdr_record*
fetchLastBMCRecord(const pldm_pdr * repo)6363687e2b6SSagar Srinivas pldm::responder::oem_ibm_platform::Handler::fetchLastBMCRecord(
6373687e2b6SSagar Srinivas const pldm_pdr* repo)
6383687e2b6SSagar Srinivas {
6393687e2b6SSagar Srinivas return pldm_pdr_find_last_in_range(repo, BMC_PDR_START_RANGE,
6403687e2b6SSagar Srinivas BMC_PDR_END_RANGE);
6413687e2b6SSagar Srinivas }
6423687e2b6SSagar Srinivas
checkRecordHandleInRange(const uint32_t & record_handle)6433687e2b6SSagar Srinivas bool pldm::responder::oem_ibm_platform::Handler::checkRecordHandleInRange(
6443687e2b6SSagar Srinivas const uint32_t& record_handle)
6453687e2b6SSagar Srinivas {
6463687e2b6SSagar Srinivas return record_handle >= HOST_PDR_START_RANGE &&
6473687e2b6SSagar Srinivas record_handle <= HOST_PDR_END_RANGE;
6483687e2b6SSagar Srinivas }
6493687e2b6SSagar Srinivas
processSetEventReceiver()65090314a3fSSagar Srinivas void Handler::processSetEventReceiver()
65190314a3fSSagar Srinivas {
65290314a3fSSagar Srinivas this->setEventReceiver();
65390314a3fSSagar Srinivas }
65490314a3fSSagar Srinivas
startStopTimer(bool value)65518145f7dSSagar Srinivas void pldm::responder::oem_ibm_platform::Handler::startStopTimer(bool value)
65618145f7dSSagar Srinivas {
65718145f7dSSagar Srinivas if (value)
65818145f7dSSagar Srinivas {
65918145f7dSSagar Srinivas timer.restart(
66018145f7dSSagar Srinivas std::chrono::seconds(HEARTBEAT_TIMEOUT + HEARTBEAT_TIMEOUT_DELTA));
66118145f7dSSagar Srinivas }
66218145f7dSSagar Srinivas else
66318145f7dSSagar Srinivas {
66418145f7dSSagar Srinivas timer.setEnabled(value);
66518145f7dSSagar Srinivas }
66618145f7dSSagar Srinivas }
66718145f7dSSagar Srinivas
setSurvTimer(uint8_t tid,bool value)66818145f7dSSagar Srinivas void pldm::responder::oem_ibm_platform::Handler::setSurvTimer(uint8_t tid,
66918145f7dSSagar Srinivas bool value)
67018145f7dSSagar Srinivas {
67118145f7dSSagar Srinivas if ((hostOff || hostTransitioningToOff || (tid != HYPERVISOR_TID)) &&
67218145f7dSSagar Srinivas timer.isEnabled())
67318145f7dSSagar Srinivas {
67418145f7dSSagar Srinivas startStopTimer(false);
67518145f7dSSagar Srinivas return;
67618145f7dSSagar Srinivas }
67718145f7dSSagar Srinivas if (value)
67818145f7dSSagar Srinivas {
67918145f7dSSagar Srinivas startStopTimer(value);
68018145f7dSSagar Srinivas }
68118145f7dSSagar Srinivas else if (timer.isEnabled())
68218145f7dSSagar Srinivas {
68318145f7dSSagar Srinivas info(
68418145f7dSSagar Srinivas "Failed to stop surveillance timer while remote terminus status is ‘{HOST_TRANST_OFF}’ with Terminus ID ‘{TID}’ ",
68518145f7dSSagar Srinivas "HOST_TRANST_OFF", hostTransitioningToOff, "TID", tid);
68618145f7dSSagar Srinivas startStopTimer(value);
68718145f7dSSagar Srinivas pldm::utils::reportError(
68818145f7dSSagar Srinivas "xyz.openbmc_project.PLDM.Error.setSurvTimer.RecvSurveillancePingFail");
68918145f7dSSagar Srinivas }
69018145f7dSSagar Srinivas }
69118145f7dSSagar Srinivas
692aea5dde1SSampa Misra } // namespace oem_ibm_platform
693aea5dde1SSampa Misra } // namespace responder
694aea5dde1SSampa Misra } // namespace pldm
695