1557dfb00SDeepak Kodihalli #include "platform.hpp" 2557dfb00SDeepak Kodihalli 3aea5dde1SSampa Misra #include "libpldm/entity.h" 4aea5dde1SSampa Misra #include "libpldm/state_set.h" 5aea5dde1SSampa Misra 6b70a1964STom Joseph #include "common/types.hpp" 7d130e1a3SDeepak Kodihalli #include "common/utils.hpp" 8c4959c3cSTom Joseph #include "event_parser.hpp" 912afe110SSampa Misra #include "pdr.hpp" 10456c9a2fSGeorge Liu #include "pdr_numeric_effecter.hpp" 11a2870726SGeorge Liu #include "pdr_state_effecter.hpp" 12adbe1726SGeorge Liu #include "pdr_state_sensor.hpp" 13362c18ddSGeorge Liu #include "pdr_utils.hpp" 14eccb0c56SGeorge Liu #include "platform_numeric_effecter.hpp" 150d7aca8cSGeorge Liu #include "platform_state_effecter.hpp" 16362c18ddSGeorge Liu #include "platform_state_sensor.hpp" 1783409573SGeorge Liu 18cc5f1586SManojkiran Eda #include <config.h> 19cc5f1586SManojkiran Eda 205079ac4aSBrad Bishop using namespace pldm::utils; 215079ac4aSBrad Bishop using namespace pldm::responder::pdr; 225079ac4aSBrad Bishop using namespace pldm::responder::pdr_utils; 235079ac4aSBrad Bishop 24557dfb00SDeepak Kodihalli namespace pldm 25557dfb00SDeepak Kodihalli { 26557dfb00SDeepak Kodihalli namespace responder 27557dfb00SDeepak Kodihalli { 28a2fa0709SSampa Misra namespace platform 29a2fa0709SSampa Misra { 30a2fa0709SSampa Misra 31c682fe2dSDeepak Kodihalli using InternalFailure = 32c682fe2dSDeepak Kodihalli sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 33c682fe2dSDeepak Kodihalli 341ec85d4bSGeorge Liu static const Json empty{}; 351ec85d4bSGeorge Liu 36a2870726SGeorge Liu void Handler::addDbusObjMaps( 37adbe1726SGeorge Liu uint16_t id, 38adbe1726SGeorge Liu std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps> dbusObj, 39adbe1726SGeorge Liu TypeId typeId) 401ec85d4bSGeorge Liu { 41adbe1726SGeorge Liu if (typeId == TypeId::PLDM_SENSOR_ID) 42adbe1726SGeorge Liu { 43adbe1726SGeorge Liu sensorDbusObjMaps.emplace(id, dbusObj); 44adbe1726SGeorge Liu } 45adbe1726SGeorge Liu else 46adbe1726SGeorge Liu { 47adbe1726SGeorge Liu effecterDbusObjMaps.emplace(id, dbusObj); 48adbe1726SGeorge Liu } 491ec85d4bSGeorge Liu } 501ec85d4bSGeorge Liu 51a2870726SGeorge Liu const std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>& 52adbe1726SGeorge Liu Handler::getDbusObjMaps(uint16_t id, TypeId typeId) const 531ec85d4bSGeorge Liu { 54adbe1726SGeorge Liu if (typeId == TypeId::PLDM_SENSOR_ID) 55adbe1726SGeorge Liu { 56adbe1726SGeorge Liu return sensorDbusObjMaps.at(id); 57adbe1726SGeorge Liu } 58adbe1726SGeorge Liu else 59adbe1726SGeorge Liu { 60adbe1726SGeorge Liu return effecterDbusObjMaps.at(id); 61adbe1726SGeorge Liu } 621ec85d4bSGeorge Liu } 631ec85d4bSGeorge Liu 6436e81352SGeorge Liu void Handler::generate(const pldm::utils::DBusHandler& dBusIntf, 6536e81352SGeorge Liu const std::string& dir, Repo& repo) 66c682fe2dSDeepak Kodihalli { 67c6e49c4fSDeepak Kodihalli if (!fs::exists(dir)) 68c6e49c4fSDeepak Kodihalli { 69c6e49c4fSDeepak Kodihalli return; 70c6e49c4fSDeepak Kodihalli } 71c6e49c4fSDeepak Kodihalli 72c682fe2dSDeepak Kodihalli // A map of PDR type to a lambda that handles creation of that PDR type. 73c682fe2dSDeepak Kodihalli // The lambda essentially would parse the platform specific PDR JSONs to 74c682fe2dSDeepak Kodihalli // generate the PDR structures. This function iterates through the map to 75c682fe2dSDeepak Kodihalli // invoke all lambdas, so that all PDR types can be created. 76a2870726SGeorge Liu 77a2870726SGeorge Liu const std::map<Type, generatePDR> generateHandlers = { 78a2870726SGeorge Liu {PLDM_STATE_EFFECTER_PDR, 7936e81352SGeorge Liu [this](const DBusHandler& dBusIntf, const auto& json, 8036e81352SGeorge Liu RepoInterface& repo) { 8136e81352SGeorge Liu pdr_state_effecter::generateStateEffecterPDR< 8236e81352SGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this, 83a2870726SGeorge Liu repo); 84456c9a2fSGeorge Liu }}, 85456c9a2fSGeorge Liu {PLDM_NUMERIC_EFFECTER_PDR, 8636e81352SGeorge Liu [this](const DBusHandler& dBusIntf, const auto& json, 8736e81352SGeorge Liu RepoInterface& repo) { 8836e81352SGeorge Liu pdr_numeric_effecter::generateNumericEffecterPDR< 8936e81352SGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this, 9036e81352SGeorge Liu repo); 91adbe1726SGeorge Liu }}, 92adbe1726SGeorge Liu {PLDM_STATE_SENSOR_PDR, [this](const DBusHandler& dBusIntf, 93adbe1726SGeorge Liu const auto& json, RepoInterface& repo) { 94adbe1726SGeorge Liu pdr_state_sensor::generateStateSensorPDR<pldm::utils::DBusHandler, 95adbe1726SGeorge Liu Handler>(dBusIntf, json, 96adbe1726SGeorge Liu *this, repo); 97c682fe2dSDeepak Kodihalli }}}; 98c682fe2dSDeepak Kodihalli 99c682fe2dSDeepak Kodihalli Type pdrType{}; 100c682fe2dSDeepak Kodihalli for (const auto& dirEntry : fs::directory_iterator(dir)) 101c682fe2dSDeepak Kodihalli { 102c682fe2dSDeepak Kodihalli try 103c682fe2dSDeepak Kodihalli { 104c682fe2dSDeepak Kodihalli auto json = readJson(dirEntry.path().string()); 105c682fe2dSDeepak Kodihalli if (!json.empty()) 106c682fe2dSDeepak Kodihalli { 1071ec85d4bSGeorge Liu auto effecterPDRs = json.value("effecterPDRs", empty); 1081ec85d4bSGeorge Liu for (const auto& effecter : effecterPDRs) 1091ec85d4bSGeorge Liu { 1101ec85d4bSGeorge Liu pdrType = effecter.value("pdrType", 0); 11136e81352SGeorge Liu generateHandlers.at(pdrType)(dBusIntf, effecter, repo); 1121ec85d4bSGeorge Liu } 113adbe1726SGeorge Liu 114adbe1726SGeorge Liu auto sensorPDRs = json.value("sensorPDRs", empty); 115adbe1726SGeorge Liu for (const auto& sensor : sensorPDRs) 116adbe1726SGeorge Liu { 117adbe1726SGeorge Liu pdrType = sensor.value("pdrType", 0); 118adbe1726SGeorge Liu generateHandlers.at(pdrType)(dBusIntf, sensor, repo); 119adbe1726SGeorge Liu } 120c682fe2dSDeepak Kodihalli } 121c682fe2dSDeepak Kodihalli } 122c682fe2dSDeepak Kodihalli catch (const InternalFailure& e) 123c682fe2dSDeepak Kodihalli { 124c682fe2dSDeepak Kodihalli std::cerr << "PDR config directory does not exist or empty, TYPE= " 125c682fe2dSDeepak Kodihalli << pdrType << "PATH= " << dirEntry 126c682fe2dSDeepak Kodihalli << " ERROR=" << e.what() << "\n"; 127c682fe2dSDeepak Kodihalli } 128c682fe2dSDeepak Kodihalli catch (const Json::exception& e) 129c682fe2dSDeepak Kodihalli { 130c682fe2dSDeepak Kodihalli std::cerr << "Failed parsing PDR JSON file, TYPE= " << pdrType 131c682fe2dSDeepak Kodihalli << " ERROR=" << e.what() << "\n"; 132c682fe2dSDeepak Kodihalli pldm::utils::reportError( 133c682fe2dSDeepak Kodihalli "xyz.openbmc_project.bmc.pldm.InternalFailure"); 134c682fe2dSDeepak Kodihalli } 135c682fe2dSDeepak Kodihalli catch (const std::exception& e) 136c682fe2dSDeepak Kodihalli { 137c682fe2dSDeepak Kodihalli std::cerr << "Failed parsing PDR JSON file, TYPE= " << pdrType 138c682fe2dSDeepak Kodihalli << " ERROR=" << e.what() << "\n"; 139c682fe2dSDeepak Kodihalli pldm::utils::reportError( 140c682fe2dSDeepak Kodihalli "xyz.openbmc_project.bmc.pldm.InternalFailure"); 141c682fe2dSDeepak Kodihalli } 142c682fe2dSDeepak Kodihalli } 143c682fe2dSDeepak Kodihalli } 144557dfb00SDeepak Kodihalli 145bc669f1bSDeepak Kodihalli Response Handler::getPDR(const pldm_msg* request, size_t payloadLength) 146557dfb00SDeepak Kodihalli { 14799854a70SPavithra Barithaya if (hostPDRHandler) 14899854a70SPavithra Barithaya { 14999854a70SPavithra Barithaya if (hostPDRHandler->isHostUp() && oemPlatformHandler != nullptr) 15099854a70SPavithra Barithaya { 15199854a70SPavithra Barithaya auto rc = oemPlatformHandler->checkBMCState(); 15299854a70SPavithra Barithaya if (rc != PLDM_SUCCESS) 15399854a70SPavithra Barithaya { 15499854a70SPavithra Barithaya return ccOnlyResponse(request, PLDM_ERROR_NOT_READY); 15599854a70SPavithra Barithaya } 15699854a70SPavithra Barithaya } 15799854a70SPavithra Barithaya } 15899854a70SPavithra Barithaya 15999854a70SPavithra Barithaya // Build FRU table if not built, since entity association PDR's 16099854a70SPavithra Barithaya // are built when the FRU table is constructed. 16133e9c7eaSTom Joseph if (fruHandler) 16233e9c7eaSTom Joseph { 16333e9c7eaSTom Joseph fruHandler->buildFRUTable(); 16433e9c7eaSTom Joseph } 16533e9c7eaSTom Joseph 166d680ae03SGeorge Liu if (!pdrCreated) 167d680ae03SGeorge Liu { 168d680ae03SGeorge Liu generateTerminusLocatorPDR(pdrRepo); 169d680ae03SGeorge Liu generate(*dBusIntf, pdrJsonsDir, pdrRepo); 17078a225a2SSagar Srinivas if (oemPlatformHandler != nullptr) 17178a225a2SSagar Srinivas { 17278a225a2SSagar Srinivas oemPlatformHandler->buildOEMPDR(pdrRepo); 17378a225a2SSagar Srinivas } 17478a225a2SSagar Srinivas 175d680ae03SGeorge Liu pdrCreated = true; 1765eed8e55SGeorge Liu 1775eed8e55SGeorge Liu if (dbusToPLDMEventHandler) 1785eed8e55SGeorge Liu { 1795fb37d57SSampa Misra deferredGetPDREvent = std::make_unique<sdeventplus::source::Defer>( 1805fb37d57SSampa Misra event, 1815fb37d57SSampa Misra std::bind(std::mem_fn(&pldm::responder::platform::Handler:: 1825fb37d57SSampa Misra _processPostGetPDRActions), 1835fb37d57SSampa Misra this, std::placeholders::_1)); 1845eed8e55SGeorge Liu } 185d680ae03SGeorge Liu } 186d680ae03SGeorge Liu 187557dfb00SDeepak Kodihalli Response response(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES, 0); 188557dfb00SDeepak Kodihalli 189557dfb00SDeepak Kodihalli if (payloadLength != PLDM_GET_PDR_REQ_BYTES) 190557dfb00SDeepak Kodihalli { 191fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH); 192557dfb00SDeepak Kodihalli } 193557dfb00SDeepak Kodihalli 194557dfb00SDeepak Kodihalli uint32_t recordHandle{}; 195557dfb00SDeepak Kodihalli uint32_t dataTransferHandle{}; 196557dfb00SDeepak Kodihalli uint8_t transferOpFlag{}; 197557dfb00SDeepak Kodihalli uint16_t reqSizeBytes{}; 198557dfb00SDeepak Kodihalli uint16_t recordChangeNum{}; 199557dfb00SDeepak Kodihalli 200fb8611dcSGeorge Liu auto rc = decode_get_pdr_req(request, payloadLength, &recordHandle, 201fb8611dcSGeorge Liu &dataTransferHandle, &transferOpFlag, 202fb8611dcSGeorge Liu &reqSizeBytes, &recordChangeNum); 203fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 204fb8611dcSGeorge Liu { 205fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc); 206fb8611dcSGeorge Liu } 207557dfb00SDeepak Kodihalli 208557dfb00SDeepak Kodihalli uint16_t respSizeBytes{}; 209557dfb00SDeepak Kodihalli uint8_t* recordData = nullptr; 210557dfb00SDeepak Kodihalli try 211557dfb00SDeepak Kodihalli { 212e53193faSGeorge Liu pdr_utils::PdrEntry e; 213e53193faSGeorge Liu auto record = pdr::getRecordByHandle(pdrRepo, recordHandle, e); 214e53193faSGeorge Liu if (record == NULL) 215e53193faSGeorge Liu { 216e53193faSGeorge Liu return CmdHandler::ccOnlyResponse( 217e53193faSGeorge Liu request, PLDM_PLATFORM_INVALID_RECORD_HANDLE); 218e53193faSGeorge Liu } 219e53193faSGeorge Liu 220557dfb00SDeepak Kodihalli if (reqSizeBytes) 221557dfb00SDeepak Kodihalli { 222e53193faSGeorge Liu respSizeBytes = e.size; 223557dfb00SDeepak Kodihalli if (respSizeBytes > reqSizeBytes) 224557dfb00SDeepak Kodihalli { 225557dfb00SDeepak Kodihalli respSizeBytes = reqSizeBytes; 226557dfb00SDeepak Kodihalli } 227e53193faSGeorge Liu recordData = e.data; 228557dfb00SDeepak Kodihalli } 229557dfb00SDeepak Kodihalli response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES + 230557dfb00SDeepak Kodihalli respSizeBytes, 231557dfb00SDeepak Kodihalli 0); 232*31a78447SManojkiran Eda auto responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 23322b5a7d7SDeepak Kodihalli rc = encode_get_pdr_resp( 23422b5a7d7SDeepak Kodihalli request->hdr.instance_id, PLDM_SUCCESS, e.handle.nextRecordHandle, 23522b5a7d7SDeepak Kodihalli 0, PLDM_START_AND_END, respSizeBytes, recordData, 0, responsePtr); 236fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 237fb8611dcSGeorge Liu { 238fb8611dcSGeorge Liu return ccOnlyResponse(request, rc); 239fb8611dcSGeorge Liu } 240557dfb00SDeepak Kodihalli } 241557dfb00SDeepak Kodihalli catch (const std::exception& e) 242557dfb00SDeepak Kodihalli { 243aa8ae72fSSampa Misra std::cerr << "Error accessing PDR, HANDLE=" << recordHandle 244aa8ae72fSSampa Misra << " ERROR=" << e.what() << "\n"; 245fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR); 246557dfb00SDeepak Kodihalli } 247557dfb00SDeepak Kodihalli return response; 248557dfb00SDeepak Kodihalli } 249557dfb00SDeepak Kodihalli 250bc669f1bSDeepak Kodihalli Response Handler::setStateEffecterStates(const pldm_msg* request, 251bc669f1bSDeepak Kodihalli size_t payloadLength) 252a2fa0709SSampa Misra { 253a2fa0709SSampa Misra Response response( 254a2fa0709SSampa Misra sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES, 0); 255a2fa0709SSampa Misra auto responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 256a2fa0709SSampa Misra uint16_t effecterId; 257a2fa0709SSampa Misra uint8_t compEffecterCnt; 258a2fa0709SSampa Misra constexpr auto maxCompositeEffecterCnt = 8; 259a2fa0709SSampa Misra std::vector<set_effecter_state_field> stateField(maxCompositeEffecterCnt, 260a2fa0709SSampa Misra {0, 0}); 261a2fa0709SSampa Misra 262a2fa0709SSampa Misra if ((payloadLength > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) || 263a2fa0709SSampa Misra (payloadLength < sizeof(effecterId) + sizeof(compEffecterCnt) + 264a2fa0709SSampa Misra sizeof(set_effecter_state_field))) 265a2fa0709SSampa Misra { 266fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH); 267a2fa0709SSampa Misra } 268a2fa0709SSampa Misra 269a2fa0709SSampa Misra int rc = decode_set_state_effecter_states_req(request, payloadLength, 270a2fa0709SSampa Misra &effecterId, &compEffecterCnt, 271a2fa0709SSampa Misra stateField.data()); 272a2fa0709SSampa Misra 273fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 274a2fa0709SSampa Misra { 275fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc); 276fb8611dcSGeorge Liu } 27783409573SGeorge Liu 278fb8611dcSGeorge Liu stateField.resize(compEffecterCnt); 27983409573SGeorge Liu const pldm::utils::DBusHandler dBusIntf; 280aea5dde1SSampa Misra uint16_t entityType{}; 281aea5dde1SSampa Misra uint16_t entityInstance{}; 282aea5dde1SSampa Misra uint16_t stateSetId{}; 283aea5dde1SSampa Misra 284aea5dde1SSampa Misra if (isOemStateEffecter(*this, effecterId, compEffecterCnt, entityType, 285aea5dde1SSampa Misra entityInstance, stateSetId) && 286aea5dde1SSampa Misra oemPlatformHandler != nullptr) 287aea5dde1SSampa Misra { 2883a0e3b9bSSampa Misra rc = oemPlatformHandler->oemSetStateEffecterStatesHandler( 2893fbd39ebSVarsha Kaverappa entityType, entityInstance, stateSetId, compEffecterCnt, stateField, 2903fbd39ebSVarsha Kaverappa effecterId); 291aea5dde1SSampa Misra } 292aea5dde1SSampa Misra else 293aea5dde1SSampa Misra { 2940d7aca8cSGeorge Liu rc = platform_state_effecter::setStateEffecterStatesHandler< 2950d7aca8cSGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId, 2960d7aca8cSGeorge Liu stateField); 297aea5dde1SSampa Misra } 298fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 299fb8611dcSGeorge Liu { 300fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc); 301a2fa0709SSampa Misra } 302a2fa0709SSampa Misra 303fb8611dcSGeorge Liu rc = encode_set_state_effecter_states_resp(request->hdr.instance_id, rc, 304a2fa0709SSampa Misra responsePtr); 305fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 306fb8611dcSGeorge Liu { 307fb8611dcSGeorge Liu return ccOnlyResponse(request, rc); 308fb8611dcSGeorge Liu } 309fb8611dcSGeorge Liu 310a2fa0709SSampa Misra return response; 311a2fa0709SSampa Misra } 312a2fa0709SSampa Misra 31356e45c58STom Joseph Response Handler::platformEventMessage(const pldm_msg* request, 31456e45c58STom Joseph size_t payloadLength) 31556e45c58STom Joseph { 31656e45c58STom Joseph uint8_t formatVersion{}; 31756e45c58STom Joseph uint8_t tid{}; 31856e45c58STom Joseph uint8_t eventClass{}; 31956e45c58STom Joseph size_t offset{}; 32056e45c58STom Joseph 32156e45c58STom Joseph auto rc = decode_platform_event_message_req( 32256e45c58STom Joseph request, payloadLength, &formatVersion, &tid, &eventClass, &offset); 32356e45c58STom Joseph if (rc != PLDM_SUCCESS) 32456e45c58STom Joseph { 32556e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, rc); 32656e45c58STom Joseph } 32756e45c58STom Joseph 328a6a8ccd9SSagar Srinivas if (eventClass == PLDM_HEARTBEAT_TIMER_ELAPSED_EVENT) 329a6a8ccd9SSagar Srinivas { 330a6a8ccd9SSagar Srinivas rc = PLDM_SUCCESS; 33179669c94SSagar Srinivas if (oemPlatformHandler) 33279669c94SSagar Srinivas { 33379669c94SSagar Srinivas oemPlatformHandler->resetWatchDogTimer(); 33479669c94SSagar Srinivas } 335a6a8ccd9SSagar Srinivas } 336a6a8ccd9SSagar Srinivas else 337a6a8ccd9SSagar Srinivas { 33856e45c58STom Joseph try 33956e45c58STom Joseph { 34056e45c58STom Joseph const auto& handlers = eventHandlers.at(eventClass); 34156e45c58STom Joseph for (const auto& handler : handlers) 34256e45c58STom Joseph { 34356e45c58STom Joseph auto rc = 34456e45c58STom Joseph handler(request, payloadLength, formatVersion, tid, offset); 34556e45c58STom Joseph if (rc != PLDM_SUCCESS) 34656e45c58STom Joseph { 34756e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, rc); 34856e45c58STom Joseph } 34956e45c58STom Joseph } 35056e45c58STom Joseph } 35156e45c58STom Joseph catch (const std::out_of_range& e) 35256e45c58STom Joseph { 35356e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_DATA); 35456e45c58STom Joseph } 355a6a8ccd9SSagar Srinivas } 35656e45c58STom Joseph Response response( 35756e45c58STom Joseph sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES, 0); 35856e45c58STom Joseph auto responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 35956e45c58STom Joseph 36056e45c58STom Joseph rc = encode_platform_event_message_resp(request->hdr.instance_id, rc, 36156e45c58STom Joseph PLDM_EVENT_NO_LOGGING, responsePtr); 36256e45c58STom Joseph if (rc != PLDM_SUCCESS) 36356e45c58STom Joseph { 36456e45c58STom Joseph return ccOnlyResponse(request, rc); 36556e45c58STom Joseph } 36656e45c58STom Joseph 36756e45c58STom Joseph return response; 36856e45c58STom Joseph } 36956e45c58STom Joseph 37056e45c58STom Joseph int Handler::sensorEvent(const pldm_msg* request, size_t payloadLength, 371c4959c3cSTom Joseph uint8_t /*formatVersion*/, uint8_t tid, 37256e45c58STom Joseph size_t eventDataOffset) 37356e45c58STom Joseph { 37456e45c58STom Joseph uint16_t sensorId{}; 37556e45c58STom Joseph uint8_t eventClass{}; 37656e45c58STom Joseph size_t eventClassDataOffset{}; 37756e45c58STom Joseph auto eventData = 37856e45c58STom Joseph reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset; 37956e45c58STom Joseph auto eventDataSize = payloadLength - eventDataOffset; 38056e45c58STom Joseph 38156e45c58STom Joseph auto rc = decode_sensor_event_data(eventData, eventDataSize, &sensorId, 38256e45c58STom Joseph &eventClass, &eventClassDataOffset); 38356e45c58STom Joseph if (rc != PLDM_SUCCESS) 38456e45c58STom Joseph { 38556e45c58STom Joseph return rc; 38656e45c58STom Joseph } 38756e45c58STom Joseph 38875330f36SZahed Hossain auto eventClassData = reinterpret_cast<const uint8_t*>(request->payload) + 38975330f36SZahed Hossain eventDataOffset + eventClassDataOffset; 39075330f36SZahed Hossain auto eventClassDataSize = 39175330f36SZahed Hossain payloadLength - eventDataOffset - eventClassDataOffset; 39275330f36SZahed Hossain 39356e45c58STom Joseph if (eventClass == PLDM_STATE_SENSOR_STATE) 39456e45c58STom Joseph { 39556e45c58STom Joseph uint8_t sensorOffset{}; 39656e45c58STom Joseph uint8_t eventState{}; 39756e45c58STom Joseph uint8_t previousEventState{}; 39856e45c58STom Joseph 39975330f36SZahed Hossain rc = decode_state_sensor_data(eventClassData, eventClassDataSize, 40056e45c58STom Joseph &sensorOffset, &eventState, 40156e45c58STom Joseph &previousEventState); 40275330f36SZahed Hossain if (rc != PLDM_SUCCESS) 40375330f36SZahed Hossain { 40475330f36SZahed Hossain return PLDM_ERROR; 40575330f36SZahed Hossain } 40675330f36SZahed Hossain 407fe4d88bbSChicago Duan // Emitting state sensor event signal 408fe4d88bbSChicago Duan emitStateSensorEventSignal(tid, sensorId, sensorOffset, eventState, 409fe4d88bbSChicago Duan previousEventState); 410fe4d88bbSChicago Duan 411c4959c3cSTom Joseph // If there are no HOST PDR's, there is no further action 412c4959c3cSTom Joseph if (hostPDRHandler == NULL) 413c4959c3cSTom Joseph { 414c4959c3cSTom Joseph return PLDM_SUCCESS; 415c4959c3cSTom Joseph } 416c4959c3cSTom Joseph 417c4959c3cSTom Joseph // Handle PLDM events for which PDR is available 418c4959c3cSTom Joseph SensorEntry sensorEntry{tid, sensorId}; 419b70a1964STom Joseph 420b70a1964STom Joseph pldm::pdr::EntityInfo entityInfo{}; 421b70a1964STom Joseph pldm::pdr::CompositeSensorStates compositeSensorStates{}; 422b70a1964STom Joseph 423c4959c3cSTom Joseph try 424c4959c3cSTom Joseph { 425b70a1964STom Joseph std::tie(entityInfo, compositeSensorStates) = 426c4959c3cSTom Joseph hostPDRHandler->lookupSensorInfo(sensorEntry); 427b70a1964STom Joseph } 428b70a1964STom Joseph catch (const std::out_of_range& e) 429b70a1964STom Joseph { 430b70a1964STom Joseph // If there is no mapping for tid, sensorId combination, try 431b70a1964STom Joseph // PLDM_TID_RESERVED, sensorId for terminus that is yet to 432b70a1964STom Joseph // implement TL PDR. 433b70a1964STom Joseph try 434b70a1964STom Joseph { 435b70a1964STom Joseph sensorEntry.terminusID = PLDM_TID_RESERVED; 436b70a1964STom Joseph std::tie(entityInfo, compositeSensorStates) = 437b70a1964STom Joseph hostPDRHandler->lookupSensorInfo(sensorEntry); 438b70a1964STom Joseph } 439b70a1964STom Joseph // If there is no mapping for events return PLDM_SUCCESS 440b70a1964STom Joseph catch (const std::out_of_range& e) 441b70a1964STom Joseph { 442b70a1964STom Joseph return PLDM_SUCCESS; 443b70a1964STom Joseph } 444b70a1964STom Joseph } 445b70a1964STom Joseph 446c4959c3cSTom Joseph if (sensorOffset >= compositeSensorStates.size()) 447c4959c3cSTom Joseph { 448c4959c3cSTom Joseph return PLDM_ERROR_INVALID_DATA; 449c4959c3cSTom Joseph } 450c4959c3cSTom Joseph 451c4959c3cSTom Joseph const auto& possibleStates = compositeSensorStates[sensorOffset]; 452c4959c3cSTom Joseph if (possibleStates.find(eventState) == possibleStates.end()) 453c4959c3cSTom Joseph { 454c4959c3cSTom Joseph return PLDM_ERROR_INVALID_DATA; 455c4959c3cSTom Joseph } 456c4959c3cSTom Joseph 457c4959c3cSTom Joseph const auto& [containerId, entityType, entityInstance] = entityInfo; 458b70a1964STom Joseph events::StateSensorEntry stateSensorEntry{containerId, entityType, 459b70a1964STom Joseph entityInstance, sensorOffset}; 4603aec997cSPavithra Barithaya return hostPDRHandler->handleStateSensorEvent(stateSensorEntry, 4613aec997cSPavithra Barithaya eventState); 462c4959c3cSTom Joseph } 46356e45c58STom Joseph else 46456e45c58STom Joseph { 46556e45c58STom Joseph return PLDM_ERROR_INVALID_DATA; 46656e45c58STom Joseph } 46756e45c58STom Joseph 46856e45c58STom Joseph return PLDM_SUCCESS; 46956e45c58STom Joseph } 47056e45c58STom Joseph 4718cb6f665SDeepak Kodihalli int Handler::pldmPDRRepositoryChgEvent(const pldm_msg* request, 4728cb6f665SDeepak Kodihalli size_t payloadLength, 4738cb6f665SDeepak Kodihalli uint8_t /*formatVersion*/, 4748cb6f665SDeepak Kodihalli uint8_t /*tid*/, size_t eventDataOffset) 4758cb6f665SDeepak Kodihalli { 4768cb6f665SDeepak Kodihalli uint8_t eventDataFormat{}; 4778cb6f665SDeepak Kodihalli uint8_t numberOfChangeRecords{}; 4788cb6f665SDeepak Kodihalli size_t dataOffset{}; 4798cb6f665SDeepak Kodihalli 4808cb6f665SDeepak Kodihalli auto eventData = 4818cb6f665SDeepak Kodihalli reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset; 4828cb6f665SDeepak Kodihalli auto eventDataSize = payloadLength - eventDataOffset; 4838cb6f665SDeepak Kodihalli 4848cb6f665SDeepak Kodihalli auto rc = decode_pldm_pdr_repository_chg_event_data( 4858cb6f665SDeepak Kodihalli eventData, eventDataSize, &eventDataFormat, &numberOfChangeRecords, 4868cb6f665SDeepak Kodihalli &dataOffset); 4878cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS) 4888cb6f665SDeepak Kodihalli { 4898cb6f665SDeepak Kodihalli return rc; 4908cb6f665SDeepak Kodihalli } 4918cb6f665SDeepak Kodihalli 4928cb6f665SDeepak Kodihalli PDRRecordHandles pdrRecordHandles; 4937246e0cdSDeepak Kodihalli 4947246e0cdSDeepak Kodihalli if (eventDataFormat == FORMAT_IS_PDR_TYPES) 4957246e0cdSDeepak Kodihalli { 4967246e0cdSDeepak Kodihalli return PLDM_ERROR_INVALID_DATA; 4977246e0cdSDeepak Kodihalli } 4987246e0cdSDeepak Kodihalli 4998cb6f665SDeepak Kodihalli if (eventDataFormat == FORMAT_IS_PDR_HANDLES) 5008cb6f665SDeepak Kodihalli { 5018cb6f665SDeepak Kodihalli uint8_t eventDataOperation{}; 5028cb6f665SDeepak Kodihalli uint8_t numberOfChangeEntries{}; 5038cb6f665SDeepak Kodihalli 5048cb6f665SDeepak Kodihalli auto changeRecordData = eventData + dataOffset; 5058cb6f665SDeepak Kodihalli auto changeRecordDataSize = eventDataSize - dataOffset; 5068cb6f665SDeepak Kodihalli 5078cb6f665SDeepak Kodihalli while (changeRecordDataSize) 5088cb6f665SDeepak Kodihalli { 5098cb6f665SDeepak Kodihalli rc = decode_pldm_pdr_repository_change_record_data( 5108cb6f665SDeepak Kodihalli changeRecordData, changeRecordDataSize, &eventDataOperation, 5118cb6f665SDeepak Kodihalli &numberOfChangeEntries, &dataOffset); 5128cb6f665SDeepak Kodihalli 5138cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS) 5148cb6f665SDeepak Kodihalli { 5158cb6f665SDeepak Kodihalli return rc; 5168cb6f665SDeepak Kodihalli } 5178cb6f665SDeepak Kodihalli 5188cb6f665SDeepak Kodihalli if (eventDataOperation == PLDM_RECORDS_ADDED) 5198cb6f665SDeepak Kodihalli { 5208cb6f665SDeepak Kodihalli rc = getPDRRecordHandles( 5218cb6f665SDeepak Kodihalli reinterpret_cast<const ChangeEntry*>(changeRecordData + 5228cb6f665SDeepak Kodihalli dataOffset), 5238cb6f665SDeepak Kodihalli changeRecordDataSize - dataOffset, 5248cb6f665SDeepak Kodihalli static_cast<size_t>(numberOfChangeEntries), 5258cb6f665SDeepak Kodihalli pdrRecordHandles); 5268cb6f665SDeepak Kodihalli 5278cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS) 5288cb6f665SDeepak Kodihalli { 5298cb6f665SDeepak Kodihalli return rc; 5308cb6f665SDeepak Kodihalli } 5318cb6f665SDeepak Kodihalli } 5328cb6f665SDeepak Kodihalli 533841ee3d5SPavithra Barithaya if (eventDataOperation == PLDM_RECORDS_MODIFIED) 534841ee3d5SPavithra Barithaya { 535841ee3d5SPavithra Barithaya return PLDM_ERROR_UNSUPPORTED_PLDM_CMD; 536841ee3d5SPavithra Barithaya } 537841ee3d5SPavithra Barithaya 5388cb6f665SDeepak Kodihalli changeRecordData += 5398cb6f665SDeepak Kodihalli dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry)); 5408cb6f665SDeepak Kodihalli changeRecordDataSize -= 5418cb6f665SDeepak Kodihalli dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry)); 5428cb6f665SDeepak Kodihalli } 5437246e0cdSDeepak Kodihalli } 5447246e0cdSDeepak Kodihalli if (hostPDRHandler) 5458cb6f665SDeepak Kodihalli { 5468cb6f665SDeepak Kodihalli hostPDRHandler->fetchPDR(std::move(pdrRecordHandles)); 5478cb6f665SDeepak Kodihalli } 5488cb6f665SDeepak Kodihalli 5498cb6f665SDeepak Kodihalli return PLDM_SUCCESS; 5508cb6f665SDeepak Kodihalli } 5518cb6f665SDeepak Kodihalli 5528cb6f665SDeepak Kodihalli int Handler::getPDRRecordHandles(const ChangeEntry* changeEntryData, 5538cb6f665SDeepak Kodihalli size_t changeEntryDataSize, 5548cb6f665SDeepak Kodihalli size_t numberOfChangeEntries, 5558cb6f665SDeepak Kodihalli PDRRecordHandles& pdrRecordHandles) 5568cb6f665SDeepak Kodihalli { 5578cb6f665SDeepak Kodihalli if (numberOfChangeEntries > (changeEntryDataSize / sizeof(ChangeEntry))) 5588cb6f665SDeepak Kodihalli { 5598cb6f665SDeepak Kodihalli return PLDM_ERROR_INVALID_DATA; 5608cb6f665SDeepak Kodihalli } 5618cb6f665SDeepak Kodihalli for (size_t i = 0; i < numberOfChangeEntries; i++) 5628cb6f665SDeepak Kodihalli { 5638cb6f665SDeepak Kodihalli pdrRecordHandles.push_back(changeEntryData[i]); 5648cb6f665SDeepak Kodihalli } 5658cb6f665SDeepak Kodihalli return PLDM_SUCCESS; 5668cb6f665SDeepak Kodihalli } 5678cb6f665SDeepak Kodihalli 568eccb0c56SGeorge Liu Response Handler::setNumericEffecterValue(const pldm_msg* request, 569eccb0c56SGeorge Liu size_t payloadLength) 570eccb0c56SGeorge Liu { 571eccb0c56SGeorge Liu Response response(sizeof(pldm_msg_hdr) + 572eccb0c56SGeorge Liu PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES); 573eccb0c56SGeorge Liu uint16_t effecterId{}; 574eccb0c56SGeorge Liu uint8_t effecterDataSize{}; 575eccb0c56SGeorge Liu uint8_t effecterValue[4] = {}; 576eccb0c56SGeorge Liu 577eccb0c56SGeorge Liu if ((payloadLength > sizeof(effecterId) + sizeof(effecterDataSize) + 578eccb0c56SGeorge Liu sizeof(union_effecter_data_size)) || 579eccb0c56SGeorge Liu (payloadLength < sizeof(effecterId) + sizeof(effecterDataSize) + 1)) 580eccb0c56SGeorge Liu { 581eccb0c56SGeorge Liu return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH); 582eccb0c56SGeorge Liu } 583eccb0c56SGeorge Liu 584eccb0c56SGeorge Liu int rc = decode_set_numeric_effecter_value_req( 585eccb0c56SGeorge Liu request, payloadLength, &effecterId, &effecterDataSize, 586eccb0c56SGeorge Liu reinterpret_cast<uint8_t*>(&effecterValue)); 587eccb0c56SGeorge Liu 588eccb0c56SGeorge Liu if (rc == PLDM_SUCCESS) 589eccb0c56SGeorge Liu { 590eccb0c56SGeorge Liu const pldm::utils::DBusHandler dBusIntf; 591eccb0c56SGeorge Liu rc = platform_numeric_effecter::setNumericEffecterValueHandler< 592eccb0c56SGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId, 593eccb0c56SGeorge Liu effecterDataSize, effecterValue, 594eccb0c56SGeorge Liu sizeof(effecterValue)); 595eccb0c56SGeorge Liu } 596eccb0c56SGeorge Liu 597eccb0c56SGeorge Liu return ccOnlyResponse(request, rc); 598eccb0c56SGeorge Liu } 599eccb0c56SGeorge Liu 60012afe110SSampa Misra void Handler::generateTerminusLocatorPDR(Repo& repo) 60112afe110SSampa Misra { 60212afe110SSampa Misra std::vector<uint8_t> pdrBuffer(sizeof(pldm_terminus_locator_pdr)); 60312afe110SSampa Misra 60412afe110SSampa Misra auto pdr = reinterpret_cast<pldm_terminus_locator_pdr*>(pdrBuffer.data()); 60512afe110SSampa Misra 60612afe110SSampa Misra pdr->hdr.record_handle = 0; 60712afe110SSampa Misra pdr->hdr.version = 1; 60812afe110SSampa Misra pdr->hdr.type = PLDM_TERMINUS_LOCATOR_PDR; 60912afe110SSampa Misra pdr->hdr.record_change_num = 0; 61012afe110SSampa Misra pdr->hdr.length = sizeof(pldm_terminus_locator_pdr) - sizeof(pldm_pdr_hdr); 611cc5f1586SManojkiran Eda pdr->terminus_handle = TERMINUS_HANDLE; 61212afe110SSampa Misra pdr->validity = PLDM_TL_PDR_VALID; 613cc5f1586SManojkiran Eda pdr->tid = TERMINUS_ID; 61412afe110SSampa Misra pdr->container_id = 0x0; 61512afe110SSampa Misra pdr->terminus_locator_type = PLDM_TERMINUS_LOCATOR_TYPE_MCTP_EID; 61612afe110SSampa Misra pdr->terminus_locator_value_size = 61712afe110SSampa Misra sizeof(pldm_terminus_locator_type_mctp_eid); 61812afe110SSampa Misra auto locatorValue = reinterpret_cast<pldm_terminus_locator_type_mctp_eid*>( 61912afe110SSampa Misra pdr->terminus_locator_value); 62012afe110SSampa Misra locatorValue->eid = BmcMctpEid; 62112afe110SSampa Misra 62212afe110SSampa Misra PdrEntry pdrEntry{}; 62312afe110SSampa Misra pdrEntry.data = pdrBuffer.data(); 62412afe110SSampa Misra pdrEntry.size = pdrBuffer.size(); 62512afe110SSampa Misra repo.addRecord(pdrEntry); 62612afe110SSampa Misra } 627362c18ddSGeorge Liu 628362c18ddSGeorge Liu Response Handler::getStateSensorReadings(const pldm_msg* request, 629362c18ddSGeorge Liu size_t payloadLength) 630362c18ddSGeorge Liu { 631362c18ddSGeorge Liu uint16_t sensorId{}; 632362c18ddSGeorge Liu bitfield8_t sensorRearm{}; 633362c18ddSGeorge Liu uint8_t reserved{}; 634362c18ddSGeorge Liu 635362c18ddSGeorge Liu if (payloadLength != PLDM_GET_SENSOR_READING_REQ_BYTES) 636362c18ddSGeorge Liu { 637362c18ddSGeorge Liu return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH); 638362c18ddSGeorge Liu } 639362c18ddSGeorge Liu 640362c18ddSGeorge Liu int rc = decode_get_state_sensor_readings_req( 641362c18ddSGeorge Liu request, payloadLength, &sensorId, &sensorRearm, &reserved); 642362c18ddSGeorge Liu 643362c18ddSGeorge Liu if (rc != PLDM_SUCCESS) 644362c18ddSGeorge Liu { 645362c18ddSGeorge Liu return ccOnlyResponse(request, rc); 646362c18ddSGeorge Liu } 647362c18ddSGeorge Liu 648362c18ddSGeorge Liu // 0x01 to 0x08 649c1230ca1SGeorge Liu uint8_t sensorRearmCount = std::popcount(sensorRearm.byte); 650aea5dde1SSampa Misra std::vector<get_sensor_state_field> stateField(sensorRearmCount); 651362c18ddSGeorge Liu uint8_t comSensorCnt{}; 652362c18ddSGeorge Liu const pldm::utils::DBusHandler dBusIntf; 653aea5dde1SSampa Misra 654aea5dde1SSampa Misra uint16_t entityType{}; 655aea5dde1SSampa Misra uint16_t entityInstance{}; 656aea5dde1SSampa Misra uint16_t stateSetId{}; 657aea5dde1SSampa Misra 658aea5dde1SSampa Misra if (isOemStateSensor(*this, sensorId, sensorRearmCount, comSensorCnt, 659aea5dde1SSampa Misra entityType, entityInstance, stateSetId) && 660aea5dde1SSampa Misra oemPlatformHandler != nullptr) 661aea5dde1SSampa Misra { 662aea5dde1SSampa Misra rc = oemPlatformHandler->getOemStateSensorReadingsHandler( 663aea5dde1SSampa Misra entityType, entityInstance, stateSetId, comSensorCnt, stateField); 664aea5dde1SSampa Misra } 665aea5dde1SSampa Misra else 666aea5dde1SSampa Misra { 667362c18ddSGeorge Liu rc = platform_state_sensor::getStateSensorReadingsHandler< 668aea5dde1SSampa Misra pldm::utils::DBusHandler, Handler>(dBusIntf, *this, sensorId, 669aea5dde1SSampa Misra sensorRearmCount, comSensorCnt, 670aea5dde1SSampa Misra stateField); 671aea5dde1SSampa Misra } 672362c18ddSGeorge Liu 673362c18ddSGeorge Liu if (rc != PLDM_SUCCESS) 674362c18ddSGeorge Liu { 675362c18ddSGeorge Liu return ccOnlyResponse(request, rc); 676362c18ddSGeorge Liu } 677362c18ddSGeorge Liu 678362c18ddSGeorge Liu Response response(sizeof(pldm_msg_hdr) + 679362c18ddSGeorge Liu PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES + 680362c18ddSGeorge Liu sizeof(get_sensor_state_field) * comSensorCnt); 681362c18ddSGeorge Liu auto responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 682362c18ddSGeorge Liu rc = encode_get_state_sensor_readings_resp(request->hdr.instance_id, rc, 683362c18ddSGeorge Liu comSensorCnt, stateField.data(), 684362c18ddSGeorge Liu responsePtr); 685362c18ddSGeorge Liu if (rc != PLDM_SUCCESS) 686362c18ddSGeorge Liu { 687362c18ddSGeorge Liu return ccOnlyResponse(request, rc); 688362c18ddSGeorge Liu } 689362c18ddSGeorge Liu 690362c18ddSGeorge Liu return response; 691362c18ddSGeorge Liu } 692362c18ddSGeorge Liu 69399854a70SPavithra Barithaya void Handler::_processPostGetPDRActions(sdeventplus::source::EventBase& 69499854a70SPavithra Barithaya /*source */) 6955fb37d57SSampa Misra { 6965fb37d57SSampa Misra deferredGetPDREvent.reset(); 6975fb37d57SSampa Misra dbusToPLDMEventHandler->listenSensorEvent(pdrRepo, sensorDbusObjMaps); 6985fb37d57SSampa Misra } 6995fb37d57SSampa Misra 700aea5dde1SSampa Misra bool isOemStateSensor(Handler& handler, uint16_t sensorId, 701aea5dde1SSampa Misra uint8_t sensorRearmCount, uint8_t& compSensorCnt, 702aea5dde1SSampa Misra uint16_t& entityType, uint16_t& entityInstance, 703aea5dde1SSampa Misra uint16_t& stateSetId) 704aea5dde1SSampa Misra { 705aea5dde1SSampa Misra pldm_state_sensor_pdr* pdr = nullptr; 706aea5dde1SSampa Misra 707aea5dde1SSampa Misra std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateSensorPdrRepo( 708aea5dde1SSampa Misra pldm_pdr_init(), pldm_pdr_destroy); 709aea5dde1SSampa Misra Repo stateSensorPDRs(stateSensorPdrRepo.get()); 710aea5dde1SSampa Misra getRepoByType(handler.getRepo(), stateSensorPDRs, PLDM_STATE_SENSOR_PDR); 711aea5dde1SSampa Misra if (stateSensorPDRs.empty()) 712aea5dde1SSampa Misra { 713aea5dde1SSampa Misra std::cerr << "Failed to get record by PDR type\n"; 714aea5dde1SSampa Misra return false; 715aea5dde1SSampa Misra } 716aea5dde1SSampa Misra 717aea5dde1SSampa Misra PdrEntry pdrEntry{}; 718aea5dde1SSampa Misra auto pdrRecord = stateSensorPDRs.getFirstRecord(pdrEntry); 719aea5dde1SSampa Misra while (pdrRecord) 720aea5dde1SSampa Misra { 721aea5dde1SSampa Misra pdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdrEntry.data); 722aea5dde1SSampa Misra assert(pdr != NULL); 723aea5dde1SSampa Misra if (pdr->sensor_id != sensorId) 724aea5dde1SSampa Misra { 725aea5dde1SSampa Misra pdr = nullptr; 726aea5dde1SSampa Misra pdrRecord = stateSensorPDRs.getNextRecord(pdrRecord, pdrEntry); 727aea5dde1SSampa Misra continue; 728aea5dde1SSampa Misra } 729aea5dde1SSampa Misra auto tmpEntityType = pdr->entity_type; 730aea5dde1SSampa Misra auto tmpEntityInstance = pdr->entity_instance; 731aea5dde1SSampa Misra auto tmpCompSensorCnt = pdr->composite_sensor_count; 732aea5dde1SSampa Misra auto tmpPossibleStates = 733aea5dde1SSampa Misra reinterpret_cast<state_sensor_possible_states*>( 734aea5dde1SSampa Misra pdr->possible_states); 735aea5dde1SSampa Misra auto tmpStateSetId = tmpPossibleStates->state_set_id; 736aea5dde1SSampa Misra 737aea5dde1SSampa Misra if (sensorRearmCount > tmpCompSensorCnt) 738aea5dde1SSampa Misra { 739aea5dde1SSampa Misra std::cerr << "The requester sent wrong sensorRearm" 740aea5dde1SSampa Misra << " count for the sensor, SENSOR_ID=" << sensorId 741aea5dde1SSampa Misra << "SENSOR_REARM_COUNT=" << (uint16_t)sensorRearmCount 742aea5dde1SSampa Misra << "\n"; 743aea5dde1SSampa Misra break; 744aea5dde1SSampa Misra } 745aea5dde1SSampa Misra 746aea5dde1SSampa Misra if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START && 747aea5dde1SSampa Misra tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) || 748aea5dde1SSampa Misra (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START && 749aea5dde1SSampa Misra tmpStateSetId < PLDM_OEM_STATE_SET_ID_END)) 750aea5dde1SSampa Misra { 751aea5dde1SSampa Misra entityType = tmpEntityType; 752aea5dde1SSampa Misra entityInstance = tmpEntityInstance; 753aea5dde1SSampa Misra stateSetId = tmpStateSetId; 754aea5dde1SSampa Misra compSensorCnt = tmpCompSensorCnt; 755aea5dde1SSampa Misra return true; 756aea5dde1SSampa Misra } 757aea5dde1SSampa Misra else 758aea5dde1SSampa Misra { 759aea5dde1SSampa Misra return false; 760aea5dde1SSampa Misra } 761aea5dde1SSampa Misra } 762aea5dde1SSampa Misra return false; 763aea5dde1SSampa Misra } 764aea5dde1SSampa Misra 765aea5dde1SSampa Misra bool isOemStateEffecter(Handler& handler, uint16_t effecterId, 766aea5dde1SSampa Misra uint8_t compEffecterCnt, uint16_t& entityType, 767aea5dde1SSampa Misra uint16_t& entityInstance, uint16_t& stateSetId) 768aea5dde1SSampa Misra { 769aea5dde1SSampa Misra pldm_state_effecter_pdr* pdr = nullptr; 770aea5dde1SSampa Misra 771aea5dde1SSampa Misra std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateEffecterPdrRepo( 772aea5dde1SSampa Misra pldm_pdr_init(), pldm_pdr_destroy); 773aea5dde1SSampa Misra Repo stateEffecterPDRs(stateEffecterPdrRepo.get()); 774aea5dde1SSampa Misra getRepoByType(handler.getRepo(), stateEffecterPDRs, 775aea5dde1SSampa Misra PLDM_STATE_EFFECTER_PDR); 776aea5dde1SSampa Misra if (stateEffecterPDRs.empty()) 777aea5dde1SSampa Misra { 778aea5dde1SSampa Misra std::cerr << "Failed to get record by PDR type\n"; 779aea5dde1SSampa Misra return false; 780aea5dde1SSampa Misra } 781aea5dde1SSampa Misra 782aea5dde1SSampa Misra PdrEntry pdrEntry{}; 783aea5dde1SSampa Misra auto pdrRecord = stateEffecterPDRs.getFirstRecord(pdrEntry); 784aea5dde1SSampa Misra while (pdrRecord) 785aea5dde1SSampa Misra { 786aea5dde1SSampa Misra pdr = reinterpret_cast<pldm_state_effecter_pdr*>(pdrEntry.data); 787aea5dde1SSampa Misra assert(pdr != NULL); 788aea5dde1SSampa Misra if (pdr->effecter_id != effecterId) 789aea5dde1SSampa Misra { 790aea5dde1SSampa Misra pdr = nullptr; 791aea5dde1SSampa Misra pdrRecord = stateEffecterPDRs.getNextRecord(pdrRecord, pdrEntry); 792aea5dde1SSampa Misra continue; 793aea5dde1SSampa Misra } 794aea5dde1SSampa Misra 795aea5dde1SSampa Misra auto tmpEntityType = pdr->entity_type; 796aea5dde1SSampa Misra auto tmpEntityInstance = pdr->entity_instance; 797aea5dde1SSampa Misra auto tmpPossibleStates = 798aea5dde1SSampa Misra reinterpret_cast<state_effecter_possible_states*>( 799aea5dde1SSampa Misra pdr->possible_states); 800aea5dde1SSampa Misra auto tmpStateSetId = tmpPossibleStates->state_set_id; 801aea5dde1SSampa Misra 802aea5dde1SSampa Misra if (compEffecterCnt > pdr->composite_effecter_count) 803aea5dde1SSampa Misra { 804aea5dde1SSampa Misra std::cerr << "The requester sent wrong composite effecter" 805aea5dde1SSampa Misra << " count for the effecter, EFFECTER_ID=" << effecterId 806aea5dde1SSampa Misra << "COMP_EFF_CNT=" << (uint16_t)compEffecterCnt << "\n"; 807aea5dde1SSampa Misra return false; 808aea5dde1SSampa Misra } 809aea5dde1SSampa Misra 810aea5dde1SSampa Misra if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START && 811aea5dde1SSampa Misra tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) || 812aea5dde1SSampa Misra (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START && 813aea5dde1SSampa Misra tmpStateSetId < PLDM_OEM_STATE_SET_ID_END)) 814aea5dde1SSampa Misra { 815aea5dde1SSampa Misra entityType = tmpEntityType; 816aea5dde1SSampa Misra entityInstance = tmpEntityInstance; 817aea5dde1SSampa Misra stateSetId = tmpStateSetId; 818aea5dde1SSampa Misra return true; 819aea5dde1SSampa Misra } 820aea5dde1SSampa Misra else 821aea5dde1SSampa Misra { 822aea5dde1SSampa Misra return false; 823aea5dde1SSampa Misra } 824aea5dde1SSampa Misra } 825aea5dde1SSampa Misra return false; 826aea5dde1SSampa Misra } 827aea5dde1SSampa Misra 828bc669f1bSDeepak Kodihalli } // namespace platform 829557dfb00SDeepak Kodihalli } // namespace responder 830557dfb00SDeepak Kodihalli } // namespace pldm 831