133 lines
3.8 KiB
Diff
133 lines
3.8 KiB
Diff
|
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)
|