diff --git a/arch/arm/dts/ast2600-rainier.dts b/arch/arm/dts/ast2600-rainier.dts index 89114a8fd174..669a961d6cc7 100755 --- a/arch/arm/dts/ast2600-rainier.dts +++ b/arch/arm/dts/ast2600-rainier.dts @@ -41,6 +41,7 @@ &sdrammc { clock-frequency = <400000000>; + aspeed,ecc-enabled; }; &wdt2 { diff --git a/drivers/ram/aspeed/Kconfig b/drivers/ram/aspeed/Kconfig index 512570eb8bda..b72aceaebde8 100644 --- a/drivers/ram/aspeed/Kconfig +++ b/drivers/ram/aspeed/Kconfig @@ -127,23 +127,4 @@ config ASPEED_DDR4_WR_DATA_EYE_TRAINING_RESULT_OFFSET are not sure what is the best value in your system. endif -config ASPEED_ECC - bool "aspeed SDRAM error correcting code" - depends on DM && OF_CONTROL && ARCH_ASPEED - default n - help - enable SDRAM ECC function - -if ASPEED_ECC -config ASPEED_ECC_SIZE - int "ECC size: 0=driver auto-caluated" - depends on ASPEED_ECC - default 0 - help - SDRAM size with the error correcting code enabled. The unit is - in Megabytes. Noted that only the 8/9 of the configured size - can be used by the system. The remaining 1/9 will be used by - the ECC engine. If the size is set to 0, the sdram driver will - calculate the SDRAM size and set the whole range be ECC enabled. -endif endif diff --git a/drivers/ram/aspeed/sdram_ast2500.c b/drivers/ram/aspeed/sdram_ast2500.c index 435e1a8cfc1d..c8eee32da698 100644 --- a/drivers/ram/aspeed/sdram_ast2500.c +++ b/drivers/ram/aspeed/sdram_ast2500.c @@ -278,17 +278,16 @@ static void ast2500_sdrammc_calc_size(struct dram_info *info) << SDRAM_CONF_CAP_SHIFT)); } -#ifdef CONFIG_ASPEED_ECC -static void ast2500_sdrammc_ecc_enable(struct dram_info *info) +static void ast2500_sdrammc_ecc_enable(struct dram_info *info, u32 conf_size_mb) { struct ast2500_sdrammc_regs *regs = info->regs; size_t conf_size; u32 reg; - conf_size = CONFIG_ASPEED_ECC_SIZE * SDRAM_SIZE_1MB; + conf_size = conf_size_mb * SDRAM_SIZE_1MB; if (conf_size > info->info.size) { printf("warning: ECC configured %dMB but actual size is %dMB\n", - CONFIG_ASPEED_ECC_SIZE, + conf_size_mb, info->info.size / SDRAM_SIZE_1MB); conf_size = info->info.size; } else if (conf_size == 0) { @@ -313,10 +312,10 @@ static void ast2500_sdrammc_ecc_enable(struct dram_info *info) writel(0x400, ®s->ecc_test_ctrl); printf("ECC enable, "); } -#endif -static int ast2500_sdrammc_init_ddr4(struct dram_info *info) +static int ast2500_sdrammc_init_ddr4(struct udevice *dev) { + struct dram_info *info = dev_get_priv(dev); int i; const u32 power_control = SDRAM_PCR_CKE_EN | (1 << SDRAM_PCR_CKE_DELAY_SHIFT) @@ -370,9 +369,13 @@ static int ast2500_sdrammc_init_ddr4(struct dram_info *info) writel(SDRAM_MISC_DDR4_TREFRESH, &info->regs->misc_control); -#ifdef CONFIG_ASPEED_ECC - ast2500_sdrammc_ecc_enable(info); -#endif + if (dev_read_bool(dev, "aspeed,ecc-enabled")) { + u32 ecc_size; + + ecc_size = dev_read_u32_default(dev, "aspeed,ecc-size-mb", 0); + ast2500_sdrammc_ecc_enable(info, ecc_size); + } + /* Enable all requests except video & display */ writel(SDRAM_REQ_USB20_EHCI1 | SDRAM_REQ_USB20_EHCI2 @@ -477,7 +480,7 @@ static int ast2500_sdrammc_probe(struct udevice *dev) ast2500_sdrammc_init_phy(priv->phy); if (readl(&priv->scu->hwstrap) & SCU_HWSTRAP_DDR4) { - ast2500_sdrammc_init_ddr4(priv); + ast2500_sdrammc_init_ddr4(dev); } else { debug("Unsupported DRAM3\n"); return -EINVAL; diff --git a/drivers/ram/aspeed/sdram_ast2600.c b/drivers/ram/aspeed/sdram_ast2600.c index 97ca6a44702d..4e46370e2a57 100644 --- a/drivers/ram/aspeed/sdram_ast2600.c +++ b/drivers/ram/aspeed/sdram_ast2600.c @@ -862,17 +862,17 @@ static void ast2600_sdrammc_update_size(struct dram_info *info) info->info.size = hw_size; } -#ifdef CONFIG_ASPEED_ECC -static void ast2600_sdrammc_ecc_enable(struct dram_info *info) + +static void ast2600_sdrammc_ecc_enable(struct dram_info *info, u32 conf_size_mb) { struct ast2600_sdrammc_regs *regs = info->regs; size_t conf_size; u32 reg; - conf_size = CONFIG_ASPEED_ECC_SIZE * SDRAM_SIZE_1MB; + conf_size = conf_size_mb * SDRAM_SIZE_1MB; if (conf_size > info->info.size) { printf("warning: ECC configured %dMB but actual size is %dMB\n", - CONFIG_ASPEED_ECC_SIZE, + conf_size_mb, info->info.size / SDRAM_SIZE_1MB); conf_size = info->info.size; } else if (conf_size == 0) { @@ -893,7 +893,6 @@ static void ast2600_sdrammc_ecc_enable(struct dram_info *info) writel(BIT(31), ®s->intr_ctrl); writel(0, ®s->intr_ctrl); } -#endif static int ast2600_sdrammc_probe(struct udevice *dev) { @@ -986,9 +985,13 @@ static int ast2600_sdrammc_probe(struct udevice *dev) } #endif -#ifdef CONFIG_ASPEED_ECC - ast2600_sdrammc_ecc_enable(priv); -#endif + if (dev_read_bool(dev, "aspeed,ecc-enabled")) { + u32 ecc_size; + + ecc_size = dev_read_u32_default(dev, "aspeed,ecc-size-mb", 0); + ast2600_sdrammc_ecc_enable(priv, ecc_size); + } + setbits_le32(priv->scu + AST_SCU_HANDSHAKE, SCU_HANDSHAKE_MASK); clrbits_le32(®s->intr_ctrl, MCR50_RESET_ALL_INTR); ast2600_sdrammc_lock(priv);