123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- From 318c1fce4aeef298cbb6153416c499c94ad7cda0 Mon Sep 17 00:00:00 2001
- From: Jonas Gorski <jogo@openwrt.org>
- Date: Tue, 24 Jun 2014 10:53:15 +0200
- Subject: [PATCH RFC v3] MIPS: add support for vmlinux.bin appended DTB
- Add support for populating initial_boot_params through a dtb
- blob appended to raw vmlinux.bin.
- Signed-off-by: Jonas Gorski <jogo@openwrt.org>
- ---
- Changes RFC v2 -> v3
- * fixed !smp kernels (TODO: move it to its own patch
- Changes RFC v1 -> v2
- * changed all occurences of vmlinux to vmlinux.bin
- * clarified this applies to the raw vmlinux.bin without decompressor
- * s/initial_device_params/initial_boot_params/
- Initial comments by me still valid:
- Mostly adapted from how ARM is doing it.
- Sent as an RFC PATCH because I am not sure if this is the right way to
- it, and whether storing the pointer in initial_boot_params is a good
- idea, or a new variable should be introduced.
- The reasoning for initial_boot_params is that there is no common
- MIPS interface yet, so the next best thing was using that. This also
- has the advantage of keeping the original fw_args intact.
- This patch works for me on bcm63xx, where the bootloader expects
- an lzma compressed kernel, so I didn't want to double compress using
- the in-kernel compressed kernel support.
- Completely untested on anything except MIPS32 / big endian.
- arch/mips/Kconfig | 18 ++++++++++++++++++
- arch/mips/kernel/head.S | 19 +++++++++++++++++++
- arch/mips/kernel/vmlinux.lds.S | 7 +++++++
- 3 files changed, 43 insertions(+)
- --- a/arch/mips/Kconfig
- +++ b/arch/mips/Kconfig
- @@ -2655,6 +2655,24 @@ config RAPIDIO
-
- source "drivers/rapidio/Kconfig"
-
- +config MIPS_APPENDED_DTB
- + bool "Use appended device tree blob to vmlinux.bin (EXPERIMENTAL)"
- + depends on OF
- + help
- + With this option, the boot code will look for a device tree binary
- + DTB) appended to raw vmlinux.bin (without decompressor).
- + (e.g. cat vmlinux.bin <filename>.dtb > vmlinux_w_dtb).
- +
- + This is meant as a backward compatibility convenience for those
- + systems with a bootloader that can't be upgraded to accommodate
- + the documented boot protocol using a device tree.
- +
- + Beware that there is very little in terms of protection against
- + this option being confused by leftover garbage in memory that might
- + look like a DTB header after a reboot if no actual DTB is appended
- + to vmlinux.bin. Do not leave this option active in a production kernel
- + if you don't intend to always append a DTB.
- +
- endmenu
-
- menu "Executable file formats"
- --- a/arch/mips/kernel/head.S
- +++ b/arch/mips/kernel/head.S
- @@ -100,6 +100,22 @@ NESTED(kernel_entry, 16, sp) # kernel
- jr t0
- 0:
-
- +#ifdef CONFIG_MIPS_APPENDED_DTB
- + PTR_LA t0, __appended_dtb
- + PTR_LI t3, 0
- +
- +#ifdef CONFIG_CPU_BIG_ENDIAN
- + PTR_LI t1, 0xd00dfeed
- +#else
- + PTR_LI t1, 0xedfe0dd0
- +#endif
- + LONG_L t2, (t0)
- + bne t1, t2, not_found
- +
- + PTR_LA t3, __appended_dtb
- +
- +not_found:
- +#endif
- PTR_LA t0, __bss_start # clear .bss
- LONG_S zero, (t0)
- PTR_LA t1, __bss_stop - LONGSIZE
- @@ -113,6 +129,10 @@ NESTED(kernel_entry, 16, sp) # kernel
- LONG_S a2, fw_arg2
- LONG_S a3, fw_arg3
-
- +#ifdef CONFIG_MIPS_APPENDED_DTB
- + LONG_S t3, initial_boot_params
- +#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/vmlinux.lds.S
- +++ b/arch/mips/kernel/vmlinux.lds.S
- @@ -125,8 +125,14 @@ SECTIONS
- .exit.data : {
- EXIT_DATA
- }
- -
- +#ifdef CONFIG_SMP
- PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
- +#endif
- +#ifdef CONFIG_MIPS_APPENDED_DTB
- + __appended_dtb = .;
- + /* leave space for appended DTB */
- + . = . + 0x100000;
- +#endif
- /*
- * Align to 64K in attempt to eliminate holes before the
- * .bss..swapper_pg_dir section at the start of .bss. This
|