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