[PATCH] Actions: S700 Calculate SDRAM size

Manivannan Sadhasivam manivannan.sadhasivam at linaro.org
Mon May 4 07:52:11 CEST 2020


On Sat, May 02, 2020 at 06:55:20PM +0530, Amit Singh Tomar wrote:
> Calculate the SDRAM size from DDR capacity register registers instead of using
> hard-coded value. This is quite useful to get correct size on differnt boards
> based on S700 SoC.
> 
> There is no documentation available that talks about DDR registers, and this
> is very much taken from vendor source.
> 
> This commit lets Linux boot on Cubieboard7-lite (based on S700).
> 
> Signed-off-by: Amit Singh Tomar <amittomer25 at gmail.com>
> ---
> There is bit of a story about it:
>  
> Wasn't really aware that working on a board (CubieBoard7-Lite) that actually
> has only 1GB of RAM untill I see the Kernel crash[1], and DDR size is
> hard-coded to 2GB(as CubieBoard7 comes with 2 GB). With this set-up Kernel
> was trying to access the memory that doesn't exist leads to the crash.
> 
> [1]:
>  
> Starting kernel ...
> 
> [    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
> [    0.000000] Linux version 5.6.0-rc6-00012-g7080a8a-dirty (amit at amit-ThinkPad-X230) (gcc version 7.3.1 20180425 [linaro-7.3-2018.05 revision d29120a424ecfbc167ef90065c0eeb7f91977701] (Linaro GCC 7.3-2018.05)) #10 SMP PREEMPT Fri Mar 27 21:52:07 IST 2020
> [    0.000000] Machine model: CubieBoard7
> [    0.000000] earlycon: owl0 at MMIO 0x00000000e0126000 (options '')
> [    0.000000] printk: bootconsole [owl0] enabled
> [    0.000000] efi: Getting EFI parameters from FDT:
> [    0.000000] efi: UEFI not found.
> [    0.000000] cma: Reserved 32 MiB at 0x000000007e000000
> [    0.000000] NUMA: No NUMA configuration found
> [    0.000000] NUMA: Faking a node at [mem 0x0000000000000000-0x000000007fffffff]
> [    0.000000] NUMA: NODE_DATA [mem 0x7dbfb100-0x7dbfcfff]
> [    0.000000] Zone ranges:
> [    0.000000]   DMA      [mem 0x0000000000000000-0x000000003fffffff]
> [    0.000000]   DMA32    [mem 0x0000000040000000-0x000000007fffffff]
> [    0.000000]   Normal   empty
> [    0.000000] Movable zone start for each node
> [    0.000000] Early memory node ranges
> [    0.000000]   node   0: [mem 0x0000000000000000-0x000000001effffff]
> [    0.000000]   node   0: [mem 0x0000000020000000-0x000000007fffffff]
> [    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000007fffffff]
> [    0.000000] psci: probing for conduit method from DT.
> [    0.000000] psci: PSCIv0.2 detected in firmware.
> [    0.000000] psci: Using standard PSCI v0.2 function IDs
> [    0.000000] psci: Trusted OS migration not required
> [    0.000000] percpu: Embedded 23 pages/cpu s53272 r8192 d32744 u94208
> [    0.000000] Detected VIPT I-cache on CPU0
> [    0.000000] CPU features: detected: ARM erratum 845719
> [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 512000
> [    0.000000] Policy zone: DMA32
> [    0.000000] Kernel command line: console=ttyOWL,115200 earlycon=owl,0xe0126000 root=/dev/mmcblk0p2
> [    0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
> [    0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
> [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> [    0.000000] Unable to handle kernel paging request at virtual address ffff00003de18000
> [    0.000000] Mem abort info:
> [    0.000000]   ESR = 0x96000047
> [    0.000000]   EC = 0x25: DABT (current EL), IL = 32 bits
> [    0.000000]   SET = 0, FnV = 0
> [    0.000000]   EA = 0, S1PTW = 0
> [    0.000000] Data abort info:
> [    0.000000]   ISV = 0, ISS = 0x00000047
> [    0.000000]   CM = 0, WnR = 1
> [    0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001399000
>   
> ---
>  arch/arm/mach-owl/soc.c | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
> diff --git a/arch/arm/mach-owl/soc.c b/arch/arm/mach-owl/soc.c
> index 409cbd3..f63f1a8 100644
> --- a/arch/arm/mach-owl/soc.c
> +++ b/arch/arm/mach-owl/soc.c
> @@ -13,15 +13,38 @@
>  #include <asm/mach-types.h>
>  #include <asm/psci.h>
>  
> +#define DMM_INTERLEAVE_PER_CH_CFG       (0xe0290028)
> +
>  DECLARE_GLOBAL_DATA_PTR;
>  
> +unsigned int get_owl_ram_size(void)
> +{
> +	unsigned int val, cap;
> +
> +	/* ddr capacity register initialized by ddr driver
> +	 * in early bootloader
> +	 * DMM_INTERLEAVE_PER_CH_CFG  bit[10:8]
> +	 * (val + 1) * 256
> +	 */
> +	val = (readl(DMM_INTERLEAVE_PER_CH_CFG) >> 8) & 0x7;
> +	cap =  (val + 1) * 256;
> +
> +	return cap;
> +}
> +
>  /*
>   * dram_init - sets uboots idea of sdram size
>   */
>  int dram_init(void)
>  {
>  	gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
> +
> +#if defined(CONFIG_MACH_S700)
> +	gd->ram_size = get_owl_ram_size() * 1024 * 1024;
> +#endif

Have you checked if this setting can be reused for S900? IMO we should use
this helper for all Owl SoCs. Using CONFIG_SYS_SDRAM_SIZE won't scale.

Thanks,
Mani

> +
>  	return 0;
> +
>  }
>  
>  /* This is called after dram_init() so use get_ram_size result */
> -- 
> 2.7.4
> 


More information about the U-Boot mailing list