170e8db0cSDeepak Kodihalli #pragma once 270e8db0cSDeepak Kodihalli 370e8db0cSDeepak Kodihalli #include "fru_parser.hpp" 4a410c658SPavithra Barithaya #include "libpldmresponder/pdr_utils.hpp" 5a410c658SPavithra Barithaya #include "oem_handler.hpp" 61521f6d1SDeepak Kodihalli #include "pldmd/handler.hpp" 770e8db0cSDeepak Kodihalli 8c453e164SGeorge Liu #include <libpldm/fru.h> 9c453e164SGeorge Liu #include <libpldm/pdr.h> 10c453e164SGeorge Liu 1170e8db0cSDeepak Kodihalli #include <sdbusplus/message.hpp> 126492f524SGeorge Liu 136492f524SGeorge Liu #include <map> 1470e8db0cSDeepak Kodihalli #include <string> 1570e8db0cSDeepak Kodihalli #include <variant> 1670e8db0cSDeepak Kodihalli #include <vector> 1770e8db0cSDeepak Kodihalli 1870e8db0cSDeepak Kodihalli namespace pldm 1970e8db0cSDeepak Kodihalli { 2070e8db0cSDeepak Kodihalli 2170e8db0cSDeepak Kodihalli namespace responder 2270e8db0cSDeepak Kodihalli { 2370e8db0cSDeepak Kodihalli 2470e8db0cSDeepak Kodihalli namespace dbus 2570e8db0cSDeepak Kodihalli { 2670e8db0cSDeepak Kodihalli 27754041d0SRiya Dixit using Value = std::variant<bool, uint8_t, int16_t, uint16_t, int32_t, uint32_t, 28754041d0SRiya Dixit int64_t, uint64_t, double, std::string, 29754041d0SRiya Dixit std::vector<uint8_t>, std::vector<std::string>>; 3070e8db0cSDeepak Kodihalli using PropertyMap = std::map<Property, Value>; 3170e8db0cSDeepak Kodihalli using InterfaceMap = std::map<Interface, PropertyMap>; 3270e8db0cSDeepak Kodihalli using ObjectValueTree = std::map<sdbusplus::message::object_path, InterfaceMap>; 333cd61814SDeepak Kodihalli using ObjectPath = std::string; 34c4ea6a90SGeorge Liu using AssociatedEntityMap = std::map<ObjectPath, pldm_entity>; 3570e8db0cSDeepak Kodihalli 3670e8db0cSDeepak Kodihalli } // namespace dbus 3770e8db0cSDeepak Kodihalli 3870e8db0cSDeepak Kodihalli /** @class FruImpl 3970e8db0cSDeepak Kodihalli * 4070e8db0cSDeepak Kodihalli * @brief Builds the PLDM FRU table containing the FRU records 4170e8db0cSDeepak Kodihalli */ 4270e8db0cSDeepak Kodihalli class FruImpl 4370e8db0cSDeepak Kodihalli { 4470e8db0cSDeepak Kodihalli public: 4570e8db0cSDeepak Kodihalli /* @brief Header size for FRU record, it includes the FRU record set 4670e8db0cSDeepak Kodihalli * identifier, FRU record type, Number of FRU fields, Encoding type 4770e8db0cSDeepak Kodihalli * of FRU fields 4870e8db0cSDeepak Kodihalli */ 4970e8db0cSDeepak Kodihalli static constexpr size_t recHeaderSize = 5070e8db0cSDeepak Kodihalli sizeof(struct pldm_fru_record_data_format) - 5170e8db0cSDeepak Kodihalli sizeof(struct pldm_fru_record_tlv); 5270e8db0cSDeepak Kodihalli 5333e9c7eaSTom Joseph /** @brief Constructor for FruImpl, the configPath is consumed to build the 5433e9c7eaSTom Joseph * FruParser object. 5570e8db0cSDeepak Kodihalli * 5670e8db0cSDeepak Kodihalli * @param[in] configPath - path to the directory containing config files 5770e8db0cSDeepak Kodihalli * for PLDM FRU 5803b01ca8SManojkiran Eda * @param[in] fruMasterJsonPath - path to the file containing the FRU D-Bus 5903b01ca8SManojkiran Eda * Lookup Map 6033e9c7eaSTom Joseph * @param[in] pdrRepo - opaque pointer to PDR repository 6133e9c7eaSTom Joseph * @param[in] entityTree - opaque pointer to the entity association tree 62c073a20eSSampa Misra * @param[in] bmcEntityTree - opaque pointer to bmc's entity association 63c073a20eSSampa Misra * tree 64a410c658SPavithra Barithaya * @param[in] oemFruHandler - OEM fru handler 6570e8db0cSDeepak Kodihalli */ FruImpl(const std::string & configPath,const std::filesystem::path & fruMasterJsonPath,pldm_pdr * pdrRepo,pldm_entity_association_tree * entityTree,pldm_entity_association_tree * bmcEntityTree)6603b01ca8SManojkiran Eda FruImpl(const std::string& configPath, 6703b01ca8SManojkiran Eda const std::filesystem::path& fruMasterJsonPath, pldm_pdr* pdrRepo, 68c073a20eSSampa Misra pldm_entity_association_tree* entityTree, 69a881c170SGeorge Liu pldm_entity_association_tree* bmcEntityTree) : 7016c2a0a0SPatrick Williams parser(configPath, fruMasterJsonPath), pdrRepo(pdrRepo), 7116c2a0a0SPatrick Williams entityTree(entityTree), bmcEntityTree(bmcEntityTree) 7233e9c7eaSTom Joseph {} 7370e8db0cSDeepak Kodihalli 749e6631e2SPavithra Barithaya /** @brief Total length of the FRU table in bytes, this includes the pad 7570e8db0cSDeepak Kodihalli * bytes and the checksum. 7670e8db0cSDeepak Kodihalli * 7770e8db0cSDeepak Kodihalli * @return size of the FRU table 7870e8db0cSDeepak Kodihalli */ size() const7970e8db0cSDeepak Kodihalli uint32_t size() const 8070e8db0cSDeepak Kodihalli { 819e6631e2SPavithra Barithaya return table.size(); 8270e8db0cSDeepak Kodihalli } 8370e8db0cSDeepak Kodihalli 8470e8db0cSDeepak Kodihalli /** @brief The checksum of the contents of the FRU table 8570e8db0cSDeepak Kodihalli * 8670e8db0cSDeepak Kodihalli * @return checksum 8770e8db0cSDeepak Kodihalli */ checkSum() const8870e8db0cSDeepak Kodihalli uint32_t checkSum() const 8970e8db0cSDeepak Kodihalli { 9070e8db0cSDeepak Kodihalli return checksum; 9170e8db0cSDeepak Kodihalli } 9270e8db0cSDeepak Kodihalli 9370e8db0cSDeepak Kodihalli /** @brief Number of record set identifiers in the FRU tables 9470e8db0cSDeepak Kodihalli * 9570e8db0cSDeepak Kodihalli * @return number of record set identifiers 9670e8db0cSDeepak Kodihalli */ numRSI() const9770e8db0cSDeepak Kodihalli uint16_t numRSI() const 9870e8db0cSDeepak Kodihalli { 9970e8db0cSDeepak Kodihalli return rsi; 10070e8db0cSDeepak Kodihalli } 10170e8db0cSDeepak Kodihalli 10270e8db0cSDeepak Kodihalli /** @brief The number of FRU records in the table 10370e8db0cSDeepak Kodihalli * 10470e8db0cSDeepak Kodihalli * @return number of FRU records 10570e8db0cSDeepak Kodihalli */ numRecords() const10670e8db0cSDeepak Kodihalli uint16_t numRecords() const 10770e8db0cSDeepak Kodihalli { 10870e8db0cSDeepak Kodihalli return numRecs; 10970e8db0cSDeepak Kodihalli } 11070e8db0cSDeepak Kodihalli 11170e8db0cSDeepak Kodihalli /** @brief Get the FRU table 11270e8db0cSDeepak Kodihalli * 11370e8db0cSDeepak Kodihalli * @param[out] - Populate response with the FRU table 11470e8db0cSDeepak Kodihalli */ 11570e8db0cSDeepak Kodihalli void getFRUTable(Response& response); 11670e8db0cSDeepak Kodihalli 1179e6631e2SPavithra Barithaya /** @brief Get the Fru Table MetaData 1189e6631e2SPavithra Barithaya * 1199e6631e2SPavithra Barithaya */ 1209e6631e2SPavithra Barithaya void getFRURecordTableMetadata(); 1219e6631e2SPavithra Barithaya 1229e82ad1fSJohn Wang /** @brief Get FRU Record Table By Option 1239e82ad1fSJohn Wang * @param[out] response - Populate response with the FRU table got by 1249e82ad1fSJohn Wang * options 1259e82ad1fSJohn Wang * @param[in] fruTableHandle - The fru table handle 1269e82ad1fSJohn Wang * @param[in] recordSetIdentifer - The record set identifier 1279e82ad1fSJohn Wang * @param[in] recordType - The record type 1289e82ad1fSJohn Wang * @param[in] fieldType - The field type 1299e82ad1fSJohn Wang */ 1309e82ad1fSJohn Wang int getFRURecordByOption(Response& response, uint16_t fruTableHandle, 1319e82ad1fSJohn Wang uint16_t recordSetIdentifer, uint8_t recordType, 1329e82ad1fSJohn Wang uint8_t fieldType); 1339e82ad1fSJohn Wang 13433e9c7eaSTom Joseph /** @brief FRU table is built by processing the D-Bus inventory namespace 13533e9c7eaSTom Joseph * based on the config files for FRU. The table is populated based 13633e9c7eaSTom Joseph * on the isBuilt flag. 13733e9c7eaSTom Joseph */ 13833e9c7eaSTom Joseph void buildFRUTable(); 13933e9c7eaSTom Joseph 140c4ea6a90SGeorge Liu /** @brief Get std::map associated with the entity 141c4ea6a90SGeorge Liu * key: object path 142c4ea6a90SGeorge Liu * value: pldm_entity 143c4ea6a90SGeorge Liu * 144c4ea6a90SGeorge Liu * @return std::map<ObjectPath, pldm_entity> 145c4ea6a90SGeorge Liu */ 146c4ea6a90SGeorge Liu inline const pldm::responder::dbus::AssociatedEntityMap& getAssociateEntityMap() const147c4ea6a90SGeorge Liu getAssociateEntityMap() const 148c4ea6a90SGeorge Liu { 149c4ea6a90SGeorge Liu return associatedEntityMap; 150c4ea6a90SGeorge Liu } 151c4ea6a90SGeorge Liu 1525bfb0dcbSGeorge Liu /** @brief Get pldm entity by the object path 1535bfb0dcbSGeorge Liu * 1545bfb0dcbSGeorge Liu * @param[in] intfMaps - D-Bus interfaces and the associated property 1555bfb0dcbSGeorge Liu * values for the FRU 1565bfb0dcbSGeorge Liu * 1575bfb0dcbSGeorge Liu * @return pldm_entity 1585bfb0dcbSGeorge Liu */ 159*366507c8SPatrick Williams std::optional<pldm_entity> getEntityByObjectPath( 160*366507c8SPatrick Williams const dbus::InterfaceMap& intfMaps); 1615bfb0dcbSGeorge Liu 1625bfb0dcbSGeorge Liu /** @brief Update pldm entity to association tree 1635bfb0dcbSGeorge Liu * 1645bfb0dcbSGeorge Liu * @param[in] objects - std::map The object value tree 1655bfb0dcbSGeorge Liu * @param[in] path - Object path 1665bfb0dcbSGeorge Liu * 1675bfb0dcbSGeorge Liu * Ex: Input path = 1685bfb0dcbSGeorge Liu * "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0" 1695bfb0dcbSGeorge Liu * 1705bfb0dcbSGeorge Liu * Get the parent class in turn and store it in a temporary vector 1715bfb0dcbSGeorge Liu * 1725bfb0dcbSGeorge Liu * Output tmpObjPaths = { 1735bfb0dcbSGeorge Liu * "/xyz/openbmc_project/inventory/system", 1745bfb0dcbSGeorge Liu * "/xyz/openbmc_project/inventory/system/chassis/", 1755bfb0dcbSGeorge Liu * "/xyz/openbmc_project/inventory/system/chassis/motherboard", 1765bfb0dcbSGeorge Liu * "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0"} 1775bfb0dcbSGeorge Liu * 1785bfb0dcbSGeorge Liu */ 1795bfb0dcbSGeorge Liu void updateAssociationTree(const dbus::ObjectValueTree& objects, 1805bfb0dcbSGeorge Liu const std::string& path); 1815bfb0dcbSGeorge Liu 18247180ac9SPavithra Barithaya /* @brief Method to populate the firmware version ID 18347180ac9SPavithra Barithaya * 18447180ac9SPavithra Barithaya * @return firmware version ID 18547180ac9SPavithra Barithaya */ 18647180ac9SPavithra Barithaya std::string populatefwVersion(); 18747180ac9SPavithra Barithaya 1889e6631e2SPavithra Barithaya /* @brief Method to resize the table 1899e6631e2SPavithra Barithaya * 1909e6631e2SPavithra Barithaya * @return resized table 1919e6631e2SPavithra Barithaya */ 1929e6631e2SPavithra Barithaya std::vector<uint8_t> tableResize(); 1939e6631e2SPavithra Barithaya 194a410c658SPavithra Barithaya /* @brief set FRU Record Table 195a410c658SPavithra Barithaya * 196a410c658SPavithra Barithaya * @param[in] fruData - the data of the fru 197a410c658SPavithra Barithaya * 198a410c658SPavithra Barithaya * @return PLDM completion code 199a410c658SPavithra Barithaya */ 200a410c658SPavithra Barithaya int setFRUTable(const std::vector<uint8_t>& fruData); 201a410c658SPavithra Barithaya 202a881c170SGeorge Liu /* @brief Method to set the oem platform handler in fru handler class 203a881c170SGeorge Liu * 204a881c170SGeorge Liu * @param[in] handler - oem fru handler 205a881c170SGeorge Liu */ setOemFruHandler(pldm::responder::oem_fru::Handler * handler)206a881c170SGeorge Liu inline void setOemFruHandler(pldm::responder::oem_fru::Handler* handler) 207a881c170SGeorge Liu { 208a881c170SGeorge Liu oemFruHandler = handler; 209a881c170SGeorge Liu } 210a881c170SGeorge Liu 21170e8db0cSDeepak Kodihalli private: nextRSI()21270e8db0cSDeepak Kodihalli uint16_t nextRSI() 21370e8db0cSDeepak Kodihalli { 21470e8db0cSDeepak Kodihalli return ++rsi; 21570e8db0cSDeepak Kodihalli } 21670e8db0cSDeepak Kodihalli nextRecordHandle()2174f2538a6SPavithra Barithaya uint32_t nextRecordHandle() 2184f2538a6SPavithra Barithaya { 2194f2538a6SPavithra Barithaya return ++rh; 2204f2538a6SPavithra Barithaya } 2214f2538a6SPavithra Barithaya 2224f2538a6SPavithra Barithaya uint32_t rh = 0; 22370e8db0cSDeepak Kodihalli uint16_t rsi = 0; 22470e8db0cSDeepak Kodihalli uint16_t numRecs = 0; 22570e8db0cSDeepak Kodihalli uint8_t padBytes = 0; 22670e8db0cSDeepak Kodihalli std::vector<uint8_t> table; 22770e8db0cSDeepak Kodihalli uint32_t checksum = 0; 22833e9c7eaSTom Joseph bool isBuilt = false; 22970e8db0cSDeepak Kodihalli 23033e9c7eaSTom Joseph fru_parser::FruParser parser; 2313cd61814SDeepak Kodihalli pldm_pdr* pdrRepo; 2323cd61814SDeepak Kodihalli pldm_entity_association_tree* entityTree; 233c073a20eSSampa Misra pldm_entity_association_tree* bmcEntityTree; 234a881c170SGeorge Liu pldm::responder::oem_fru::Handler* oemFruHandler = nullptr; 235754041d0SRiya Dixit dbus::ObjectValueTree objects; 2363cd61814SDeepak Kodihalli 2373cd61814SDeepak Kodihalli std::map<dbus::ObjectPath, pldm_entity_node*> objToEntityNode{}; 2383cd61814SDeepak Kodihalli 23970e8db0cSDeepak Kodihalli /** @brief populateRecord builds the FRU records for an instance of FRU and 24070e8db0cSDeepak Kodihalli * updates the FRU table with the FRU records. 24170e8db0cSDeepak Kodihalli * 24270e8db0cSDeepak Kodihalli * @param[in] interfaces - D-Bus interfaces and the associated property 24370e8db0cSDeepak Kodihalli * values for the FRU 24470e8db0cSDeepak Kodihalli * @param[in] recordInfos - FRU record info to build the FRU records 2453cd61814SDeepak Kodihalli * @param[in/out] entity - PLDM entity corresponding to FRU instance 24670e8db0cSDeepak Kodihalli */ 247c4ea6a90SGeorge Liu void populateRecords(const dbus::InterfaceMap& interfaces, 2483cd61814SDeepak Kodihalli const fru_parser::FruRecordInfos& recordInfos, 2493cd61814SDeepak Kodihalli const pldm_entity& entity); 250c4ea6a90SGeorge Liu 251c4ea6a90SGeorge Liu /** @brief Associate sensor/effecter to FRU entity 252c4ea6a90SGeorge Liu */ 253c4ea6a90SGeorge Liu dbus::AssociatedEntityMap associatedEntityMap; 25470e8db0cSDeepak Kodihalli }; 25570e8db0cSDeepak Kodihalli 256e60c5822SDeepak Kodihalli namespace fru 257e60c5822SDeepak Kodihalli { 258e60c5822SDeepak Kodihalli 259e60c5822SDeepak Kodihalli class Handler : public CmdHandler 260e60c5822SDeepak Kodihalli { 261e60c5822SDeepak Kodihalli public: Handler(const std::string & configPath,const std::filesystem::path & fruMasterJsonPath,pldm_pdr * pdrRepo,pldm_entity_association_tree * entityTree,pldm_entity_association_tree * bmcEntityTree)26203b01ca8SManojkiran Eda Handler(const std::string& configPath, 26303b01ca8SManojkiran Eda const std::filesystem::path& fruMasterJsonPath, pldm_pdr* pdrRepo, 264c073a20eSSampa Misra pldm_entity_association_tree* entityTree, 265a881c170SGeorge Liu pldm_entity_association_tree* bmcEntityTree) : 266a881c170SGeorge Liu impl(configPath, fruMasterJsonPath, pdrRepo, entityTree, bmcEntityTree) 267e60c5822SDeepak Kodihalli { 268d2e48991SDelphine CC Chiu handlers.emplace( 269d2e48991SDelphine CC Chiu PLDM_GET_FRU_RECORD_TABLE_METADATA, 270d2e48991SDelphine CC Chiu [this](pldm_tid_t, const pldm_msg* request, size_t payloadLength) { 2716da4f91bSPatrick Williams return this->getFRURecordTableMetadata(request, payloadLength); 272e60c5822SDeepak Kodihalli }); 273d2e48991SDelphine CC Chiu handlers.emplace( 274d2e48991SDelphine CC Chiu PLDM_GET_FRU_RECORD_TABLE, 275d2e48991SDelphine CC Chiu [this](pldm_tid_t, const pldm_msg* request, size_t payloadLength) { 2766da4f91bSPatrick Williams return this->getFRURecordTable(request, payloadLength); 277e60c5822SDeepak Kodihalli }); 278d2e48991SDelphine CC Chiu handlers.emplace( 279d2e48991SDelphine CC Chiu PLDM_GET_FRU_RECORD_BY_OPTION, 280d2e48991SDelphine CC Chiu [this](pldm_tid_t, const pldm_msg* request, size_t payloadLength) { 2816da4f91bSPatrick Williams return this->getFRURecordByOption(request, payloadLength); 2829e82ad1fSJohn Wang }); 283a410c658SPavithra Barithaya handlers.emplace( 284a410c658SPavithra Barithaya PLDM_SET_FRU_RECORD_TABLE, 285a410c658SPavithra Barithaya [this](pldm_tid_t, const pldm_msg* request, size_t payloadLength) { 286a410c658SPavithra Barithaya return this->setFRURecordTable(request, payloadLength); 287a410c658SPavithra Barithaya }); 288e60c5822SDeepak Kodihalli } 289e60c5822SDeepak Kodihalli 290e60c5822SDeepak Kodihalli /** @brief Handler for Get FRURecordTableMetadata 291e60c5822SDeepak Kodihalli * 292e60c5822SDeepak Kodihalli * @param[in] request - Request message payload 293e60c5822SDeepak Kodihalli * @param[in] payloadLength - Request payload length 294e60c5822SDeepak Kodihalli * 295e60c5822SDeepak Kodihalli * @return PLDM response message 296e60c5822SDeepak Kodihalli */ 297e60c5822SDeepak Kodihalli Response getFRURecordTableMetadata(const pldm_msg* request, 298e60c5822SDeepak Kodihalli size_t payloadLength); 299e60c5822SDeepak Kodihalli 300e60c5822SDeepak Kodihalli /** @brief Handler for GetFRURecordTable 301e60c5822SDeepak Kodihalli * 302e60c5822SDeepak Kodihalli * @param[in] request - Request message payload 303e60c5822SDeepak Kodihalli * @param[in] payloadLength - Request payload length 304e60c5822SDeepak Kodihalli * 305e60c5822SDeepak Kodihalli * @return PLDM response message 306e60c5822SDeepak Kodihalli */ 307e60c5822SDeepak Kodihalli Response getFRURecordTable(const pldm_msg* request, size_t payloadLength); 3083cd61814SDeepak Kodihalli 30933e9c7eaSTom Joseph /** @brief Build FRU table is bnot already built 31033e9c7eaSTom Joseph * 31133e9c7eaSTom Joseph */ buildFRUTable()31233e9c7eaSTom Joseph void buildFRUTable() 31333e9c7eaSTom Joseph { 31433e9c7eaSTom Joseph impl.buildFRUTable(); 31533e9c7eaSTom Joseph } 31633e9c7eaSTom Joseph 317c4ea6a90SGeorge Liu /** @brief Get std::map associated with the entity 318c4ea6a90SGeorge Liu * key: object path 319c4ea6a90SGeorge Liu * value: pldm_entity 320c4ea6a90SGeorge Liu * 321c4ea6a90SGeorge Liu * @return std::map<ObjectPath, pldm_entity> 322c4ea6a90SGeorge Liu */ getAssociateEntityMap() const323*366507c8SPatrick Williams const pldm::responder::dbus::AssociatedEntityMap& getAssociateEntityMap() 324*366507c8SPatrick Williams const 325c4ea6a90SGeorge Liu { 326c4ea6a90SGeorge Liu return impl.getAssociateEntityMap(); 327c4ea6a90SGeorge Liu } 328c4ea6a90SGeorge Liu 3299e82ad1fSJohn Wang /** @brief Handler for GetFRURecordByOption 3309e82ad1fSJohn Wang * 3319e82ad1fSJohn Wang * @param[in] request - Request message payload 3329e82ad1fSJohn Wang * @param[in] payloadLength - Request payload length 3339e82ad1fSJohn Wang * 3349e82ad1fSJohn Wang * @return PLDM response message 3359e82ad1fSJohn Wang */ 3369e82ad1fSJohn Wang Response getFRURecordByOption(const pldm_msg* request, 3379e82ad1fSJohn Wang size_t payloadLength); 3389e82ad1fSJohn Wang 339a410c658SPavithra Barithaya /** @brief Handler for SetFRURecordTable 340a410c658SPavithra Barithaya * 341a410c658SPavithra Barithaya * @param[in] request - Request message 342a410c658SPavithra Barithaya * @param[in] payloadLength - Request payload length 343a410c658SPavithra Barithaya * 344a410c658SPavithra Barithaya * @return PLDM response message 345a410c658SPavithra Barithaya */ 346a410c658SPavithra Barithaya Response setFRURecordTable(const pldm_msg* request, size_t payloadLength); 347a410c658SPavithra Barithaya 348a881c170SGeorge Liu /* @brief Method to set the oem platform handler in fru handler class 349a881c170SGeorge Liu * 350a881c170SGeorge Liu * @param[in] handler - oem fru handler 351a881c170SGeorge Liu */ setOemFruHandler(pldm::responder::oem_fru::Handler * handler)352a881c170SGeorge Liu void setOemFruHandler(pldm::responder::oem_fru::Handler* handler) 353a881c170SGeorge Liu { 354a881c170SGeorge Liu impl.setOemFruHandler(handler); 355a881c170SGeorge Liu } 356a881c170SGeorge Liu 357a410c658SPavithra Barithaya using Table = std::vector<uint8_t>; 358a410c658SPavithra Barithaya 3593cd61814SDeepak Kodihalli private: 3603cd61814SDeepak Kodihalli FruImpl impl; 361e60c5822SDeepak Kodihalli }; 362e60c5822SDeepak Kodihalli 363e60c5822SDeepak Kodihalli } // namespace fru 364e60c5822SDeepak Kodihalli 36570e8db0cSDeepak Kodihalli } // namespace responder 36670e8db0cSDeepak Kodihalli 36770e8db0cSDeepak Kodihalli } // namespace pldm 368