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

Reply via email to