diff --git a/extensions/phal/phal_error.cpp b/extensions/phal/phal_error.cpp
index 8879964..009b9c0 100644
--- a/extensions/phal/phal_error.cpp
+++ b/extensions/phal/phal_error.cpp
@@ -328,6 +328,93 @@
     reset();
 }
 
+/**
+ * @brief processClockInfoErrorHelper
+ *
+ * Creates informational PEL for spare clock failure
+ *
+ * @param[in] ffdc - FFDC data capturd by the HWP
+ * @param[in] ffdc_prefix - prefix string for logging the data.
+ */
+void processClockInfoErrorHelper(FFDC* ffdc, const std::string& ffdc_prefix)
+{
+    try
+    {
+        log<level::INFO>(
+            fmt::format("processClockInfoErrorHelper: FFDC Message[{}]",
+                        ffdc->message)
+                .c_str());
+
+        // To store callouts details in json format as per pel expectation.
+        json jsonCalloutDataList;
+        jsonCalloutDataList = json::array();
+
+        // To store phal trace and other additional data about ffdc.
+        FFDCData pelAdditionalData;
+
+        std::string keyWithPrefix(ffdc_prefix + "RC");
+        // Adding hardware procedures return code details
+        pelAdditionalData.emplace_back(keyWithPrefix, ffdc->hwp_errorinfo.rc);
+        keyWithPrefix = ffdc_prefix + "RC_DESC";
+        pelAdditionalData.emplace_back(keyWithPrefix,
+                                       ffdc->hwp_errorinfo.rc_desc);
+
+        // Adding hardware procedures required ffdc data for debug
+        for_each(ffdc->hwp_errorinfo.ffdcs_data.begin(),
+                 ffdc->hwp_errorinfo.ffdcs_data.end(),
+                 [&pelAdditionalData, &ffdc_prefix](
+                     std::pair<std::string, std::string>& ele) -> void {
+                     std::string keyWithPrefix(ffdc_prefix + "FFDC_");
+                     keyWithPrefix.append(ele.first);
+
+                     pelAdditionalData.emplace_back(keyWithPrefix, ele.second);
+                 });
+        // get clock position information
+        auto clk_pos = 0xFF; // Invalid position.
+        for (auto& hwCallout : ffdc->hwp_errorinfo.hwcallouts)
+        {
+            if ((hwCallout.hwid == "PROC_REF_CLOCK") ||
+                (hwCallout.hwid == "PCI_REF_CLOCK"))
+            {
+                clk_pos = hwCallout.clkPos;
+                break;
+            }
+        }
+
+        // Adding CDG (Only deconfigure) targets details
+        for_each(ffdc->hwp_errorinfo.cdg_targets.begin(),
+                 ffdc->hwp_errorinfo.cdg_targets.end(),
+                 [&pelAdditionalData, &jsonCalloutDataList,
+                  clk_pos](const CDG_Target& cdg_tgt) -> void {
+                     json jsonCalloutData;
+                     std::string pelPriority = "H";
+                     jsonCalloutData["Priority"] = pelPriority; // Not used
+                     jsonCalloutData["SymbolicFRU"] =
+                         "REFCLK" + std::to_string(clk_pos);
+                     jsonCalloutData["Deconfigured"] = cdg_tgt.deconfigure;
+                     jsonCalloutData["EntityPath"] = cdg_tgt.target_entity_path;
+                     jsonCalloutDataList.emplace_back(jsonCalloutData);
+                 });
+
+        // Adding collected phal logs into PEL additional data
+        for_each(traceLog.begin(), traceLog.end(),
+                 [&pelAdditionalData](
+                     std::pair<std::string, std::string>& ele) -> void {
+                     pelAdditionalData.emplace_back(ele.first, ele.second);
+                 });
+
+        openpower::pel::createErrorPEL("org.open_power.PHAL.Error.SpareClock",
+                                       jsonCalloutDataList, pelAdditionalData,
+                                       Severity::Informational);
+    }
+    catch (const std::exception& ex)
+    {
+        reset();
+        throw ex;
+    }
+    reset();
+}
+
 void processIplErrorCallback(const ipl_error_info& errInfo)
 {
     log<level::INFO>(
@@ -461,6 +548,12 @@
             fmt::format("PHAL FFDC: Return Message[{}]", ffdc->message)
                 .c_str());
 
+        // Special handling for spare clock related errors.
+        if (ffdc->ffdc_type == FFDC_TYPE_SPARE_CLOCK_INFO)
+        {
+            processClockInfoErrorHelper(ffdc, ffdc_prefix);
+            return;
+        }
         // To store callouts details in json format as per pel expectation.
         json jsonCalloutDataList;
         jsonCalloutDataList = json::array();
