1557dfb00SDeepak Kodihalli #include "platform.hpp"
2557dfb00SDeepak Kodihalli
3b70a1964STom Joseph #include "common/types.hpp"
4d130e1a3SDeepak Kodihalli #include "common/utils.hpp"
5c4959c3cSTom Joseph #include "event_parser.hpp"
612afe110SSampa Misra #include "pdr.hpp"
7456c9a2fSGeorge Liu #include "pdr_numeric_effecter.hpp"
8a2870726SGeorge Liu #include "pdr_state_effecter.hpp"
9adbe1726SGeorge Liu #include "pdr_state_sensor.hpp"
10362c18ddSGeorge Liu #include "pdr_utils.hpp"
11eccb0c56SGeorge Liu #include "platform_numeric_effecter.hpp"
120d7aca8cSGeorge Liu #include "platform_state_effecter.hpp"
13362c18ddSGeorge Liu #include "platform_state_sensor.hpp"
1490314a3fSSagar Srinivas #include "pldmd/dbus_impl_requester.hpp"
1590314a3fSSagar Srinivas #include "pldmd/handler.hpp"
1690314a3fSSagar Srinivas #include "requester/handler.hpp"
1783409573SGeorge Liu
18c453e164SGeorge Liu #include <libpldm/entity.h>
19c453e164SGeorge Liu #include <libpldm/state_set.h>
20cc5f1586SManojkiran Eda
2149cfb138SRiya Dixit #include <phosphor-logging/lg2.hpp>
2249cfb138SRiya Dixit
2349cfb138SRiya Dixit PHOSPHOR_LOG2_USING;
2449cfb138SRiya Dixit
255079ac4aSBrad Bishop using namespace pldm::utils;
265079ac4aSBrad Bishop using namespace pldm::responder::pdr;
275079ac4aSBrad Bishop using namespace pldm::responder::pdr_utils;
285079ac4aSBrad Bishop
29557dfb00SDeepak Kodihalli namespace pldm
30557dfb00SDeepak Kodihalli {
31557dfb00SDeepak Kodihalli namespace responder
32557dfb00SDeepak Kodihalli {
33a2fa0709SSampa Misra namespace platform
34a2fa0709SSampa Misra {
35c682fe2dSDeepak Kodihalli using InternalFailure =
36c682fe2dSDeepak Kodihalli sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
37c682fe2dSDeepak Kodihalli
381ec85d4bSGeorge Liu static const Json empty{};
391ec85d4bSGeorge Liu
addDbusObjMaps(uint16_t id,std::tuple<pdr_utils::DbusMappings,pdr_utils::DbusValMaps> dbusObj,TypeId typeId)40a2870726SGeorge Liu void Handler::addDbusObjMaps(
41adbe1726SGeorge Liu uint16_t id,
42adbe1726SGeorge Liu std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps> dbusObj,
43adbe1726SGeorge Liu TypeId typeId)
441ec85d4bSGeorge Liu {
45adbe1726SGeorge Liu if (typeId == TypeId::PLDM_SENSOR_ID)
46adbe1726SGeorge Liu {
47adbe1726SGeorge Liu sensorDbusObjMaps.emplace(id, dbusObj);
48adbe1726SGeorge Liu }
49adbe1726SGeorge Liu else
50adbe1726SGeorge Liu {
51adbe1726SGeorge Liu effecterDbusObjMaps.emplace(id, dbusObj);
52adbe1726SGeorge Liu }
531ec85d4bSGeorge Liu }
541ec85d4bSGeorge Liu
55a2870726SGeorge Liu const std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>&
getDbusObjMaps(uint16_t id,TypeId typeId) const56adbe1726SGeorge Liu Handler::getDbusObjMaps(uint16_t id, TypeId typeId) const
571ec85d4bSGeorge Liu {
58adbe1726SGeorge Liu if (typeId == TypeId::PLDM_SENSOR_ID)
59adbe1726SGeorge Liu {
60adbe1726SGeorge Liu return sensorDbusObjMaps.at(id);
61adbe1726SGeorge Liu }
62adbe1726SGeorge Liu else
63adbe1726SGeorge Liu {
64adbe1726SGeorge Liu return effecterDbusObjMaps.at(id);
65adbe1726SGeorge Liu }
661ec85d4bSGeorge Liu }
671ec85d4bSGeorge Liu
generate(const pldm::utils::DBusHandler & dBusIntf,const std::vector<fs::path> & dir,Repo & repo)6836e81352SGeorge Liu void Handler::generate(const pldm::utils::DBusHandler& dBusIntf,
693c50c82aSKamalkumar Patel const std::vector<fs::path>& dir, Repo& repo)
70c682fe2dSDeepak Kodihalli {
713c50c82aSKamalkumar Patel for (const auto& directory : dir)
723c50c82aSKamalkumar Patel {
7389644441SRiya Dixit info("Checking if directory '{DIRECTORY}' exists", "DIRECTORY",
7489644441SRiya Dixit directory);
753c50c82aSKamalkumar Patel if (!fs::exists(directory))
76c6e49c4fSDeepak Kodihalli {
77c6e49c4fSDeepak Kodihalli return;
78c6e49c4fSDeepak Kodihalli }
793c50c82aSKamalkumar Patel }
80c6e49c4fSDeepak Kodihalli
81c682fe2dSDeepak Kodihalli // A map of PDR type to a lambda that handles creation of that PDR type.
82c682fe2dSDeepak Kodihalli // The lambda essentially would parse the platform specific PDR JSONs to
83c682fe2dSDeepak Kodihalli // generate the PDR structures. This function iterates through the map to
84c682fe2dSDeepak Kodihalli // invoke all lambdas, so that all PDR types can be created.
85a2870726SGeorge Liu
86a675662cSPatrick Williams const std::map<Type, generatePDR> generateHandlers = {
87a675662cSPatrick Williams {PLDM_STATE_EFFECTER_PDR,
88a675662cSPatrick Williams [this](const DBusHandler& dBusIntf, const auto& json,
89a675662cSPatrick Williams RepoInterface& repo) {
906da4f91bSPatrick Williams pdr_state_effecter::generateStateEffecterPDR<pldm::utils::DBusHandler,
916da4f91bSPatrick Williams Handler>(dBusIntf, json,
926da4f91bSPatrick Williams *this, repo);
93456c9a2fSGeorge Liu }},
94456c9a2fSGeorge Liu {PLDM_NUMERIC_EFFECTER_PDR,
95a675662cSPatrick Williams [this](const DBusHandler& dBusIntf, const auto& json,
96a675662cSPatrick Williams RepoInterface& repo) {
9736e81352SGeorge Liu pdr_numeric_effecter::generateNumericEffecterPDR<
986da4f91bSPatrick Williams pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this, repo);
99adbe1726SGeorge Liu }},
100adbe1726SGeorge Liu {PLDM_STATE_SENSOR_PDR, [this](const DBusHandler& dBusIntf,
101adbe1726SGeorge Liu const auto& json, RepoInterface& repo) {
102adbe1726SGeorge Liu pdr_state_sensor::generateStateSensorPDR<pldm::utils::DBusHandler,
103a675662cSPatrick Williams Handler>(dBusIntf, json, *this,
104a675662cSPatrick Williams repo);
105c682fe2dSDeepak Kodihalli }}};
106c682fe2dSDeepak Kodihalli
107c682fe2dSDeepak Kodihalli Type pdrType{};
1083c50c82aSKamalkumar Patel for (const auto& directory : dir)
1093c50c82aSKamalkumar Patel {
1103c50c82aSKamalkumar Patel for (const auto& dirEntry : fs::directory_iterator(directory))
111c682fe2dSDeepak Kodihalli {
112c682fe2dSDeepak Kodihalli try
113c682fe2dSDeepak Kodihalli {
1143c50c82aSKamalkumar Patel if (fs::is_regular_file(dirEntry.path().string()))
1153c50c82aSKamalkumar Patel {
116c682fe2dSDeepak Kodihalli auto json = readJson(dirEntry.path().string());
117c682fe2dSDeepak Kodihalli if (!json.empty())
118c682fe2dSDeepak Kodihalli {
1191ec85d4bSGeorge Liu auto effecterPDRs = json.value("effecterPDRs", empty);
1201ec85d4bSGeorge Liu for (const auto& effecter : effecterPDRs)
1211ec85d4bSGeorge Liu {
1221ec85d4bSGeorge Liu pdrType = effecter.value("pdrType", 0);
1233c50c82aSKamalkumar Patel generateHandlers.at(pdrType)(dBusIntf, effecter,
1243c50c82aSKamalkumar Patel repo);
1251ec85d4bSGeorge Liu }
126adbe1726SGeorge Liu
127adbe1726SGeorge Liu auto sensorPDRs = json.value("sensorPDRs", empty);
128adbe1726SGeorge Liu for (const auto& sensor : sensorPDRs)
129adbe1726SGeorge Liu {
130adbe1726SGeorge Liu pdrType = sensor.value("pdrType", 0);
1313c50c82aSKamalkumar Patel generateHandlers.at(pdrType)(dBusIntf, sensor,
1323c50c82aSKamalkumar Patel repo);
1333c50c82aSKamalkumar Patel }
134adbe1726SGeorge Liu }
135c682fe2dSDeepak Kodihalli }
136c682fe2dSDeepak Kodihalli }
137c682fe2dSDeepak Kodihalli catch (const InternalFailure& e)
138c682fe2dSDeepak Kodihalli {
13949cfb138SRiya Dixit error(
14089644441SRiya Dixit "PDR config directory '{PATH}' does not exist or empty for '{TYPE}' pdr, error - {ERROR}",
14189644441SRiya Dixit "PATH", dirEntry.path(), "TYPE", pdrType, "ERROR", e);
142c682fe2dSDeepak Kodihalli }
143c682fe2dSDeepak Kodihalli catch (const Json::exception& e)
144c682fe2dSDeepak Kodihalli {
14589644441SRiya Dixit error(
14689644441SRiya Dixit "Failed to parse PDR JSON file for '{TYPE}' pdr, error - {ERROR}",
1473c50c82aSKamalkumar Patel "TYPE", pdrType, "ERROR", e);
148c682fe2dSDeepak Kodihalli pldm::utils::reportError(
1493c50c82aSKamalkumar Patel "xyz.openbmc_project.PLDM.Error.Generate.PDRJsonFileParseFail");
150c682fe2dSDeepak Kodihalli }
151c682fe2dSDeepak Kodihalli catch (const std::exception& e)
152c682fe2dSDeepak Kodihalli {
15389644441SRiya Dixit error(
15489644441SRiya Dixit "Failed to parse PDR JSON file for '{TYPE}' pdr, error - {ERROR}",
1553c50c82aSKamalkumar Patel "TYPE", pdrType, "ERROR", e);
156c682fe2dSDeepak Kodihalli pldm::utils::reportError(
1573c50c82aSKamalkumar Patel "xyz.openbmc_project.PLDM.Error.Generate.PDRJsonFileParseFail");
1583c50c82aSKamalkumar Patel }
159c682fe2dSDeepak Kodihalli }
160c682fe2dSDeepak Kodihalli }
161c682fe2dSDeepak Kodihalli }
16292fb0b55SManojkiran Eda
getPDR(const pldm_msg * request,size_t payloadLength)163bc669f1bSDeepak Kodihalli Response Handler::getPDR(const pldm_msg* request, size_t payloadLength)
164557dfb00SDeepak Kodihalli {
16599854a70SPavithra Barithaya if (hostPDRHandler)
16699854a70SPavithra Barithaya {
16799854a70SPavithra Barithaya if (hostPDRHandler->isHostUp() && oemPlatformHandler != nullptr)
16899854a70SPavithra Barithaya {
16999854a70SPavithra Barithaya auto rc = oemPlatformHandler->checkBMCState();
17099854a70SPavithra Barithaya if (rc != PLDM_SUCCESS)
17199854a70SPavithra Barithaya {
17299854a70SPavithra Barithaya return ccOnlyResponse(request, PLDM_ERROR_NOT_READY);
17399854a70SPavithra Barithaya }
17499854a70SPavithra Barithaya }
17599854a70SPavithra Barithaya }
17699854a70SPavithra Barithaya
17799854a70SPavithra Barithaya // Build FRU table if not built, since entity association PDR's
17899854a70SPavithra Barithaya // are built when the FRU table is constructed.
17933e9c7eaSTom Joseph if (fruHandler)
18033e9c7eaSTom Joseph {
18133e9c7eaSTom Joseph fruHandler->buildFRUTable();
18233e9c7eaSTom Joseph }
18333e9c7eaSTom Joseph
184d680ae03SGeorge Liu if (!pdrCreated)
185d680ae03SGeorge Liu {
186d680ae03SGeorge Liu generateTerminusLocatorPDR(pdrRepo);
1873c50c82aSKamalkumar Patel if (platformConfigHandler)
1883c50c82aSKamalkumar Patel {
1893c50c82aSKamalkumar Patel auto systemType = platformConfigHandler->getPlatformName();
1903c50c82aSKamalkumar Patel if (systemType.has_value())
1913c50c82aSKamalkumar Patel {
1923c50c82aSKamalkumar Patel // In case of normal poweron , the system type would have been
1933c50c82aSKamalkumar Patel // already filled by entity manager when ever BMC reaches Ready
1943c50c82aSKamalkumar Patel // state. If this is not filled by time we get a getpdr request
1953c50c82aSKamalkumar Patel // we can assume that the entity manager service is not present
1963c50c82aSKamalkumar Patel // on this system & continue to build the common PDR's.
1973c50c82aSKamalkumar Patel pdrJsonsDir.push_back(pdrJsonDir / systemType.value());
1983c50c82aSKamalkumar Patel }
1993c50c82aSKamalkumar Patel }
2003c50c82aSKamalkumar Patel
20178a225a2SSagar Srinivas if (oemPlatformHandler != nullptr)
20278a225a2SSagar Srinivas {
20378a225a2SSagar Srinivas oemPlatformHandler->buildOEMPDR(pdrRepo);
20478a225a2SSagar Srinivas }
2053c50c82aSKamalkumar Patel generate(*dBusIntf, pdrJsonsDir, pdrRepo);
20678a225a2SSagar Srinivas
207d680ae03SGeorge Liu pdrCreated = true;
2085eed8e55SGeorge Liu
2095eed8e55SGeorge Liu if (dbusToPLDMEventHandler)
2105eed8e55SGeorge Liu {
2115fb37d57SSampa Misra deferredGetPDREvent = std::make_unique<sdeventplus::source::Defer>(
2125fb37d57SSampa Misra event,
2135fb37d57SSampa Misra std::bind(std::mem_fn(&pldm::responder::platform::Handler::
2145fb37d57SSampa Misra _processPostGetPDRActions),
2155fb37d57SSampa Misra this, std::placeholders::_1));
2165eed8e55SGeorge Liu }
217d680ae03SGeorge Liu }
218d680ae03SGeorge Liu
219557dfb00SDeepak Kodihalli Response response(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES, 0);
220557dfb00SDeepak Kodihalli
221557dfb00SDeepak Kodihalli if (payloadLength != PLDM_GET_PDR_REQ_BYTES)
222557dfb00SDeepak Kodihalli {
223fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
224557dfb00SDeepak Kodihalli }
225557dfb00SDeepak Kodihalli
226557dfb00SDeepak Kodihalli uint32_t recordHandle{};
227557dfb00SDeepak Kodihalli uint32_t dataTransferHandle{};
228557dfb00SDeepak Kodihalli uint8_t transferOpFlag{};
229557dfb00SDeepak Kodihalli uint16_t reqSizeBytes{};
230557dfb00SDeepak Kodihalli uint16_t recordChangeNum{};
231557dfb00SDeepak Kodihalli
232fb8611dcSGeorge Liu auto rc = decode_get_pdr_req(request, payloadLength, &recordHandle,
233fb8611dcSGeorge Liu &dataTransferHandle, &transferOpFlag,
234fb8611dcSGeorge Liu &reqSizeBytes, &recordChangeNum);
235fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS)
236fb8611dcSGeorge Liu {
237fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc);
238fb8611dcSGeorge Liu }
239557dfb00SDeepak Kodihalli
240557dfb00SDeepak Kodihalli uint16_t respSizeBytes{};
241557dfb00SDeepak Kodihalli uint8_t* recordData = nullptr;
242557dfb00SDeepak Kodihalli try
243557dfb00SDeepak Kodihalli {
244e53193faSGeorge Liu pdr_utils::PdrEntry e;
245e53193faSGeorge Liu auto record = pdr::getRecordByHandle(pdrRepo, recordHandle, e);
246e53193faSGeorge Liu if (record == NULL)
247e53193faSGeorge Liu {
248e53193faSGeorge Liu return CmdHandler::ccOnlyResponse(
249e53193faSGeorge Liu request, PLDM_PLATFORM_INVALID_RECORD_HANDLE);
250e53193faSGeorge Liu }
251e53193faSGeorge Liu
252557dfb00SDeepak Kodihalli if (reqSizeBytes)
253557dfb00SDeepak Kodihalli {
254e53193faSGeorge Liu respSizeBytes = e.size;
255557dfb00SDeepak Kodihalli if (respSizeBytes > reqSizeBytes)
256557dfb00SDeepak Kodihalli {
257557dfb00SDeepak Kodihalli respSizeBytes = reqSizeBytes;
258557dfb00SDeepak Kodihalli }
259e53193faSGeorge Liu recordData = e.data;
260557dfb00SDeepak Kodihalli }
261557dfb00SDeepak Kodihalli response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES +
262557dfb00SDeepak Kodihalli respSizeBytes,
263557dfb00SDeepak Kodihalli 0);
26431a78447SManojkiran Eda auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
26522b5a7d7SDeepak Kodihalli rc = encode_get_pdr_resp(
26622b5a7d7SDeepak Kodihalli request->hdr.instance_id, PLDM_SUCCESS, e.handle.nextRecordHandle,
26722b5a7d7SDeepak Kodihalli 0, PLDM_START_AND_END, respSizeBytes, recordData, 0, responsePtr);
268fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS)
269fb8611dcSGeorge Liu {
270fb8611dcSGeorge Liu return ccOnlyResponse(request, rc);
271fb8611dcSGeorge Liu }
272557dfb00SDeepak Kodihalli }
273557dfb00SDeepak Kodihalli catch (const std::exception& e)
274557dfb00SDeepak Kodihalli {
27589644441SRiya Dixit error(
27689644441SRiya Dixit "Failed to access PDR record handle '{RECORD_HANDLE}', error - {ERROR}",
27789644441SRiya Dixit "RECORD_HANDLE", recordHandle, "ERROR", e);
278fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR);
279557dfb00SDeepak Kodihalli }
280557dfb00SDeepak Kodihalli return response;
281557dfb00SDeepak Kodihalli }
282557dfb00SDeepak Kodihalli
setStateEffecterStates(const pldm_msg * request,size_t payloadLength)283bc669f1bSDeepak Kodihalli Response Handler::setStateEffecterStates(const pldm_msg* request,
284bc669f1bSDeepak Kodihalli size_t payloadLength)
285a2fa0709SSampa Misra {
286a2fa0709SSampa Misra Response response(
287a2fa0709SSampa Misra sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES, 0);
288a2fa0709SSampa Misra auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
289a2fa0709SSampa Misra uint16_t effecterId;
290a2fa0709SSampa Misra uint8_t compEffecterCnt;
291a2fa0709SSampa Misra constexpr auto maxCompositeEffecterCnt = 8;
292a2fa0709SSampa Misra std::vector<set_effecter_state_field> stateField(maxCompositeEffecterCnt,
293a2fa0709SSampa Misra {0, 0});
294a2fa0709SSampa Misra
295a2fa0709SSampa Misra if ((payloadLength > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) ||
296a2fa0709SSampa Misra (payloadLength < sizeof(effecterId) + sizeof(compEffecterCnt) +
297a2fa0709SSampa Misra sizeof(set_effecter_state_field)))
298a2fa0709SSampa Misra {
299fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
300a2fa0709SSampa Misra }
301a2fa0709SSampa Misra
302a2fa0709SSampa Misra int rc = decode_set_state_effecter_states_req(request, payloadLength,
303a2fa0709SSampa Misra &effecterId, &compEffecterCnt,
304a2fa0709SSampa Misra stateField.data());
305a2fa0709SSampa Misra
306fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS)
307a2fa0709SSampa Misra {
308fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc);
309fb8611dcSGeorge Liu }
31083409573SGeorge Liu
311fb8611dcSGeorge Liu stateField.resize(compEffecterCnt);
31283409573SGeorge Liu const pldm::utils::DBusHandler dBusIntf;
313aea5dde1SSampa Misra uint16_t entityType{};
314aea5dde1SSampa Misra uint16_t entityInstance{};
315aea5dde1SSampa Misra uint16_t stateSetId{};
316aea5dde1SSampa Misra
317aea5dde1SSampa Misra if (isOemStateEffecter(*this, effecterId, compEffecterCnt, entityType,
318aea5dde1SSampa Misra entityInstance, stateSetId) &&
319321804e9SManojkiran Eda oemPlatformHandler != nullptr &&
320321804e9SManojkiran Eda !effecterDbusObjMaps.contains(effecterId))
321aea5dde1SSampa Misra {
3223a0e3b9bSSampa Misra rc = oemPlatformHandler->oemSetStateEffecterStatesHandler(
3233fbd39ebSVarsha Kaverappa entityType, entityInstance, stateSetId, compEffecterCnt, stateField,
3243fbd39ebSVarsha Kaverappa effecterId);
325aea5dde1SSampa Misra }
326aea5dde1SSampa Misra else
327aea5dde1SSampa Misra {
3280d7aca8cSGeorge Liu rc = platform_state_effecter::setStateEffecterStatesHandler<
3290d7aca8cSGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
3300d7aca8cSGeorge Liu stateField);
331aea5dde1SSampa Misra }
332fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS)
333fb8611dcSGeorge Liu {
334fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc);
335a2fa0709SSampa Misra }
336a2fa0709SSampa Misra
337fb8611dcSGeorge Liu rc = encode_set_state_effecter_states_resp(request->hdr.instance_id, rc,
338a2fa0709SSampa Misra responsePtr);
339fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS)
340fb8611dcSGeorge Liu {
341fb8611dcSGeorge Liu return ccOnlyResponse(request, rc);
342fb8611dcSGeorge Liu }
343fb8611dcSGeorge Liu
344a2fa0709SSampa Misra return response;
345a2fa0709SSampa Misra }
346a2fa0709SSampa Misra
platformEventMessage(const pldm_msg * request,size_t payloadLength)34756e45c58STom Joseph Response Handler::platformEventMessage(const pldm_msg* request,
34856e45c58STom Joseph size_t payloadLength)
34956e45c58STom Joseph {
35056e45c58STom Joseph uint8_t formatVersion{};
35156e45c58STom Joseph uint8_t tid{};
35256e45c58STom Joseph uint8_t eventClass{};
35356e45c58STom Joseph size_t offset{};
35456e45c58STom Joseph
35556e45c58STom Joseph auto rc = decode_platform_event_message_req(
35656e45c58STom Joseph request, payloadLength, &formatVersion, &tid, &eventClass, &offset);
35756e45c58STom Joseph if (rc != PLDM_SUCCESS)
35856e45c58STom Joseph {
35956e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, rc);
36056e45c58STom Joseph }
36156e45c58STom Joseph
362a6a8ccd9SSagar Srinivas if (eventClass == PLDM_HEARTBEAT_TIMER_ELAPSED_EVENT)
363a6a8ccd9SSagar Srinivas {
364a6a8ccd9SSagar Srinivas rc = PLDM_SUCCESS;
36579669c94SSagar Srinivas if (oemPlatformHandler)
36679669c94SSagar Srinivas {
36718145f7dSSagar Srinivas if (oemPlatformHandler->watchDogRunning())
36818145f7dSSagar Srinivas {
36979669c94SSagar Srinivas oemPlatformHandler->resetWatchDogTimer();
37079669c94SSagar Srinivas }
37118145f7dSSagar Srinivas else
37218145f7dSSagar Srinivas {
37318145f7dSSagar Srinivas oemPlatformHandler->setSurvTimer(tid, true);
37418145f7dSSagar Srinivas }
37518145f7dSSagar Srinivas }
376a6a8ccd9SSagar Srinivas }
377a6a8ccd9SSagar Srinivas else
378a6a8ccd9SSagar Srinivas {
37956e45c58STom Joseph try
38056e45c58STom Joseph {
38156e45c58STom Joseph const auto& handlers = eventHandlers.at(eventClass);
38256e45c58STom Joseph for (const auto& handler : handlers)
38356e45c58STom Joseph {
3846da4f91bSPatrick Williams auto rc = handler(request, payloadLength, formatVersion, tid,
3856da4f91bSPatrick Williams offset);
38656e45c58STom Joseph if (rc != PLDM_SUCCESS)
38756e45c58STom Joseph {
38856e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, rc);
38956e45c58STom Joseph }
39056e45c58STom Joseph }
39156e45c58STom Joseph }
39256e45c58STom Joseph catch (const std::out_of_range& e)
39356e45c58STom Joseph {
39489644441SRiya Dixit error("Failed to handle platform event msg, error - {ERROR}",
39589644441SRiya Dixit "ERROR", e);
39656e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_DATA);
39756e45c58STom Joseph }
398a6a8ccd9SSagar Srinivas }
39956e45c58STom Joseph Response response(
40056e45c58STom Joseph sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES, 0);
40156e45c58STom Joseph auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
40256e45c58STom Joseph
40356e45c58STom Joseph rc = encode_platform_event_message_resp(request->hdr.instance_id, rc,
40456e45c58STom Joseph PLDM_EVENT_NO_LOGGING, responsePtr);
40556e45c58STom Joseph if (rc != PLDM_SUCCESS)
40656e45c58STom Joseph {
40756e45c58STom Joseph return ccOnlyResponse(request, rc);
40856e45c58STom Joseph }
40956e45c58STom Joseph
41056e45c58STom Joseph return response;
41156e45c58STom Joseph }
41256e45c58STom Joseph
sensorEvent(const pldm_msg * request,size_t payloadLength,uint8_t,uint8_t tid,size_t eventDataOffset)41356e45c58STom Joseph int Handler::sensorEvent(const pldm_msg* request, size_t payloadLength,
414c4959c3cSTom Joseph uint8_t /*formatVersion*/, uint8_t tid,
41556e45c58STom Joseph size_t eventDataOffset)
41656e45c58STom Joseph {
41756e45c58STom Joseph uint16_t sensorId{};
41856e45c58STom Joseph uint8_t eventClass{};
41956e45c58STom Joseph size_t eventClassDataOffset{};
4206da4f91bSPatrick Williams auto eventData = reinterpret_cast<const uint8_t*>(request->payload) +
4216da4f91bSPatrick Williams eventDataOffset;
42256e45c58STom Joseph auto eventDataSize = payloadLength - eventDataOffset;
42356e45c58STom Joseph
42456e45c58STom Joseph auto rc = decode_sensor_event_data(eventData, eventDataSize, &sensorId,
42556e45c58STom Joseph &eventClass, &eventClassDataOffset);
42656e45c58STom Joseph if (rc != PLDM_SUCCESS)
42756e45c58STom Joseph {
42856e45c58STom Joseph return rc;
42956e45c58STom Joseph }
43056e45c58STom Joseph
43175330f36SZahed Hossain auto eventClassData = reinterpret_cast<const uint8_t*>(request->payload) +
43275330f36SZahed Hossain eventDataOffset + eventClassDataOffset;
4336da4f91bSPatrick Williams auto eventClassDataSize = payloadLength - eventDataOffset -
4346da4f91bSPatrick Williams eventClassDataOffset;
43575330f36SZahed Hossain
43656e45c58STom Joseph if (eventClass == PLDM_STATE_SENSOR_STATE)
43756e45c58STom Joseph {
43856e45c58STom Joseph uint8_t sensorOffset{};
43956e45c58STom Joseph uint8_t eventState{};
44056e45c58STom Joseph uint8_t previousEventState{};
44156e45c58STom Joseph
44275330f36SZahed Hossain rc = decode_state_sensor_data(eventClassData, eventClassDataSize,
44356e45c58STom Joseph &sensorOffset, &eventState,
44456e45c58STom Joseph &previousEventState);
44575330f36SZahed Hossain if (rc != PLDM_SUCCESS)
44675330f36SZahed Hossain {
44775330f36SZahed Hossain return PLDM_ERROR;
44875330f36SZahed Hossain }
44975330f36SZahed Hossain
450fe4d88bbSChicago Duan // Emitting state sensor event signal
451fe4d88bbSChicago Duan emitStateSensorEventSignal(tid, sensorId, sensorOffset, eventState,
452fe4d88bbSChicago Duan previousEventState);
453fe4d88bbSChicago Duan
454c4959c3cSTom Joseph // If there are no HOST PDR's, there is no further action
455c4959c3cSTom Joseph if (hostPDRHandler == NULL)
456c4959c3cSTom Joseph {
457c4959c3cSTom Joseph return PLDM_SUCCESS;
458c4959c3cSTom Joseph }
459c4959c3cSTom Joseph
460c4959c3cSTom Joseph // Handle PLDM events for which PDR is available
461c4959c3cSTom Joseph SensorEntry sensorEntry{tid, sensorId};
462b70a1964STom Joseph
463b70a1964STom Joseph pldm::pdr::EntityInfo entityInfo{};
464b70a1964STom Joseph pldm::pdr::CompositeSensorStates compositeSensorStates{};
465e3607a3cSSagar Srinivas std::vector<pldm::pdr::StateSetId> stateSetIds{};
466b70a1964STom Joseph
467c4959c3cSTom Joseph try
468c4959c3cSTom Joseph {
469e3607a3cSSagar Srinivas std::tie(entityInfo, compositeSensorStates, stateSetIds) =
470c4959c3cSTom Joseph hostPDRHandler->lookupSensorInfo(sensorEntry);
471b70a1964STom Joseph }
47258cbcaf2SKamalkumar Patel catch (const std::out_of_range&)
473b70a1964STom Joseph {
474b70a1964STom Joseph // If there is no mapping for tid, sensorId combination, try
475b70a1964STom Joseph // PLDM_TID_RESERVED, sensorId for terminus that is yet to
476b70a1964STom Joseph // implement TL PDR.
477b70a1964STom Joseph try
478b70a1964STom Joseph {
479b70a1964STom Joseph sensorEntry.terminusID = PLDM_TID_RESERVED;
480e3607a3cSSagar Srinivas std::tie(entityInfo, compositeSensorStates, stateSetIds) =
481b70a1964STom Joseph hostPDRHandler->lookupSensorInfo(sensorEntry);
482b70a1964STom Joseph }
483b70a1964STom Joseph // If there is no mapping for events return PLDM_SUCCESS
48458cbcaf2SKamalkumar Patel catch (const std::out_of_range&)
485b70a1964STom Joseph {
486b70a1964STom Joseph return PLDM_SUCCESS;
487b70a1964STom Joseph }
488b70a1964STom Joseph }
489b70a1964STom Joseph
490c4959c3cSTom Joseph if (sensorOffset >= compositeSensorStates.size())
491c4959c3cSTom Joseph {
492c4959c3cSTom Joseph return PLDM_ERROR_INVALID_DATA;
493c4959c3cSTom Joseph }
494c4959c3cSTom Joseph
495c4959c3cSTom Joseph const auto& possibleStates = compositeSensorStates[sensorOffset];
49606f9b29eSSagar Srinivas if (!possibleStates.contains(eventState))
497c4959c3cSTom Joseph {
498c4959c3cSTom Joseph return PLDM_ERROR_INVALID_DATA;
499c4959c3cSTom Joseph }
500c4959c3cSTom Joseph
501c4959c3cSTom Joseph const auto& [containerId, entityType, entityInstance] = entityInfo;
502fa084700SManojkiran Eda events::StateSensorEntry stateSensorEntry{containerId,
503fa084700SManojkiran Eda entityType,
504fa084700SManojkiran Eda entityInstance,
505fa084700SManojkiran Eda sensorOffset,
506fa084700SManojkiran Eda stateSetIds[sensorOffset],
507fa084700SManojkiran Eda false};
5083aec997cSPavithra Barithaya return hostPDRHandler->handleStateSensorEvent(stateSensorEntry,
5093aec997cSPavithra Barithaya eventState);
510c4959c3cSTom Joseph }
51156e45c58STom Joseph else
51256e45c58STom Joseph {
51356e45c58STom Joseph return PLDM_ERROR_INVALID_DATA;
51456e45c58STom Joseph }
51556e45c58STom Joseph
51656e45c58STom Joseph return PLDM_SUCCESS;
51756e45c58STom Joseph }
51856e45c58STom Joseph
pldmPDRRepositoryChgEvent(const pldm_msg * request,size_t payloadLength,uint8_t,uint8_t tid,size_t eventDataOffset)5198cb6f665SDeepak Kodihalli int Handler::pldmPDRRepositoryChgEvent(const pldm_msg* request,
5208cb6f665SDeepak Kodihalli size_t payloadLength,
5213ca40453SManojkiran Eda uint8_t /*formatVersion*/, uint8_t tid,
5223ca40453SManojkiran Eda size_t eventDataOffset)
5238cb6f665SDeepak Kodihalli {
5248cb6f665SDeepak Kodihalli uint8_t eventDataFormat{};
5258cb6f665SDeepak Kodihalli uint8_t numberOfChangeRecords{};
5268cb6f665SDeepak Kodihalli size_t dataOffset{};
5278cb6f665SDeepak Kodihalli
5286da4f91bSPatrick Williams auto eventData = reinterpret_cast<const uint8_t*>(request->payload) +
5296da4f91bSPatrick Williams eventDataOffset;
5308cb6f665SDeepak Kodihalli auto eventDataSize = payloadLength - eventDataOffset;
5318cb6f665SDeepak Kodihalli
5328cb6f665SDeepak Kodihalli auto rc = decode_pldm_pdr_repository_chg_event_data(
5338cb6f665SDeepak Kodihalli eventData, eventDataSize, &eventDataFormat, &numberOfChangeRecords,
5348cb6f665SDeepak Kodihalli &dataOffset);
5358cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS)
5368cb6f665SDeepak Kodihalli {
5378cb6f665SDeepak Kodihalli return rc;
5388cb6f665SDeepak Kodihalli }
5398cb6f665SDeepak Kodihalli
5408cb6f665SDeepak Kodihalli PDRRecordHandles pdrRecordHandles;
5417246e0cdSDeepak Kodihalli
5427246e0cdSDeepak Kodihalli if (eventDataFormat == FORMAT_IS_PDR_TYPES)
5437246e0cdSDeepak Kodihalli {
5447246e0cdSDeepak Kodihalli return PLDM_ERROR_INVALID_DATA;
5457246e0cdSDeepak Kodihalli }
5467246e0cdSDeepak Kodihalli
5478cb6f665SDeepak Kodihalli if (eventDataFormat == FORMAT_IS_PDR_HANDLES)
5488cb6f665SDeepak Kodihalli {
5498cb6f665SDeepak Kodihalli uint8_t eventDataOperation{};
5508cb6f665SDeepak Kodihalli uint8_t numberOfChangeEntries{};
5518cb6f665SDeepak Kodihalli
5528cb6f665SDeepak Kodihalli auto changeRecordData = eventData + dataOffset;
5538cb6f665SDeepak Kodihalli auto changeRecordDataSize = eventDataSize - dataOffset;
5548cb6f665SDeepak Kodihalli
5558cb6f665SDeepak Kodihalli while (changeRecordDataSize)
5568cb6f665SDeepak Kodihalli {
5578cb6f665SDeepak Kodihalli rc = decode_pldm_pdr_repository_change_record_data(
5588cb6f665SDeepak Kodihalli changeRecordData, changeRecordDataSize, &eventDataOperation,
5598cb6f665SDeepak Kodihalli &numberOfChangeEntries, &dataOffset);
5608cb6f665SDeepak Kodihalli
5618cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS)
5628cb6f665SDeepak Kodihalli {
5638cb6f665SDeepak Kodihalli return rc;
5648cb6f665SDeepak Kodihalli }
5658cb6f665SDeepak Kodihalli
566ae5c97ebSPavithra Barithaya if (eventDataOperation == PLDM_RECORDS_ADDED ||
567ae5c97ebSPavithra Barithaya eventDataOperation == PLDM_RECORDS_MODIFIED)
5688cb6f665SDeepak Kodihalli {
569ae5c97ebSPavithra Barithaya if (eventDataOperation == PLDM_RECORDS_MODIFIED)
570ae5c97ebSPavithra Barithaya {
571ae5c97ebSPavithra Barithaya hostPDRHandler->isHostPdrModified = true;
572ae5c97ebSPavithra Barithaya }
573ae5c97ebSPavithra Barithaya
5748cb6f665SDeepak Kodihalli rc = getPDRRecordHandles(
5758cb6f665SDeepak Kodihalli reinterpret_cast<const ChangeEntry*>(changeRecordData +
5768cb6f665SDeepak Kodihalli dataOffset),
5778cb6f665SDeepak Kodihalli changeRecordDataSize - dataOffset,
5788cb6f665SDeepak Kodihalli static_cast<size_t>(numberOfChangeEntries),
5798cb6f665SDeepak Kodihalli pdrRecordHandles);
5808cb6f665SDeepak Kodihalli
5818cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS)
5828cb6f665SDeepak Kodihalli {
5838cb6f665SDeepak Kodihalli return rc;
5848cb6f665SDeepak Kodihalli }
5858cb6f665SDeepak Kodihalli }
5868cb6f665SDeepak Kodihalli
5876da4f91bSPatrick Williams changeRecordData += dataOffset +
5886da4f91bSPatrick Williams (numberOfChangeEntries * sizeof(ChangeEntry));
5898cb6f665SDeepak Kodihalli changeRecordDataSize -=
5908cb6f665SDeepak Kodihalli dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry));
5918cb6f665SDeepak Kodihalli }
5927246e0cdSDeepak Kodihalli }
5937246e0cdSDeepak Kodihalli if (hostPDRHandler)
5948cb6f665SDeepak Kodihalli {
5953ca40453SManojkiran Eda // if we get a Repository change event with the eventDataFormat
5963ca40453SManojkiran Eda // as REFRESH_ENTIRE_REPOSITORY, then delete all the PDR's that
5973ca40453SManojkiran Eda // have the matched Terminus handle
5983ca40453SManojkiran Eda if (eventDataFormat == REFRESH_ENTIRE_REPOSITORY)
5993ca40453SManojkiran Eda {
6003ca40453SManojkiran Eda // We cannot get the Repo change event from the Terminus
6013ca40453SManojkiran Eda // that is not already added to the BMC repository
6023ca40453SManojkiran Eda
60352aad393SPavithra Barithaya for (auto it = hostPDRHandler->tlPDRInfo.cbegin();
60452aad393SPavithra Barithaya it != hostPDRHandler->tlPDRInfo.cend();)
6053ca40453SManojkiran Eda {
60652aad393SPavithra Barithaya if (std::get<0>(it->second) == tid)
6073ca40453SManojkiran Eda {
6083ca40453SManojkiran Eda pldm_pdr_remove_pdrs_by_terminus_handle(pdrRepo.getPdr(),
60952aad393SPavithra Barithaya it->first);
61052aad393SPavithra Barithaya hostPDRHandler->tlPDRInfo.erase(it++);
61152aad393SPavithra Barithaya }
61252aad393SPavithra Barithaya else
61352aad393SPavithra Barithaya {
61452aad393SPavithra Barithaya ++it;
6153ca40453SManojkiran Eda }
6163ca40453SManojkiran Eda }
6173ca40453SManojkiran Eda }
6188cb6f665SDeepak Kodihalli hostPDRHandler->fetchPDR(std::move(pdrRecordHandles));
6198cb6f665SDeepak Kodihalli }
6208cb6f665SDeepak Kodihalli
6218cb6f665SDeepak Kodihalli return PLDM_SUCCESS;
6228cb6f665SDeepak Kodihalli }
6238cb6f665SDeepak Kodihalli
getPDRRecordHandles(const ChangeEntry * changeEntryData,size_t changeEntryDataSize,size_t numberOfChangeEntries,PDRRecordHandles & pdrRecordHandles)6248cb6f665SDeepak Kodihalli int Handler::getPDRRecordHandles(const ChangeEntry* changeEntryData,
6258cb6f665SDeepak Kodihalli size_t changeEntryDataSize,
6268cb6f665SDeepak Kodihalli size_t numberOfChangeEntries,
6278cb6f665SDeepak Kodihalli PDRRecordHandles& pdrRecordHandles)
6288cb6f665SDeepak Kodihalli {
6298cb6f665SDeepak Kodihalli if (numberOfChangeEntries > (changeEntryDataSize / sizeof(ChangeEntry)))
6308cb6f665SDeepak Kodihalli {
6318cb6f665SDeepak Kodihalli return PLDM_ERROR_INVALID_DATA;
6328cb6f665SDeepak Kodihalli }
6338cb6f665SDeepak Kodihalli for (size_t i = 0; i < numberOfChangeEntries; i++)
6348cb6f665SDeepak Kodihalli {
6358cb6f665SDeepak Kodihalli pdrRecordHandles.push_back(changeEntryData[i]);
6368cb6f665SDeepak Kodihalli }
6378cb6f665SDeepak Kodihalli return PLDM_SUCCESS;
6388cb6f665SDeepak Kodihalli }
6398cb6f665SDeepak Kodihalli
getNumericEffecterValue(const pldm_msg * request,size_t payloadLength)6406ece21fbSArchana Kakani Response Handler::getNumericEffecterValue(const pldm_msg* request,
6416ece21fbSArchana Kakani size_t payloadLength)
6426ece21fbSArchana Kakani {
6436ece21fbSArchana Kakani if (payloadLength != PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES)
6446ece21fbSArchana Kakani {
6456ece21fbSArchana Kakani return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
6466ece21fbSArchana Kakani }
6476ece21fbSArchana Kakani
6486ece21fbSArchana Kakani uint16_t effecterId{};
6496ece21fbSArchana Kakani auto rc = decode_get_numeric_effecter_value_req(request, payloadLength,
6506ece21fbSArchana Kakani &effecterId);
6516ece21fbSArchana Kakani if (rc != PLDM_SUCCESS)
6526ece21fbSArchana Kakani {
6536ece21fbSArchana Kakani return ccOnlyResponse(request, rc);
6546ece21fbSArchana Kakani }
6556ece21fbSArchana Kakani
6566ece21fbSArchana Kakani const pldm::utils::DBusHandler dBusIntf;
6576ece21fbSArchana Kakani uint8_t effecterDataSize{};
6586ece21fbSArchana Kakani pldm::utils::PropertyValue dbusValue;
6596ece21fbSArchana Kakani std::string propertyType;
6606ece21fbSArchana Kakani using effecterOperationalState = uint8_t;
6616ece21fbSArchana Kakani using completionCode = uint8_t;
6626ece21fbSArchana Kakani
6636ece21fbSArchana Kakani rc = platform_numeric_effecter::getNumericEffecterData<
6646ece21fbSArchana Kakani pldm::utils::DBusHandler, Handler>(
6656ece21fbSArchana Kakani dBusIntf, *this, effecterId, effecterDataSize, propertyType, dbusValue);
6666ece21fbSArchana Kakani
6676ece21fbSArchana Kakani if (rc != PLDM_SUCCESS)
6686ece21fbSArchana Kakani {
6696ece21fbSArchana Kakani return ccOnlyResponse(request, rc);
6706ece21fbSArchana Kakani }
6716ece21fbSArchana Kakani
6726ece21fbSArchana Kakani // Refer DSP0248_1.2.0.pdf (section 22.3, Table 48)
6736ece21fbSArchana Kakani // Completion Code (uint8), Effecter Data Size(uint8), Effecter Operational
6746ece21fbSArchana Kakani // State(uint8), PendingValue (uint8|sint8|uint16|sint16|uint32|sint32 )
6756ece21fbSArchana Kakani // PresentValue (uint8|sint8|uint16|sint16|uint32|sint32 )
6766ece21fbSArchana Kakani // Size of PendingValue and PresentValue calculated based on size is
6776ece21fbSArchana Kakani // provided in effecter data size
6786ece21fbSArchana Kakani size_t responsePayloadLength = sizeof(completionCode) +
6796ece21fbSArchana Kakani sizeof(effecterDataSize) +
6806ece21fbSArchana Kakani sizeof(effecterOperationalState) +
6816ece21fbSArchana Kakani getEffecterDataSize(effecterDataSize) +
6826ece21fbSArchana Kakani getEffecterDataSize(effecterDataSize);
6836ece21fbSArchana Kakani
6846ece21fbSArchana Kakani Response response(responsePayloadLength + sizeof(pldm_msg_hdr));
6856ece21fbSArchana Kakani auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
6866ece21fbSArchana Kakani
6876ece21fbSArchana Kakani rc = platform_numeric_effecter::getNumericEffecterValueHandler(
6886ece21fbSArchana Kakani propertyType, dbusValue, effecterDataSize, responsePtr,
6896ece21fbSArchana Kakani responsePayloadLength, request->hdr.instance_id);
6906ece21fbSArchana Kakani
6916ece21fbSArchana Kakani if (rc != PLDM_SUCCESS)
6926ece21fbSArchana Kakani {
6936ece21fbSArchana Kakani error(
69489644441SRiya Dixit "Failed to get response of GetNumericEffecterValue for effecter ID '{EFFECTERID}', response code '{RC}'.",
69589644441SRiya Dixit "EFFECTERID", effecterId, "RC", rc);
6966ece21fbSArchana Kakani return ccOnlyResponse(request, rc);
6976ece21fbSArchana Kakani }
6986ece21fbSArchana Kakani return response;
6996ece21fbSArchana Kakani }
7006ece21fbSArchana Kakani
setNumericEffecterValue(const pldm_msg * request,size_t payloadLength)701eccb0c56SGeorge Liu Response Handler::setNumericEffecterValue(const pldm_msg* request,
702eccb0c56SGeorge Liu size_t payloadLength)
703eccb0c56SGeorge Liu {
704eccb0c56SGeorge Liu Response response(sizeof(pldm_msg_hdr) +
705eccb0c56SGeorge Liu PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
706eccb0c56SGeorge Liu uint16_t effecterId{};
707eccb0c56SGeorge Liu uint8_t effecterDataSize{};
708eccb0c56SGeorge Liu uint8_t effecterValue[4] = {};
709eccb0c56SGeorge Liu
710eccb0c56SGeorge Liu if ((payloadLength > sizeof(effecterId) + sizeof(effecterDataSize) +
711eccb0c56SGeorge Liu sizeof(union_effecter_data_size)) ||
712eccb0c56SGeorge Liu (payloadLength < sizeof(effecterId) + sizeof(effecterDataSize) + 1))
713eccb0c56SGeorge Liu {
714eccb0c56SGeorge Liu return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
715eccb0c56SGeorge Liu }
716eccb0c56SGeorge Liu
717eccb0c56SGeorge Liu int rc = decode_set_numeric_effecter_value_req(
7188fbf3cccSAndrew Jeffery request, payloadLength, &effecterId, &effecterDataSize, effecterValue);
719eccb0c56SGeorge Liu
720eccb0c56SGeorge Liu if (rc == PLDM_SUCCESS)
721eccb0c56SGeorge Liu {
722eccb0c56SGeorge Liu const pldm::utils::DBusHandler dBusIntf;
723eccb0c56SGeorge Liu rc = platform_numeric_effecter::setNumericEffecterValueHandler<
724eccb0c56SGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
725eccb0c56SGeorge Liu effecterDataSize, effecterValue,
726eccb0c56SGeorge Liu sizeof(effecterValue));
727eccb0c56SGeorge Liu }
728eccb0c56SGeorge Liu
729eccb0c56SGeorge Liu return ccOnlyResponse(request, rc);
730eccb0c56SGeorge Liu }
731eccb0c56SGeorge Liu
generateTerminusLocatorPDR(Repo & repo)73212afe110SSampa Misra void Handler::generateTerminusLocatorPDR(Repo& repo)
73312afe110SSampa Misra {
73412afe110SSampa Misra std::vector<uint8_t> pdrBuffer(sizeof(pldm_terminus_locator_pdr));
73512afe110SSampa Misra
73612afe110SSampa Misra auto pdr = reinterpret_cast<pldm_terminus_locator_pdr*>(pdrBuffer.data());
73712afe110SSampa Misra
73812afe110SSampa Misra pdr->hdr.record_handle = 0;
73912afe110SSampa Misra pdr->hdr.version = 1;
74012afe110SSampa Misra pdr->hdr.type = PLDM_TERMINUS_LOCATOR_PDR;
74112afe110SSampa Misra pdr->hdr.record_change_num = 0;
74212afe110SSampa Misra pdr->hdr.length = sizeof(pldm_terminus_locator_pdr) - sizeof(pldm_pdr_hdr);
743cc5f1586SManojkiran Eda pdr->terminus_handle = TERMINUS_HANDLE;
74412afe110SSampa Misra pdr->validity = PLDM_TL_PDR_VALID;
745cc5f1586SManojkiran Eda pdr->tid = TERMINUS_ID;
74612afe110SSampa Misra pdr->container_id = 0x0;
74712afe110SSampa Misra pdr->terminus_locator_type = PLDM_TERMINUS_LOCATOR_TYPE_MCTP_EID;
74812afe110SSampa Misra pdr->terminus_locator_value_size =
74912afe110SSampa Misra sizeof(pldm_terminus_locator_type_mctp_eid);
75012afe110SSampa Misra auto locatorValue = reinterpret_cast<pldm_terminus_locator_type_mctp_eid*>(
75112afe110SSampa Misra pdr->terminus_locator_value);
75212afe110SSampa Misra locatorValue->eid = BmcMctpEid;
75312afe110SSampa Misra
75412afe110SSampa Misra PdrEntry pdrEntry{};
75512afe110SSampa Misra pdrEntry.data = pdrBuffer.data();
75612afe110SSampa Misra pdrEntry.size = pdrBuffer.size();
75712afe110SSampa Misra repo.addRecord(pdrEntry);
75860e1fe91SManojkiran Eda if (hostPDRHandler)
75960e1fe91SManojkiran Eda {
76060e1fe91SManojkiran Eda hostPDRHandler->tlPDRInfo.insert_or_assign(
76160e1fe91SManojkiran Eda pdr->terminus_handle,
76260e1fe91SManojkiran Eda std::make_tuple(pdr->tid, locatorValue->eid, pdr->validity));
76360e1fe91SManojkiran Eda }
76412afe110SSampa Misra }
765362c18ddSGeorge Liu
getStateSensorReadings(const pldm_msg * request,size_t payloadLength)766362c18ddSGeorge Liu Response Handler::getStateSensorReadings(const pldm_msg* request,
767362c18ddSGeorge Liu size_t payloadLength)
768362c18ddSGeorge Liu {
769362c18ddSGeorge Liu uint16_t sensorId{};
770362c18ddSGeorge Liu bitfield8_t sensorRearm{};
771362c18ddSGeorge Liu uint8_t reserved{};
772362c18ddSGeorge Liu
77387083f26SPavithra Barithaya if (payloadLength != PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES)
774362c18ddSGeorge Liu {
775362c18ddSGeorge Liu return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
776362c18ddSGeorge Liu }
777362c18ddSGeorge Liu
778362c18ddSGeorge Liu int rc = decode_get_state_sensor_readings_req(
779362c18ddSGeorge Liu request, payloadLength, &sensorId, &sensorRearm, &reserved);
780362c18ddSGeorge Liu
781362c18ddSGeorge Liu if (rc != PLDM_SUCCESS)
782362c18ddSGeorge Liu {
783362c18ddSGeorge Liu return ccOnlyResponse(request, rc);
784362c18ddSGeorge Liu }
785362c18ddSGeorge Liu
786362c18ddSGeorge Liu // 0x01 to 0x08
787c1230ca1SGeorge Liu uint8_t sensorRearmCount = std::popcount(sensorRearm.byte);
788aea5dde1SSampa Misra std::vector<get_sensor_state_field> stateField(sensorRearmCount);
789362c18ddSGeorge Liu uint8_t comSensorCnt{};
790362c18ddSGeorge Liu const pldm::utils::DBusHandler dBusIntf;
791aea5dde1SSampa Misra
792aea5dde1SSampa Misra uint16_t entityType{};
793aea5dde1SSampa Misra uint16_t entityInstance{};
794aea5dde1SSampa Misra uint16_t stateSetId{};
795aea5dde1SSampa Misra
796aea5dde1SSampa Misra if (isOemStateSensor(*this, sensorId, sensorRearmCount, comSensorCnt,
797aea5dde1SSampa Misra entityType, entityInstance, stateSetId) &&
798321804e9SManojkiran Eda oemPlatformHandler != nullptr && !sensorDbusObjMaps.contains(sensorId))
799aea5dde1SSampa Misra {
800aea5dde1SSampa Misra rc = oemPlatformHandler->getOemStateSensorReadingsHandler(
801aea5dde1SSampa Misra entityType, entityInstance, stateSetId, comSensorCnt, stateField);
802aea5dde1SSampa Misra }
803aea5dde1SSampa Misra else
804aea5dde1SSampa Misra {
805362c18ddSGeorge Liu rc = platform_state_sensor::getStateSensorReadingsHandler<
806ae933cc2SManojkiran Eda pldm::utils::DBusHandler, Handler>(
807ae933cc2SManojkiran Eda dBusIntf, *this, sensorId, sensorRearmCount, comSensorCnt,
808ae933cc2SManojkiran Eda stateField, dbusToPLDMEventHandler->getSensorCache());
809aea5dde1SSampa Misra }
810362c18ddSGeorge Liu
811362c18ddSGeorge Liu if (rc != PLDM_SUCCESS)
812362c18ddSGeorge Liu {
813362c18ddSGeorge Liu return ccOnlyResponse(request, rc);
814362c18ddSGeorge Liu }
815362c18ddSGeorge Liu
816362c18ddSGeorge Liu Response response(sizeof(pldm_msg_hdr) +
817362c18ddSGeorge Liu PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
818362c18ddSGeorge Liu sizeof(get_sensor_state_field) * comSensorCnt);
819362c18ddSGeorge Liu auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
820362c18ddSGeorge Liu rc = encode_get_state_sensor_readings_resp(request->hdr.instance_id, rc,
821362c18ddSGeorge Liu comSensorCnt, stateField.data(),
822362c18ddSGeorge Liu responsePtr);
823362c18ddSGeorge Liu if (rc != PLDM_SUCCESS)
824362c18ddSGeorge Liu {
825362c18ddSGeorge Liu return ccOnlyResponse(request, rc);
826362c18ddSGeorge Liu }
827362c18ddSGeorge Liu
828362c18ddSGeorge Liu return response;
829362c18ddSGeorge Liu }
830362c18ddSGeorge Liu
_processPostGetPDRActions(sdeventplus::source::EventBase &)83199854a70SPavithra Barithaya void Handler::_processPostGetPDRActions(sdeventplus::source::EventBase&
83299854a70SPavithra Barithaya /*source */)
8335fb37d57SSampa Misra {
8345fb37d57SSampa Misra deferredGetPDREvent.reset();
8355fb37d57SSampa Misra dbusToPLDMEventHandler->listenSensorEvent(pdrRepo, sensorDbusObjMaps);
8365fb37d57SSampa Misra }
8375fb37d57SSampa Misra
isOemStateSensor(Handler & handler,uint16_t sensorId,uint8_t sensorRearmCount,uint8_t & compSensorCnt,uint16_t & entityType,uint16_t & entityInstance,uint16_t & stateSetId)838aea5dde1SSampa Misra bool isOemStateSensor(Handler& handler, uint16_t sensorId,
839aea5dde1SSampa Misra uint8_t sensorRearmCount, uint8_t& compSensorCnt,
840aea5dde1SSampa Misra uint16_t& entityType, uint16_t& entityInstance,
841aea5dde1SSampa Misra uint16_t& stateSetId)
842aea5dde1SSampa Misra {
843aea5dde1SSampa Misra pldm_state_sensor_pdr* pdr = nullptr;
844aea5dde1SSampa Misra
845aea5dde1SSampa Misra std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateSensorPdrRepo(
846aea5dde1SSampa Misra pldm_pdr_init(), pldm_pdr_destroy);
847acb20299SAndrew Jeffery if (!stateSensorPdrRepo)
848acb20299SAndrew Jeffery {
849acb20299SAndrew Jeffery error("Failed to instantiate state sensor PDR repository");
850acb20299SAndrew Jeffery return false;
851acb20299SAndrew Jeffery }
852aea5dde1SSampa Misra Repo stateSensorPDRs(stateSensorPdrRepo.get());
853aea5dde1SSampa Misra getRepoByType(handler.getRepo(), stateSensorPDRs, PLDM_STATE_SENSOR_PDR);
854aea5dde1SSampa Misra if (stateSensorPDRs.empty())
855aea5dde1SSampa Misra {
85649cfb138SRiya Dixit error("Failed to get record by PDR type");
857aea5dde1SSampa Misra return false;
858aea5dde1SSampa Misra }
859aea5dde1SSampa Misra
860aea5dde1SSampa Misra PdrEntry pdrEntry{};
861aea5dde1SSampa Misra auto pdrRecord = stateSensorPDRs.getFirstRecord(pdrEntry);
862aea5dde1SSampa Misra while (pdrRecord)
863aea5dde1SSampa Misra {
864aea5dde1SSampa Misra pdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdrEntry.data);
865aea5dde1SSampa Misra assert(pdr != NULL);
866aea5dde1SSampa Misra if (pdr->sensor_id != sensorId)
867aea5dde1SSampa Misra {
868aea5dde1SSampa Misra pdr = nullptr;
869aea5dde1SSampa Misra pdrRecord = stateSensorPDRs.getNextRecord(pdrRecord, pdrEntry);
870aea5dde1SSampa Misra continue;
871aea5dde1SSampa Misra }
872aea5dde1SSampa Misra auto tmpEntityType = pdr->entity_type;
873aea5dde1SSampa Misra auto tmpEntityInstance = pdr->entity_instance;
874aea5dde1SSampa Misra auto tmpCompSensorCnt = pdr->composite_sensor_count;
875aea5dde1SSampa Misra auto tmpPossibleStates =
876aea5dde1SSampa Misra reinterpret_cast<state_sensor_possible_states*>(
877aea5dde1SSampa Misra pdr->possible_states);
878aea5dde1SSampa Misra auto tmpStateSetId = tmpPossibleStates->state_set_id;
879aea5dde1SSampa Misra
880aea5dde1SSampa Misra if (sensorRearmCount > tmpCompSensorCnt)
881aea5dde1SSampa Misra {
88249cfb138SRiya Dixit error(
88389644441SRiya Dixit "The requester sent wrong sensor rearm count '{SENSOR_REARM_COUNT}' for the sensor ID '{SENSORID}'.",
88489644441SRiya Dixit "SENSOR_REARM_COUNT", (uint16_t)sensorRearmCount, "SENSORID",
88589644441SRiya Dixit sensorId);
886aea5dde1SSampa Misra break;
887aea5dde1SSampa Misra }
888aea5dde1SSampa Misra
889aea5dde1SSampa Misra if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START &&
890aea5dde1SSampa Misra tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) ||
891aea5dde1SSampa Misra (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START &&
892aea5dde1SSampa Misra tmpStateSetId < PLDM_OEM_STATE_SET_ID_END))
893aea5dde1SSampa Misra {
894aea5dde1SSampa Misra entityType = tmpEntityType;
895aea5dde1SSampa Misra entityInstance = tmpEntityInstance;
896aea5dde1SSampa Misra stateSetId = tmpStateSetId;
897aea5dde1SSampa Misra compSensorCnt = tmpCompSensorCnt;
898aea5dde1SSampa Misra return true;
899aea5dde1SSampa Misra }
900aea5dde1SSampa Misra else
901aea5dde1SSampa Misra {
902aea5dde1SSampa Misra return false;
903aea5dde1SSampa Misra }
904aea5dde1SSampa Misra }
905aea5dde1SSampa Misra return false;
906aea5dde1SSampa Misra }
907aea5dde1SSampa Misra
isOemStateEffecter(Handler & handler,uint16_t effecterId,uint8_t compEffecterCnt,uint16_t & entityType,uint16_t & entityInstance,uint16_t & stateSetId)908aea5dde1SSampa Misra bool isOemStateEffecter(Handler& handler, uint16_t effecterId,
909aea5dde1SSampa Misra uint8_t compEffecterCnt, uint16_t& entityType,
910aea5dde1SSampa Misra uint16_t& entityInstance, uint16_t& stateSetId)
911aea5dde1SSampa Misra {
912aea5dde1SSampa Misra pldm_state_effecter_pdr* pdr = nullptr;
913aea5dde1SSampa Misra
914aea5dde1SSampa Misra std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateEffecterPdrRepo(
915aea5dde1SSampa Misra pldm_pdr_init(), pldm_pdr_destroy);
916acb20299SAndrew Jeffery if (!stateEffecterPdrRepo)
917acb20299SAndrew Jeffery {
918acb20299SAndrew Jeffery error("Failed to instantiate state effecter PDR repository");
919acb20299SAndrew Jeffery return false;
920acb20299SAndrew Jeffery }
921aea5dde1SSampa Misra Repo stateEffecterPDRs(stateEffecterPdrRepo.get());
922aea5dde1SSampa Misra getRepoByType(handler.getRepo(), stateEffecterPDRs,
923aea5dde1SSampa Misra PLDM_STATE_EFFECTER_PDR);
924aea5dde1SSampa Misra if (stateEffecterPDRs.empty())
925aea5dde1SSampa Misra {
92649cfb138SRiya Dixit error("Failed to get record by PDR type");
927aea5dde1SSampa Misra return false;
928aea5dde1SSampa Misra }
929aea5dde1SSampa Misra
930aea5dde1SSampa Misra PdrEntry pdrEntry{};
931aea5dde1SSampa Misra auto pdrRecord = stateEffecterPDRs.getFirstRecord(pdrEntry);
932aea5dde1SSampa Misra while (pdrRecord)
933aea5dde1SSampa Misra {
934aea5dde1SSampa Misra pdr = reinterpret_cast<pldm_state_effecter_pdr*>(pdrEntry.data);
935aea5dde1SSampa Misra assert(pdr != NULL);
936aea5dde1SSampa Misra if (pdr->effecter_id != effecterId)
937aea5dde1SSampa Misra {
938aea5dde1SSampa Misra pdr = nullptr;
939aea5dde1SSampa Misra pdrRecord = stateEffecterPDRs.getNextRecord(pdrRecord, pdrEntry);
940aea5dde1SSampa Misra continue;
941aea5dde1SSampa Misra }
942aea5dde1SSampa Misra
943aea5dde1SSampa Misra auto tmpEntityType = pdr->entity_type;
944aea5dde1SSampa Misra auto tmpEntityInstance = pdr->entity_instance;
945aea5dde1SSampa Misra auto tmpPossibleStates =
946aea5dde1SSampa Misra reinterpret_cast<state_effecter_possible_states*>(
947aea5dde1SSampa Misra pdr->possible_states);
948aea5dde1SSampa Misra auto tmpStateSetId = tmpPossibleStates->state_set_id;
949aea5dde1SSampa Misra
950aea5dde1SSampa Misra if (compEffecterCnt > pdr->composite_effecter_count)
951aea5dde1SSampa Misra {
95249cfb138SRiya Dixit error(
95389644441SRiya Dixit "The requester sent wrong composite effecter count '{COMPOSITE_EFFECTER_COUNT}' for the effecter ID '{EFFECTERID}'.",
954*1e5c81e0SRiya Dixit "COMPOSITE_EFFECTER_COUNT", compEffecterCnt, "EFFECTERID",
955*1e5c81e0SRiya Dixit effecterId);
956aea5dde1SSampa Misra return false;
957aea5dde1SSampa Misra }
958aea5dde1SSampa Misra
959aea5dde1SSampa Misra if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START &&
960aea5dde1SSampa Misra tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) ||
961aea5dde1SSampa Misra (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START &&
962aea5dde1SSampa Misra tmpStateSetId < PLDM_OEM_STATE_SET_ID_END))
963aea5dde1SSampa Misra {
964aea5dde1SSampa Misra entityType = tmpEntityType;
965aea5dde1SSampa Misra entityInstance = tmpEntityInstance;
966aea5dde1SSampa Misra stateSetId = tmpStateSetId;
967aea5dde1SSampa Misra return true;
968aea5dde1SSampa Misra }
969aea5dde1SSampa Misra else
970aea5dde1SSampa Misra {
971aea5dde1SSampa Misra return false;
972aea5dde1SSampa Misra }
973aea5dde1SSampa Misra }
974aea5dde1SSampa Misra return false;
975aea5dde1SSampa Misra }
976aea5dde1SSampa Misra
setEventReceiver()97790314a3fSSagar Srinivas void Handler::setEventReceiver()
97890314a3fSSagar Srinivas {
97990314a3fSSagar Srinivas std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
98090314a3fSSagar Srinivas PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
98190314a3fSSagar Srinivas auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
98290314a3fSSagar Srinivas auto instanceId = instanceIdDb->next(eid);
98390314a3fSSagar Srinivas uint8_t eventMessageGlobalEnable =
98490314a3fSSagar Srinivas PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
98590314a3fSSagar Srinivas uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
98690314a3fSSagar Srinivas uint8_t eventReceiverAddressInfo = pldm::responder::pdr::BmcMctpEid;
98790314a3fSSagar Srinivas uint16_t heartbeatTimer = HEARTBEAT_TIMEOUT;
98890314a3fSSagar Srinivas
98990314a3fSSagar Srinivas auto rc = encode_set_event_receiver_req(
99090314a3fSSagar Srinivas instanceId, eventMessageGlobalEnable, transportProtocolType,
99190314a3fSSagar Srinivas eventReceiverAddressInfo, heartbeatTimer, request);
99290314a3fSSagar Srinivas if (rc != PLDM_SUCCESS)
99390314a3fSSagar Srinivas {
99490314a3fSSagar Srinivas instanceIdDb->free(eid, instanceId);
99589644441SRiya Dixit error(
99689644441SRiya Dixit "Failed to encode set event receiver request, response code '{RC}'",
99789644441SRiya Dixit "RC", lg2::hex, rc);
99890314a3fSSagar Srinivas return;
99990314a3fSSagar Srinivas }
100090314a3fSSagar Srinivas
100190314a3fSSagar Srinivas auto processSetEventReceiverResponse =
100290314a3fSSagar Srinivas [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) {
100390314a3fSSagar Srinivas if (response == nullptr || !respMsgLen)
100490314a3fSSagar Srinivas {
100590314a3fSSagar Srinivas error("Failed to receive response for setEventReceiver command");
100690314a3fSSagar Srinivas return;
100790314a3fSSagar Srinivas }
100890314a3fSSagar Srinivas
100990314a3fSSagar Srinivas uint8_t completionCode{};
101090314a3fSSagar Srinivas auto rc = decode_set_event_receiver_resp(response, respMsgLen,
101190314a3fSSagar Srinivas &completionCode);
101290314a3fSSagar Srinivas if (rc || completionCode)
101390314a3fSSagar Srinivas {
101490314a3fSSagar Srinivas error(
101589644441SRiya Dixit "Failed to decode setEventReceiver command, response code '{RC}' and completion code '{CC}'",
1016*1e5c81e0SRiya Dixit "RC", rc, "CC", completionCode);
101790314a3fSSagar Srinivas pldm::utils::reportError(
101892fb0b55SManojkiran Eda "xyz.openbmc_project.bmc.pldm.InternalFailure");
101990314a3fSSagar Srinivas }
102090314a3fSSagar Srinivas };
102190314a3fSSagar Srinivas rc = handler->registerRequest(
102290314a3fSSagar Srinivas eid, instanceId, PLDM_PLATFORM, PLDM_SET_EVENT_RECEIVER,
102390314a3fSSagar Srinivas std::move(requestMsg), std::move(processSetEventReceiverResponse));
102490314a3fSSagar Srinivas
102590314a3fSSagar Srinivas if (rc != PLDM_SUCCESS)
102690314a3fSSagar Srinivas {
102790314a3fSSagar Srinivas error("Failed to send the setEventReceiver request");
102890314a3fSSagar Srinivas }
102990314a3fSSagar Srinivas
103090314a3fSSagar Srinivas if (oemPlatformHandler)
103190314a3fSSagar Srinivas {
103290314a3fSSagar Srinivas oemPlatformHandler->countSetEventReceiver();
103390314a3fSSagar Srinivas oemPlatformHandler->checkAndDisableWatchDog();
103490314a3fSSagar Srinivas }
103590314a3fSSagar Srinivas }
103690314a3fSSagar Srinivas
1037bc669f1bSDeepak Kodihalli } // namespace platform
1038557dfb00SDeepak Kodihalli } // namespace responder
1039557dfb00SDeepak Kodihalli } // namespace pldm
1040