You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.2 KiB
81 lines
2.2 KiB
8 years ago
|
From: Alexey Brodkin <abrodkin@synopsys.com>
|
||
8 years ago
|
Subject: openwrt: arc - add OWRTDTB section
|
||
8 years ago
|
|
||
|
This change allows OpenWRT to patch resulting kernel binary with
|
||
|
external .dtb.
|
||
|
|
||
|
That allows us to re-use exactky the same vmlinux on different boards
|
||
|
given its ARC core configurations match (at least cache line sizes etc).
|
||
|
|
||
|
""patch-dtb" searches for ASCII "OWRTDTB:" strign and copies external
|
||
|
.dtb right after it, keeping the string in place.
|
||
|
|
||
|
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
|
||
|
---
|
||
|
arch/arc/kernel/head.S | 10 ++++++++++
|
||
|
arch/arc/kernel/setup.c | 4 +++-
|
||
|
arch/arc/kernel/vmlinux.lds.S | 13 +++++++++++++
|
||
|
3 files changed, 26 insertions(+), 1 deletion(-)
|
||
|
|
||
|
--- a/arch/arc/kernel/head.S
|
||
|
+++ b/arch/arc/kernel/head.S
|
||
|
@@ -49,6 +49,16 @@
|
||
|
1:
|
||
|
.endm
|
||
|
|
||
|
+; Here "patch-dtb" will embed external .dtb
|
||
|
+; Note "patch-dtb" searches for ASCII "OWRTDTB:" string
|
||
|
+; and pastes .dtb right after it, hense the string precedes
|
||
|
+; __image_dtb symbol.
|
||
|
+ .section .owrt, "aw",@progbits
|
||
|
+ .ascii "OWRTDTB:"
|
||
|
+ENTRY(__image_dtb)
|
||
|
+ .fill 0x4000
|
||
|
+END(__image_dtb)
|
||
|
+
|
||
|
.section .init.text, "ax",@progbits
|
||
|
|
||
|
;----------------------------------------------------------------
|
||
|
--- a/arch/arc/kernel/setup.c
|
||
|
+++ b/arch/arc/kernel/setup.c
|
||
|
@@ -388,6 +388,8 @@ static inline int is_kernel(unsigned lon
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+extern struct boot_param_header __image_dtb;
|
||
|
+
|
||
|
void __init setup_arch(char **cmdline_p)
|
||
|
{
|
||
|
#ifdef CONFIG_ARC_UBOOT_SUPPORT
|
||
|
@@ -401,7 +403,7 @@ void __init setup_arch(char **cmdline_p)
|
||
|
#endif
|
||
|
{
|
||
|
/* No, so try the embedded one */
|
||
|
- machine_desc = setup_machine_fdt(__dtb_start);
|
||
|
+ machine_desc = setup_machine_fdt(&__image_dtb);
|
||
|
if (!machine_desc)
|
||
|
panic("Embedded DT invalid\n");
|
||
|
|
||
|
--- a/arch/arc/kernel/vmlinux.lds.S
|
||
|
+++ b/arch/arc/kernel/vmlinux.lds.S
|
||
|
@@ -30,6 +30,19 @@ SECTIONS
|
||
|
|
||
|
. = CONFIG_LINUX_LINK_BASE;
|
||
|
|
||
|
+ /*
|
||
|
+ * In OpenWRT we want to patch built binary embedding .dtb of choice.
|
||
|
+ * This is implemented with "patch-dtb" utility which searches for
|
||
|
+ * "OWRTDTB:" string in first 16k of image and if it is found
|
||
|
+ * copies .dtb right after mentioned string.
|
||
|
+ *
|
||
|
+ * Note: "OWRTDTB:" won't be overwritten with .dtb, .dtb will follow it.
|
||
|
+ */
|
||
|
+ .owrt : {
|
||
|
+ *(.owrt)
|
||
|
+ . = ALIGN(PAGE_SIZE);
|
||
|
+ }
|
||
|
+
|
||
|
_int_vec_base_lds = .;
|
||
|
.vector : {
|
||
|
*(.vector)
|