diff --git a/arch/arm/mach-uniphier/Makefile b/arch/arm/mach-uniphier/Makefile
index caa79d1e53e6..115af244cd55 100644
--- a/arch/arm/mach-uniphier/Makefile
+++ b/arch/arm/mach-uniphier/Makefile
@@ -13,6 +13,7 @@ else
 obj-$(CONFIG_DISPLAY_CPUINFO) += cpu-info.o
 obj-y += dram_init.o
 obj-y += board_init.o
+obj-$(CONFIG_ARCH_UNIPHIER_V8_MULTI) += base-address.o
 obj-$(CONFIG_BOARD_LATE_INIT) += board_late_init.o
 ifndef CONFIG_SYSRESET
 obj-y += reset.o
diff --git a/arch/arm/mach-uniphier/base-address.c b/arch/arm/mach-uniphier/base-address.c
new file mode 100644
index 000000000000..5ee742e363ff
--- /dev/null
+++ b/arch/arm/mach-uniphier/base-address.c
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (C) 2019 Socionext Inc.
+//   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
+
+#include <common.h>
+#include <dm/of.h>
+#include <fdt_support.h>
+#include <linux/io.h>
+#include <linux/libfdt.h>
+#include <linux/sizes.h>
+#include <asm/global_data.h>
+
+#include "base-address.h"
+#include "sc64-regs.h"
+#include "sg-regs.h"
+
+/*
+ * Dummy initializers are needed to allocate these to .data section instead of
+ * .bss section. The .bss section is unusable before relocation because the
+ * .bss section and DT share the same address. Without the initializers,
+ * DT would be broken.
+ */
+void __iomem *sc_base = (void *)0xdeadbeef;
+void __iomem *sg_base = (void *)0xdeadbeef;
+
+static u64 uniphier_base_address_get(const char *compat_tail)
+{
+	DECLARE_GLOBAL_DATA_PTR;
+	const void *fdt = gd->fdt_blob;
+	int offset, len, i;
+	const char *str;
+
+	for (offset = fdt_next_node(fdt, 0, NULL);
+	     offset >= 0;
+	     offset = fdt_next_node(fdt, offset, NULL)) {
+		for (i = 0;
+		     (str = fdt_stringlist_get(fdt, offset, "compatible", i, &len));
+		     i++) {
+			if (!memcmp(compat_tail,
+				    str + len - strlen(compat_tail),
+				    strlen(compat_tail)))
+				return fdt_get_base_address(fdt, offset);
+		}
+	}
+
+	return OF_BAD_ADDR;
+}
+
+int uniphier_base_address_init(void)
+{
+	u64 base;
+
+	base = uniphier_base_address_get("-soc-glue");
+	if (base == OF_BAD_ADDR)
+		return -EINVAL;
+
+	sg_base = ioremap(base, SZ_8K);
+
+	base = uniphier_base_address_get("-sysctrl");
+	if (base == OF_BAD_ADDR)
+		return -EINVAL;
+
+	sc_base = ioremap(base, SZ_64K);
+
+	return 0;
+}
diff --git a/arch/arm/mach-uniphier/base-address.h b/arch/arm/mach-uniphier/base-address.h
new file mode 100644
index 000000000000..6158ce7d66a1
--- /dev/null
+++ b/arch/arm/mach-uniphier/base-address.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2019 Socionext Inc.
+ */
+
+#ifndef __UNIPHIER_BASE_ADDRESS_H
+#define __UNIPHIER_BASE_ADDRESS_H
+
+#ifdef CONFIG_ARCH_UNIPHIER_V8_MULTI
+int uniphier_base_address_init(void);
+#else
+static inline int uniphier_base_address_init(void)
+{
+	return 0;
+}
+#endif
+
+#endif /* __UNIPHIER_BASE_ADDRESS_H */
diff --git a/arch/arm/mach-uniphier/cpu-info.c b/arch/arm/mach-uniphier/cpu-info.c
index 9f5f5051b318..6a7b203a44da 100644
--- a/arch/arm/mach-uniphier/cpu-info.c
+++ b/arch/arm/mach-uniphier/cpu-info.c
@@ -10,11 +10,17 @@
 #include <linux/io.h>
 #include <linux/printk.h>
 
+#include "base-address.h"
 #include "soc-info.h"
 
 int print_cpuinfo(void)
 {
 	unsigned int id, model, rev, required_model = 1, required_rev = 1;
+	int ret;
+
+	ret = uniphier_base_address_init();
+	if (ret)
+		return ret;
 
 	id = uniphier_get_soc_id();
 	model = uniphier_get_soc_model();
diff --git a/arch/arm/mach-uniphier/sc64-regs.h b/arch/arm/mach-uniphier/sc64-regs.h
index 1f3b41a336b3..fdcca232b61c 100644
--- a/arch/arm/mach-uniphier/sc64-regs.h
+++ b/arch/arm/mach-uniphier/sc64-regs.h
@@ -11,7 +11,7 @@
 
 #ifndef __ASSEMBLY__
 #include <linux/compiler.h>
-#define sc_base			((void __iomem *)SC_BASE)
+extern void __iomem *sc_base;
 #endif
 
 #define SC_BASE			0x61840000
diff --git a/arch/arm/mach-uniphier/sg-regs.h b/arch/arm/mach-uniphier/sg-regs.h
index cba02d1f4aee..f47d10194987 100644
--- a/arch/arm/mach-uniphier/sg-regs.h
+++ b/arch/arm/mach-uniphier/sg-regs.h
@@ -12,8 +12,12 @@
 
 #ifndef __ASSEMBLY__
 #include <linux/compiler.h>
+#ifdef CONFIG_ARCH_UNIPHIER_V8_MULTI
+extern void __iomem *sg_base;
+#else
 #define sg_base			((void __iomem *)SG_BASE)
 #endif
+#endif /* __ASSEMBLY__ */
 
 /* Base Address */
 #define SG_BASE			0x5f800000
