Adding PFR Redfish event log support.

This commit adds the support to read cpld
for any events and log them in Redfish events.
There are 3 Types are events logged,
1) Platform firmware panic events
2) Platform firmware recovery events
3) Platforms firmware error code events

Tested:
Restarted BMC, performed power operation on/off etc.. and
verified the event mointor/timer star and stop functionality.
Also verified the redfish event logs using postman tool.
URI: /redfish/v1/Systems/system/LogServices/EventLog/Entries
METHOD: GET

Change-Id: Icd9793d637121621933f84520b7e70fa66c16364
Signed-off-by: AppaRao Puli <apparao.puli@linux.intel.com>
diff --git a/libpfr/inc/pfr.hpp b/libpfr/inc/pfr.hpp
index bc1f3df..012c647 100644
--- a/libpfr/inc/pfr.hpp
+++ b/libpfr/inc/pfr.hpp
@@ -31,8 +31,19 @@
     bmcRecovery
 };
 
+enum class ActionType
+{
+    recoveryCount,
+    recoveryReason,
+    panicCount,
+    panicReason,
+    majorError,
+    minorError
+};
+
 std::string getVersionInfoCPLD(ImageType &imgType);
 int getProvisioningStatus(bool &ufmLocked, bool &ufmProvisioned);
+int readCpldReg(const ActionType &action, uint8_t value);
 
 } // namespace pfr
 } // namespace intel
diff --git a/libpfr/src/pfr.cpp b/libpfr/src/pfr.cpp
index 59929a2..1ad98b2 100644
--- a/libpfr/src/pfr.cpp
+++ b/libpfr/src/pfr.cpp
@@ -140,5 +140,51 @@
     }
 }
 
+int readCpldReg(const ActionType& action, uint8_t value)
+{
+    uint8_t cpldReg;
+
+    switch (action)
+    {
+        case (ActionType::recoveryCount):
+            cpldReg = recoveryCount;
+            break;
+        case (ActionType::recoveryReason):
+            cpldReg = lastRecoveryReason;
+            break;
+        case (ActionType::panicCount):
+            cpldReg = panicEventCount;
+            break;
+        case (ActionType::panicReason):
+            cpldReg = panicEventReason;
+            break;
+        case (ActionType::majorError):
+            cpldReg = majorErrorCode;
+            break;
+        case (ActionType::minorError):
+            cpldReg = minorErrorCode;
+            break;
+
+        default:
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "Invalid CPLD read action.");
+            return -1;
+    }
+
+    try
+    {
+        I2CFile cpldDev(i2cBusNumber, i2cSlaveAddress, O_RDWR | O_CLOEXEC);
+        value = cpldDev.i2cReadByteData(cpldReg);
+        return 0;
+    }
+    catch (const std::exception& e)
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Exception caught in readCpldReg.",
+            phosphor::logging::entry("MSG=%s", e.what()));
+        return -1;
+    }
+}
+
 } // namespace pfr
 } // namespace intel