OpenWrt – Rev 1

Subversion Repositories:
Rev:
From: Alexey Brodkin <abrodkin@synopsys.com>
Subject: openwrt: arc - add OWRTDTB section

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
@@ -421,6 +421,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
@@ -434,7 +436,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)