From patchwork Wed Dec 1 19:41:32 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: dirk.brandewie@gmail.com X-Patchwork-Id: 73888 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id 9231CB7632 for ; Thu, 2 Dec 2010 06:42:59 +1100 (EST) Received: from mail-yw0-f51.google.com (mail-yw0-f51.google.com [209.85.213.51]) by ozlabs.org (Postfix) with ESMTP id 04DA0B70B0; Thu, 2 Dec 2010 06:42:27 +1100 (EST) Received: by ywg8 with SMTP id 8so727372ywg.38 for ; Wed, 01 Dec 2010 11:42:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer:in-reply-to:references:in-reply-to:references; bh=PKtgbPTDzm6GVJ2A/d8BdjVkbHsQmYcO/yU3uT6CoBA=; b=o6acyl+YKbAuj/D8JJtHQ9rKaJ3lUGnAX0ohZfq4S/9XZqnTsz0M3GiXCAAQMmT+nf tL0hF5WGTNU37LRG16N19WPL+CPffAMs/vpF8V5LDfdUxUw595gWfZySGanI3eK4EgLO vaagVCISN1qh0014wvVmYvugvtzeqn9S+KHHU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=W6Fwv3CUJy6JdgmvLW4rPVLJnPADfZ9ZMBoqtGnym4QsN9SgUR2srOx4c8hvnG//9q oTt7Zrk2qs/7NrFCsEOc/CeVxklTI35uSjInDx4zkLET1cCR7AvF3wowx67qMx9QX+/R c6dM9+J5nrqmyohz3CU8c7ladLV5y0KlFRDNM= Received: by 10.231.12.131 with SMTP id x3mr9463716ibx.31.1291232545350; Wed, 01 Dec 2010 11:42:25 -0800 (PST) Received: from localhost.localdomain (pool-173-50-249-160.ptldor.fios.verizon.net [173.50.249.160]) by mx.google.com with ESMTPS id i16sm196995ibl.12.2010.12.01.11.42.18 (version=TLSv1/SSLv3 cipher=RC4-MD5); Wed, 01 Dec 2010 11:42:20 -0800 (PST) From: dirk.brandewie@gmail.com To: linux-serial@vger.kernel.org Subject: [PATCH 1/4] of: Add support for linking device tree blobs into vmlinux Date: Wed, 1 Dec 2010 11:41:32 -0800 Message-Id: <76a37fa459aeadce5d11db8a7cc044687a2e0e8c.1291231792.git.dirk.brandewie@gmail.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: References: In-Reply-To: References: Cc: linux-arch@vger.kernel.org, mmarek@suse.cz, microblaze-uclinux@itee.uq.edu.au, devicetree-discuss@lists.ozlabs.org, sodaville@linutronix.de, Dirk Brandewie , linuxppc-dev@lists.ozlabs.org X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org From: Dirk Brandewie 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 --- Documentation/kbuild/makefiles.txt | 15 +++++++++++++++ include/asm-generic/vmlinux.lds.h | 15 ++++++++++++--- scripts/Makefile.lib | 21 ++++++++++++++++++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt index 0ef00bd..fc18bb1 100644 --- a/Documentation/kbuild/makefiles.txt +++ b/Documentation/kbuild/makefiles.txt @@ -1136,6 +1136,21 @@ When kbuild executes, the following steps are followed (roughly): resulting in the target file being recompiled for no 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 if_changed,dtc) --- 6.7 Custom kbuild commands diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index bd69d79..024d3b9 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -23,7 +23,7 @@ * _etext = .; * * _sdata = .; - * RO_DATA_SECTION(PAGE_SIZE) +* RO_DATA_SECTION(PAGE_SIZE) * RW_DATA_SECTION(...) * _edata = .; * @@ -67,7 +67,8 @@ * 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) /* The actual configuration determine if the init/exit sections * are handled as text/data or they can be discarded (which @@ -146,6 +147,13 @@ #define TRACE_SYSCALLS() #endif + +#define KERNEL_DTB() \ + STRUCT_ALIGN(); \ + VMLINUX_SYMBOL(__dtb_start) = .; \ + *(.dtb.init.rodata) \ + VMLINUX_SYMBOL(__dtb_end) = .; + /* .data section */ #define DATA_DATA \ *(.data) \ @@ -468,7 +476,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..937eabbb 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -200,7 +200,26 @@ quiet_cmd_gzip = GZIP $@ cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \ (rm -f $@ ; false) - +# DTC +# --------------------------------------------------------------------------- + +# Generate an assembly file to wrap the output of the device tree compiler +$(obj)/%.dtb.S: $(obj)/%.dtb + @echo '#include ' > $@ + @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' >> $@ + +DTC = $(objtree)/scripts/dtc/dtc + +quiet_cmd_dtc = DTC $@ + cmd_dtc = $(DTC) -O dtb -o $@ -b 0 $(DTC_FLAGS) $< +ooo # Bzip2 # ---------------------------------------------------------------------------