[PATCH 0/4] [RFC V4] Adding DTB to architecture independent vmlinux

Dirk Brandewie dirk.j.brandewie at intel.com
Fri Nov 12 10:58:30 EST 2010


Sorry for the poor formatting I will resend as discreet patches to make
commenting easier
--Dirk
On Thu, 2010-11-11 at 15:45 -0800, dirk.brandewie at gmail.com wrote:
> From: Dirk Brandewie <dirk.j.brandewie at intel.com>
> 
> The following series implements the ability to link device tree
> blob(s) into the kernel image.
> 
> Changes since V3:
> Added kernel command line option to pass a "compatible" string to
> select the DTB for the platform.
> 
> Added function to find the compatible DTB in the kernel image if any
> 
> Added code to dtc to force the DTB to be modulo 32 bytes in size
> 
> Changed the alignment of the .dtb section
> 
> ---
> 
> Dirk Brandewie (4):
>       x86/of:  Support building device tree blob(s) into image.
>       of: Add support for linking device tree blobs into vmlinux
>       of/dtc: force dtb size to modulo 32 bytes
>       of/fdt: add kernel command line option for dtb_compat string
> 
> 
>  arch/x86/Kconfig                  |    6 ++++
>  arch/x86/boot/dts/Kconfig         |    8 ++++++
>  arch/x86/kernel/Makefile          |   11 ++++++++
>  drivers/of/fdt.c                  |   52 +++++++++++++++++++++++++++++++++++++
>  include/asm-generic/vmlinux.lds.h |   13 +++++++++
>  include/linux/of_fdt.h            |    9 ++++++
>  init/Kconfig                      |    7 +++++
>  scripts/Makefile.lib              |   14 ++++++++++
>  scripts/dtc/flattree.c            |    6 ++++
>  9 files changed, 123 insertions(+), 3 deletions(-)
>  create mode 100644 arch/x86/boot/dts/Kconfig
> 
> --
> Signature
> 
> From nobody Thu Nov 11 15:42:58 2010
> Subject: [PATCH 1/4] x86/of: Support building device tree blob(s) into image.
> Bcc: dirk.j.brandewie at intel.com
> From: Dirk Brandewie <dirk.j.brandewie at intel.com>
> Date: Thu, 11 Nov 2010 15:42:58 -0800
> Message-ID: <20101111234258.16185.98317.stgit at localhost6.localdomain6>
> In-Reply-To: <20101111234257.16185.6076.stgit at localhost6.localdomain6>
> References: <20101111234257.16185.6076.stgit at localhost6.localdomain6>
> User-Agent: StGit/0.15
> MIME-Version: 1.0
> Content-Type: text/plain; charset="utf-8"
> Content-Transfer-Encoding: 7bit
> 
> From: Dirk Brandewie <dirk.brandewie at gmail.com>
> 
> This patch adds support for linking device tree blobs into vmlinux.
> The blobs linked into the image is controlled via kernel config
> variables
> 
> Signed-off-by: Dirk Brandewie <dirk.brandewie at gmail.com>
> ---
>  arch/x86/Kconfig          |    6 +++++-
>  arch/x86/boot/dts/Kconfig |    8 ++++++++
>  arch/x86/kernel/Makefile  |   11 +++++++++++
>  3 files changed, 24 insertions(+), 1 deletions(-)
>  create mode 100644 arch/x86/boot/dts/Kconfig
> 
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 5904f38..62c195d 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -299,13 +299,17 @@ config X86_BIGSMP
>         ---help---
>           This option is needed for the systems that have more than 8 CPUs
> 
> -config X86_OF
> +menuconfig X86_OF
>         bool "Support for device tree"
>         select OF
>         select OF_FLATTREE
>         ---help---
>           Device tree support on X86.
> 
> +if X86_OF
> +source "arch/x86/boot/dts/Kconfig
> +endif
> +
>  if X86_32
>  config X86_EXTENDED_PLATFORM
>         bool "Support for extended (non-PC) x86 platforms"
> diff --git a/arch/x86/boot/dts/Kconfig b/arch/x86/boot/dts/Kconfig
> new file mode 100644
> index 0000000..5380b6b
> --- /dev/null
> +++ b/arch/x86/boot/dts/Kconfig
> @@ -0,0 +1,8 @@
> +config CE4100_DTB
> +       bool "Intel CE4100"
> +       depends on X86_OF && KERNEL_DTB
> +
> +config TEST_DTB
> +       bool "Test DTS"
> +       depends on  X86_OF && KERNEL_DTB
> +
> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
> index 586df14..cf15e8c 100644
> --- a/arch/x86/kernel/Makefile
> +++ b/arch/x86/kernel/Makefile
> @@ -113,6 +113,17 @@ obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o
>  obj-$(CONFIG_SWIOTLB)                  += pci-swiotlb.o
>  obj-$(CONFIG_X86_OF)                   += prom.o
> 
> +ifeq ($(CONFIG_KERNEL_DTB),y)
> +obj-$(CONFIG_CE4100_DTB) += ce4100.dtb.o
> +obj-$(CONFIG_TEST_DTB) += test.dtb.o
> +endif
> +
> +dtstree        := $(srctree)/arch/x86/boot/dts
> +
> +$(obj)/%.dtb: $(dtstree)/%.dts
> +       $(call if_changed,dtc)
> +
> +
>  ###
>  # 64 bit specific files
>  ifeq ($(CONFIG_X86_64),y)
> 
> 
> From nobody Thu Nov 11 15:42:58 2010
> Subject: [PATCH 2/4] of: Add support for linking device tree blobs into vmlinux
> Bcc: dirk.j.brandewie at intel.com
> From: Dirk Brandewie <dirk.j.brandewie at intel.com>
> Date: Thu, 11 Nov 2010 15:42:58 -0800
> Message-ID: <20101111234258.16185.42704.stgit at localhost6.localdomain6>
> In-Reply-To: <20101111234257.16185.6076.stgit at localhost6.localdomain6>
> References: <20101111234257.16185.6076.stgit at localhost6.localdomain6>
> User-Agent: StGit/0.15
> MIME-Version: 1.0
> Content-Type: text/plain; charset="utf-8"
> Content-Transfer-Encoding: 7bit
> 
> From: Dirk Brandewie <dirk.brandewie at 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.brandewie at gmail.com>
> ---
>  include/asm-generic/vmlinux.lds.h |   13 ++++++++++++-
>  init/Kconfig                      |    7 +++++++
>  scripts/Makefile.lib              |   14 ++++++++++++++
>  3 files changed, 33 insertions(+), 1 deletions(-)
> 
> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> index bd69d79..c8f600e 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -146,6 +146,16 @@
>  #define TRACE_SYSCALLS()
>  #endif
> 
> +#ifdef CONFIG_KERNEL_DTB
> +#define KERNEL_DTB                                                     \
> +       . = ALIGN(32);                                                  \
> +       VMLINUX_SYMBOL(__dtb_start) = .;                                \
> +       *(.dtb)                                                         \
> +       VMLINUX_SYMBOL(__dtb_end) = .;
> +#else
> +#define KERNEL_DTB
> +#endif
> +
>  /* .data section */
>  #define DATA_DATA                                                      \
>         *(.data)                                                        \
> @@ -468,7 +478,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/init/Kconfig b/init/Kconfig
> index 88c1046..fddfc0f 100644
> --- a/init/Kconfig
> +++ b/init/Kconfig
> @@ -1083,6 +1083,13 @@ config PCI_QUIRKS
>            bugs/quirks. Disable this only if your target machine is
>            unaffected by PCI quirks.
> 
> +config KERNEL_DTB
> +       bool "Support linking a device tree blob into vmlinux"
> +       default n
> +       help
> +         This option provides support for adding a device tree blob(s)
> +        directly to vmlinux
> +
>  config SLUB_DEBUG
>         default y
>         bool "Enable SLUB debugging support" if EMBEDDED
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index 4c72c11..c4487b2 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -200,6 +200,20 @@ quiet_cmd_gzip = GZIP    $@
>  cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \
>         (rm -f $@ ; false)
> 
> +# DTC
> +#  ---------------------------------------------------------------------------
> +$(obj)/%.dtb.S: $(obj)/%.dtb FORCE
> +       @echo '.section .dtb,"a"' > $@
> +       @echo '.global __dtb_$(*F)_begin' >> $@
> +       @echo '__dtb_$(*F)_begin:' >> $@
> +       @echo '.incbin "$<" ' >> $@
> +       @echo '__dtb_$(*F)_end:' >> $@
> +       @echo '.global __dtb_$(*F)_end' >> $@
> +
> +DTC = $(objtree)/scripts/dtc/dtc
> +
> +quiet_cmd_dtc = DTC    $@
> +      cmd_dtc = $(DTC) -O dtb -o $(obj)/$*.dtb -b 0  $(dtstree)/$*.dts
> 
>  # Bzip2
>  # ---------------------------------------------------------------------------
> 
> 
> From nobody Thu Nov 11 15:42:58 2010
> Subject: [PATCH 3/4] of/dtc: force dtb size to modulo 32 bytes
> Bcc: dirk.j.brandewie at intel.com
> From: Dirk Brandewie <dirk.j.brandewie at intel.com>
> Date: Thu, 11 Nov 2010 15:42:58 -0800
> Message-ID: <20101111234258.16185.25714.stgit at localhost6.localdomain6>
> In-Reply-To: <20101111234257.16185.6076.stgit at localhost6.localdomain6>
> References: <20101111234257.16185.6076.stgit at localhost6.localdomain6>
> User-Agent: StGit/0.15
> MIME-Version: 1.0
> Content-Type: text/plain; charset="utf-8"
> Content-Transfer-Encoding: 7bit
> 
> From: Dirk Brandewie <dirk.brandewie at gmail.com>
> 
> This patch forces the size of the DTB to be modulo 32 bytes. This is
> needed to support linking multiple DTB's into a single section in the
> image. GCC wants structures to be 32 byte aligned without this change
> DTB's after the first in the section may not be properly aligned so
> the flat tree parsing code will fall over.
> 
> Signed-off-by: Dirk Brandewie <dirk.brandewie at gmail.com>
> ---
>  scripts/dtc/flattree.c |    6 +++++-
>  1 files changed, 5 insertions(+), 1 deletions(-)
> 
> diff --git a/scripts/dtc/flattree.c b/scripts/dtc/flattree.c
> index 76acd28..ccca797 100644
> --- a/scripts/dtc/flattree.c
> +++ b/scripts/dtc/flattree.c
> @@ -358,6 +358,7 @@ void dt_to_blob(FILE *f, struct boot_info *bi, int version)
>         struct data strbuf     = empty_data;
>         struct fdt_header fdt;
>         int padlen = 0;
> +       int align_size;
> 
>         for (i = 0; i < ARRAY_SIZE(version_table); i++) {
>                 if (version_table[i].version == version)
> @@ -395,6 +396,9 @@ void dt_to_blob(FILE *f, struct boot_info *bi, int version)
>                 fdt.totalsize = cpu_to_fdt32(tsize);
>         }
> 
> +       align_size = ALIGN(fdt32_to_cpu(fdt.totalsize), 32);
> +       fdt.totalsize = cpu_to_fdt32(align_size);
> +
>         /*
>          * Assemble the blob: start with the header, add with alignment
>          * the reserve buffer, add the reserve map terminating zeroes,
> @@ -412,7 +416,7 @@ void dt_to_blob(FILE *f, struct boot_info *bi, int version)
>          */
>         if (padlen > 0)
>                 blob = data_append_zeroes(blob, padlen);
> -
> +       blob = data_append_align(blob, 32);
>         fwrite(blob.val, blob.len, 1, f);
> 
>         if (ferror(f))
> 
> 
> From nobody Thu Nov 11 15:42:58 2010
> Subject: [PATCH 4/4] of/fdt: add kernel command line option for dtb_compat
>         string
> Bcc: dirk.j.brandewie at intel.com
> From: Dirk Brandewie <dirk.j.brandewie at intel.com>
> Date: Thu, 11 Nov 2010 15:42:58 -0800
> Message-ID: <20101111234258.16185.25736.stgit at localhost6.localdomain6>
> In-Reply-To: <20101111234257.16185.6076.stgit at localhost6.localdomain6>
> References: <20101111234257.16185.6076.stgit at localhost6.localdomain6>
> User-Agent: StGit/0.15
> MIME-Version: 1.0
> Content-Type: text/plain; charset="utf-8"
> Content-Transfer-Encoding: 7bit
> 
> From: Dirk Brandewie <dirk.brandewie at gmail.com>
> 
> Add support for specifying a "compatible" string from the kernel
> command line and functions for the platform to find the compatible
> blob present in the kernel image if any.
> 
> Signed-off-by: Dirk Brandewie <dirk.brandewie at gmail.com>
> ---
>  drivers/of/fdt.c       |   52 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/of_fdt.h |    9 ++++++++
>  2 files changed, 61 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
> index c1360e0..07fe4c6 100644
> --- a/drivers/of/fdt.c
> +++ b/drivers/of/fdt.c
> @@ -604,3 +604,55 @@ void __init unflatten_device_tree(void)
> 
>         pr_debug(" <- unflatten_device_tree()\n");
>  }
> +
> +#ifndef MODULE
> +#ifdef CONFIG_OF_FLATTREE
> +static char dtb_compat_name[MAX_DTB_COMPAT_STR] = "";
> +
> +char __init *of_get_dtb_compatible_string(void)
> +{
> +       return dtb_compat_name;
> +}
> +
> +#ifdef CONFIG_KERNEL_DTB
> +extern char __dtb_start[];
> +extern char __dtb_end[];
> +
> +void *of_find_compatible_dtb(char *name)
> +{
> +       void *rc = NULL;
> +       char *hdr;
> +       unsigned long node, root;
> +       struct boot_param_header *blob, *orig_initial_boot_params;
> +
> +       orig_initial_boot_params = initial_boot_params;
> +
> +       if (__dtb_start != __dtb_end){
> +               blob = (struct boot_param_header *)__dtb_start;
> +               do{
> +                       node = ((unsigned long)blob) +
> +                               be32_to_cpu(blob->off_dt_struct);
> +                       initial_boot_params = blob;
> +                       root = of_get_flat_dt_root();
> +                       if (of_flat_dt_is_compatible(root, name) > 0) {
> +                               rc = (void*) blob;
> +                               break;
> +                       }
> +                       blob = (unsigned long)blob+be32_to_cpu(blob->totalsize);
> +               }while (blob < (struct boot_param_header *)__dtb_end);
> +       }
> +       if (rc == NULL)
> +               initial_boot_params = orig_initial_boot_params;
> +       return rc;
> +}
> +#endif
> +
> +static int __init dtb_compat_setup(char *line)
> +{
> +       strncpy(dtb_compat_name, line, MAX_DTB_COMPAT_STR);
> +       return 1;
> +}
> +
> +__setup("dtb_compat=", dtb_compat_setup);
> +#endif
> +#endif
> diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h
> index 7bbf5b3..181e413 100644
> --- a/include/linux/of_fdt.h
> +++ b/include/linux/of_fdt.h
> @@ -58,6 +58,8 @@ struct boot_param_header {
>  };
> 
>  #if defined(CONFIG_OF_FLATTREE)
> +#define MAX_DTB_COMPAT_STR 64
> +
>  /* TBD: Temporary export of fdt globals - remove when code fully merged */
>  extern int __initdata dt_root_addr_cells;
>  extern int __initdata dt_root_size_cells;
> @@ -82,6 +84,13 @@ extern void early_init_dt_add_memory_arch(u64 base, u64 size);
>  extern u64 early_init_dt_alloc_memory_arch(u64 size, u64 align);
>  extern u64 dt_mem_next_cell(int s, __be32 **cellp);
> 
> +extern char *of_get_dtb_compatible_string(void);
> +#ifdef CONFIG_KERNEL_DTB
> +extern void *of_find_compatible_dtb(char *name);
> +#else
> +static inline void *of_find_compatible_dtb(char *name) {return 0;}
> +
> +#endif
>  /*
>   * If BLK_DEV_INITRD, the fdt early init code will call this function,
>   * to be provided by the arch code. start and end are specified as
> 
> 




More information about the devicetree-discuss mailing list