1a743e384SChau Ly #pragma once 2a743e384SChau Ly #include "../../common/utils.hpp" 3a743e384SChau Ly #include "../../libpldmresponder/base.hpp" 4a743e384SChau Ly #include "../../libpldmresponder/bios.hpp" 5a743e384SChau Ly #include "../../libpldmresponder/fru.hpp" 6a743e384SChau Ly #include "../../libpldmresponder/platform.hpp" 7a743e384SChau Ly #include "../../oem/ampere/event/oem_event_manager.hpp" 8a743e384SChau Ly #include "../../platform-mc/manager.hpp" 9a743e384SChau Ly #include "../../pldmd/invoker.hpp" 10a743e384SChau Ly #include "../../requester/request.hpp" 11a743e384SChau Ly 12a743e384SChau Ly namespace pldm 13a743e384SChau Ly { 14a743e384SChau Ly namespace oem_ampere 15a743e384SChau Ly { 16a743e384SChau Ly 17a743e384SChau Ly /** 18a743e384SChau Ly * @class OemAMPERE 19a743e384SChau Ly * 20a743e384SChau Ly * @brief class for creating all the OEM AMPERE handlers 21a743e384SChau Ly * 22a743e384SChau Ly * Only in case of OEM_AMPERE this class object will be instantiated 23a743e384SChau Ly */ 24a743e384SChau Ly class OemAMPERE 25a743e384SChau Ly { 26a743e384SChau Ly public: 27a743e384SChau Ly OemAMPERE() = delete; 28a743e384SChau Ly OemAMPERE& operator=(const OemAMPERE&) = delete; 29a743e384SChau Ly OemAMPERE(OemAMPERE&&) = delete; 30a743e384SChau Ly OemAMPERE& operator=(OemAMPERE&&) = delete; 31a743e384SChau Ly 32a743e384SChau Ly public: 33a743e384SChau Ly /** Constructs OemAMPERE object 34a743e384SChau Ly * 35a743e384SChau Ly * @param[in] dBusIntf - D-Bus handler 36a743e384SChau Ly * @param[in] mctp_fd - fd of MCTP communications socket 37a743e384SChau Ly * @param[in] mctp_eid - MCTP EID of remote host firmware 38a743e384SChau Ly * @param[in] repo - pointer to BMC's primary PDR repo 39a743e384SChau Ly * @param[in] instanceIdDb - pointer to an InstanceIdDb object 40a743e384SChau Ly * @param[in] event - sd_event handler 41a743e384SChau Ly * @param[in] invoker - invoker handler 42a743e384SChau Ly * @param[in] hostPDRHandler - hostPDRHandler handler 43a743e384SChau Ly * @param[in] platformHandler - platformHandler handler 44a743e384SChau Ly * @param[in] fruHandler - fruHandler handler 45a743e384SChau Ly * @param[in] baseHandler - baseHandler handler 46a743e384SChau Ly * @param[in] biosHandler - biosHandler handler 47a743e384SChau Ly * @param[in] reqHandler - reqHandler handler 48a743e384SChau Ly */ OemAMPERE(const pldm::utils::DBusHandler *,int,pldm_pdr *,pldm::InstanceIdDb & instanceIdDb,sdeventplus::Event & event,responder::Invoker &,HostPDRHandler *,responder::platform::Handler * platformHandler,responder::fru::Handler *,responder::base::Handler *,responder::bios::Handler *,platform_mc::Manager * platformManager,pldm::requester::Handler<pldm::requester::Request> * reqHandler)49a743e384SChau Ly explicit OemAMPERE( 50a743e384SChau Ly const pldm::utils::DBusHandler* /* dBusIntf */, int /* mctp_fd */, 51a743e384SChau Ly pldm_pdr* /* repo */, pldm::InstanceIdDb& instanceIdDb, 52a743e384SChau Ly sdeventplus::Event& event, responder::Invoker& /* invoker */, 53a743e384SChau Ly HostPDRHandler* /* hostPDRHandler */, 54a743e384SChau Ly responder::platform::Handler* platformHandler, 55a743e384SChau Ly responder::fru::Handler* /* fruHandler */, 56a743e384SChau Ly responder::base::Handler* /* baseHandler */, 57a743e384SChau Ly responder::bios::Handler* /* biosHandler */, 586894e90fSThu Nguyen platform_mc::Manager* platformManager, 59a743e384SChau Ly pldm::requester::Handler<pldm::requester::Request>* reqHandler) : 60a743e384SChau Ly instanceIdDb(instanceIdDb), event(event), 616894e90fSThu Nguyen platformHandler(platformHandler), platformManager(platformManager), 626894e90fSThu Nguyen reqHandler(reqHandler) 63a743e384SChau Ly { 64a743e384SChau Ly oemEventManager = std::make_shared<oem_ampere::OemEventManager>( 65*4a503837SDung Cao this->event, this->reqHandler, this->instanceIdDb, 66*4a503837SDung Cao this->platformManager); 6772c8aa06SDung Cao createOemEventHandler(oemEventManager.get(), this->platformManager); 68a743e384SChau Ly } 69a743e384SChau Ly 70a743e384SChau Ly private: 71a743e384SChau Ly /** @brief Method for creating OemEventManager 72a743e384SChau Ly * 73a743e384SChau Ly * This method also assigns the OemEventManager to the below 74a743e384SChau Ly * different handlers. 75a743e384SChau Ly */ createOemEventHandler(oem_ampere::OemEventManager * oemEventManager,platform_mc::Manager * platformManager)7672c8aa06SDung Cao void createOemEventHandler(oem_ampere::OemEventManager* oemEventManager, 776894e90fSThu Nguyen platform_mc::Manager* platformManager) 78a743e384SChau Ly { 79a743e384SChau Ly platformHandler->registerEventHandlers( 80a743e384SChau Ly PLDM_SENSOR_EVENT, 8172c8aa06SDung Cao {[oemEventManager](const pldm_msg* request, size_t payloadLength, 82a743e384SChau Ly uint8_t formatVersion, uint8_t tid, 83a743e384SChau Ly size_t eventDataOffset) { 84a743e384SChau Ly return oemEventManager->handleSensorEvent( 85a743e384SChau Ly request, payloadLength, formatVersion, tid, 86a743e384SChau Ly eventDataOffset); 87a743e384SChau Ly }}); 8872c8aa06SDung Cao 8972c8aa06SDung Cao /* Register Ampere OEM handler to the PLDM CPER events */ 9072c8aa06SDung Cao platformManager->registerPolledEventHandler( 9172c8aa06SDung Cao 0xFA, 9272c8aa06SDung Cao {[oemEventManager](pldm_tid_t tid, uint16_t eventId, 9372c8aa06SDung Cao const uint8_t* eventData, size_t eventDataSize) { 9472c8aa06SDung Cao return oemEventManager->processOemMsgPollEvent( 9572c8aa06SDung Cao tid, eventId, eventData, eventDataSize); 9672c8aa06SDung Cao }}); 9772c8aa06SDung Cao platformManager->registerPolledEventHandler( 9872c8aa06SDung Cao PLDM_CPER_EVENT, 9972c8aa06SDung Cao {[oemEventManager](pldm_tid_t tid, uint16_t eventId, 10072c8aa06SDung Cao const uint8_t* eventData, size_t eventDataSize) { 10172c8aa06SDung Cao return oemEventManager->processOemMsgPollEvent( 10272c8aa06SDung Cao tid, eventId, eventData, eventDataSize); 10372c8aa06SDung Cao }}); 10472c8aa06SDung Cao 1056894e90fSThu Nguyen /** CPEREvent class (0x07) is only available in DSP0248 V1.3.0. 1066894e90fSThu Nguyen * Before DSP0248 V1.3.0 spec, Ampere uses OEM event class 0xFA to 1076894e90fSThu Nguyen * report the CPER event 1086894e90fSThu Nguyen */ 1096894e90fSThu Nguyen platformHandler->registerEventHandlers( 1106894e90fSThu Nguyen 0xFA, 1116894e90fSThu Nguyen {[platformManager](const pldm_msg* request, size_t payloadLength, 1126894e90fSThu Nguyen uint8_t formatVersion, uint8_t tid, 1136894e90fSThu Nguyen size_t eventDataOffset) { 1146894e90fSThu Nguyen return platformManager->handleCperEvent( 1156894e90fSThu Nguyen request, payloadLength, formatVersion, tid, 1166894e90fSThu Nguyen eventDataOffset); 1176894e90fSThu Nguyen }}); 1186894e90fSThu Nguyen /* Support handle the polled event with Ampere OEM CPER event class */ 1196894e90fSThu Nguyen platformManager->registerPolledEventHandler( 1206894e90fSThu Nguyen 0xFA, 1216dce7d11SThu Nguyen {[platformManager](pldm_tid_t tid, uint16_t eventId, 1226894e90fSThu Nguyen const uint8_t* eventData, size_t eventDataSize) { 1236894e90fSThu Nguyen return platformManager->handlePolledCperEvent( 1246894e90fSThu Nguyen tid, eventId, eventData, eventDataSize); 1256dce7d11SThu Nguyen }}); 12679f9ff6bSThu Nguyen 12779f9ff6bSThu Nguyen /* Register OEM handling for pldmMessagePollEvent */ 12879f9ff6bSThu Nguyen platformHandler->registerEventHandlers( 12979f9ff6bSThu Nguyen PLDM_MESSAGE_POLL_EVENT, 13079f9ff6bSThu Nguyen {[oemEventManager](const pldm_msg* request, size_t payloadLength, 13179f9ff6bSThu Nguyen uint8_t formatVersion, uint8_t tid, 13279f9ff6bSThu Nguyen size_t eventDataOffset) { 13379f9ff6bSThu Nguyen return oemEventManager->handlepldmMessagePollEvent( 13479f9ff6bSThu Nguyen request, payloadLength, formatVersion, tid, 13579f9ff6bSThu Nguyen eventDataOffset); 13679f9ff6bSThu Nguyen }}); 137*4a503837SDung Cao 138*4a503837SDung Cao /* Register Ampere OEM handler to poll the PLDM events */ 139*4a503837SDung Cao platformManager->registerOEMPollMethod( 140*4a503837SDung Cao [oemEventManager](pldm_tid_t tid) { 141*4a503837SDung Cao return oemEventManager->oemPollForPlatformEvent(tid); 142*4a503837SDung Cao }); 143a743e384SChau Ly } 144a743e384SChau Ly 145a743e384SChau Ly private: 146a743e384SChau Ly /** @brief reference to an Instance ID database object, used to obtain PLDM 147a743e384SChau Ly * instance IDs 148a743e384SChau Ly */ 149a743e384SChau Ly pldm::InstanceIdDb& instanceIdDb; 150a743e384SChau Ly 151a743e384SChau Ly /** @brief reference of main event loop of pldmd, primarily used to schedule 152a743e384SChau Ly * work 153a743e384SChau Ly */ 154a743e384SChau Ly sdeventplus::Event& event; 155a743e384SChau Ly 156a743e384SChau Ly /** @brief Platform handler*/ 157a743e384SChau Ly responder::platform::Handler* platformHandler = nullptr; 158a743e384SChau Ly 1596894e90fSThu Nguyen /** @brief MC Platform manager*/ 1606894e90fSThu Nguyen platform_mc::Manager* platformManager = nullptr; 1616894e90fSThu Nguyen 162a743e384SChau Ly /** @brief pointer to the requester class*/ 163a743e384SChau Ly requester::Handler<requester::Request>* reqHandler = nullptr; 164a743e384SChau Ly 165a743e384SChau Ly std::shared_ptr<oem_ampere::OemEventManager> oemEventManager{}; 166a743e384SChau Ly }; 167a743e384SChau Ly 168a743e384SChau Ly } // namespace oem_ampere 169a743e384SChau Ly } // namespace pldm 170