--- ./source/private_module/src/bsp_api.c	2023-05-04 03:24:42.297797758 +0000
+++ ./source/private_module/src/bsp_api.c.hotpatch	2023-05-04 03:14:27.460131293 +0000
@@ -32,7 +32,7 @@
 #else // else with #ifndef _PCLINT_
  #include "pclint_linux.h"
 #endif // end #ifndef _PCLINT_
-
+#include "../include/bsp_dbg.h"
 /*BEGIN ADD BY HENINGBO  ⵥţT11X-4940  ޸ԭR7һ*/
 OSP_U8 g_MeLockFlag = ME_UNLOCK_MASK; //hnb
 /*END ADD BY HENINGBO  ⵥţT11X-4940  ޸ԭR7һ*/
@@ -3809,25 +3809,25 @@
    : עж¼
    : 
    : 
-   ֵ  : OSP_S32
- ú  :
-   :
-
- ޸ʷ      :
-  1.       : 201334
-           : ѩ
-    ޸   : ɺ
 
 *****************************************************************************/
 
+struct mutex g_bspGetEccPatchLock = __MUTEX_INITIALIZER(g_bspGetEccPatchLock);
+OSP_VOID BSP_CheckCeStormPatch(ECC_AllData_S *eccAllData);
 OSP_S32 BSP_GetEccInfo (ECC_AllData_S *v_stECC_AllData)
 {
+    OSP_S32 ret;
     if (NULL == g_stBSPApi.pfnGetEccInfo)
     {
         return RETURN_ERROR;
     }
-
-    return g_stBSPApi.pfnGetEccInfo(v_stECC_AllData);
+    mutex_lock(&g_bspGetEccPatchLock);
+    ret = g_stBSPApi.pfnGetEccInfo(v_stECC_AllData);
+    if (ret == RETURN_OK) {
+        BSP_CheckCeStormPatch(v_stECC_AllData);
+    }
+    mutex_unlock(&g_bspGetEccPatchLock);
+    return ret;
 }
 
 /*****************************************************************************
@@ -6923,6 +6923,128 @@
 	  return g_stBSPApi.PfnMcePanicNotifierUnregister(nb);
  }
 
+ 
+/* CE籩ʱⳬʱʱ */
+#define BSP_FIRST_CHECK_ECC_TIMEOUT (HZ + HZ/2)
+/* CE籩ʱⳬʱʱ */
+#define BSP_SECOND_CHECK_ECC_TIMEOUT (3 * HZ)
+/* ϴʱ¼ */
+OSP_ULONG g_bspPreEccRecordTime = 0;
+/* ǰʱ¼ */
+OSP_ULONG g_bspCurEccRecordTime = 0;
+/* ϴ¼ */
+ECC_AllData_S g_bspPreEccAllData = {0};
+/* eccֵ */
+#define BSP_ECC_INC_THRESHOLD 8000
+
+/* ecc籩ֵ */
+#define BSP_ECC_STORM_FIRST_TH 30
+OSP_U32 g_bspEccStormFirstCnt[MAX_DIMM_NUM] = {0};
+
+/* ecc籩ʱӰ߳ʱ䣬ʱ BSP_FIRST_CHECK_ECC_TIMEOUT */
+#define BSP_ECC_STORM_SECOND_TH 10
+OSP_U32 g_bspEccStormSecondCnt[MAX_DIMM_NUM] = {0};
+
+/* ecc籩ʱӰ߳ʱ䣬ʱ BSP_SECOND_CHECK_ECC_TIMEOUT */
+#define BSP_ECC_STORM_THIRD_TH 3
+OSP_U32 g_bspEccStormThirdCnt[MAX_DIMM_NUM] = {0};
+
+void eccStormHandlePatchsph052(OSP_U32 para);
+OSP_VOID BSP_SetCeStormFlagPatch(OSP_VOID)
+{
+	eccStormHandlePatchsph052(0);
+    BSP_LOG_LIMIT(DBGLEVEL_INFO, 0x1, 3, BSP_SECOND_TO_JIFFS(BSP_SECONDS_PER_HOUR),
+	    "BSP ec storm is comming, will call sys to reboot.");
+}
+
+OSP_VOID BSP_CheckCeStormPatch(ECC_AllData_S *eccAllData)
+{
+    OSP_U32 i;
+    OSP_U32 eccIncCnt = 0x0;
+    OSP_BOOL isCeStorm = FALSE;
+    OSP_U8 productId = 0;
+
+    if (eccAllData == NULL) {
+        return;
+    }
+    if (RETURN_OK != BSP_GetProductType(&productId)) {
+        return;
+    }
+    /* ųARMV5 */
+    if (productId == SPANGEA_V2R1C2_ARM || productId == SPANGEA_V2R5C00 || productId == SPANGEA_V2R5C00_2U) {
+        return;
+    }
+
+    if (g_bspPreEccRecordTime == 0) {
+        memcpy(&g_bspPreEccAllData, eccAllData, sizeof(ECC_AllData_S));
+        g_bspPreEccRecordTime = jiffies;
+        return;
+    }
+
+    g_bspCurEccRecordTime = jiffies;
+    for (i = 0; i < eccAllData->max_dimm_count; i++) {
+        eccIncCnt = eccAllData->uiDimmECCCount[i] - g_bspPreEccAllData.uiDimmECCCount[i];
+        if (eccIncCnt > BSP_ECC_INC_THRESHOLD) {
+            g_bspEccStormFirstCnt[i]++;
+            if (g_bspEccStormFirstCnt[i] > BSP_ECC_STORM_FIRST_TH) {
+                isCeStorm = TRUE;
+                BSP_LOG_LIMIT(DBGLEVEL_INFO, 0x1, 3, BSP_SECOND_TO_JIFFS(BSP_SECONDS_PER_HOUR),
+                    "Dimm%d ecc storm cnt(%d) threshold(%d), pre jiffes %lu cur jiffes %lu.", i, g_bspEccStormFirstCnt[i],
+                    BSP_ECC_STORM_FIRST_TH, g_bspPreEccRecordTime, g_bspCurEccRecordTime);
+                break;
+            }
+
+            if (time_after(g_bspCurEccRecordTime, g_bspPreEccRecordTime + BSP_FIRST_CHECK_ECC_TIMEOUT)) {
+                /* CE籩ڵ£ڱ䳤Ӽ */
+                g_bspEccStormSecondCnt[i]++;
+                if (g_bspEccStormSecondCnt[i] > BSP_ECC_STORM_SECOND_TH) {
+                    isCeStorm = TRUE;
+                    BSP_LOG_LIMIT(DBGLEVEL_INFO, 0x2, 3, BSP_SECOND_TO_JIFFS(BSP_SECONDS_PER_HOUR),
+                        "Dimm%d ecc storm cnt(%d) threshold(%d), pre jiffes %lu cur jiffes %lu.",
+                        i, g_bspEccStormSecondCnt[i], BSP_ECC_STORM_SECOND_TH, g_bspPreEccRecordTime, g_bspCurEccRecordTime);
+                    break;
+                }
+            }
+
+            if (time_after(g_bspCurEccRecordTime, g_bspPreEccRecordTime + BSP_SECOND_CHECK_ECC_TIMEOUT)) {
+                /* CE籩ڵ£ڱ䳤Ӽ */
+                g_bspEccStormThirdCnt[i]++;
+                if (g_bspEccStormThirdCnt[i] > BSP_ECC_STORM_THIRD_TH) {
+                    isCeStorm = TRUE;
+                    BSP_LOG_LIMIT(DBGLEVEL_INFO, 0x3, 3, BSP_SECOND_TO_JIFFS(BSP_SECONDS_PER_HOUR),
+                        "Dimm%d ecc storm cnt(%d) threshold(%d), pre jiffes %lu cur jiffes %lu.",
+                        i, g_bspEccStormThirdCnt[i], BSP_ECC_STORM_THIRD_TH, g_bspPreEccRecordTime, g_bspCurEccRecordTime);
+                    break;
+                }
+            }
+        } else {
+            if (g_bspEccStormFirstCnt[i] > 0x0) {
+                g_bspEccStormFirstCnt[i]--;
+            }
+            /*  */
+            if (g_bspEccStormFirstCnt[i] == 0) {
+                g_bspEccStormSecondCnt[i] = 0;
+                g_bspEccStormThirdCnt[i] = 0;
+            }
+        }
+    }
+
+    memcpy(&g_bspPreEccAllData, eccAllData, sizeof(ECC_AllData_S));
+    g_bspPreEccRecordTime = g_bspCurEccRecordTime;
+    if (isCeStorm == TRUE) {
+        BSP_SetCeStormFlagPatch();
+        /*  */
+        memset(g_bspEccStormFirstCnt, 0, sizeof(g_bspEccStormFirstCnt));
+        memset(g_bspEccStormSecondCnt, 0, sizeof(g_bspEccStormSecondCnt));
+        memset(g_bspEccStormThirdCnt, 0, sizeof(g_bspEccStormThirdCnt));
+        g_bspPreEccRecordTime = 0;
+        /* ʱ10sȴλ */
+        msleep(10000);
+    }
+
+    return;
+}
+
  #ifndef _PCLINT_
  EXPORT_SYMBOL(BSP_McePanicNotifierRegister);
  EXPORT_SYMBOL(BSP_McePanicNotifierUnregister);
