oem-ampere: eventManager: Handle pldmMessagePollEvent event class

Add Ampere OEM handler to handle `pldmMessagePollEvent` event class. The
handler will check if the event is one of the RAS_UE sensors IDs
(CORE_UE, SOC_UE, MCU_UE, PCIE_UE) and triggers the `ras_ue_fault` LED
if it is.

Change-Id: I767def72ffda6c20482633f8be0b0bfbd6eea4c7
Signed-off-by: Thu Nguyen <thu@os.amperecomputing.com>
diff --git a/oem/ampere/event/oem_event_manager.cpp b/oem/ampere/event/oem_event_manager.cpp
index b9fd114..0eadb3d 100644
--- a/oem/ampere/event/oem_event_manager.cpp
+++ b/oem/ampere/event/oem_event_manager.cpp
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <map>
+#include <set>
 #include <sstream>
 #include <string>
 #include <unordered_map>
@@ -41,6 +42,8 @@
 constexpr auto maxDIMMIdxBitNum = 24;
 constexpr auto maxDIMMInstantNum = 24;
 
+const std::set<uint16_t> rasUESensorIDs = {CORE_UE, MCU_UE, PCIE_UE, SOC_UE};
+
 /*
     An array of possible boot status of a boot stage.
     The index maps with byte 0 of boot code.
@@ -944,5 +947,52 @@
     return PLDM_SUCCESS;
 }
 
+int OemEventManager::handlepldmMessagePollEvent(
+    const pldm_msg* request, size_t payloadLength, uint8_t /* formatVersion */,
+    pldm_tid_t tid, size_t eventDataOffset)
+{
+    /* This OEM event handler is only used for SoC terminus*/
+    if (!tidToSocketNameMap.contains(tid))
+    {
+        return PLDM_SUCCESS;
+    }
+
+    auto eventData =
+        reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset;
+    auto eventDataSize = payloadLength - eventDataOffset;
+
+    pldm_message_poll_event poll_event{};
+    auto rc = decode_pldm_message_poll_event_data(eventData, eventDataSize,
+                                                  &poll_event);
+    if (rc)
+    {
+        lg2::error("Failed to decode PldmMessagePollEvent event, error {RC} ",
+                   "RC", rc);
+        return rc;
+    }
+
+    auto sensorID = poll_event.event_id;
+    /* The UE errors */
+    if (rasUESensorIDs.contains(sensorID))
+    {
+        pldm::utils::DBusMapping dbusMapping{
+            "/xyz/openbmc_project/led/groups/ras_ue_fault",
+            "xyz.openbmc_project.Led.Group", "Asserted", "bool"};
+        try
+        {
+            pldm::utils::DBusHandler().setDbusProperty(
+                dbusMapping, pldm::utils::PropertyValue{bool(true)});
+        }
+        catch (const std::exception& e)
+        {
+            lg2::error(
+                "Failed to set the RAS UE LED terminus ID {TID} sensor ID {SENSORID} - errors {ERROR}",
+                "TID", tid, "SENSORID", sensorID, "ERROR", e);
+        }
+    }
+
+    return PLDM_SUCCESS;
+}
+
 } // namespace oem_ampere
 } // namespace pldm