[U-Boot] [linux-sunxi] Re: [PATCH 3/5] sunxi: add 3GiB DRAM detection support in main U-Boot

Icenowy Zheng icenowy at aosc.io
Thu Feb 8 08:10:54 UTC 2018


在 2018-02-08 08:37,André Przywara 写道:
> On 07/02/18 19:35, Icenowy Zheng wrote:
> 
> Hi,
> 
>> Some Allwinner SoCs can use 3GiB DRAM (part of 4GiB or larger module).
>> 
>> As the common get_ram_size function cannot detect non-pow-of-2 memory,
>> add special detect code into the DRAM size code in main U-Boot.
> 
> The original get_ram_size() function is slightly dodgy already (as it
> probes memory by writing). And in general we will never be able to 
> cover
> ARMv7/LPAE machines easily with our current static identify mapping -
> regardless of any probing hacks we pull up.
> 
> So I was wondering if we could either:
> - somehow pass the result of sunxi_dram_init() to U-Boot proper, or

Where to pass it?

I don't think currently we pass anything from SPL to U-Boot. And it's
still a bit possible to use BSP boot0 with mainline U-Boot.

> - call the DRAM size determination routine again

I checked the DRAM controller of H6, and it's not easy to re-calc the
DRAM size -- the DRAM size is only considered when constructing ADDRMAP
registers. We may need to emulate part of the DRAM controller to calc
the size ;-)

> 
> This would give us the definite answer, and would be correct in every
> case. We just need to limit it to the memory map limit, if any.
> 
> But his function below looks really like a hack. If at all, it should 
> be
> part of the get_ram_size() routine itself, as this is not sunxi 
> specific.
> 
> Cheers,
> Andre.
> 
> 
>> Signed-off-by: Icenowy Zheng <icenowy at aosc.io>
>> ---
>>  board/sunxi/board.c            | 23 +++++++++++++++++++++++
>>  include/configs/sunxi-common.h |  2 +-
>>  2 files changed, 24 insertions(+), 1 deletion(-)
>> 
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index 8891961dcc..8d707cbac2 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -256,7 +256,30 @@ int board_init(void)
>> 
>>  int dram_init(void)
>>  {
>> +#if PHYS_SDRAM_0_SIZE == (SZ_2G + SZ_1G)
>> +	/*
>> +	 * get_ram_size() doesn't support non-pow-of-2 sizes, so the 
>> detection
>> +	 * of 3GiB DRAM is implemented here.
>> +	 * It just checks whether the DRAM is bigger than 2GiB, as the DRAM
>> +	 * module is usually 4GiB in this case (and 1GiB is not accessible).
>> +	 */
>> +	u32 save_0, save_2g;
>> +	gd->ram_size = get_ram_size((long *)PHYS_SDRAM_0, SZ_2G);
>> +	if (gd->ram_size == SZ_2G) {
>> +		save_0 = readl(PHYS_SDRAM_0);
>> +		save_2g = readl(PHYS_SDRAM_0 + SZ_2G);
>> +		writel(0, PHYS_SDRAM_0);
>> +		writel(0xaa55aa55, PHYS_SDRAM_0 + SZ_2G);
>> +		dsb();
>> +		if (readl(PHYS_SDRAM_0) != readl(PHYS_SDRAM_0 + SZ_2G)) {
>> +			gd->ram_size = SZ_2G + SZ_1G;
>> +			writel(save_2g, PHYS_SDRAM_0 + SZ_2G);
>> +		}
>> +		writel(save_0, PHYS_SDRAM_0);
>> +	}
>> +#else
>>  	gd->ram_size = get_ram_size((long *)PHYS_SDRAM_0, 
>> PHYS_SDRAM_0_SIZE);
>> +#endif
>> 
>>  	return 0;
>>  }
>> diff --git a/include/configs/sunxi-common.h 
>> b/include/configs/sunxi-common.h
>> index 9b3944ad13..177647e009 100644
>> --- a/include/configs/sunxi-common.h
>> +++ b/include/configs/sunxi-common.h
>> @@ -111,7 +111,7 @@
>> 
>>  #define CONFIG_NR_DRAM_BANKS		1
>>  #define PHYS_SDRAM_0			CONFIG_SYS_SDRAM_BASE
>> -#define PHYS_SDRAM_0_SIZE		0x80000000 /* 2 GiB */
>> +#define PHYS_SDRAM_0_SIZE		CONFIG_SUNXI_DRAM_MAX_SIZE
>> 
>>  #ifdef CONFIG_AHCI
>>  #define CONFIG_SCSI_AHCI_PLAT
>> 


More information about the U-Boot mailing list