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:: 25aea5dde1SSampa Misra getOemStateSensorReadingsHandler( 26aea5dde1SSampa Misra 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:: 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 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 { 170*fc84f634SRiya 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 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 { 222*fc84f634SRiya 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 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 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 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( 324*fc84f634SRiya Dixit "Failed to decode platform event message response for code update event with response code '{RC}' and completion code '{CC}'", 32549cfb138SRiya Dixit "RC", rc, "CC", static_cast<unsigned>(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 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 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 { 379*fc84f634SRiya Dixit error("Failed to encode state sensor event with response code '{RC}'", 380*fc84f634SRiya 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 { 387*fc84f634SRiya Dixit error( 388*fc84f634SRiya Dixit "Failed to send event to remote terminus with response code '{RC}'", 389*fc84f634SRiya Dixit "RC", rc); 390bb585b28SVarsha Kaverappa } 391bb585b28SVarsha Kaverappa return; 392bb585b28SVarsha Kaverappa } 393bb585b28SVarsha Kaverappa 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 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 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; 44915ce5a18SKamalkumar Patel // Replacing starting from substring to next occurence of char '/' 45015ce5a18SKamalkumar Patel dbusPath.replace(pos1, pos2 + 1, ""); 45115ce5a18SKamalkumar Patel pos1 = dbusPath.find(toFind); 45215ce5a18SKamalkumar Patel } 45315ce5a18SKamalkumar Patel } 45415ce5a18SKamalkumar Patel 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( 470*fc84f634SRiya Dixit "Failure in chassis State transition to Off, unable to set property RequestedPowerTransition, error - {ERROR}", 471*fc84f634SRiya 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( 504*fc84f634SRiya Dixit "Failure in setting one-time restore policy, unable to set property PowerRestorePolicy, error - {ERROR}", 505*fc84f634SRiya 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( 519*fc84f634SRiya Dixit "Failure in BMC state transition to reboot, unable to set property RequestedBMCTransition , error - {ERROR}", 520*fc84f634SRiya Dixit "ERROR", e); 5219a64b4a7SSagar Srinivas } 5229a64b4a7SSagar Srinivas } 5239a64b4a7SSagar Srinivas } 5249a64b4a7SSagar Srinivas }); 5259a64b4a7SSagar Srinivas } 52679669c94SSagar Srinivas 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 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 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 { 582*fc84f634SRiya Dixit error("Failed to reset watchdog timer, error - {ERROR}", "ERROR", e); 58379669c94SSagar Srinivas return; 58479669c94SSagar Srinivas } 58579669c94SSagar Srinivas } 5867f760b36SSagar Srinivas 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 { 605*fc84f634SRiya Dixit error("Failed to disable watchdog timer, error - {ERROR}", "ERROR", e); 6067f760b36SSagar Srinivas } 6077f760b36SSagar Srinivas } 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 { 628*fc84f634SRiya Dixit error("Error getting the current BMC state, error - {ERROR}", "ERROR", 629*fc84f634SRiya Dixit e); 63099854a70SPavithra Barithaya return PLDM_ERROR; 63199854a70SPavithra Barithaya } 63299854a70SPavithra Barithaya return PLDM_SUCCESS; 63399854a70SPavithra Barithaya } 63499854a70SPavithra Barithaya 6353687e2b6SSagar Srinivas const pldm_pdr_record* 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 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 65090314a3fSSagar Srinivas void Handler::processSetEventReceiver() 65190314a3fSSagar Srinivas { 65290314a3fSSagar Srinivas this->setEventReceiver(); 65390314a3fSSagar Srinivas } 65490314a3fSSagar Srinivas 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 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