diff options
author | Dirk Brandewie <dirk.brandewie@gmail.com> | 2010-12-22 14:57:26 -0500 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-12-23 16:43:00 -0500 |
commit | aab94339cd85d726abeae78fc02351fc1910e6a4 (patch) | |
tree | 25d434a1dec4f758a9938e621dc1516f7a788521 | |
parent | cfb13c5db08c90311a5defdde9a0328ee788cca5 (diff) |
of: Add support for linking device tree blobs into vmlinux
This patch adds support for linking device tree blob(s) into
vmlinux. Modifies asm-generic/vmlinux.lds.h to add linking
.dtb sections into vmlinux. To maintain compatiblity with the of/fdt
driver code platforms MUST copy the blob to a non-init memory location
before the kernel frees the .init.* sections in the image.
Modifies scripts/Makefile.lib to add a kbuild command to
compile DTS files to device tree blobs and a rule to create objects to
wrap the blobs for linking.
STRUCT_ALIGNMENT is defined in vmlinux.lds.h for use in the rule to
create wrapper objects for the dtb in Makefile.lib. The
STRUCT_ALIGN() macro in vmlinux.lds.h is modified to use the
STRUCT_ALIGNMENT definition.
The DTB's are placed on 32 byte boundries to allow parsing the blob
with driver/of/fdt.c during early boot without having to copy the blob
to get the structure alignment GCC expects.
A DTB is linked in by adding the DTB object to the list of objects to
be linked into vmlinux in the archtecture specific Makefile using
obj-y += foo.dtb.o
Signed-off-by: Dirk Brandewie <dirk.brandewie@gmail.com>
Acked-by: Michal Marek <mmarek@suse.cz>
[grant.likely@secretlab.ca: cleaned up whitespace inconsistencies]
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
-rw-r--r-- | Documentation/kbuild/makefiles.txt | 15 | ||||
-rw-r--r-- | include/asm-generic/vmlinux.lds.h | 13 | ||||
-rw-r--r-- | scripts/Makefile.lib | 23 |
3 files changed, 49 insertions, 2 deletions
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt index 0ef00bd6e54d..86e3cd0d26a0 100644 --- a/Documentation/kbuild/makefiles.txt +++ b/Documentation/kbuild/makefiles.txt | |||
@@ -1136,6 +1136,21 @@ When kbuild executes, the following steps are followed (roughly): | |||
1136 | resulting in the target file being recompiled for no | 1136 | resulting in the target file being recompiled for no |
1137 | obvious reason. | 1137 | obvious reason. |
1138 | 1138 | ||
1139 | dtc | ||
1140 | Create flattend device tree blob object suitable for linking | ||
1141 | into vmlinux. Device tree blobs linked into vmlinux are placed | ||
1142 | in an init section in the image. Platform code *must* copy the | ||
1143 | blob to non-init memory prior to calling unflatten_device_tree(). | ||
1144 | |||
1145 | Example: | ||
1146 | #arch/x86/platform/ce4100/Makefile | ||
1147 | clean-files := *dtb.S | ||
1148 | |||
1149 | DTC_FLAGS := -p 1024 | ||
1150 | obj-y += foo.dtb.o | ||
1151 | |||
1152 | $(obj)/%.dtb: $(src)/%.dts | ||
1153 | $(call cmd,dtc) | ||
1139 | 1154 | ||
1140 | --- 6.7 Custom kbuild commands | 1155 | --- 6.7 Custom kbuild commands |
1141 | 1156 | ||
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index bd69d79208de..05cbad03c5ab 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -67,7 +67,8 @@ | |||
67 | * Align to a 32 byte boundary equal to the | 67 | * Align to a 32 byte boundary equal to the |
68 | * alignment gcc 4.5 uses for a struct | 68 | * alignment gcc 4.5 uses for a struct |
69 | */ | 69 | */ |
70 | #define STRUCT_ALIGN() . = ALIGN(32) | 70 | #define STRUCT_ALIGNMENT 32 |
71 | #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) | ||
71 | 72 | ||
72 | /* The actual configuration determine if the init/exit sections | 73 | /* The actual configuration determine if the init/exit sections |
73 | * are handled as text/data or they can be discarded (which | 74 | * are handled as text/data or they can be discarded (which |
@@ -146,6 +147,13 @@ | |||
146 | #define TRACE_SYSCALLS() | 147 | #define TRACE_SYSCALLS() |
147 | #endif | 148 | #endif |
148 | 149 | ||
150 | |||
151 | #define KERNEL_DTB() \ | ||
152 | STRUCT_ALIGN(); \ | ||
153 | VMLINUX_SYMBOL(__dtb_start) = .; \ | ||
154 | *(.dtb.init.rodata) \ | ||
155 | VMLINUX_SYMBOL(__dtb_end) = .; | ||
156 | |||
149 | /* .data section */ | 157 | /* .data section */ |
150 | #define DATA_DATA \ | 158 | #define DATA_DATA \ |
151 | *(.data) \ | 159 | *(.data) \ |
@@ -468,7 +476,8 @@ | |||
468 | MCOUNT_REC() \ | 476 | MCOUNT_REC() \ |
469 | DEV_DISCARD(init.rodata) \ | 477 | DEV_DISCARD(init.rodata) \ |
470 | CPU_DISCARD(init.rodata) \ | 478 | CPU_DISCARD(init.rodata) \ |
471 | MEM_DISCARD(init.rodata) | 479 | MEM_DISCARD(init.rodata) \ |
480 | KERNEL_DTB() | ||
472 | 481 | ||
473 | #define INIT_TEXT \ | 482 | #define INIT_TEXT \ |
474 | *(.init.text) \ | 483 | *(.init.text) \ |
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 4c72c1189479..396da16aabf8 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
@@ -200,6 +200,29 @@ quiet_cmd_gzip = GZIP $@ | |||
200 | cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \ | 200 | cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \ |
201 | (rm -f $@ ; false) | 201 | (rm -f $@ ; false) |
202 | 202 | ||
203 | # DTC | ||
204 | # --------------------------------------------------------------------------- | ||
205 | |||
206 | # Generate an assembly file to wrap the output of the device tree compiler | ||
207 | quiet_cmd_dt_S_dtb= DTB $@ | ||
208 | cmd_dt_S_dtb= \ | ||
209 | ( \ | ||
210 | echo '\#include <asm-generic/vmlinux.lds.h>'; \ | ||
211 | echo '.section .dtb.init.rodata,"a"'; \ | ||
212 | echo '.balign STRUCT_ALIGNMENT'; \ | ||
213 | echo '.global __dtb_$(*F)_begin'; \ | ||
214 | echo '__dtb_$(*F)_begin:'; \ | ||
215 | echo '.incbin "$<" '; \ | ||
216 | echo '__dtb_$(*F)_end:'; \ | ||
217 | echo '.global __dtb_$(*F)_end'; \ | ||
218 | echo '.balign STRUCT_ALIGNMENT'; \ | ||
219 | ) > $@ | ||
220 | |||
221 | $(obj)/%.dtb.S: $(obj)/%.dtb | ||
222 | $(call cmd,dt_S_dtb) | ||
223 | |||
224 | quiet_cmd_dtc = DTC $@ | ||
225 | cmd_dtc = $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 $(DTC_FLAGS) $< | ||
203 | 226 | ||
204 | # Bzip2 | 227 | # Bzip2 |
205 | # --------------------------------------------------------------------------- | 228 | # --------------------------------------------------------------------------- |