xref: /openbmc/pldm/platform-mc/platform_manager.hpp (revision fe2527954be36a3013dc6b8c8ff13ae649bb58a6)
16c7fed4cSGilbert Chen #pragma once
26c7fed4cSGilbert Chen 
36c7fed4cSGilbert Chen #include "terminus.hpp"
46c7fed4cSGilbert Chen #include "terminus_manager.hpp"
56c7fed4cSGilbert Chen 
6*fe252795SManojkiran Eda #include <libpldm/fru.h>
7*fe252795SManojkiran Eda #include <libpldm/platform.h>
8*fe252795SManojkiran Eda #include <libpldm/pldm.h>
9*fe252795SManojkiran Eda 
10de2a132aSGilbert Chen #include <vector>
11de2a132aSGilbert Chen 
126c7fed4cSGilbert Chen namespace pldm
136c7fed4cSGilbert Chen {
146c7fed4cSGilbert Chen 
156c7fed4cSGilbert Chen namespace platform_mc
166c7fed4cSGilbert Chen {
176c7fed4cSGilbert Chen 
186c7fed4cSGilbert Chen /**
196c7fed4cSGilbert Chen  * @brief PlatformManager
206c7fed4cSGilbert Chen  *
216c7fed4cSGilbert Chen  * PlatformManager class manages the actions outlined in the platform spec.
226c7fed4cSGilbert Chen  */
236c7fed4cSGilbert Chen class PlatformManager
246c7fed4cSGilbert Chen {
256c7fed4cSGilbert Chen   public:
266c7fed4cSGilbert Chen     PlatformManager() = delete;
276c7fed4cSGilbert Chen     PlatformManager(const PlatformManager&) = delete;
286c7fed4cSGilbert Chen     PlatformManager(PlatformManager&&) = delete;
296c7fed4cSGilbert Chen     PlatformManager& operator=(const PlatformManager&) = delete;
306c7fed4cSGilbert Chen     PlatformManager& operator=(PlatformManager&&) = delete;
316c7fed4cSGilbert Chen     ~PlatformManager() = default;
326c7fed4cSGilbert Chen 
PlatformManager(TerminusManager & terminusManager,TerminiMapper & termini,Manager * manager)336c7fed4cSGilbert Chen     explicit PlatformManager(TerminusManager& terminusManager,
346baafe48SEric Yang                              TerminiMapper& termini, Manager* manager) :
356baafe48SEric Yang         terminusManager(terminusManager), termini(termini), manager(manager)
366c7fed4cSGilbert Chen     {}
376c7fed4cSGilbert Chen 
386c7fed4cSGilbert Chen     /** @brief Initialize terminus which supports PLDM Type 2
396c7fed4cSGilbert Chen      *
406c7fed4cSGilbert Chen      *  @return coroutine return_value - PLDM completion code
416c7fed4cSGilbert Chen      */
426c7fed4cSGilbert Chen     exec::task<int> initTerminus();
436c7fed4cSGilbert Chen 
4451d66b59SThu Nguyen     /** @brief Helper to get the supported event messages and set event receiver
4551d66b59SThu Nguyen      *
4651d66b59SThu Nguyen      *  @param[in] tid - Destination TID
4751d66b59SThu Nguyen      *  @return coroutine return_value - PLDM completion code
4851d66b59SThu Nguyen      */
4951d66b59SThu Nguyen     exec::task<int> configEventReceiver(pldm_tid_t tid);
5051d66b59SThu Nguyen 
516c7fed4cSGilbert Chen   private:
52de2a132aSGilbert Chen     /** @brief Fetch all PDRs from terminus.
53de2a132aSGilbert Chen      *
54de2a132aSGilbert Chen      *  @param[in] terminus - The terminus object to store fetched PDRs
55de2a132aSGilbert Chen      *  @return coroutine return_value - PLDM completion code
56de2a132aSGilbert Chen      */
57de2a132aSGilbert Chen     exec::task<int> getPDRs(std::shared_ptr<Terminus> terminus);
58de2a132aSGilbert Chen 
59de2a132aSGilbert Chen     /** @brief Fetch PDR from terminus
60de2a132aSGilbert Chen      *
61de2a132aSGilbert Chen      *  @param[in] tid - Destination TID
62de2a132aSGilbert Chen      *  @param[in] recordHndl - Record handle
63de2a132aSGilbert Chen      *  @param[in] dataTransferHndl - Data transfer handle
64de2a132aSGilbert Chen      *  @param[in] transferOpFlag - Transfer Operation Flag
65de2a132aSGilbert Chen      *  @param[in] requstCnt - Request Count of data
66de2a132aSGilbert Chen      *  @param[in] recordChgNum - Record change number
67de2a132aSGilbert Chen      *  @param[out] nextRecordHndl - Next record handle
68de2a132aSGilbert Chen      *  @param[out] nextDataTransferHndl - Next data transfer handle
69de2a132aSGilbert Chen      *  @param[out] transferFlag - Transfer flag
70de2a132aSGilbert Chen      *  @param[out] responseCnt - Response count of record data
71de2a132aSGilbert Chen      *  @param[out] recordData - Returned record data
72de2a132aSGilbert Chen      *  @param[out] transferCrc - CRC value when record data is last part of PDR
73de2a132aSGilbert Chen      *  @return coroutine return_value - PLDM completion code
74de2a132aSGilbert Chen      */
75366507c8SPatrick Williams     exec::task<int> getPDR(
76366507c8SPatrick Williams         const pldm_tid_t tid, const uint32_t recordHndl,
77de2a132aSGilbert Chen         const uint32_t dataTransferHndl, const uint8_t transferOpFlag,
78de2a132aSGilbert Chen         const uint16_t requestCnt, const uint16_t recordChgNum,
79de2a132aSGilbert Chen         uint32_t& nextRecordHndl, uint32_t& nextDataTransferHndl,
80de2a132aSGilbert Chen         uint8_t& transferFlag, uint16_t& responseCnt,
81de2a132aSGilbert Chen         std::vector<uint8_t>& recordData, uint8_t& transferCrc);
82de2a132aSGilbert Chen 
83de2a132aSGilbert Chen     /** @brief get PDR repository information.
84de2a132aSGilbert Chen      *
85de2a132aSGilbert Chen      *  @param[in] tid - Destination TID
86de2a132aSGilbert Chen      *  @param[out] repositoryState - the state of repository
87de2a132aSGilbert Chen      *  @param[out] recordCount - number of records
88de2a132aSGilbert Chen      *  @param[out] repositorySize - repository size
89de2a132aSGilbert Chen      *  @param[out] largestRecordSize - largest record size
90de2a132aSGilbert Chen      * *
91de2a132aSGilbert Chen      *  @return coroutine return_value - PLDM completion code
92de2a132aSGilbert Chen      */
9316c2a0a0SPatrick Williams     exec::task<int> getPDRRepositoryInfo(
9416c2a0a0SPatrick Williams         const pldm_tid_t tid, uint8_t& repositoryState, uint32_t& recordCount,
9516c2a0a0SPatrick Williams         uint32_t& repositorySize, uint32_t& largestRecordSize);
96de2a132aSGilbert Chen 
9751d66b59SThu Nguyen     /** @brief Send setEventReceiver command to destination EID.
9851d66b59SThu Nguyen      *
9951d66b59SThu Nguyen      *  @param[in] tid - Destination TID
10051d66b59SThu Nguyen      *  @param[in] eventMessageGlobalEnable - Enable/disable event message
10151d66b59SThu Nguyen      *             generation from the terminus
10251d66b59SThu Nguyen      *  @param[in] eventReceiverEid - The EID of eventReceiver that terminus
10351d66b59SThu Nguyen      *             should send event message to
10451d66b59SThu Nguyen      *  @param[in] protocolType - Provided in the request to help the responder
10551d66b59SThu Nguyen      *             verify that the content of the eventReceiverAddressInfo field
10651d66b59SThu Nguyen      *  @param[in] heartbeatTimer - Amount of time in seconds after each
10751d66b59SThu Nguyen      *             elapsing of which the terminus shall emit a heartbeat event.
10851d66b59SThu Nguyen      *  @return coroutine return_value - PLDM completion code
10951d66b59SThu Nguyen      */
11051d66b59SThu Nguyen     exec::task<int> setEventReceiver(
11151d66b59SThu Nguyen         pldm_tid_t tid,
11251d66b59SThu Nguyen         pldm_event_message_global_enable eventMessageGlobalEnable,
11351d66b59SThu Nguyen         pldm_transport_protocol_type protocolType, uint16_t heartbeatTimer);
11451d66b59SThu Nguyen 
11577e6fe7aSGilbert Chen     /** @brief  send eventMessageBufferSize
11677e6fe7aSGilbert Chen      *  @param[in] tid - Destination TID
11777e6fe7aSGilbert Chen      *  @param[in] receiverMaxBufferSize
11877e6fe7aSGilbert Chen      *  @param[out] terminusBufferSize
11977e6fe7aSGilbert Chen      *  @return coroutine return_value - PLDM completion code
12077e6fe7aSGilbert Chen      */
12177e6fe7aSGilbert Chen     exec::task<int> eventMessageBufferSize(pldm_tid_t tid,
12277e6fe7aSGilbert Chen                                            uint16_t receiverMaxBufferSize,
12377e6fe7aSGilbert Chen                                            uint16_t& terminusBufferSize);
12477e6fe7aSGilbert Chen 
12551d66b59SThu Nguyen     /** @brief  send eventMessageSupported
12651d66b59SThu Nguyen      *  @param[in] tid - Destination TID
12751d66b59SThu Nguyen      *  @param[in] formatVersion - version of the event format
12851d66b59SThu Nguyen      *  @param[out] synchronyConfiguration - messaging style most recently
12951d66b59SThu Nguyen      *              configured via the setEventReceiver command
13051d66b59SThu Nguyen      *  @param[out] synchronyConfigurationSupported - event messaging styles
13151d66b59SThu Nguyen      *              supported by the terminus
13251d66b59SThu Nguyen      *  @param[out] numerEventClassReturned - number of eventClass enumerated
13351d66b59SThu Nguyen      *              bytes
13451d66b59SThu Nguyen      *  @param[out] eventClass - vector of eventClass the device can generate
13551d66b59SThu Nguyen      *  @return coroutine return_value - PLDM completion code
13651d66b59SThu Nguyen      */
13751d66b59SThu Nguyen     exec::task<int> eventMessageSupported(
13851d66b59SThu Nguyen         pldm_tid_t tid, uint8_t formatVersion, uint8_t& synchronyConfiguration,
13951d66b59SThu Nguyen         bitfield8_t& synchronyConfigurationSupported,
14051d66b59SThu Nguyen         uint8_t& numerEventClassReturned, std::vector<uint8_t>& eventClass);
14151d66b59SThu Nguyen 
142b6d3943dSDung Cao     /** @brief Get FRU Record Tables from remote MCTP Endpoint
143b6d3943dSDung Cao      *
144b6d3943dSDung Cao      *  @param[in] tid - Destination TID
145b6d3943dSDung Cao      *  @param[in] total - Total number of record in table
146b6d3943dSDung Cao      *  @param[out] fruData - Returned fru record table data
147b6d3943dSDung Cao      */
148b6d3943dSDung Cao     exec::task<int> getFRURecordTables(pldm_tid_t tid, const uint16_t& total,
149b6d3943dSDung Cao                                        std::vector<uint8_t>& fruData);
150b6d3943dSDung Cao 
151b6d3943dSDung Cao     /** @brief Fetch FRU Record Data from terminus
152b6d3943dSDung Cao      *
153b6d3943dSDung Cao      *  @param[in] tid - Destination TID
154b6d3943dSDung Cao      *  @param[in] dataTransferHndl - Data transfer handle
155b6d3943dSDung Cao      *  @param[in] transferOpFlag - Transfer Operation Flag
156b6d3943dSDung Cao      *  @param[out] nextDataTransferHndl - Next data transfer handle
157b6d3943dSDung Cao      *  @param[out] transferFlag - Transfer flag
158b6d3943dSDung Cao      *  @param[out] responseCnt - Response count of record data
159b6d3943dSDung Cao      *  @param[out] recordData - Returned record data
160b6d3943dSDung Cao      *
161b6d3943dSDung Cao      *  @return coroutine return_value - PLDM completion code
162b6d3943dSDung Cao      */
163b6d3943dSDung Cao     exec::task<int> getFRURecordTable(
164b6d3943dSDung Cao         pldm_tid_t tid, const uint32_t dataTransferHndl,
165b6d3943dSDung Cao         const uint8_t transferOpFlag, uint32_t* nextDataTransferHndl,
166b6d3943dSDung Cao         uint8_t* transferFlag, size_t* responseCnt,
167b6d3943dSDung Cao         std::vector<uint8_t>& recordData);
168b6d3943dSDung Cao 
169b6d3943dSDung Cao     /** @brief Get FRU Record Table Metadata from remote MCTP Endpoint
170b6d3943dSDung Cao      *
171b6d3943dSDung Cao      *  @param[in] tid - Destination TID
172b6d3943dSDung Cao      *  @param[out] total - Total number of record in table
173b6d3943dSDung Cao      */
174b6d3943dSDung Cao     exec::task<int> getFRURecordTableMetadata(pldm_tid_t tid, uint16_t* total);
175b6d3943dSDung Cao 
176b6d3943dSDung Cao     /** @brief Parse record data from FRU table
177b6d3943dSDung Cao      *
178b6d3943dSDung Cao      *  @param[in] tid - Destination TID
179b6d3943dSDung Cao      *  @param[in] fruData - pointer to FRU record table
180b6d3943dSDung Cao      *  @param[in] fruLen - FRU table length
181b6d3943dSDung Cao      */
182b6d3943dSDung Cao     void updateInventoryWithFru(pldm_tid_t tid, const uint8_t* fruData,
183b6d3943dSDung Cao                                 const size_t fruLen);
184b6d3943dSDung Cao 
1856c7fed4cSGilbert Chen     /** reference of TerminusManager for sending PLDM request to terminus*/
1866c7fed4cSGilbert Chen     TerminusManager& terminusManager;
1876c7fed4cSGilbert Chen 
1886c7fed4cSGilbert Chen     /** @brief Managed termini list */
1896c7fed4cSGilbert Chen     TerminiMapper& termini;
1906baafe48SEric Yang 
1916baafe48SEric Yang     /**
1926baafe48SEric Yang      * @brief Pointer to the Manager instance, used for sensor polling
1936baafe48SEric Yang      *        and other platform-level PLDM operations.
1946baafe48SEric Yang      */
1956baafe48SEric Yang     Manager* manager;
1966c7fed4cSGilbert Chen };
1976c7fed4cSGilbert Chen } // namespace platform_mc
1986c7fed4cSGilbert Chen } // namespace pldm
199