[PATCH 07/15] ddr: altera: n5x: re-init DDR when double-bit ECC error is detected
Chen Huei Lok
chen.huei.lok at altera.com
Wed Jul 8 03:12:20 CEST 2026
From: Tien Fong Chee <tien.fong.chee at altera.com>
A double-bit ECC error (DBE) means the retained DDR contents can no longer
be trusted. Detect the DBE status and force a full DDR init and
calibration in that case instead of taking the retention / warm-reset skip
path.
Signed-off-by: Tien Fong Chee <tien.fong.chee at altera.com>
Signed-off-by: Chen Huei Lok <chen.huei.lok at altera.com>
---
drivers/ddr/altera/sdram_n5x.c | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/drivers/ddr/altera/sdram_n5x.c b/drivers/ddr/altera/sdram_n5x.c
index 9c3f07b409d..f6ce15bffaa 100644
--- a/drivers/ddr/altera/sdram_n5x.c
+++ b/drivers/ddr/altera/sdram_n5x.c
@@ -421,6 +421,17 @@ enum data_process {
LOADING
};
+bool is_ddr_dbe_triggered(void)
+{
+ u32 reg = readl(socfpga_get_sysmgr_addr() +
+ SYSMGR_SOC64_BOOT_SCRATCH_COLD8);
+
+ if (reg & ALT_SYSMGR_SCRATCH_REG_8_DDR_DBE_MASK)
+ return true;
+
+ return false;
+}
+
void ddr_init_inprogress(bool start)
{
if (start)
@@ -479,17 +490,20 @@ bool is_ddr_init_skipped(u32 reg)
reset_type_print(reset_t);
- if (reset_t == WARM_RESET) {
- debug("%s: DDR init is skipped\n", __func__);
- return true;
- }
-
- if (reset_t == COLD_RESET) {
- if (is_ddr_retention_enabled(reg)) {
- debug("%s: DDR retention bit is set\n", __func__);
+ if (!is_ddr_dbe_triggered()) {
+ if (reset_t == WARM_RESET) {
debug("%s: DDR init is skipped\n", __func__);
return true;
}
+
+ if (reset_t == COLD_RESET) {
+ if (is_ddr_retention_enabled(reg)) {
+ debug("%s: DDR retention bit is set\n",
+ __func__);
+ debug("%s: DDR init is skipped\n", __func__);
+ return true;
+ }
+ }
}
debug("%s: DDR init is required\n", __func__);
@@ -501,7 +515,8 @@ bool is_ddr_calibration_skipped(u32 reg)
enum reset_type reset_t = get_reset_type(reg);
if ((reset_t == NCONFIG || reset_t == JTAG_CONFIG ||
- reset_t == RSU_RECONFIG) && is_ddr_retention_enabled(reg)) {
+ reset_t == RSU_RECONFIG) && is_ddr_retention_enabled(reg) &&
+ !is_ddr_dbe_triggered()) {
debug("%s: DDR retention bit is set\n", __func__);
return true;
}
--
2.43.7
More information about the U-Boot
mailing list