ARM: uniphier: make mem_map run-time configurable

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>
diff --git a/arch/arm/mach-uniphier/arm64/mem_map.c b/arch/arm/mach-uniphier/arm64/mem_map.c
index 35e75e2..7653bd2 100644
--- a/arch/arm/mach-uniphier/arm64/mem_map.c
+++ b/arch/arm/mach-uniphier/arm64/mem_map.c
@@ -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 @@
 };
 
 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;
+}
diff --git a/arch/arm/mach-uniphier/dram_init.c b/arch/arm/mach-uniphier/dram_init.c
index ab4aa93..970fa09 100644
--- a/arch/arm/mach-uniphier/dram_init.c
+++ b/arch/arm/mach-uniphier/dram_init.c
@@ -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_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 @@
 		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;
+		}
 
-		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;
+
+		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;
 }
diff --git a/arch/arm/mach-uniphier/init.h b/arch/arm/mach-uniphier/init.h
index c6b3f36..b37ab2f 100644
--- a/arch/arm/mach-uniphier/init.h
+++ b/arch/arm/mach-uniphier/init.h
@@ -102,5 +102,13 @@
 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 */