On 11/15/2010 08:41 PM, Grant Likely wrote:
On Mon, Nov 15, 2010 at 08:01:20PM -0800, dirk.brande...@gmail.com wrote:
From: Dirk Brandewie<dirk.brande...@gmail.com>
This patch adds support for linking device tree blobs into
vmlinux. The device tree blobs are placed in the init.data
section.
Signed-off-by: Dirk Brandewie<dirk.brande...@gmail.com>
---
include/asm-generic/vmlinux.lds.h | 19 +++++++++++++++++--
scripts/Makefile.lib | 17 +++++++++++++++++
2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/include/asm-generic/vmlinux.lds.h
b/include/asm-generic/vmlinux.lds.h
index bd69d79..ea671e7 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -67,7 +67,14 @@
* Align to a 32 byte boundary equal to the
* alignment gcc 4.5 uses for a struct
*/
-#define STRUCT_ALIGN() . = ALIGN(32)
+#define STRUCT_ALIGNMENT 32
+#define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT)
+
+/* Device tree blobs linked into the kernel need to have proper
+ * structure alignment to be parsed by the flat device tree library
+ * used in early boot
+*/
+#define DTB_ALIGNMENT STRUCT_ALIGNMENT
/* The actual configuration determine if the init/exit sections
* are handled as text/data or they can be discarded (which
@@ -146,6 +153,13 @@
#define TRACE_SYSCALLS()
#endif
+
+#define KERNEL_DTB() \
+ . = ALIGN(DTB_ALIGNMENT); \
+ VMLINUX_SYMBOL(__dtb_start) = .; \
+ *(.dtb.init.rodata) \
+ VMLINUX_SYMBOL(__dtb_end) = .;
+
/* .data section */
#define DATA_DATA \
*(.data) \
@@ -468,7 +482,8 @@
MCOUNT_REC() \
DEV_DISCARD(init.rodata) \
CPU_DISCARD(init.rodata) \
- MEM_DISCARD(init.rodata)
+ MEM_DISCARD(init.rodata) \
+ KERNEL_DTB()
#define INIT_TEXT \
*(.init.text) \
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 4c72c11..a8a4774 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -200,6 +200,23 @@ quiet_cmd_gzip = GZIP $@
cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9> $@) || \
(rm -f $@ ; false)
+# DTC
+# ---------------------------------------------------------------------------
+$(obj)/%.dtb.S: $(obj)/%.dtb FORCE
+ @echo '#include<asm-generic/vmlinux.lds.h>'> $@
+ @echo '.section .dtb.init.rodata,"a"'>> $@
+ @echo '.balign DTB_ALIGNMENT'>> $@
+ @echo '.global __dtb_$(*F)_begin'>> $@
+ @echo '__dtb_$(*F)_begin:'>> $@
+ @echo '.incbin "$<" '>> $@
+ @echo '__dtb_$(*F)_end:'>> $@
+ @echo '.global __dtb_$(*F)_end'>> $@
+ @echo '.balign DTB_ALIGNMENT'>> $@
+
+DTC = $(objtree)/scripts/dtc/dtc
+
+quiet_cmd_dtc = DTC $@
+ cmd_dtc = $(DTC) -O dtb -o $(obj)/$*.dtb -b 0 $(src)/$*.dts
Missing the %.dtb: %.dts rule, but otherwise looks okay. You will
need to make sure this doesn't break powerpc or microblaze when the
dts->dtb rule is added.
I have the rule
$(obj)/%.dtb: $(src)/%.dts
$(call if_changed,dtc)
in the arch/x86/kernel/Makefile to prevent this sneaking into other other
architectures.
I need some more skilled in kbuild to help craft the more generic rule so we can
have the dts files anywhere in the arch/<*>/ directory structure and be able to
find the correct dts files.
--Dirk
_______________________________________________
devicetree-discuss mailing list
devicetree-discuss@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/devicetree-discuss