175356c1aSTom Joseph #pragma once 275356c1aSTom Joseph 32abbce76SAndrew Jeffery #include "common/instance_id.hpp" 475356c1aSTom Joseph #include "common/types.hpp" 575356c1aSTom Joseph #include "requester/handler.hpp" 675356c1aSTom Joseph 775356c1aSTom Joseph namespace pldm 875356c1aSTom Joseph { 975356c1aSTom Joseph 1075356c1aSTom Joseph namespace fw_update 1175356c1aSTom Joseph { 1275356c1aSTom Joseph 1375356c1aSTom Joseph /** @class InventoryManager 1475356c1aSTom Joseph * 1575356c1aSTom Joseph * InventoryManager class manages the software inventory of firmware devices 1675356c1aSTom Joseph * managed by the BMC. It discovers the firmware identifiers and the component 1775356c1aSTom Joseph * details of the FD. Firmware identifiers, component details and update 1875356c1aSTom Joseph * capabilities of FD are populated by the InventoryManager and is used for the 1975356c1aSTom Joseph * firmware update of the FDs. 2075356c1aSTom Joseph */ 2175356c1aSTom Joseph class InventoryManager 2275356c1aSTom Joseph { 2375356c1aSTom Joseph public: 2475356c1aSTom Joseph InventoryManager() = delete; 2575356c1aSTom Joseph InventoryManager(const InventoryManager&) = delete; 2675356c1aSTom Joseph InventoryManager(InventoryManager&&) = delete; 2775356c1aSTom Joseph InventoryManager& operator=(const InventoryManager&) = delete; 2875356c1aSTom Joseph InventoryManager& operator=(InventoryManager&&) = delete; 2975356c1aSTom Joseph ~InventoryManager() = default; 3075356c1aSTom Joseph 3175356c1aSTom Joseph /** @brief Constructor 3275356c1aSTom Joseph * 3375356c1aSTom Joseph * @param[in] handler - PLDM request handler 34a330b2f0SAndrew Jeffery * @param[in] instanceIdDb - Managing instance ID for PLDM requests 352576aecdSManojkiran Eda * @param[out] descriptorMap - Populate the firmware identifiers for the 3675356c1aSTom Joseph * FDs managed by the BMC. 37*8b169dc5SUnive Tien * @param[out] downstreamDescriptorMap - Populate the downstream 38*8b169dc5SUnive Tien * identifiers for the FDs managed 39*8b169dc5SUnive Tien * by the BMC. 4075356c1aSTom Joseph * @param[out] componentInfoMap - Populate the component info for the FDs 4175356c1aSTom Joseph * managed by the BMC. 4275356c1aSTom Joseph */ InventoryManager(pldm::requester::Handler<pldm::requester::Request> & handler,InstanceIdDb & instanceIdDb,DescriptorMap & descriptorMap,DownstreamDescriptorMap & downstreamDescriptorMap,ComponentInfoMap & componentInfoMap)4375356c1aSTom Joseph explicit InventoryManager( 4475356c1aSTom Joseph pldm::requester::Handler<pldm::requester::Request>& handler, 45a330b2f0SAndrew Jeffery InstanceIdDb& instanceIdDb, DescriptorMap& descriptorMap, 46*8b169dc5SUnive Tien DownstreamDescriptorMap& downstreamDescriptorMap, 4775356c1aSTom Joseph ComponentInfoMap& componentInfoMap) : 4816c2a0a0SPatrick Williams handler(handler), instanceIdDb(instanceIdDb), 49*8b169dc5SUnive Tien descriptorMap(descriptorMap), 50*8b169dc5SUnive Tien downstreamDescriptorMap(downstreamDescriptorMap), 51*8b169dc5SUnive Tien componentInfoMap(componentInfoMap) 5275356c1aSTom Joseph {} 5375356c1aSTom Joseph 5475356c1aSTom Joseph /** @brief Discover the firmware identifiers and component details of FDs 5575356c1aSTom Joseph * 5675356c1aSTom Joseph * Inventory commands QueryDeviceIdentifiers and GetFirmwareParmeters 5775356c1aSTom Joseph * commands are sent to every FD and the response is used to populate 5875356c1aSTom Joseph * the firmware identifiers and component details of the FDs. 5975356c1aSTom Joseph * 6075356c1aSTom Joseph * @param[in] eids - MCTP endpoint ID of the FDs 6175356c1aSTom Joseph */ 6275356c1aSTom Joseph void discoverFDs(const std::vector<mctp_eid_t>& eids); 6375356c1aSTom Joseph 6475356c1aSTom Joseph /** @brief Handler for QueryDeviceIdentifiers command response 6575356c1aSTom Joseph * 6675356c1aSTom Joseph * The response of the QueryDeviceIdentifiers is processed and firmware 6775356c1aSTom Joseph * identifiers of the FD is updated. GetFirmwareParameters command request 6875356c1aSTom Joseph * is sent to the FD. 6975356c1aSTom Joseph * 7075356c1aSTom Joseph * @param[in] eid - Remote MCTP endpoint 7175356c1aSTom Joseph * @param[in] response - PLDM response message 7275356c1aSTom Joseph * @param[in] respMsgLen - Response message length 7375356c1aSTom Joseph */ 7475356c1aSTom Joseph void queryDeviceIdentifiers(mctp_eid_t eid, const pldm_msg* response, 7575356c1aSTom Joseph size_t respMsgLen); 7675356c1aSTom Joseph 77*8b169dc5SUnive Tien /** @brief Handler for QueryDownstreamDevices command response 78*8b169dc5SUnive Tien * 79*8b169dc5SUnive Tien * @param[in] eid - Remote MCTP endpoint 80*8b169dc5SUnive Tien * @param[in] response - PLDM response message 81*8b169dc5SUnive Tien * @param[in] respMsgLen - Response message length 82*8b169dc5SUnive Tien */ 83*8b169dc5SUnive Tien void queryDownstreamDevices(mctp_eid_t eid, const pldm_msg* response, 84*8b169dc5SUnive Tien size_t respMsgLen); 85*8b169dc5SUnive Tien 86*8b169dc5SUnive Tien /** @brief Handler for QueryDownstreamIdentifiers command response 87*8b169dc5SUnive Tien * 88*8b169dc5SUnive Tien * @param[in] eid - Remote MCTP endpoint 89*8b169dc5SUnive Tien * @param[in] response - PLDM response message 90*8b169dc5SUnive Tien * @param[in] respMsgLen - Response message length 91*8b169dc5SUnive Tien */ 92*8b169dc5SUnive Tien void queryDownstreamIdentifiers(mctp_eid_t eid, const pldm_msg* response, 93*8b169dc5SUnive Tien size_t respMsgLen); 94*8b169dc5SUnive Tien 95*8b169dc5SUnive Tien /** @brief Handler for GetDownstreamFirmwareParameters command response 96*8b169dc5SUnive Tien * 97*8b169dc5SUnive Tien * @param[in] eid - Remote MCTP endpoint 98*8b169dc5SUnive Tien * @param[in] response - PLDM response message 99*8b169dc5SUnive Tien * @param[in] respMsgLen - Response message length 100*8b169dc5SUnive Tien */ 101*8b169dc5SUnive Tien void getDownstreamFirmwareParameters( 102*8b169dc5SUnive Tien mctp_eid_t eid, const pldm_msg* response, size_t respMsgLen); 103*8b169dc5SUnive Tien 10475356c1aSTom Joseph /** @brief Handler for GetFirmwareParameters command response 10575356c1aSTom Joseph * 10675356c1aSTom Joseph * Handling the response of GetFirmwareParameters command and create 10775356c1aSTom Joseph * software version D-Bus objects. 10875356c1aSTom Joseph * 10975356c1aSTom Joseph * @param[in] eid - Remote MCTP endpoint 11075356c1aSTom Joseph * @param[in] response - PLDM response message 11175356c1aSTom Joseph * @param[in] respMsgLen - Response message length 11275356c1aSTom Joseph */ 11375356c1aSTom Joseph void getFirmwareParameters(mctp_eid_t eid, const pldm_msg* response, 11475356c1aSTom Joseph size_t respMsgLen); 11575356c1aSTom Joseph 11675356c1aSTom Joseph private: 117*8b169dc5SUnive Tien /** 118*8b169dc5SUnive Tien * @brief Sends QueryDeviceIdentifiers request 119*8b169dc5SUnive Tien * 120*8b169dc5SUnive Tien * @param[in] eid - Remote MCTP endpoint 121*8b169dc5SUnive Tien */ 122*8b169dc5SUnive Tien void sendQueryDeviceIdentifiersRequest(mctp_eid_t eid); 123*8b169dc5SUnive Tien 124*8b169dc5SUnive Tien /** 125*8b169dc5SUnive Tien * @brief Sends QueryDownstreamDevices request 126*8b169dc5SUnive Tien * 127*8b169dc5SUnive Tien * @param[in] eid - Remote MCTP endpoint 128*8b169dc5SUnive Tien */ 129*8b169dc5SUnive Tien void sendQueryDownstreamDevicesRequest(mctp_eid_t eid); 130*8b169dc5SUnive Tien 131*8b169dc5SUnive Tien /** 132*8b169dc5SUnive Tien * @brief Sends QueryDownstreamIdentifiers request 133*8b169dc5SUnive Tien * 134*8b169dc5SUnive Tien * The request format is defined at Table 16 – QueryDownstreamIdentifiers 135*8b169dc5SUnive Tien * command format in DSP0267_1.1.0 136*8b169dc5SUnive Tien * 137*8b169dc5SUnive Tien * @param[in] eid - Remote MCTP endpoint 138*8b169dc5SUnive Tien * @param[in] dataTransferHandle - Data transfer handle 139*8b169dc5SUnive Tien * @param[in] transferOperationFlag - Transfer operation flag 140*8b169dc5SUnive Tien */ 141*8b169dc5SUnive Tien void sendQueryDownstreamIdentifiersRequest( 142*8b169dc5SUnive Tien mctp_eid_t eid, uint32_t dataTransferHandle, 143*8b169dc5SUnive Tien enum transfer_op_flag transferOperationFlag); 144*8b169dc5SUnive Tien 145*8b169dc5SUnive Tien /** 146*8b169dc5SUnive Tien * @brief Sends QueryDownstreamFirmwareParameters request 147*8b169dc5SUnive Tien * 148*8b169dc5SUnive Tien * @param[in] eid - Remote MCTP endpoint 149*8b169dc5SUnive Tien * @param[in] dataTransferHandle - Data transfer handle 150*8b169dc5SUnive Tien * @param[in] transferOperationFlag - Transfer operation flag 151*8b169dc5SUnive Tien */ 152*8b169dc5SUnive Tien void sendGetDownstreamFirmwareParametersRequest( 153*8b169dc5SUnive Tien mctp_eid_t eid, uint32_t dataTransferHandle, 154*8b169dc5SUnive Tien const enum transfer_op_flag transferOperationFlag); 155*8b169dc5SUnive Tien 15675356c1aSTom Joseph /** @brief Send GetFirmwareParameters command request 15775356c1aSTom Joseph * 15875356c1aSTom Joseph * @param[in] eid - Remote MCTP endpoint 15975356c1aSTom Joseph */ 16075356c1aSTom Joseph void sendGetFirmwareParametersRequest(mctp_eid_t eid); 16175356c1aSTom Joseph 16275356c1aSTom Joseph /** @brief PLDM request handler */ 16375356c1aSTom Joseph pldm::requester::Handler<pldm::requester::Request>& handler; 16475356c1aSTom Joseph 165a330b2f0SAndrew Jeffery /** @brief Instance ID database for managing instance ID*/ 166a330b2f0SAndrew Jeffery InstanceIdDb& instanceIdDb; 16775356c1aSTom Joseph 16875356c1aSTom Joseph /** @brief Device identifiers of the managed FDs */ 16975356c1aSTom Joseph DescriptorMap& descriptorMap; 17075356c1aSTom Joseph 171*8b169dc5SUnive Tien /** @brief Downstream Device identifiers of the managed FDs */ 172*8b169dc5SUnive Tien DownstreamDescriptorMap& downstreamDescriptorMap; 173*8b169dc5SUnive Tien 17475356c1aSTom Joseph /** @brief Component information needed for the update of the managed FDs */ 17575356c1aSTom Joseph ComponentInfoMap& componentInfoMap; 17675356c1aSTom Joseph }; 17775356c1aSTom Joseph 17875356c1aSTom Joseph } // namespace fw_update 17975356c1aSTom Joseph 18075356c1aSTom Joseph } // namespace pldm 181