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