aboutsummaryrefslogtreecommitdiff
path: root/nixos/modules/kernel-patches/0042-arc-add-OWRTDTB-section.patch
blob: 402ea476ca39777235580d0016b70ad50a683d16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
From ec54842bfce8240815a9ce7a1db0935851fe9ea8 Mon Sep 17 00:00:00 2001
From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
Date: Fri, 15 Mar 2019 18:53:38 +0300
Subject: [PATCH 42/96] 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: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Signed-off-by: Evgeniy Didin <Evgeniy.Didin@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(-)

diff --git a/arch/arc/kernel/head.S b/arch/arc/kernel/head.S
index 9152782444b5..167d81ce6ab7 100644
--- a/arch/arc/kernel/head.S
+++ b/arch/arc/kernel/head.S
@@ -88,6 +88,16 @@
 	DSP_EARLY_INIT
 .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
 
 ;----------------------------------------------------------------
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c
index 41f07b3e594e..d0c3e7817022 100644
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
@@ -495,6 +495,8 @@ static inline bool uboot_arg_invalid(unsigned long addr)
 /* We always pass 0 as magic from U-boot */
 #define UBOOT_MAGIC_VALUE	0
 
+extern struct boot_param_header __image_dtb;
+
 void __init handle_uboot_args(void)
 {
 	bool use_embedded_dtb = true;
@@ -533,7 +535,7 @@ void __init handle_uboot_args(void)
 ignore_uboot_args:
 
 	if (use_embedded_dtb) {
-		machine_desc = setup_machine_fdt(__dtb_start);
+		machine_desc = setup_machine_fdt(&__image_dtb);
 		if (!machine_desc)
 			panic("Embedded DT invalid\n");
 	}
diff --git a/arch/arc/kernel/vmlinux.lds.S b/arch/arc/kernel/vmlinux.lds.S
index 529ae50f9fe2..ecdcd6842c0d 100644
--- a/arch/arc/kernel/vmlinux.lds.S
+++ b/arch/arc/kernel/vmlinux.lds.S
@@ -27,6 +27,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)
-- 
2.37.2