ARM: uniphier: make mem_map run-time configurable
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Wed, 10 Jul 2019 11:07:45 +0000 (20:07 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Wed, 10 Jul 2019 13:42:05 +0000 (22:42 +0900)
Currently, mem_map is hard-coded, and it worked well until the last
SoC. For a planned new SoC, the addresses of peripherals and DRAM
will be changed. Set it up run-time.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
arch/arm/mach-uniphier/arm64/mem_map.c
arch/arm/mach-uniphier/dram_init.c
arch/arm/mach-uniphier/init.h

index 35e75e2ab2d2903ffa24aeb87264d8667989b63a..7653bd2d3c65874208376dfb127b65f839b69dec 100644 (file)
@@ -7,6 +7,8 @@
 #include <linux/types.h>
 #include <asm/armv8/mmu.h>
 
+#include "../init.h"
+
 static struct mm_region uniphier_mem_map[] = {
        {
                .virt = 0x00000000,
@@ -27,3 +29,11 @@ static struct mm_region uniphier_mem_map[] = {
 };
 
 struct mm_region *mem_map = uniphier_mem_map;
+
+void uniphier_mem_map_init(unsigned long dram_base, unsigned long dram_size)
+{
+       uniphier_mem_map[0].size = dram_base;
+       uniphier_mem_map[1].virt = dram_base;
+       uniphier_mem_map[1].phys = dram_base;
+       uniphier_mem_map[1].size = dram_size;
+}
index ab4aa93f42a6108eae9b19b3ae46d845d643d321..970fa09ef03c0aaa6d76ba01572bb2b590e336a1 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/sizes.h>
 #include <asm/global_data.h>
 
+#include "init.h"
 #include "sg-regs.h"
 #include "soc-info.h"
 
@@ -271,6 +272,8 @@ int dram_init(void)
 int dram_init_banksize(void)
 {
        struct uniphier_dram_map dram_map[3] = {};
+       unsigned long base, top;
+       bool valid_bank_found = false;
        int ret, i;
 
        ret = uniphier_dram_map_get(dram_map);
@@ -278,12 +281,25 @@ int dram_init_banksize(void)
                return ret;
 
        for (i = 0; i < ARRAY_SIZE(dram_map); i++) {
-               if (i >= ARRAY_SIZE(gd->bd->bi_dram))
-                       break;
+               if (i < ARRAY_SIZE(gd->bd->bi_dram)) {
+                       gd->bd->bi_dram[i].start = dram_map[i].base;
+                       gd->bd->bi_dram[i].size = dram_map[i].size;
+               }
+
+               if (!dram_map[i].size)
+                       continue;
 
-               gd->bd->bi_dram[i].start = dram_map[i].base;
-               gd->bd->bi_dram[i].size = dram_map[i].size;
+               if (!valid_bank_found)
+                       base = dram_map[i].base;
+               top = dram_map[i].base + dram_map[i].size;
+               valid_bank_found = true;
        }
 
+       if (!valid_bank_found)
+               return -EINVAL;
+
+       /* map all the DRAM regions */
+       uniphier_mem_map_init(base, top - base);
+
        return 0;
 }
index c6b3f3656ccc347ad4aa7ded09d435baf21bca5e..b37ab2fa508db367051d5335b9f6452604743116 100644 (file)
@@ -102,5 +102,13 @@ unsigned int uniphier_boot_device_raw(void);
 int uniphier_have_internal_stm(void);
 int uniphier_boot_from_backend(void);
 int uniphier_pin_init(const char *pinconfig_name);
+#ifdef CONFIG_ARM64
+void uniphier_mem_map_init(unsigned long dram_base, unsigned long dram_size);
+#else
+static inline void uniphier_mem_map_init(unsigned long dram_base,
+                                        unsigned long dram_size)
+{
+}
+#endif
 
 #endif /* __MACH_INIT_H */