xref: /openbmc/pldm/oem/ampere/oem_ampere.hpp (revision 4a5038370b1513022b41e5d99a319f627c0084c8)
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