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