On Mon, Nov 15, 2010 at 10:28 PM, Dirk Brandewie <dirk.brande...@gmail.com> wrote: > On 11/15/2010 09:17 PM, Grant Likely wrote: >> >> On Mon, Nov 15, 2010 at 10:06 PM, Dirk Brandewie >> <dirk.brande...@gmail.com> wrote: >>> >>> 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. >> >> This rule looks correct. PowerPC and Microblaze need to be modified >> to use it. It should not be hard to do, give it a try. Worst case, >> your first attempt is wrong and the rest of us fix it up. :-) >> >> Hint: PowerPC currently puts the .dtb file in a different directory >> from the source .dts file. It doesn't need to do it that way. >> arch/powerpc/boot/Makefile will need to be modified. >> > > I will give it a shot. The only real difference except for the directory > structures is powerpc and microblaze add padding to the dtb with the -p 1024 > command line argument to dtc.
You could use a $(DTCFLAGS) variable to pass in arch specific flags. > Is the padding needed when the blob are > linked into vmlinux proper? Maybe, maybe not. Padding is required to be able to modify the .dtb data in-place, which is important when adapting data from other sources into the device tree structure. However, when it is linked into the kernel, the adding of additional data /possibly/ can be deferred until after the tree is either copied or unflattened. g. _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev