]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
ARM: renesas: Configure DRAM size from ATF DT fragment
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Tue, 2 Oct 2018 18:40:58 +0000 (20:40 +0200)
committerMarek Vasut <marex@denx.de>
Sat, 4 May 2019 17:26:49 +0000 (19:26 +0200)
The ATF can pass additional information via the first four registers,
x0...x3. The R-Car Gen3 with mainline ATF, register x1 contains pointer
to a device tree with platform information. Parse this device tree and
extract DRAM size information from it. This is useful on systems where
the DRAM size can vary between configurations.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
board/renesas/ebisu/ebisu.c
board/renesas/salvator-x/salvator-x.c
board/renesas/ulcb/ulcb.c

index 5d8b79eee319e51774524c26257a2c409623e6c7..60429e45290267d0b7822b59c3b4b153e482ae46 100644 (file)
@@ -43,17 +43,37 @@ int board_init(void)
        return 0;
 }
 
+/*
+ * If the firmware passed a device tree use it for U-Boot DRAM setup.
+ */
+extern u64 rcar_atf_boot_args[];
+
 int dram_init(void)
 {
-       if (fdtdec_setup_mem_size_base() != 0)
-               return -EINVAL;
+       const void *atf_fdt_blob = (const void *)(rcar_atf_boot_args[1]);
+       const void *blob;
 
-       return 0;
+       /* Check if ATF passed us DTB. If not, fall back to builtin DTB. */
+       if (fdt_magic(atf_fdt_blob) == FDT_MAGIC)
+               blob = atf_fdt_blob;
+       else
+               blob = gd->fdt_blob;
+
+       return fdtdec_setup_mem_size_base_fdt(blob);
 }
 
 int dram_init_banksize(void)
 {
-       fdtdec_setup_memory_banksize();
+       const void *atf_fdt_blob = (const void *)(rcar_atf_boot_args[1]);
+       const void *blob;
+
+       /* Check if ATF passed us DTB. If not, fall back to builtin DTB. */
+       if (fdt_magic(atf_fdt_blob) == FDT_MAGIC)
+               blob = atf_fdt_blob;
+       else
+               blob = gd->fdt_blob;
+
+       fdtdec_setup_memory_banksize_fdt(blob);
 
        return 0;
 }
index 8f0247e046159046cd2cfaf5ae6983900a6d42ba..1db08fce6a2aa03202d3e304a47630a25912a768 100644 (file)
@@ -69,17 +69,37 @@ int board_init(void)
        return 0;
 }
 
+/*
+ * If the firmware passed a device tree use it for U-Boot DRAM setup.
+ */
+extern u64 rcar_atf_boot_args[];
+
 int dram_init(void)
 {
-       if (fdtdec_setup_mem_size_base() != 0)
-               return -EINVAL;
+       const void *atf_fdt_blob = (const void *)(rcar_atf_boot_args[1]);
+       const void *blob;
 
-       return 0;
+       /* Check if ATF passed us DTB. If not, fall back to builtin DTB. */
+       if (fdt_magic(atf_fdt_blob) == FDT_MAGIC)
+               blob = atf_fdt_blob;
+       else
+               blob = gd->fdt_blob;
+
+       return fdtdec_setup_mem_size_base_fdt(blob);
 }
 
 int dram_init_banksize(void)
 {
-       fdtdec_setup_memory_banksize();
+       const void *atf_fdt_blob = (const void *)(rcar_atf_boot_args[1]);
+       const void *blob;
+
+       /* Check if ATF passed us DTB. If not, fall back to builtin DTB. */
+       if (fdt_magic(atf_fdt_blob) == FDT_MAGIC)
+               blob = atf_fdt_blob;
+       else
+               blob = gd->fdt_blob;
+
+       fdtdec_setup_memory_banksize_fdt(blob);
 
        return 0;
 }
index 9785107e56bba5f197dbe735e6d1ab89e38fadca..faf19c3580303acb800e8db4a4211bcae1d3af5b 100644 (file)
@@ -68,17 +68,37 @@ int board_init(void)
        return 0;
 }
 
+/*
+ * If the firmware passed a device tree use it for U-Boot DRAM setup.
+ */
+extern u64 rcar_atf_boot_args[];
+
 int dram_init(void)
 {
-       if (fdtdec_setup_mem_size_base() != 0)
-               return -EINVAL;
+       const void *atf_fdt_blob = (const void *)(rcar_atf_boot_args[1]);
+       const void *blob;
 
-       return 0;
+       /* Check if ATF passed us DTB. If not, fall back to builtin DTB. */
+       if (fdt_magic(atf_fdt_blob) == FDT_MAGIC)
+               blob = atf_fdt_blob;
+       else
+               blob = gd->fdt_blob;
+
+       return fdtdec_setup_mem_size_base_fdt(blob);
 }
 
 int dram_init_banksize(void)
 {
-       fdtdec_setup_memory_banksize();
+       const void *atf_fdt_blob = (const void *)(rcar_atf_boot_args[1]);
+       const void *blob;
+
+       /* Check if ATF passed us DTB. If not, fall back to builtin DTB. */
+       if (fdt_magic(atf_fdt_blob) == FDT_MAGIC)
+               blob = atf_fdt_blob;
+       else
+               blob = gd->fdt_blob;
+
+       fdtdec_setup_memory_banksize_fdt(blob);
 
        return 0;
 }