[PATCH v3 6/7] drivers: ddr: altera: Improve DRAM init with Dcache

Ravulapalli, Naresh Kumar nareshkumar.ravulapalli at altera.com
Tue Jun 10 08:53:05 CEST 2025


Hi Tien Fong

On 06-Jun-25 12:15 PM, Chee, Tien Fong wrote:
> Hi,
> 
>> -----Original Message-----
>> From: Ravulapalli, Naresh Kumar <naresh.kumar.ravulapalli at altera.com>
>> Sent: Tuesday, June 3, 2025 7:55 PM
>> To: u-boot at lists.denx.de
>> Cc: Marek Vasut <marex at denx.de>; Simon Goldschmidt
>> <simon.k.r.goldschmidt at gmail.com>; Chee, Tien Fong
>> <tien.fong.chee at altera.com>; Tom Rini <trini at konsulko.com>; Ravulapalli,
>> Naresh Kumar <naresh.kumar.ravulapalli at altera.com>
>> Subject: [PATCH v3 6/7] drivers: ddr: altera: Improve DRAM init with Dcache
>>
>> Initialize DRAM memory fully to bring it into a known state. The process is
>> improved by enabling the Dcache. Also, if hardware watchdog is configured,
>> it is reconfigured to avoid timeout.
>>
>> Signed-off-by: Naresh Kumar Ravulapalli
>> <nareshkumar.ravulapalli at altera.com>
>> Signed-off-by: Tien Fong Chee <tien.fong.chee at altera.com>
>> ---
>>   drivers/ddr/altera/sdram_arria10.c |  3 +-
>>   drivers/ddr/altera/sdram_soc32.c   | 52 ++++++++++++++++++++++++------
>>   drivers/ddr/altera/sdram_soc32.h   |  2 +-
>>   3 files changed, 45 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/ddr/altera/sdram_arria10.c
>> b/drivers/ddr/altera/sdram_arria10.c
>> index a1288d5fb50..6cb5002208b 100644
>> --- a/drivers/ddr/altera/sdram_arria10.c
>> +++ b/drivers/ddr/altera/sdram_arria10.c
>> @@ -4,7 +4,6 @@
>>    * Copyright (C) 2025 Altera Corporation <www.altera.com>
>>    */
>>
>> -#include <cpu_func.h>
>>   #include <errno.h>
>>   #include <fdtdec.h>
>>   #include <init.h>
>> @@ -719,7 +718,7 @@ int ddr_calibration_sequence(void)
>>   		puts("FW: Error Configuring Firewall\n");
>>
>>   	if (sdram_is_ecc_enabled())
>> -		sdram_init_ecc_bits(gd->ram_size);
>> +		sdram_init_ecc_bits();
>>
>>   	sdram_size_check();
>>
>> diff --git a/drivers/ddr/altera/sdram_soc32.c
>> b/drivers/ddr/altera/sdram_soc32.c
>> index 0b928a2352f..5cdf48d2d01 100644
>> --- a/drivers/ddr/altera/sdram_soc32.c
>> +++ b/drivers/ddr/altera/sdram_soc32.c
>> @@ -7,25 +7,59 @@
>>   #include <asm/system.h>
>>   #include <linux/sizes.h>
>>   #include "sdram_soc32.h"
>> +#include <watchdog.h>
> 
> Moving the watchdog.h as first header
> https://docs.u-boot.org/en/latest/develop/codingstyle.html
> Please refer Include Header section
> 

Acknowledge the comment, will fix it in next version.

>>
>>   DECLARE_GLOBAL_DATA_PTR;
>>
>>   #define PGTABLE_OFF	0x4000
>>
>>   /* Initialize SDRAM ECC bits to avoid false DBE */ -void
>> sdram_init_ecc_bits(u32 size)
>> +void sdram_init_ecc_bits(void)
>>   {
>> -	icache_enable();
>> +	u32 start;
>> +	phys_addr_t start_addr, saved_start;
>> +	phys_size_t size, size_init, saved_size;
>> +	enum dcache_option option = DCACHE_WRITEBACK;
>>
>> -	memset(0, 0, 0x8000);
>> -	gd->arch.tlb_addr = 0x4000;
>> -	gd->arch.tlb_size = PGTABLE_SIZE;
>> +	if (IS_ENABLED(CONFIG_SYS_ARM_CACHE_WRITETHROUGH))
>> +		option = DCACHE_WRITETHROUGH;
>> +	else if (IS_ENABLED(CONFIG_SYS_ARM_CACHE_WRITEALLOC))
>> +		option = DCACHE_WRITEALLOC;
>> +
>> +	start = get_timer(0);
>> +
>> +	start_addr = gd->bd->bi_dram[0].start;
>> +	size = gd->bd->bi_dram[0].size;
>>
>> +	printf("DDRCAL: Initialize ECC RAM (%ld MiB).\n", size >> 20);
>> +
>> +	memset((void *)start_addr, 0, PGTABLE_SIZE + PGTABLE_OFF);
>> +	gd->arch.tlb_addr = start_addr + PGTABLE_OFF;
>> +	gd->arch.tlb_size = PGTABLE_SIZE;
>> +	start_addr += PGTABLE_SIZE + PGTABLE_OFF;
>> +	size -= (PGTABLE_OFF + PGTABLE_SIZE);
>>   	dcache_enable();
>>
>> -	printf("DDRCAL: Scrubbing ECC RAM (%i MiB).\n", size >> 20);
>> -	memset((void *)0x8000, 0, size - 0x8000);
>> -	flush_dcache_all();
>> -	printf("DDRCAL: Scrubbing ECC RAM done.\n");
>> +	saved_start = start_addr;
>> +	saved_size = size;
>> +	/* Set SDRAM region to writethrough to avoid false double-bit error.
>> */
>> +	mmu_set_region_dcache_behaviour(saved_start, saved_size,
>> +					DCACHE_WRITETHROUGH);
>> +
>> +	while (size > 0) {
>> +		size_init = min((phys_addr_t)SZ_1G, (phys_addr_t)size);
>> +		memset((void *)start_addr, 0, size_init);
>> +		size -= size_init;
>> +		start_addr += size_init;
>> +		schedule();
>> +	}
>> +
>>   	dcache_disable();
>> +
>> +	/* Restore back to original dcache behaviour. */
>> +	mmu_set_region_dcache_behaviour(saved_start, saved_size,
>> +					option);
>> +
>> +	printf("DDRCAL: SDRAM-ECC successfully initialized within %d ms\n",
>> +	       (u32)get_timer(start));
>>   }
>> diff --git a/drivers/ddr/altera/sdram_soc32.h
>> b/drivers/ddr/altera/sdram_soc32.h
>> index 4c6137e728d..85a951a5a74 100644
>> --- a/drivers/ddr/altera/sdram_soc32.h
>> +++ b/drivers/ddr/altera/sdram_soc32.h
>> @@ -6,6 +6,6 @@
>>   #ifndef	_SDRAM_SOC32_H_
>>   #define	_SDRAM_SOC32_H_
>>
>> -void sdram_init_ecc_bits(u32 size);
>> +void sdram_init_ecc_bits(void);
>>
>>   #endif /* _SDRAM_SOC32_H_ */
>> --
>> 2.35.3
> 

Kind Regards
Naresh



More information about the U-Boot mailing list