[PATCH v2 1/1] Revert "MIPS: of: Introduce helper function to get DTB"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ath79 does not compile if CONFIG_MIPS_ELF_APPENDED_DTB is enabled. Simple
removal of 'const' fixes compilation but booting a device is stopped
short.

This reverts commit b83ba0b9df56f8404ccc6ebcc7050fb8294f0f20.

Signed-off-by: Mauri Sandberg <sandberg@xxxxxxxxxxxxx>
---
 arch/mips/ath79/setup.c               | 13 ++++++-----
 arch/mips/bmips/setup.c               |  7 +++---
 arch/mips/generic/init.c              |  5 +++--
 arch/mips/include/asm/bootinfo.h      | 22 +------------------
 arch/mips/include/asm/octeon/octeon.h |  1 +
 arch/mips/kernel/head.S               | 31 +++++++++++++++++++++++++++
 arch/mips/kernel/setup.c              |  4 ++++
 arch/mips/lantiq/prom.c               |  7 ++++--
 arch/mips/pic32/pic32mzda/init.c      | 15 ++++++++++++-
 arch/mips/ralink/of.c                 | 11 +++++++---
 10 files changed, 77 insertions(+), 39 deletions(-)

diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c
index 891f495c4c3c..7e7bf9c2ad26 100644
--- a/arch/mips/ath79/setup.c
+++ b/arch/mips/ath79/setup.c
@@ -213,17 +213,16 @@ unsigned int get_c0_compare_int(void)
 
 void __init plat_mem_setup(void)
 {
-	void *dtb;
+	unsigned long fdt_start;
 
 	set_io_port_base(KSEG1);
 
 	/* Get the position of the FDT passed by the bootloader */
-	dtb = (void *)fw_getenvl("fdt_start");
-	if (dtb == NULL)
-		dtb = get_fdt();
-
-	if (dtb)
-		__dt_setup_arch((void *)KSEG0ADDR(dtb));
+	fdt_start = fw_getenvl("fdt_start");
+	if (fdt_start)
+		__dt_setup_arch((void *)KSEG0ADDR(fdt_start));
+	else if (fw_passed_dtb)
+		__dt_setup_arch((void *)KSEG0ADDR(fw_passed_dtb));
 
 	ath79_reset_base = ioremap(AR71XX_RESET_BASE,
 					   AR71XX_RESET_SIZE);
diff --git a/arch/mips/bmips/setup.c b/arch/mips/bmips/setup.c
index 31bcfa4e08b9..7392edbd19e7 100644
--- a/arch/mips/bmips/setup.c
+++ b/arch/mips/bmips/setup.c
@@ -161,10 +161,11 @@ void __init plat_mem_setup(void)
 	/* intended to somewhat resemble ARM; see Documentation/arm/booting.rst */
 	if (fw_arg0 == 0 && fw_arg1 == 0xffffffff)
 		dtb = phys_to_virt(fw_arg2);
+	else if (fw_passed_dtb) /* UHI interface or appended dtb */
+		dtb = (void *)fw_passed_dtb;
+	else if (&__dtb_start != &__dtb_end)
+		dtb = (void *)__dtb_start;
 	else
-		dtb = get_fdt();
-
-	if (!dtb)
 		panic("no dtb found");
 
 	__dt_setup_arch(dtb);
diff --git a/arch/mips/generic/init.c b/arch/mips/generic/init.c
index 1842cddd8356..68763fcde1d0 100644
--- a/arch/mips/generic/init.c
+++ b/arch/mips/generic/init.c
@@ -39,13 +39,14 @@ void __init *plat_get_fdt(void)
 		/* Already set up */
 		return (void *)fdt;
 
-	fdt = (void *)get_fdt();
-	if (fdt && !fdt_check_header(fdt)) {
+	if (fw_passed_dtb && !fdt_check_header((void *)fw_passed_dtb)) {
 		/*
 		 * We have been provided with the appropriate device tree for
 		 * the board. Make use of it & search for any machine struct
 		 * based upon the root compatible string.
 		 */
+		fdt = (void *)fw_passed_dtb;
+
 		for_each_mips_machine(check_mach) {
 			match = mips_machine_is_compatible(check_mach, fdt);
 			if (match) {
diff --git a/arch/mips/include/asm/bootinfo.h b/arch/mips/include/asm/bootinfo.h
index 5be10ece3ef0..aa03b1237155 100644
--- a/arch/mips/include/asm/bootinfo.h
+++ b/arch/mips/include/asm/bootinfo.h
@@ -112,27 +112,7 @@ extern char arcs_cmdline[COMMAND_LINE_SIZE];
 extern unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
 
 #ifdef CONFIG_USE_OF
-#include <linux/libfdt.h>
-#include <linux/of_fdt.h>
-
-extern char __appended_dtb[];
-
-static inline void *get_fdt(void)
-{
-	if (IS_ENABLED(CONFIG_MIPS_RAW_APPENDED_DTB) ||
-	    IS_ENABLED(CONFIG_MIPS_ELF_APPENDED_DTB))
-		if (fdt_magic(&__appended_dtb) == FDT_MAGIC)
-			return &__appended_dtb;
-
-	if (fw_arg0 == -2) /* UHI interface */
-		return (void *)fw_arg1;
-
-	if (IS_ENABLED(CONFIG_BUILTIN_DTB))
-		if (&__dtb_start != &__dtb_end)
-			return &__dtb_start;
-
-	return NULL;
-}
+extern unsigned long fw_passed_dtb;
 #endif
 
 /*
diff --git a/arch/mips/include/asm/octeon/octeon.h b/arch/mips/include/asm/octeon/octeon.h
index 7e714aefc76d..08d48f37c046 100644
--- a/arch/mips/include/asm/octeon/octeon.h
+++ b/arch/mips/include/asm/octeon/octeon.h
@@ -282,6 +282,7 @@ union octeon_cvmemctl {
 extern void octeon_check_cpu_bist(void);
 
 int octeon_prune_device_tree(void);
+extern const char __appended_dtb;
 extern const char __dtb_octeon_3xxx_begin;
 extern const char __dtb_octeon_68xx_begin;
 
diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
index b825ed4476c7..61b73580b877 100644
--- a/arch/mips/kernel/head.S
+++ b/arch/mips/kernel/head.S
@@ -93,6 +93,33 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
 	jr	t0
 0:
 
+#ifdef CONFIG_USE_OF
+#if defined(CONFIG_MIPS_RAW_APPENDED_DTB) || \
+	defined(CONFIG_MIPS_ELF_APPENDED_DTB)
+
+	PTR_LA		t2, __appended_dtb
+
+#ifdef CONFIG_CPU_BIG_ENDIAN
+	li		t1, 0xd00dfeed
+#else  /* !CONFIG_CPU_BIG_ENDIAN */
+	li		t1, 0xedfe0dd0
+#endif /* !CONFIG_CPU_BIG_ENDIAN */
+	lw		t0, (t2)
+	beq		t0, t1, dtb_found
+#endif /* CONFIG_MIPS_RAW_APPENDED_DTB || CONFIG_MIPS_ELF_APPENDED_DTB */
+	li		t1, -2
+	move		t2, a1
+	beq		a0, t1, dtb_found
+
+#ifdef CONFIG_BUILTIN_DTB
+	PTR_LA	t2, __dtb_start
+	PTR_LA	t1, __dtb_end
+	bne		t1, t2, dtb_found
+#endif /* CONFIG_BUILTIN_DTB */
+
+	li		t2, 0
+dtb_found:
+#endif /* CONFIG_USE_OF */
 	PTR_LA		t0, __bss_start		# clear .bss
 	LONG_S		zero, (t0)
 	PTR_LA		t1, __bss_stop - LONGSIZE
@@ -106,6 +133,10 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
 	LONG_S		a2, fw_arg2
 	LONG_S		a3, fw_arg3
 
+#ifdef CONFIG_USE_OF
+	LONG_S		t2, fw_passed_dtb
+#endif
+
 	MTC0		zero, CP0_CONTEXT	# clear context register
 #ifdef CONFIG_64BIT
 	MTC0		zero, CP0_XCONTEXT
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
index 279be0153f8b..2546f2fd2eb6 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -784,6 +784,10 @@ void __init setup_arch(char **cmdline_p)
 unsigned long kernelsp[NR_CPUS];
 unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
 
+#ifdef CONFIG_USE_OF
+unsigned long fw_passed_dtb;
+#endif
+
 #ifdef CONFIG_DEBUG_FS
 struct dentry *mips_debugfs_dir;
 static int __init debugfs_mips(void)
diff --git a/arch/mips/lantiq/prom.c b/arch/mips/lantiq/prom.c
index bc9f58fcbdf9..363937121617 100644
--- a/arch/mips/lantiq/prom.c
+++ b/arch/mips/lantiq/prom.c
@@ -73,8 +73,11 @@ void __init plat_mem_setup(void)
 
 	set_io_port_base((unsigned long) KSEG1);
 
-	dtb = get_fdt();
-	if (dtb == NULL)
+	if (fw_passed_dtb) /* UHI interface */
+		dtb = (void *)fw_passed_dtb;
+	else if (&__dtb_start != &__dtb_end)
+		dtb = (void *)__dtb_start;
+	else
 		panic("no dtb found");
 
 	/*
diff --git a/arch/mips/pic32/pic32mzda/init.c b/arch/mips/pic32/pic32mzda/init.c
index 764f2d022fae..1897aa863573 100644
--- a/arch/mips/pic32/pic32mzda/init.c
+++ b/arch/mips/pic32/pic32mzda/init.c
@@ -21,11 +21,24 @@ const char *get_system_type(void)
 	return "PIC32MZDA";
 }
 
+static ulong get_fdtaddr(void)
+{
+	ulong ftaddr = 0;
+
+	if (fw_passed_dtb && !fw_arg2 && !fw_arg3)
+		return (ulong)fw_passed_dtb;
+
+	if (&__dtb_start < &__dtb_end)
+		ftaddr = (ulong)__dtb_start;
+
+	return ftaddr;
+}
+
 void __init plat_mem_setup(void)
 {
 	void *dtb;
 
-	dtb = get_fdt();
+	dtb = (void *)get_fdtaddr();
 	if (!dtb) {
 		pr_err("pic32: no DTB found.\n");
 		return;
diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c
index 8286c3521476..2c9af61efc20 100644
--- a/arch/mips/ralink/of.c
+++ b/arch/mips/ralink/of.c
@@ -64,15 +64,20 @@ static int __init early_init_dt_find_memory(unsigned long node,
 
 void __init plat_mem_setup(void)
 {
-	void *dtb;
+	void *dtb = NULL;
 
 	set_io_port_base(KSEG1);
 
 	/*
 	 * Load the builtin devicetree. This causes the chosen node to be
-	 * parsed resulting in our memory appearing.
+	 * parsed resulting in our memory appearing. fw_passed_dtb is used
+	 * by CONFIG_MIPS_APPENDED_RAW_DTB as well.
 	 */
-	dtb = get_fdt();
+	if (fw_passed_dtb)
+		dtb = (void *)fw_passed_dtb;
+	else if (&__dtb_start != &__dtb_end)
+		dtb = (void *)__dtb_start;
+
 	__dt_setup_arch(dtb);
 
 	of_scan_flat_dt(early_init_dt_find_memory, NULL);
-- 
2.25.1




[Index of Archives]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux