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>
This commit is contained in:
parent
cfb13c5db0
commit
aab94339cd
|
@ -1136,6 +1136,21 @@ When kbuild executes, the following steps are followed (roughly):
|
||||||
resulting in the target file being recompiled for no
|
resulting in the target file being recompiled for no
|
||||||
obvious reason.
|
obvious reason.
|
||||||
|
|
||||||
|
dtc
|
||||||
|
Create flattend device tree blob object suitable for linking
|
||||||
|
into vmlinux. Device tree blobs linked into vmlinux are placed
|
||||||
|
in an init section in the image. Platform code *must* copy the
|
||||||
|
blob to non-init memory prior to calling unflatten_device_tree().
|
||||||
|
|
||||||
|
Example:
|
||||||
|
#arch/x86/platform/ce4100/Makefile
|
||||||
|
clean-files := *dtb.S
|
||||||
|
|
||||||
|
DTC_FLAGS := -p 1024
|
||||||
|
obj-y += foo.dtb.o
|
||||||
|
|
||||||
|
$(obj)/%.dtb: $(src)/%.dts
|
||||||
|
$(call cmd,dtc)
|
||||||
|
|
||||||
--- 6.7 Custom kbuild commands
|
--- 6.7 Custom kbuild commands
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,8 @@
|
||||||
* Align to a 32 byte boundary equal to the
|
* Align to a 32 byte boundary equal to the
|
||||||
* alignment gcc 4.5 uses for a struct
|
* alignment gcc 4.5 uses for a struct
|
||||||
*/
|
*/
|
||||||
#define STRUCT_ALIGN() . = ALIGN(32)
|
#define STRUCT_ALIGNMENT 32
|
||||||
|
#define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT)
|
||||||
|
|
||||||
/* The actual configuration determine if the init/exit sections
|
/* The actual configuration determine if the init/exit sections
|
||||||
* are handled as text/data or they can be discarded (which
|
* are handled as text/data or they can be discarded (which
|
||||||
|
@ -146,6 +147,13 @@
|
||||||
#define TRACE_SYSCALLS()
|
#define TRACE_SYSCALLS()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define KERNEL_DTB() \
|
||||||
|
STRUCT_ALIGN(); \
|
||||||
|
VMLINUX_SYMBOL(__dtb_start) = .; \
|
||||||
|
*(.dtb.init.rodata) \
|
||||||
|
VMLINUX_SYMBOL(__dtb_end) = .;
|
||||||
|
|
||||||
/* .data section */
|
/* .data section */
|
||||||
#define DATA_DATA \
|
#define DATA_DATA \
|
||||||
*(.data) \
|
*(.data) \
|
||||||
|
@ -468,7 +476,8 @@
|
||||||
MCOUNT_REC() \
|
MCOUNT_REC() \
|
||||||
DEV_DISCARD(init.rodata) \
|
DEV_DISCARD(init.rodata) \
|
||||||
CPU_DISCARD(init.rodata) \
|
CPU_DISCARD(init.rodata) \
|
||||||
MEM_DISCARD(init.rodata)
|
MEM_DISCARD(init.rodata) \
|
||||||
|
KERNEL_DTB()
|
||||||
|
|
||||||
#define INIT_TEXT \
|
#define INIT_TEXT \
|
||||||
*(.init.text) \
|
*(.init.text) \
|
||||||
|
|
|
@ -200,6 +200,29 @@ quiet_cmd_gzip = GZIP $@
|
||||||
cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \
|
cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \
|
||||||
(rm -f $@ ; false)
|
(rm -f $@ ; false)
|
||||||
|
|
||||||
|
# DTC
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Generate an assembly file to wrap the output of the device tree compiler
|
||||||
|
quiet_cmd_dt_S_dtb= DTB $@
|
||||||
|
cmd_dt_S_dtb= \
|
||||||
|
( \
|
||||||
|
echo '\#include <asm-generic/vmlinux.lds.h>'; \
|
||||||
|
echo '.section .dtb.init.rodata,"a"'; \
|
||||||
|
echo '.balign STRUCT_ALIGNMENT'; \
|
||||||
|
echo '.global __dtb_$(*F)_begin'; \
|
||||||
|
echo '__dtb_$(*F)_begin:'; \
|
||||||
|
echo '.incbin "$<" '; \
|
||||||
|
echo '__dtb_$(*F)_end:'; \
|
||||||
|
echo '.global __dtb_$(*F)_end'; \
|
||||||
|
echo '.balign STRUCT_ALIGNMENT'; \
|
||||||
|
) > $@
|
||||||
|
|
||||||
|
$(obj)/%.dtb.S: $(obj)/%.dtb
|
||||||
|
$(call cmd,dt_S_dtb)
|
||||||
|
|
||||||
|
quiet_cmd_dtc = DTC $@
|
||||||
|
cmd_dtc = $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 $(DTC_FLAGS) $<
|
||||||
|
|
||||||
# Bzip2
|
# Bzip2
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue