提交 15f37e15 编写于 作者: J Jonas Gorski 提交者: Ralf Baechle

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: NJonas 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: NRalf Baechle <ralf@linux-mips.org>
上级 b8f54f2c
...@@ -204,8 +204,8 @@ void __init plat_mem_setup(void) ...@@ -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) else if (fw_passed_dtb)
__dt_setup_arch((void *)KSEG0ADDR(fw_arg1)); __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,
......
...@@ -162,8 +162,8 @@ void __init plat_mem_setup(void) ...@@ -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 */ else if (fw_passed_dtb) /* UHI interface */
dtb = (void *)fw_arg1; 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
......
...@@ -127,6 +127,10 @@ extern char arcs_cmdline[COMMAND_LINE_SIZE]; ...@@ -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
*/ */
......
...@@ -93,21 +93,24 @@ NESTED(kernel_entry, 16, sp) # kernel entry point ...@@ -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) lw t0, (t2)
bne t1, t2, not_found beq t0, t1, dtb_found
nop #endif
li t1, -2
beq a0, t1, dtb_found
move t2, a1
move a1, t0 li t2, 0
PTR_LI a0, -2 dtb_found:
not_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: ...@@ -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. */
......
...@@ -875,6 +875,10 @@ void __init setup_arch(char **cmdline_p) ...@@ -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)
......
...@@ -74,8 +74,8 @@ void __init plat_mem_setup(void) ...@@ -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 */ if (fw_passed_dtb) /* UHI interface */
dtb = (void *)fw_arg1; 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
......
...@@ -33,8 +33,8 @@ static ulong get_fdtaddr(void) ...@@ -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) if (fw_passed_dtb && !fw_arg2 && !fw_arg3)
return (ulong)fw_arg1; return (ulong)fw_passed_dtb;
if (__dtb_start < __dtb_end) if (__dtb_start < __dtb_end)
ftaddr = (ulong)__dtb_start; ftaddr = (ulong)__dtb_start;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册