1ac19bd68SDeepak Kodihalli #pragma once 2ac19bd68SDeepak Kodihalli 3ac19bd68SDeepak Kodihalli #include "libpldm/base.h" 4ac19bd68SDeepak Kodihalli #include "libpldm/platform.h" 5ac19bd68SDeepak Kodihalli 6d130e1a3SDeepak Kodihalli #include "common/types.hpp" 7d130e1a3SDeepak Kodihalli #include "common/utils.hpp" 83aec997cSPavithra Barithaya #include "libpldmresponder/event_parser.hpp" 9ac19bd68SDeepak Kodihalli #include "libpldmresponder/pdr_utils.hpp" 101521f6d1SDeepak Kodihalli #include "pldmd/dbus_impl_requester.hpp" 1174f27c73STom Joseph #include "requester/handler.hpp" 12ac19bd68SDeepak Kodihalli 13ac19bd68SDeepak Kodihalli #include <sdeventplus/event.hpp> 14ac19bd68SDeepak Kodihalli #include <sdeventplus/source/event.hpp> 15ac19bd68SDeepak Kodihalli 167246e0cdSDeepak Kodihalli #include <deque> 17ac19bd68SDeepak Kodihalli #include <map> 18ac19bd68SDeepak Kodihalli #include <memory> 19ac19bd68SDeepak Kodihalli #include <vector> 20ac19bd68SDeepak Kodihalli 21ac19bd68SDeepak Kodihalli using namespace pldm::dbus_api; 223aec997cSPavithra Barithaya using namespace pldm::responder::events; 23ac19bd68SDeepak Kodihalli 24ac19bd68SDeepak Kodihalli namespace pldm 25ac19bd68SDeepak Kodihalli { 26ac19bd68SDeepak Kodihalli 27ac19bd68SDeepak Kodihalli using EntityType = uint16_t; 28ac19bd68SDeepak Kodihalli // vector which would hold the PDR record handle data returned by 29ac19bd68SDeepak Kodihalli // pldmPDRRepositoryChgEvent event data 30ac19bd68SDeepak Kodihalli using ChangeEntry = uint32_t; 317246e0cdSDeepak Kodihalli using PDRRecordHandles = std::deque<ChangeEntry>; 32ac19bd68SDeepak Kodihalli 33ac19bd68SDeepak Kodihalli /** @struct SensorEntry 34ac19bd68SDeepak Kodihalli * 35ac19bd68SDeepak Kodihalli * SensorEntry is a unique key which maps a sensorEventType request in the 36ac19bd68SDeepak Kodihalli * PlatformEventMessage command to a host sensor PDR. This struct is a key 37ac19bd68SDeepak Kodihalli * in a std::map, so implemented operator==and operator<. 38ac19bd68SDeepak Kodihalli */ 39ac19bd68SDeepak Kodihalli struct SensorEntry 40ac19bd68SDeepak Kodihalli { 41ac19bd68SDeepak Kodihalli pdr::TerminusID terminusID; 42ac19bd68SDeepak Kodihalli pdr::SensorID sensorID; 43ac19bd68SDeepak Kodihalli 44ac19bd68SDeepak Kodihalli bool operator==(const SensorEntry& e) const 45ac19bd68SDeepak Kodihalli { 46ac19bd68SDeepak Kodihalli return ((terminusID == e.terminusID) && (sensorID == e.sensorID)); 47ac19bd68SDeepak Kodihalli } 48ac19bd68SDeepak Kodihalli 49ac19bd68SDeepak Kodihalli bool operator<(const SensorEntry& e) const 50ac19bd68SDeepak Kodihalli { 51ac19bd68SDeepak Kodihalli return ((terminusID < e.terminusID) || 52ac19bd68SDeepak Kodihalli ((terminusID == e.terminusID) && (sensorID < e.sensorID))); 53ac19bd68SDeepak Kodihalli } 54ac19bd68SDeepak Kodihalli }; 55ac19bd68SDeepak Kodihalli 56ac19bd68SDeepak Kodihalli using HostStateSensorMap = std::map<SensorEntry, pdr::SensorInfo>; 57868c879aSSampa Misra using PDRList = std::vector<std::vector<uint8_t>>; 58ac19bd68SDeepak Kodihalli 59ac19bd68SDeepak Kodihalli /** @class HostPDRHandler 60ac19bd68SDeepak Kodihalli * @brief This class can fetch and process PDRs from host firmware 61ac19bd68SDeepak Kodihalli * @details Provides an API to fetch PDRs from the host firmware. Upon 62ac19bd68SDeepak Kodihalli * receiving the PDRs, they are stored into the BMC's primary PDR repo. 63ac19bd68SDeepak Kodihalli * Adjustments are made to entity association PDRs received from the host, 64ac19bd68SDeepak Kodihalli * because they need to be assimilated into the BMC's entity association 65ac19bd68SDeepak Kodihalli * tree. A PLDM event containing the record handles of the updated entity 66ac19bd68SDeepak Kodihalli * association PDRs is sent to the host. 67ac19bd68SDeepak Kodihalli */ 68ac19bd68SDeepak Kodihalli class HostPDRHandler 69ac19bd68SDeepak Kodihalli { 70ac19bd68SDeepak Kodihalli public: 71ac19bd68SDeepak Kodihalli HostPDRHandler() = delete; 72ac19bd68SDeepak Kodihalli HostPDRHandler(const HostPDRHandler&) = delete; 73ac19bd68SDeepak Kodihalli HostPDRHandler(HostPDRHandler&&) = delete; 74ac19bd68SDeepak Kodihalli HostPDRHandler& operator=(const HostPDRHandler&) = delete; 75ac19bd68SDeepak Kodihalli HostPDRHandler& operator=(HostPDRHandler&&) = delete; 76ac19bd68SDeepak Kodihalli ~HostPDRHandler() = default; 77ac19bd68SDeepak Kodihalli 78868c879aSSampa Misra using TLPDRMap = std::map<pdr::TerminusHandle, pdr::TerminusID>; 79868c879aSSampa Misra 80ac19bd68SDeepak Kodihalli /** @brief Constructor 81ac19bd68SDeepak Kodihalli * @param[in] mctp_fd - fd of MCTP communications socket 82ac19bd68SDeepak Kodihalli * @param[in] mctp_eid - MCTP EID of host firmware 83ac19bd68SDeepak Kodihalli * @param[in] event - reference of main event loop of pldmd 84ac19bd68SDeepak Kodihalli * @param[in] repo - pointer to BMC's primary PDR repo 853aec997cSPavithra Barithaya * @param[in] eventsJsonDir - directory path which has the config JSONs 8674f27c73STom Joseph * @param[in] entityTree - Pointer to BMC and Host entity association tree 8774f27c73STom Joseph * @param[in] bmcEntityTree - pointer to BMC's entity association tree 88ac19bd68SDeepak Kodihalli * @param[in] requester - reference to Requester object 8974f27c73STom Joseph * @param[in] handler - PLDM request handler 90ac19bd68SDeepak Kodihalli */ 9174f27c73STom Joseph explicit HostPDRHandler( 9274f27c73STom Joseph int mctp_fd, uint8_t mctp_eid, sdeventplus::Event& event, 9374f27c73STom Joseph pldm_pdr* repo, const std::string& eventsJsonsDir, 94ac19bd68SDeepak Kodihalli pldm_entity_association_tree* entityTree, 9574f27c73STom Joseph pldm_entity_association_tree* bmcEntityTree, Requester& requester, 96*c0c79481SSampa Misra pldm::requester::Handler<pldm::requester::Request>* handler, 9774f27c73STom Joseph bool verbose = false); 98ac19bd68SDeepak Kodihalli 99ac19bd68SDeepak Kodihalli /** @brief fetch PDRs from host firmware. See @class. 100ac19bd68SDeepak Kodihalli * @param[in] recordHandles - list of record handles pointing to host's 101ac19bd68SDeepak Kodihalli * PDRs that need to be fetched. 102ac19bd68SDeepak Kodihalli */ 103ac19bd68SDeepak Kodihalli 1047246e0cdSDeepak Kodihalli void fetchPDR(PDRRecordHandles&& recordHandles); 105ac19bd68SDeepak Kodihalli 106ac19bd68SDeepak Kodihalli /** @brief Send a PLDM event to host firmware containing a list of record 107ac19bd68SDeepak Kodihalli * handles of PDRs that the host firmware has to fetch. 108ac19bd68SDeepak Kodihalli * @param[in] pdrTypes - list of PDR types that need to be looked up in the 109ac19bd68SDeepak Kodihalli * BMC repo 110ac19bd68SDeepak Kodihalli * @param[in] eventDataFormat - format for PDRRepositoryChgEvent in DSP0248 111ac19bd68SDeepak Kodihalli */ 112ac19bd68SDeepak Kodihalli void sendPDRRepositoryChgEvent(std::vector<uint8_t>&& pdrTypes, 113ac19bd68SDeepak Kodihalli uint8_t eventDataFormat); 114ac19bd68SDeepak Kodihalli 115ac19bd68SDeepak Kodihalli /** @brief Lookup host sensor info corresponding to requested SensorEntry 116ac19bd68SDeepak Kodihalli * 117ac19bd68SDeepak Kodihalli * @param[in] entry - TerminusID and SensorID 118ac19bd68SDeepak Kodihalli * 119ac19bd68SDeepak Kodihalli * @return SensorInfo corresponding to the input paramter SensorEntry 120ac19bd68SDeepak Kodihalli * throw std::out_of_range exception if not found 121ac19bd68SDeepak Kodihalli */ 122ac19bd68SDeepak Kodihalli const pdr::SensorInfo& lookupSensorInfo(const SensorEntry& entry) const 123ac19bd68SDeepak Kodihalli { 124ac19bd68SDeepak Kodihalli return sensorMap.at(entry); 125ac19bd68SDeepak Kodihalli } 126ac19bd68SDeepak Kodihalli 1273aec997cSPavithra Barithaya /** @brief Handles state sensor event 1283aec997cSPavithra Barithaya * 1293aec997cSPavithra Barithaya * @param[in] entry - state sensor entry 1303aec997cSPavithra Barithaya * @param[in] state - event state 1313aec997cSPavithra Barithaya * 1323aec997cSPavithra Barithaya * @return PLDM completion code 1333aec997cSPavithra Barithaya */ 1343aec997cSPavithra Barithaya int handleStateSensorEvent(const StateSensorEntry& entry, 1353aec997cSPavithra Barithaya pdr::EventState state); 1363aec997cSPavithra Barithaya 137868c879aSSampa Misra /** @brief Parse state sensor PDRs and populate the sensorMap lookup data 138868c879aSSampa Misra * structure 139868c879aSSampa Misra * 140868c879aSSampa Misra * @param[in] stateSensorPDRs - host state sensor PDRs 141868c879aSSampa Misra * @param[in] tlpdrInfo - terminus locator PDRs info 142868c879aSSampa Misra * 143868c879aSSampa Misra */ 144868c879aSSampa Misra void parseStateSensorPDRs(const PDRList& stateSensorPDRs, 145868c879aSSampa Misra const TLPDRMap& tlpdrInfo); 146868c879aSSampa Misra 147ac19bd68SDeepak Kodihalli private: 148*c0c79481SSampa Misra /** @brief deferred function to fetch PDR from Host, scheduled to work on 149*c0c79481SSampa Misra * the event loop. The PDR exchg with the host is async. 150ac19bd68SDeepak Kodihalli * @param[in] source - sdeventplus event source 151ac19bd68SDeepak Kodihalli */ 152ac19bd68SDeepak Kodihalli void _fetchPDR(sdeventplus::source::EventBase& source); 153ac19bd68SDeepak Kodihalli 154*c0c79481SSampa Misra /** @brief this function sends a GetPDR request to Host firmware. 155*c0c79481SSampa Misra * And processes the PDRs based on type 156*c0c79481SSampa Misra * 157*c0c79481SSampa Misra * @param[in] - nextRecordHandle - the next record handle to ask for 158*c0c79481SSampa Misra */ 159*c0c79481SSampa Misra void getHostPDR(uint32_t nextRecordHandle = 0); 160*c0c79481SSampa Misra 161ac19bd68SDeepak Kodihalli /** @brief Merge host firmware's entity association PDRs into BMC's 162ac19bd68SDeepak Kodihalli * @details A merge operation involves adding a pldm_entity under the 163ac19bd68SDeepak Kodihalli * appropriate parent, and updating container ids. 164ac19bd68SDeepak Kodihalli * @param[in] pdr - entity association pdr 165ac19bd68SDeepak Kodihalli */ 166ac19bd68SDeepak Kodihalli void mergeEntityAssociations(const std::vector<uint8_t>& pdr); 167ac19bd68SDeepak Kodihalli 168ac19bd68SDeepak Kodihalli /** @brief Find parent of input entity type, from the entity association 169ac19bd68SDeepak Kodihalli * tree 170ac19bd68SDeepak Kodihalli * @param[in] type - PLDM entity type 171ac19bd68SDeepak Kodihalli * @param[out] parent - PLDM entity information of parent 172ac19bd68SDeepak Kodihalli * @return bool - true if parent found, false otherwise 173ac19bd68SDeepak Kodihalli */ 174ac19bd68SDeepak Kodihalli bool getParent(EntityType type, pldm_entity& parent); 175ac19bd68SDeepak Kodihalli 176*c0c79481SSampa Misra /** @brief process the Host's PDR and add to BMC's PDR repo 177*c0c79481SSampa Misra * @param[in] eid - MCTP id of Host 178*c0c79481SSampa Misra * @param[in] response - response from Host for GetPDR 179*c0c79481SSampa Misra * @param[in] respMsgLen - response message length 180*c0c79481SSampa Misra */ 181*c0c79481SSampa Misra void processHostPDRs(mctp_eid_t eid, const pldm_msg* response, 182*c0c79481SSampa Misra size_t respMsgLen); 183*c0c79481SSampa Misra 184*c0c79481SSampa Misra /** @brief send PDR Repo change after merging Host's PDR to BMC PDR repo 185*c0c79481SSampa Misra * @param[in] source - sdeventplus event source 186*c0c79481SSampa Misra */ 187*c0c79481SSampa Misra void _processPDRRepoChgEvent(sdeventplus::source::EventBase& source); 188*c0c79481SSampa Misra 189*c0c79481SSampa Misra /** @brief fetch the next PDR based on the record handle sent by Host 190*c0c79481SSampa Misra * @param[in] nextRecordHandle - next record handle 191*c0c79481SSampa Misra * @param[in] source - sdeventplus event source 192*c0c79481SSampa Misra */ 193*c0c79481SSampa Misra void _processFetchPDREvent(uint32_t nextRecordHandle, 194*c0c79481SSampa Misra sdeventplus::source::EventBase& source); 195*c0c79481SSampa Misra 196ac19bd68SDeepak Kodihalli /** @brief fd of MCTP communications socket */ 197ac19bd68SDeepak Kodihalli int mctp_fd; 198ac19bd68SDeepak Kodihalli /** @brief MCTP EID of host firmware */ 199ac19bd68SDeepak Kodihalli uint8_t mctp_eid; 200ac19bd68SDeepak Kodihalli /** @brief reference of main event loop of pldmd, primarily used to schedule 201ac19bd68SDeepak Kodihalli * work. 202ac19bd68SDeepak Kodihalli */ 203ac19bd68SDeepak Kodihalli sdeventplus::Event& event; 204ac19bd68SDeepak Kodihalli /** @brief pointer to BMC's primary PDR repo, host PDRs are added here */ 205ac19bd68SDeepak Kodihalli pldm_pdr* repo; 2063aec997cSPavithra Barithaya 2073aec997cSPavithra Barithaya StateSensorHandler stateSensorHandler; 208c073a20eSSampa Misra /** @brief Pointer to BMC's and Host's entity association tree */ 209ac19bd68SDeepak Kodihalli pldm_entity_association_tree* entityTree; 210c073a20eSSampa Misra 211c073a20eSSampa Misra /** @brief Pointer to BMC's entity association tree */ 212c073a20eSSampa Misra pldm_entity_association_tree* bmcEntityTree; 213c073a20eSSampa Misra 214ac19bd68SDeepak Kodihalli /** @brief reference to Requester object, primarily used to access API to 215ac19bd68SDeepak Kodihalli * obtain PLDM instance id. 216ac19bd68SDeepak Kodihalli */ 217ac19bd68SDeepak Kodihalli Requester& requester; 21874f27c73STom Joseph 21974f27c73STom Joseph /** @brief PLDM request handler */ 220*c0c79481SSampa Misra pldm::requester::Handler<pldm::requester::Request>* handler; 22174f27c73STom Joseph 222ac19bd68SDeepak Kodihalli /** @brief sdeventplus event source */ 223ac19bd68SDeepak Kodihalli std::unique_ptr<sdeventplus::source::Defer> pdrFetchEvent; 224*c0c79481SSampa Misra std::unique_ptr<sdeventplus::source::Defer> deferredFetchPDREvent; 225*c0c79481SSampa Misra std::unique_ptr<sdeventplus::source::Defer> deferredPDRRepoChgEvent; 226*c0c79481SSampa Misra 227ac19bd68SDeepak Kodihalli /** @brief list of PDR record handles pointing to host's PDRs */ 228ac19bd68SDeepak Kodihalli PDRRecordHandles pdrRecordHandles; 229ac19bd68SDeepak Kodihalli /** @brief maps an entity type to parent pldm_entity from the BMC's entity 230ac19bd68SDeepak Kodihalli * association tree 231ac19bd68SDeepak Kodihalli */ 232ac19bd68SDeepak Kodihalli std::map<EntityType, pldm_entity> parents; 233ac19bd68SDeepak Kodihalli /** @brief D-Bus property changed signal match */ 234ac19bd68SDeepak Kodihalli std::unique_ptr<sdbusplus::bus::match::match> hostOffMatch; 235ac19bd68SDeepak Kodihalli 236ac19bd68SDeepak Kodihalli /** @brief sensorMap is a lookup data structure that is build from the 237ac19bd68SDeepak Kodihalli * hostPDR that speeds up the lookup of <TerminusID, SensorID> in 238ac19bd68SDeepak Kodihalli * PlatformEventMessage command request. 239ac19bd68SDeepak Kodihalli */ 240ac19bd68SDeepak Kodihalli HostStateSensorMap sensorMap; 241ae28bc77SSridevi Ramesh bool verbose; 242ac19bd68SDeepak Kodihalli }; 243ac19bd68SDeepak Kodihalli 244ac19bd68SDeepak Kodihalli } // namespace pldm 245