xref: /openbmc/pldm/fw-update/inventory_manager.hpp (revision 8b169dc51d7dfe8512add038169c0644f424b4d9)
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