Browse Source

MIPS: store the appended dtb address in a variable

Instead of rewriting the arguments to match the UHI spec, store the
address of a appended or UHI supplied dtb in fw_supplied_dtb.

That way the original bootloader arugments are kept intact while still
making the use of an appended dtb invisible for mach code.

Mach code can still find out if it is an appended dtb by comparing
fw_arg1 with fw_supplied_dtb.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
Cc: Kevin Cernekee <cernekee@gmail.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: John Crispin <john@phrozen.org>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Alban Bedel <albeu@free.fr>
Cc: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
Cc: Antony Pavlov <antonynpavlov@gmail.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/13699/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Jonas Gorski 9 years ago
parent
commit
15f37e1588

+ 2 - 2
arch/mips/ath79/setup.c

@@ -204,8 +204,8 @@ void __init plat_mem_setup(void)
 	fdt_start = fw_getenvl("fdt_start");
 	fdt_start = fw_getenvl("fdt_start");
 	if (fdt_start)
 	if (fdt_start)
 		__dt_setup_arch((void *)KSEG0ADDR(fdt_start));
 		__dt_setup_arch((void *)KSEG0ADDR(fdt_start));
-	else if (fw_arg0 == -2)
-		__dt_setup_arch((void *)KSEG0ADDR(fw_arg1));
+	else if (fw_passed_dtb)
+		__dt_setup_arch((void *)KSEG0ADDR(fw_passed_dtb));
 
 
 	if (mips_machtype != ATH79_MACH_GENERIC_OF) {
 	if (mips_machtype != ATH79_MACH_GENERIC_OF) {
 		ath79_reset_base = ioremap_nocache(AR71XX_RESET_BASE,
 		ath79_reset_base = ioremap_nocache(AR71XX_RESET_BASE,

+ 2 - 2
arch/mips/bmips/setup.c

@@ -162,8 +162,8 @@ void __init plat_mem_setup(void)
 	/* intended to somewhat resemble ARM; see Documentation/arm/Booting */
 	/* intended to somewhat resemble ARM; see Documentation/arm/Booting */
 	if (fw_arg0 == 0 && fw_arg1 == 0xffffffff)
 	if (fw_arg0 == 0 && fw_arg1 == 0xffffffff)
 		dtb = phys_to_virt(fw_arg2);
 		dtb = phys_to_virt(fw_arg2);
-	else if (fw_arg0 == -2) /* UHI interface */
-		dtb = (void *)fw_arg1;
+	else if (fw_passed_dtb) /* UHI interface */
+		dtb = (void *)fw_passed_dtb;
 	else if (__dtb_start != __dtb_end)
 	else if (__dtb_start != __dtb_end)
 		dtb = (void *)__dtb_start;
 		dtb = (void *)__dtb_start;
 	else
 	else

+ 4 - 0
arch/mips/include/asm/bootinfo.h

@@ -127,6 +127,10 @@ extern char arcs_cmdline[COMMAND_LINE_SIZE];
  */
  */
 extern unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
 extern unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
 
 
+#ifdef CONFIG_USE_OF
+extern unsigned long fw_passed_dtb;
+#endif
+
 /*
 /*
  * Platform memory detection hook called by setup_arch
  * Platform memory detection hook called by setup_arch
  */
  */

+ 14 - 7
arch/mips/kernel/head.S

@@ -93,21 +93,24 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
 	jr	t0
 	jr	t0
 0:
 0:
 
 
+#ifdef CONFIG_USE_OF
 #ifdef CONFIG_MIPS_RAW_APPENDED_DTB
 #ifdef CONFIG_MIPS_RAW_APPENDED_DTB
-	PTR_LA		t0, __appended_dtb
+	PTR_LA		t2, __appended_dtb
 
 
 #ifdef CONFIG_CPU_BIG_ENDIAN
 #ifdef CONFIG_CPU_BIG_ENDIAN
 	li		t1, 0xd00dfeed
 	li		t1, 0xd00dfeed
 #else
 #else
 	li		t1, 0xedfe0dd0
 	li		t1, 0xedfe0dd0
 #endif
 #endif
-	lw		t2, (t0)
-	bne		t1, t2, not_found
-	 nop
+	lw		t0, (t2)
+	beq		t0, t1, dtb_found
+#endif
+	li		t1, -2
+	beq		a0, t1, dtb_found
+	move		t2, a1
 
 
-	move		a1, t0
-	PTR_LI		a0, -2
-not_found:
+	li		t2, 0
+dtb_found:
 #endif
 #endif
 	PTR_LA		t0, __bss_start		# clear .bss
 	PTR_LA		t0, __bss_start		# clear .bss
 	LONG_S		zero, (t0)
 	LONG_S		zero, (t0)
@@ -122,6 +125,10 @@ not_found:
 	LONG_S		a2, fw_arg2
 	LONG_S		a2, fw_arg2
 	LONG_S		a3, fw_arg3
 	LONG_S		a3, fw_arg3
 
 
+#ifdef CONFIG_USE_OF
+	LONG_S		t2, fw_passed_dtb
+#endif
+
 	MTC0		zero, CP0_CONTEXT	# clear context register
 	MTC0		zero, CP0_CONTEXT	# clear context register
 	PTR_LA		$28, init_thread_union
 	PTR_LA		$28, init_thread_union
 	/* Set the SP after an empty pt_regs.  */
 	/* Set the SP after an empty pt_regs.  */

+ 4 - 0
arch/mips/kernel/setup.c

@@ -875,6 +875,10 @@ void __init setup_arch(char **cmdline_p)
 unsigned long kernelsp[NR_CPUS];
 unsigned long kernelsp[NR_CPUS];
 unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
 unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
 
 
+#ifdef CONFIG_USE_OF
+unsigned long fw_passed_dtb;
+#endif
+
 #ifdef CONFIG_DEBUG_FS
 #ifdef CONFIG_DEBUG_FS
 struct dentry *mips_debugfs_dir;
 struct dentry *mips_debugfs_dir;
 static int __init debugfs_mips(void)
 static int __init debugfs_mips(void)

+ 2 - 2
arch/mips/lantiq/prom.c

@@ -74,8 +74,8 @@ void __init plat_mem_setup(void)
 
 
 	set_io_port_base((unsigned long) KSEG1);
 	set_io_port_base((unsigned long) KSEG1);
 
 
-	if (fw_arg0 == -2) /* UHI interface */
-		dtb = (void *)fw_arg1;
+	if (fw_passed_dtb) /* UHI interface */
+		dtb = (void *)fw_passed_dtb;
 	else if (__dtb_start != __dtb_end)
 	else if (__dtb_start != __dtb_end)
 		dtb = (void *)__dtb_start;
 		dtb = (void *)__dtb_start;
 	else
 	else

+ 2 - 2
arch/mips/pic32/pic32mzda/init.c

@@ -33,8 +33,8 @@ static ulong get_fdtaddr(void)
 {
 {
 	ulong ftaddr = 0;
 	ulong ftaddr = 0;
 
 
-	if ((fw_arg0 == -2) && fw_arg1 && !fw_arg2 && !fw_arg3)
-		return (ulong)fw_arg1;
+	if (fw_passed_dtb && !fw_arg2 && !fw_arg3)
+		return (ulong)fw_passed_dtb;
 
 
 	if (__dtb_start < __dtb_end)
 	if (__dtb_start < __dtb_end)
 		ftaddr = (ulong)__dtb_start;
 		ftaddr = (ulong)__dtb_start;