aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-4.4/093-MIPS-store-the-appended-dtb-address-in-a-variable.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/patches-4.4/093-MIPS-store-the-appended-dtb-address-in-a-variable.patch')
-rw-r--r--target/linux/generic/patches-4.4/093-MIPS-store-the-appended-dtb-address-in-a-variable.patch132
1 files changed, 132 insertions, 0 deletions
diff --git a/target/linux/generic/patches-4.4/093-MIPS-store-the-appended-dtb-address-in-a-variable.patch b/target/linux/generic/patches-4.4/093-MIPS-store-the-appended-dtb-address-in-a-variable.patch
new file mode 100644
index 0000000000..764c1cb830
--- /dev/null
+++ b/target/linux/generic/patches-4.4/093-MIPS-store-the-appended-dtb-address-in-a-variable.patch
@@ -0,0 +1,132 @@
+From 15f37e1588920e010f20b53f04af94e91b8ee714 Mon Sep 17 00:00:00 2001
+From: Jonas Gorski <jogo@openwrt.org>
+Date: Mon, 20 Jun 2016 11:27:37 +0200
+Subject: [PATCH] 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>
+---
+ arch/mips/ath79/setup.c | 4 ++--
+ arch/mips/bmips/setup.c | 4 ++--
+ arch/mips/include/asm/bootinfo.h | 4 ++++
+ arch/mips/kernel/head.S | 21 ++++++++++++++-------
+ arch/mips/kernel/setup.c | 4 ++++
+ arch/mips/lantiq/prom.c | 4 ++--
+ arch/mips/pic32/pic32mzda/init.c | 4 ++--
+ 7 files changed, 30 insertions(+), 15 deletions(-)
+
+--- a/arch/mips/ath79/setup.c
++++ b/arch/mips/ath79/setup.c
+@@ -207,6 +207,8 @@ void __init plat_mem_setup(void)
+ 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));
+ #ifdef CONFIG_BUILTIN_DTB
+ else
+ __dt_setup_arch(__dtb_start);
+--- a/arch/mips/bmips/setup.c
++++ b/arch/mips/bmips/setup.c
+@@ -149,8 +149,8 @@ void __init plat_mem_setup(void)
+ /* intended to somewhat resemble ARM; see Documentation/arm/Booting */
+ if (fw_arg0 == 0 && fw_arg1 == 0xffffffff)
+ 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)
+ dtb = (void *)__dtb_start;
+ else
+--- a/arch/mips/include/asm/bootinfo.h
++++ b/arch/mips/include/asm/bootinfo.h
+@@ -127,6 +127,10 @@ extern char arcs_cmdline[COMMAND_LINE_SI
+ */
+ 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
+ */
+--- a/arch/mips/kernel/head.S
++++ b/arch/mips/kernel/head.S
+@@ -94,21 +94,24 @@ NESTED(kernel_entry, 16, sp) # kernel
+ jr t0
+ 0:
+
++#ifdef CONFIG_USE_OF
+ #ifdef CONFIG_MIPS_RAW_APPENDED_DTB
+- PTR_LA t0, __appended_dtb
++ PTR_LA t2, __appended_dtb
+
+ #ifdef CONFIG_CPU_BIG_ENDIAN
+ li t1, 0xd00dfeed
+ #else
+ li t1, 0xedfe0dd0
+ #endif
+- lw t2, (t0)
+- bne t1, t2, not_found
+- nop
+-
+- move a1, t0
+- PTR_LI a0, -2
+-not_found:
++ lw t0, (t2)
++ beq t0, t1, dtb_found
++#endif
++ li t1, -2
++ beq a0, t1, dtb_found
++ move t2, a1
++
++ li t2, 0
++dtb_found:
+ #endif
+ PTR_LA t0, __bss_start # clear .bss
+ LONG_S zero, (t0)
+@@ -123,6 +126,10 @@ not_found:
+ 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
+ PTR_LA $28, init_thread_union
+ /* Set the SP after an empty pt_regs. */
+--- a/arch/mips/kernel/setup.c
++++ b/arch/mips/kernel/setup.c
+@@ -814,6 +814,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)