diff mbox series

Actions: S700 Calculate SDRAM size

Message ID 1588425920-22403-1-git-send-email-amittomer25@gmail.com
State Superseded
Delegated to: Tom Rini
Headers show
Series Actions: S700 Calculate SDRAM size | expand

Commit Message

Amit Tomer May 2, 2020, 1:25 p.m. UTC
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@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@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(+)

Comments

Manivannan Sadhasivam May 4, 2020, 5:52 a.m. UTC | #1
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@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@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
>
Amit Tomer May 4, 2020, 9:23 a.m. UTC | #2
Hi,

> 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.

Looks like S900 uses different registers to find out the size, but
can't really test
this as I don't have the Hardware based on S900.

Thanks
-Amit.
diff mbox series

Patch

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
+
 	return 0;
+
 }
 
 /* This is called after dram_init() so use get_ram_size result */