PEL: Add support for raw symbolic FRUs and procs

Allow the FRUIdentity and Callout objects to take the raw maintenance
procedure and symbolic FRU names as opposed to just the PEL message
registry names.  This will allow the values to come from sources
besides the registry, such as the device tree used by PHAL.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I4171fb7128ae1b1b5e3e635f7f95b7f7df7c6638
diff --git a/extensions/openpower-pels/fru_identity.cpp b/extensions/openpower-pels/fru_identity.cpp
index 6d06237..d6a2968 100644
--- a/extensions/openpower-pels/fru_identity.cpp
+++ b/extensions/openpower-pels/fru_identity.cpp
@@ -17,6 +17,8 @@
 
 #include "pel_values.hpp"
 
+#include <fmt/format.h>
+
 #include <phosphor-logging/log.hpp>
 
 using namespace phosphor::logging;
@@ -106,23 +108,23 @@
     _size = flattenedSize();
 }
 
-FRUIdentity::FRUIdentity(const std::string& procedureFromRegistry)
+FRUIdentity::FRUIdentity(const std::string& procedure, CalloutValueType type)
 {
     _type = substructureType;
     _flags = maintenanceProc;
 
-    setMaintenanceProcedure(procedureFromRegistry);
+    setMaintenanceProcedure(procedure, type);
 
     _size = flattenedSize();
 }
 
-FRUIdentity::FRUIdentity(const std::string& symbolicFRUFromRegistry,
+FRUIdentity::FRUIdentity(const std::string& fru, CalloutValueType type,
                          bool trustedLocationCode)
 {
     _type = substructureType;
     _flags = (trustedLocationCode) ? symbolicFRUTrustedLocCode : symbolicFRU;
 
-    setSymbolicFRU(symbolicFRUFromRegistry);
+    setSymbolicFRU(fru, type);
 
     _size = flattenedSize();
 }
@@ -238,45 +240,63 @@
     fillArray(serialNumber, _sn);
 }
 
-void FRUIdentity::setMaintenanceProcedure(
-    const std::string& procedureFromRegistry)
+void FRUIdentity::setMaintenanceProcedure(const std::string& procedure,
+                                          CalloutValueType type)
 {
     _flags |= maintProcSupplied;
     _flags &= ~pnSupplied;
 
-    if (pel_values::maintenanceProcedures.count(procedureFromRegistry))
+    if (type == CalloutValueType::registryName)
     {
-        fillArray(pel_values::maintenanceProcedures.at(procedureFromRegistry),
-                  _pnOrProcedureID);
+        if (pel_values::maintenanceProcedures.count(procedure))
+        {
+            fillArray(pel_values::maintenanceProcedures.at(procedure),
+                      _pnOrProcedureID);
+        }
+        else
+        {
+            log<level::ERR>(
+                fmt::format("Invalid maintenance procedure {}", procedure)
+                    .c_str());
+            strncpy(_pnOrProcedureID.data(), "INVALID",
+                    _pnOrProcedureID.size());
+        }
     }
     else
     {
-        log<level::ERR>("Invalid maintenance procedure",
-                        entry("PROCEDURE=%s", procedureFromRegistry.c_str()));
-        strncpy(_pnOrProcedureID.data(), "INVALID", _pnOrProcedureID.size());
+        fillArray(procedure, _pnOrProcedureID);
     }
 
     // ensure null terminated
     _pnOrProcedureID.back() = 0;
 }
 
-void FRUIdentity::setSymbolicFRU(const std::string& symbolicFRUFromRegistry)
+void FRUIdentity::setSymbolicFRU(const std::string& symbolicFRU,
+                                 CalloutValueType type)
 {
 
     // Treat this has a HW callout.
     _flags |= pnSupplied;
     _flags &= ~maintProcSupplied;
 
-    if (pel_values::symbolicFRUs.count(symbolicFRUFromRegistry))
+    if (type == CalloutValueType::registryName)
     {
-        fillArray(pel_values::symbolicFRUs.at(symbolicFRUFromRegistry),
-                  _pnOrProcedureID);
+        if (pel_values::symbolicFRUs.count(symbolicFRU))
+        {
+            fillArray(pel_values::symbolicFRUs.at(symbolicFRU),
+                      _pnOrProcedureID);
+        }
+        else
+        {
+            log<level::ERR>("Invalid symbolic FRU",
+                            entry("FRU=%s", symbolicFRU.c_str()));
+            strncpy(_pnOrProcedureID.data(), "INVALID",
+                    _pnOrProcedureID.size());
+        }
     }
     else
     {
-        log<level::ERR>("Invalid symbolic FRU",
-                        entry("FRU=%s", symbolicFRUFromRegistry.c_str()));
-        strncpy(_pnOrProcedureID.data(), "INVALID", _pnOrProcedureID.size());
+        fillArray(symbolicFRU, _pnOrProcedureID);
     }
 
     // ensure null terminated