PEL: Pass in subsystem to use with additional data

There is a requirement to pass in the subsystem to use with
the additional data field. In the process update the user
header code and SRC with the passed-in subsystem value
instead from the message registry.

Signed-off-by: Sumit Kumar <sumit_kumar@in.ibm.com>
Change-Id: I08c8c3bab100fec581df9043f4bb27b28cb556e1
diff --git a/extensions/openpower-pels/user_header.cpp b/extensions/openpower-pels/user_header.cpp
index 34e2fa1..7aed654 100644
--- a/extensions/openpower-pels/user_header.cpp
+++ b/extensions/openpower-pels/user_header.cpp
@@ -20,6 +20,8 @@
 #include "pel_values.hpp"
 #include "severity.hpp"
 
+#include <fmt/format.h>
+
 #include <iostream>
 #include <phosphor-logging/log.hpp>
 
@@ -58,6 +60,25 @@
 
     _eventSubsystem = entry.subsystem;
 
+    // Check for additional data - PEL_SUBSYSTEM
+    auto ss = additionalData.getValue("PEL_SUBSYSTEM");
+    if (ss)
+    {
+        auto eventSubsystem = std::stoul(*ss, NULL, 16);
+        std::string subsystem =
+            pv::getValue(eventSubsystem, pel_values::subsystemValues);
+        if (subsystem == "invalid")
+        {
+            log<level::WARNING>(
+                fmt::format("UH: Invalid SubSystem value:{:#X}", eventSubsystem)
+                    .c_str());
+        }
+        else
+        {
+            _eventSubsystem = eventSubsystem;
+        }
+    }
+
     _eventScope = entry.eventScope.value_or(
         static_cast<uint8_t>(EventScope::entirePlatform));