diff mbox

[Xen-devel,04/10] xen: arm: rename early_info structs

Message ID 1402919103-29642-4-git-send-email-ian.campbell@citrix.com
State New
Headers show

Commit Message

Ian Campbell June 16, 2014, 11:44 a.m. UTC
There isn't really anything Device Tree specific about the early_info, we just
happen to get it from device tree (but in the future it might come e.g. from
UEFI or ACPI or something else).

Move the relevant structs out of device_tree.h and into asm/setup.h and rename to
be more neutral.

For now the code to parse the DT into the now arch specific structs remains in
common code.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
---
 xen/arch/arm/domain_build.c   |   13 ++++++-----
 xen/arch/arm/kernel.c         |    6 ++---
 xen/arch/arm/kernel.h         |    3 ++-
 xen/arch/arm/setup.c          |   51 ++++++++++++++++++++++-------------------
 xen/common/device_tree.c      |   38 +++++++++++++++---------------
 xen/include/asm-arm/setup.h   |   40 ++++++++++++++++++++++++++++++++
 xen/include/xen/device_tree.h |   39 -------------------------------
 7 files changed, 98 insertions(+), 92 deletions(-)

Comments

Julien Grall June 16, 2014, 12:10 p.m. UTC | #1
Hi Ian,

On 06/16/2014 12:44 PM, Ian Campbell wrote:
> There isn't really anything Device Tree specific about the early_info, we just
> happen to get it from device tree (but in the future it might come e.g. from
> UEFI or ACPI or something else).
> 
> Move the relevant structs out of device_tree.h and into asm/setup.h and rename to
> be more neutral.
> 
> For now the code to parse the DT into the now arch specific structs remains in
> common code.
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Julien Grall <julien.grall@linaro.org>

Regards,
Stefano Stabellini June 18, 2014, 1:56 p.m. UTC | #2
On Mon, 16 Jun 2014, Ian Campbell wrote:
> There isn't really anything Device Tree specific about the early_info, we just
> happen to get it from device tree (but in the future it might come e.g. from
> UEFI or ACPI or something else).
> 
> Move the relevant structs out of device_tree.h and into asm/setup.h and rename to
> be more neutral.
> 
> For now the code to parse the DT into the now arch specific structs remains in
> common code.
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>


>  xen/arch/arm/domain_build.c   |   13 ++++++-----
>  xen/arch/arm/kernel.c         |    6 ++---
>  xen/arch/arm/kernel.h         |    3 ++-
>  xen/arch/arm/setup.c          |   51 ++++++++++++++++++++++-------------------
>  xen/common/device_tree.c      |   38 +++++++++++++++---------------
>  xen/include/asm-arm/setup.h   |   40 ++++++++++++++++++++++++++++++++
>  xen/include/xen/device_tree.h |   39 -------------------------------
>  7 files changed, 98 insertions(+), 92 deletions(-)
> 
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 9d9cba9..5eef8a3 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -16,6 +16,7 @@
>  #include <asm/setup.h>
>  #include <asm/platform.h>
>  #include <asm/psci.h>
> +#include <asm/setup.h>
>  
>  #include <asm/gic.h>
>  #include <xen/irq.h>
> @@ -160,9 +161,9 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo,
>      int res = 0;
>      int had_dom0_bootargs = 0;
>  
> -    if ( early_info.modules.nr_mods >= MOD_KERNEL &&
> -         early_info.modules.module[MOD_KERNEL].cmdline[0] )
> -        bootargs = &early_info.modules.module[MOD_KERNEL].cmdline[0];
> +    if ( bootinfo.modules.nr_mods >= MOD_KERNEL &&
> +         bootinfo.modules.module[MOD_KERNEL].cmdline[0] )
> +        bootargs = &bootinfo.modules.module[MOD_KERNEL].cmdline[0];
>  
>      dt_for_each_property_node (node, prop)
>      {
> @@ -221,7 +222,7 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo,
>           * If the bootloader provides an initrd, we must create a placeholder
>           * for the initrd properties. The values will be replaced later.
>           */
> -        if ( early_info.modules.module[MOD_INITRD].size )
> +        if ( bootinfo.modules.module[MOD_INITRD].size )
>          {
>              u64 a = 0;
>              res = fdt_property(kinfo->fdt, "linux,initrd-start", &a, sizeof(a));
> @@ -976,8 +977,8 @@ static void dtb_load(struct kernel_info *kinfo)
>  static void initrd_load(struct kernel_info *kinfo)
>  {
>      paddr_t load_addr = kinfo->initrd_paddr;
> -    paddr_t paddr = early_info.modules.module[MOD_INITRD].start;
> -    paddr_t len = early_info.modules.module[MOD_INITRD].size;
> +    paddr_t paddr = bootinfo.modules.module[MOD_INITRD].start;
> +    paddr_t len = bootinfo.modules.module[MOD_INITRD].size;
>      unsigned long offs;
>      int node;
>      int res;
> diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
> index 69182ec..ce5b95a 100644
> --- a/xen/arch/arm/kernel.c
> +++ b/xen/arch/arm/kernel.c
> @@ -69,7 +69,7 @@ static void place_modules(struct kernel_info *info,
>  {
>      /* Align DTB and initrd size to 2Mb. Linux only requires 4 byte alignment */
>      const paddr_t initrd_len =
> -        ROUNDUP(early_info.modules.module[MOD_INITRD].size, MB(2));
> +        ROUNDUP(bootinfo.modules.module[MOD_INITRD].size, MB(2));
>      const paddr_t dtb_len = ROUNDUP(fdt_totalsize(info->fdt), MB(2));
>      const paddr_t modsize = initrd_len + dtb_len;
>  
> @@ -376,8 +376,8 @@ int kernel_probe(struct kernel_info *info)
>  
>      paddr_t start, size;
>  
> -    start = early_info.modules.module[MOD_KERNEL].start;
> -    size = early_info.modules.module[MOD_KERNEL].size;
> +    start = bootinfo.modules.module[MOD_KERNEL].start;
> +    size = bootinfo.modules.module[MOD_KERNEL].size;
>  
>      if ( !size )
>      {
> diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h
> index fd2f61d..7c7f624 100644
> --- a/xen/arch/arm/kernel.h
> +++ b/xen/arch/arm/kernel.h
> @@ -8,6 +8,7 @@
>  
>  #include <xen/libelf.h>
>  #include <xen/device_tree.h>
> +#include <asm/setup.h>
>  
>  struct kernel_info {
>  #ifdef CONFIG_ARM_64
> @@ -16,7 +17,7 @@ struct kernel_info {
>  
>      void *fdt; /* flat device tree */
>      paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */
> -    struct dt_mem_info mem;
> +    struct meminfo mem;
>  
>      /* kernel entry point */
>      paddr_t entry;
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index b9ce7a9..63f6b8e 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -43,8 +43,11 @@
>  #include <asm/cpufeature.h>
>  #include <asm/platform.h>
>  #include <asm/procinfo.h>
> +#include <asm/setup.h>
>  #include <xsm/xsm.h>
>  
> +struct bootinfo __initdata bootinfo;
> +
>  struct cpuinfo_arm __read_mostly boot_cpu_data;
>  
>  static __used void init_done(void)
> @@ -182,7 +185,7 @@ static void dt_unreserved_regions(paddr_t s, paddr_t e,
>  
>  void __init discard_initial_modules(void)
>  {
> -    struct dt_module_info *mi = &early_info.modules;
> +    struct bootmodules *mi = &bootinfo.modules;
>      int i;
>  
>      for ( i = MOD_DISCARD_FIRST; i <= mi->nr_mods; i++ )
> @@ -210,7 +213,7 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e,
>                                         uint32_t size, paddr_t align,
>                                         int first_mod)
>  {
> -    const struct dt_module_info *mi = &early_info.modules;
> +    const struct bootmodules *mi = &bootinfo.modules;
>      int i;
>      int nr_rsvd;
>  
> @@ -275,7 +278,7 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e,
>   */
>  static paddr_t __init next_module(paddr_t s, paddr_t *end)
>  {
> -    struct dt_module_info *mi = &early_info.modules;
> +    struct bootmodules *mi = &bootinfo.modules;
>      paddr_t lowest = ~(paddr_t)0;
>      int i;
>  
> @@ -308,7 +311,7 @@ static paddr_t __init next_module(paddr_t s, paddr_t *end)
>   */
>  static paddr_t __init get_xen_paddr(void)
>  {
> -    struct dt_mem_info *mi = &early_info.mem;
> +    struct meminfo *mi = &bootinfo.mem;
>      paddr_t min_size;
>      paddr_t paddr = 0, last_end;
>      int i;
> @@ -357,8 +360,8 @@ static paddr_t __init get_xen_paddr(void)
>      printk("Placing Xen at 0x%"PRIpaddr"-0x%"PRIpaddr"\n",
>             paddr, paddr + min_size);
>  
> -    early_info.modules.module[MOD_XEN].start = paddr;
> -    early_info.modules.module[MOD_XEN].size = min_size;
> +    bootinfo.modules.module[MOD_XEN].start = paddr;
> +    bootinfo.modules.module[MOD_XEN].size = min_size;
>  
>      return paddr;
>  }
> @@ -376,7 +379,7 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>      int i;
>      void *fdt;
>  
> -    if ( !early_info.mem.nr_banks )
> +    if ( !bootinfo.mem.nr_banks )
>          panic("No memory bank");
>  
>      /*
> @@ -393,15 +396,15 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>       * We also track the number of actual RAM pages (i.e. not counting
>       * the holes).
>       */
> -    ram_size  = early_info.mem.bank[0].size;
> +    ram_size  = bootinfo.mem.bank[0].size;
>  
> -    contig_start = ram_start = early_info.mem.bank[0].start;
> +    contig_start = ram_start = bootinfo.mem.bank[0].start;
>      contig_end   = ram_end = ram_start + ram_size;
>  
> -    for ( i = 1; i < early_info.mem.nr_banks; i++ )
> +    for ( i = 1; i < bootinfo.mem.nr_banks; i++ )
>      {
> -        paddr_t bank_start = early_info.mem.bank[i].start;
> -        paddr_t bank_size = early_info.mem.bank[i].size;
> +        paddr_t bank_start = bootinfo.mem.bank[i].start;
> +        paddr_t bank_size = bootinfo.mem.bank[i].size;
>          paddr_t bank_end = bank_start + bank_size;
>  
>          paddr_t new_ram_size = ram_size + bank_size;
> @@ -434,11 +437,11 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>          ram_end = new_ram_end;
>      }
>  
> -    if ( i != early_info.mem.nr_banks )
> +    if ( i != bootinfo.mem.nr_banks )
>      {
>          printk("WARNING: only using %d out of %d memory banks\n",
> -               i, early_info.mem.nr_banks);
> -        early_info.mem.nr_banks = i;
> +               i, bootinfo.mem.nr_banks);
> +        bootinfo.mem.nr_banks = i;
>      }
>  
>      total_pages = ram_pages = ram_size >> PAGE_SHIFT;
> @@ -497,10 +500,10 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>      device_tree_flattened = fdt;
>  
>      /* Add non-xenheap memory */
> -    for ( i = 0; i < early_info.mem.nr_banks; i++ )
> +    for ( i = 0; i < bootinfo.mem.nr_banks; i++ )
>      {
> -        paddr_t bank_start = early_info.mem.bank[i].start;
> -        paddr_t bank_end = bank_start + early_info.mem.bank[i].size;
> +        paddr_t bank_start = bootinfo.mem.bank[i].start;
> +        paddr_t bank_end = bank_start + bootinfo.mem.bank[i].size;
>  
>          s = bank_start;
>          while ( s < bank_end )
> @@ -557,10 +560,10 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>      void *fdt;
>  
>      total_pages = 0;
> -    for ( bank = 0 ; bank < early_info.mem.nr_banks; bank++ )
> +    for ( bank = 0 ; bank < bootinfo.mem.nr_banks; bank++ )
>      {
> -        paddr_t bank_start = early_info.mem.bank[bank].start;
> -        paddr_t bank_size = early_info.mem.bank[bank].size;
> +        paddr_t bank_start = bootinfo.mem.bank[bank].start;
> +        paddr_t bank_size = bootinfo.mem.bank[bank].size;
>          paddr_t bank_end = bank_start + bank_size;
>          paddr_t s, e;
>  
> @@ -609,11 +612,11 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>          }
>      }
>  
> -    if ( bank != early_info.mem.nr_banks )
> +    if ( bank != bootinfo.mem.nr_banks )
>      {
>          printk("WARNING: only using %d out of %d memory banks\n",
> -               bank, early_info.mem.nr_banks);
> -        early_info.mem.nr_banks = bank;
> +               bank, bootinfo.mem.nr_banks);
> +        bootinfo.mem.nr_banks = bank;
>      }
>  
>      total_pages += ram_size >> PAGE_SHIFT;
> diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c
> index 03d495a..a1896d3 100644
> --- a/xen/common/device_tree.c
> +++ b/xen/common/device_tree.c
> @@ -23,8 +23,8 @@
>  #include <xen/cpumask.h>
>  #include <xen/ctype.h>
>  #include <xen/lib.h>
> +#include <asm/setup.h>
>  
> -struct dt_early_info __initdata early_info;
>  const void *device_tree_flattened;
>  dt_irq_xlate_func dt_irq_xlate;
>  /* Host device tree */
> @@ -238,10 +238,10 @@ const char *device_tree_bootargs(const void *fdt)
>      prop = fdt_get_property(fdt, node, "xen,xen-bootargs", NULL);
>      if ( prop == NULL )
>      {
> -        struct dt_mb_module *dom0_mod = NULL;
> +        struct bootmodule *dom0_mod = NULL;
>  
> -        if ( early_info.modules.nr_mods >= MOD_KERNEL )
> -            dom0_mod = &early_info.modules.module[MOD_KERNEL];
> +        if ( bootinfo.modules.nr_mods >= MOD_KERNEL )
> +            dom0_mod = &bootinfo.modules.module[MOD_KERNEL];
>  
>          if (fdt_get_property(fdt, node, "xen,dom0-bootargs", NULL) ||
>              ( dom0_mod && dom0_mod->cmdline[0] ) )
> @@ -319,12 +319,12 @@ static void __init process_memory_node(const void *fdt, int node,
>      cell = (const __be32 *)prop->data;
>      banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
>  
> -    for ( i = 0; i < banks && early_info.mem.nr_banks < NR_MEM_BANKS; i++ )
> +    for ( i = 0; i < banks && bootinfo.mem.nr_banks < NR_MEM_BANKS; i++ )
>      {
>          device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
> -        early_info.mem.bank[early_info.mem.nr_banks].start = start;
> -        early_info.mem.bank[early_info.mem.nr_banks].size = size;
> -        early_info.mem.nr_banks++;
> +        bootinfo.mem.bank[bootinfo.mem.nr_banks].start = start;
> +        bootinfo.mem.bank[bootinfo.mem.nr_banks].size = size;
> +        bootinfo.mem.nr_banks++;
>      }
>  }
>  
> @@ -335,7 +335,7 @@ static void __init process_multiboot_node(const void *fdt, int node,
>      const struct fdt_property *prop;
>      const __be32 *cell;
>      int nr;
> -    struct dt_mb_module *mod;
> +    struct bootmodule *mod;
>      int len;
>  
>      if ( fdt_node_check_compatible(fdt, node, "xen,linux-zimage") == 0 ||
> @@ -349,7 +349,7 @@ static void __init process_multiboot_node(const void *fdt, int node,
>      else
>          panic("%s not a known xen multiboot type\n", name);
>  
> -    mod = &early_info.modules.module[nr];
> +    mod = &bootinfo.modules.module[nr];
>  
>      prop = fdt_get_property(fdt, node, "reg", &len);
>      if ( !prop )
> @@ -374,8 +374,8 @@ static void __init process_multiboot_node(const void *fdt, int node,
>      else
>          mod->cmdline[0] = 0;
>  
> -    if ( nr > early_info.modules.nr_mods )
> -        early_info.modules.nr_mods = nr;
> +    if ( nr > bootinfo.modules.nr_mods )
> +        bootinfo.modules.nr_mods = nr;
>  }
>  
>  static void __init process_chosen_node(const void *fdt, int node,
> @@ -383,7 +383,7 @@ static void __init process_chosen_node(const void *fdt, int node,
>                                         u32 address_cells, u32 size_cells)
>  {
>      const struct fdt_property *prop;
> -    struct dt_mb_module *mod = &early_info.modules.module[MOD_INITRD];
> +    struct bootmodule *mod = &bootinfo.modules.module[MOD_INITRD];
>      paddr_t start, end;
>      int len;
>  
> @@ -425,7 +425,7 @@ static void __init process_chosen_node(const void *fdt, int node,
>      mod->start = start;
>      mod->size = end - start;
>  
> -    early_info.modules.nr_mods = max(MOD_INITRD, early_info.modules.nr_mods);
> +    bootinfo.modules.nr_mods = max(MOD_INITRD, bootinfo.modules.nr_mods);
>  }
>  
>  static int __init early_scan_node(const void *fdt,
> @@ -446,8 +446,8 @@ static int __init early_scan_node(const void *fdt,
>  
>  static void __init early_print_info(void)
>  {
> -    struct dt_mem_info *mi = &early_info.mem;
> -    struct dt_module_info *mods = &early_info.modules;
> +    struct meminfo *mi = &bootinfo.mem;
> +    struct bootmodules *mods = &bootinfo.modules;
>      int i, nr_rsvd;
>  
>      for ( i = 0; i < mi->nr_banks; i++ )
> @@ -483,18 +483,18 @@ static void __init early_print_info(void)
>   */
>  size_t __init device_tree_early_init(const void *fdt, paddr_t paddr)
>  {
> -    struct dt_mb_module *mod;
> +    struct bootmodule *mod;
>      int ret;
>  
>      ret = fdt_check_header(fdt);
>      if ( ret < 0 )
>          panic("No valid device tree\n");
>  
> -    mod = &early_info.modules.module[MOD_FDT];
> +    mod = &bootinfo.modules.module[MOD_FDT];
>      mod->start = paddr;
>      mod->size = fdt_totalsize(fdt);
>  
> -    early_info.modules.nr_mods = max(MOD_FDT, early_info.modules.nr_mods);
> +    bootinfo.modules.nr_mods = max(MOD_FDT, bootinfo.modules.nr_mods);
>  
>      device_tree_for_each_node((void *)fdt, early_scan_node, NULL);
>      early_print_info();
> diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
> index b09f688..ea0dc46 100644
> --- a/xen/include/asm-arm/setup.h
> +++ b/xen/include/asm-arm/setup.h
> @@ -3,6 +3,46 @@
>  
>  #include <public/version.h>
>  
> +#define NR_MEM_BANKS 8
> +
> +#define MOD_XEN    0
> +#define MOD_FDT    1
> +#define MOD_KERNEL 2
> +#define MOD_INITRD 3
> +#define MOD_XSM    4
> +#define NR_MODULES 5
> +
> +#define MOD_DISCARD_FIRST MOD_FDT
> +
> +struct membank {
> +    paddr_t start;
> +    paddr_t size;
> +};
> +
> +struct meminfo {
> +    int nr_banks;
> +    struct membank bank[NR_MEM_BANKS];
> +};
> +
> +struct bootmodule {
> +    paddr_t start;
> +    paddr_t size;
> +    char cmdline[1024];
> +};
> +
> +struct bootmodules {
> +    int nr_mods;
> +    /* Module 0 is Xen itself, followed by the provided modules-proper */
> +    struct bootmodule module[NR_MODULES];
> +};
> +
> +struct bootinfo {
> +    struct meminfo mem;
> +    struct bootmodules modules;
> +};
> +
> +extern struct bootinfo bootinfo;
> +
>  void arch_init_memory(void);
>  
>  void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len);
> diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h
> index 25db076..74e98f5 100644
> --- a/xen/include/xen/device_tree.h
> +++ b/xen/include/xen/device_tree.h
> @@ -20,44 +20,6 @@
>  
>  #define DEVICE_TREE_MAX_DEPTH 16
>  
> -#define NR_MEM_BANKS 8
> -
> -#define MOD_XEN    0
> -#define MOD_FDT    1
> -#define MOD_KERNEL 2
> -#define MOD_INITRD 3
> -#define MOD_XSM    4
> -#define NR_MODULES 5
> -
> -#define MOD_DISCARD_FIRST MOD_FDT
> -
> -struct membank {
> -    paddr_t start;
> -    paddr_t size;
> -};
> -
> -struct dt_mem_info {
> -    int nr_banks;
> -    struct membank bank[NR_MEM_BANKS];
> -};
> -
> -struct dt_mb_module {
> -    paddr_t start;
> -    paddr_t size;
> -    char cmdline[1024];
> -};
> -
> -struct dt_module_info {
> -    int nr_mods;
> -    /* Module 0 is Xen itself, followed by the provided modules-proper */
> -    struct dt_mb_module module[NR_MODULES];
> -};
> -
> -struct dt_early_info {
> -    struct dt_mem_info mem;
> -    struct dt_module_info modules;
> -};
> -
>  /*
>   * Struct used for matching a device
>   */
> @@ -193,7 +155,6 @@ typedef int (*device_tree_node_func)(const void *fdt,
>                                       u32 address_cells, u32 size_cells,
>                                       void *data);
>  
> -extern struct dt_early_info early_info;
>  extern const void *device_tree_flattened;
>  
>  size_t __init device_tree_early_init(const void *fdt, paddr_t paddr);
> -- 
> 1.7.10.4
>
diff mbox

Patch

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 9d9cba9..5eef8a3 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -16,6 +16,7 @@ 
 #include <asm/setup.h>
 #include <asm/platform.h>
 #include <asm/psci.h>
+#include <asm/setup.h>
 
 #include <asm/gic.h>
 #include <xen/irq.h>
@@ -160,9 +161,9 @@  static int write_properties(struct domain *d, struct kernel_info *kinfo,
     int res = 0;
     int had_dom0_bootargs = 0;
 
-    if ( early_info.modules.nr_mods >= MOD_KERNEL &&
-         early_info.modules.module[MOD_KERNEL].cmdline[0] )
-        bootargs = &early_info.modules.module[MOD_KERNEL].cmdline[0];
+    if ( bootinfo.modules.nr_mods >= MOD_KERNEL &&
+         bootinfo.modules.module[MOD_KERNEL].cmdline[0] )
+        bootargs = &bootinfo.modules.module[MOD_KERNEL].cmdline[0];
 
     dt_for_each_property_node (node, prop)
     {
@@ -221,7 +222,7 @@  static int write_properties(struct domain *d, struct kernel_info *kinfo,
          * If the bootloader provides an initrd, we must create a placeholder
          * for the initrd properties. The values will be replaced later.
          */
-        if ( early_info.modules.module[MOD_INITRD].size )
+        if ( bootinfo.modules.module[MOD_INITRD].size )
         {
             u64 a = 0;
             res = fdt_property(kinfo->fdt, "linux,initrd-start", &a, sizeof(a));
@@ -976,8 +977,8 @@  static void dtb_load(struct kernel_info *kinfo)
 static void initrd_load(struct kernel_info *kinfo)
 {
     paddr_t load_addr = kinfo->initrd_paddr;
-    paddr_t paddr = early_info.modules.module[MOD_INITRD].start;
-    paddr_t len = early_info.modules.module[MOD_INITRD].size;
+    paddr_t paddr = bootinfo.modules.module[MOD_INITRD].start;
+    paddr_t len = bootinfo.modules.module[MOD_INITRD].size;
     unsigned long offs;
     int node;
     int res;
diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
index 69182ec..ce5b95a 100644
--- a/xen/arch/arm/kernel.c
+++ b/xen/arch/arm/kernel.c
@@ -69,7 +69,7 @@  static void place_modules(struct kernel_info *info,
 {
     /* Align DTB and initrd size to 2Mb. Linux only requires 4 byte alignment */
     const paddr_t initrd_len =
-        ROUNDUP(early_info.modules.module[MOD_INITRD].size, MB(2));
+        ROUNDUP(bootinfo.modules.module[MOD_INITRD].size, MB(2));
     const paddr_t dtb_len = ROUNDUP(fdt_totalsize(info->fdt), MB(2));
     const paddr_t modsize = initrd_len + dtb_len;
 
@@ -376,8 +376,8 @@  int kernel_probe(struct kernel_info *info)
 
     paddr_t start, size;
 
-    start = early_info.modules.module[MOD_KERNEL].start;
-    size = early_info.modules.module[MOD_KERNEL].size;
+    start = bootinfo.modules.module[MOD_KERNEL].start;
+    size = bootinfo.modules.module[MOD_KERNEL].size;
 
     if ( !size )
     {
diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h
index fd2f61d..7c7f624 100644
--- a/xen/arch/arm/kernel.h
+++ b/xen/arch/arm/kernel.h
@@ -8,6 +8,7 @@ 
 
 #include <xen/libelf.h>
 #include <xen/device_tree.h>
+#include <asm/setup.h>
 
 struct kernel_info {
 #ifdef CONFIG_ARM_64
@@ -16,7 +17,7 @@  struct kernel_info {
 
     void *fdt; /* flat device tree */
     paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */
-    struct dt_mem_info mem;
+    struct meminfo mem;
 
     /* kernel entry point */
     paddr_t entry;
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index b9ce7a9..63f6b8e 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -43,8 +43,11 @@ 
 #include <asm/cpufeature.h>
 #include <asm/platform.h>
 #include <asm/procinfo.h>
+#include <asm/setup.h>
 #include <xsm/xsm.h>
 
+struct bootinfo __initdata bootinfo;
+
 struct cpuinfo_arm __read_mostly boot_cpu_data;
 
 static __used void init_done(void)
@@ -182,7 +185,7 @@  static void dt_unreserved_regions(paddr_t s, paddr_t e,
 
 void __init discard_initial_modules(void)
 {
-    struct dt_module_info *mi = &early_info.modules;
+    struct bootmodules *mi = &bootinfo.modules;
     int i;
 
     for ( i = MOD_DISCARD_FIRST; i <= mi->nr_mods; i++ )
@@ -210,7 +213,7 @@  static paddr_t __init consider_modules(paddr_t s, paddr_t e,
                                        uint32_t size, paddr_t align,
                                        int first_mod)
 {
-    const struct dt_module_info *mi = &early_info.modules;
+    const struct bootmodules *mi = &bootinfo.modules;
     int i;
     int nr_rsvd;
 
@@ -275,7 +278,7 @@  static paddr_t __init consider_modules(paddr_t s, paddr_t e,
  */
 static paddr_t __init next_module(paddr_t s, paddr_t *end)
 {
-    struct dt_module_info *mi = &early_info.modules;
+    struct bootmodules *mi = &bootinfo.modules;
     paddr_t lowest = ~(paddr_t)0;
     int i;
 
@@ -308,7 +311,7 @@  static paddr_t __init next_module(paddr_t s, paddr_t *end)
  */
 static paddr_t __init get_xen_paddr(void)
 {
-    struct dt_mem_info *mi = &early_info.mem;
+    struct meminfo *mi = &bootinfo.mem;
     paddr_t min_size;
     paddr_t paddr = 0, last_end;
     int i;
@@ -357,8 +360,8 @@  static paddr_t __init get_xen_paddr(void)
     printk("Placing Xen at 0x%"PRIpaddr"-0x%"PRIpaddr"\n",
            paddr, paddr + min_size);
 
-    early_info.modules.module[MOD_XEN].start = paddr;
-    early_info.modules.module[MOD_XEN].size = min_size;
+    bootinfo.modules.module[MOD_XEN].start = paddr;
+    bootinfo.modules.module[MOD_XEN].size = min_size;
 
     return paddr;
 }
@@ -376,7 +379,7 @@  static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
     int i;
     void *fdt;
 
-    if ( !early_info.mem.nr_banks )
+    if ( !bootinfo.mem.nr_banks )
         panic("No memory bank");
 
     /*
@@ -393,15 +396,15 @@  static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
      * We also track the number of actual RAM pages (i.e. not counting
      * the holes).
      */
-    ram_size  = early_info.mem.bank[0].size;
+    ram_size  = bootinfo.mem.bank[0].size;
 
-    contig_start = ram_start = early_info.mem.bank[0].start;
+    contig_start = ram_start = bootinfo.mem.bank[0].start;
     contig_end   = ram_end = ram_start + ram_size;
 
-    for ( i = 1; i < early_info.mem.nr_banks; i++ )
+    for ( i = 1; i < bootinfo.mem.nr_banks; i++ )
     {
-        paddr_t bank_start = early_info.mem.bank[i].start;
-        paddr_t bank_size = early_info.mem.bank[i].size;
+        paddr_t bank_start = bootinfo.mem.bank[i].start;
+        paddr_t bank_size = bootinfo.mem.bank[i].size;
         paddr_t bank_end = bank_start + bank_size;
 
         paddr_t new_ram_size = ram_size + bank_size;
@@ -434,11 +437,11 @@  static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
         ram_end = new_ram_end;
     }
 
-    if ( i != early_info.mem.nr_banks )
+    if ( i != bootinfo.mem.nr_banks )
     {
         printk("WARNING: only using %d out of %d memory banks\n",
-               i, early_info.mem.nr_banks);
-        early_info.mem.nr_banks = i;
+               i, bootinfo.mem.nr_banks);
+        bootinfo.mem.nr_banks = i;
     }
 
     total_pages = ram_pages = ram_size >> PAGE_SHIFT;
@@ -497,10 +500,10 @@  static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
     device_tree_flattened = fdt;
 
     /* Add non-xenheap memory */
-    for ( i = 0; i < early_info.mem.nr_banks; i++ )
+    for ( i = 0; i < bootinfo.mem.nr_banks; i++ )
     {
-        paddr_t bank_start = early_info.mem.bank[i].start;
-        paddr_t bank_end = bank_start + early_info.mem.bank[i].size;
+        paddr_t bank_start = bootinfo.mem.bank[i].start;
+        paddr_t bank_end = bank_start + bootinfo.mem.bank[i].size;
 
         s = bank_start;
         while ( s < bank_end )
@@ -557,10 +560,10 @@  static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
     void *fdt;
 
     total_pages = 0;
-    for ( bank = 0 ; bank < early_info.mem.nr_banks; bank++ )
+    for ( bank = 0 ; bank < bootinfo.mem.nr_banks; bank++ )
     {
-        paddr_t bank_start = early_info.mem.bank[bank].start;
-        paddr_t bank_size = early_info.mem.bank[bank].size;
+        paddr_t bank_start = bootinfo.mem.bank[bank].start;
+        paddr_t bank_size = bootinfo.mem.bank[bank].size;
         paddr_t bank_end = bank_start + bank_size;
         paddr_t s, e;
 
@@ -609,11 +612,11 @@  static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
         }
     }
 
-    if ( bank != early_info.mem.nr_banks )
+    if ( bank != bootinfo.mem.nr_banks )
     {
         printk("WARNING: only using %d out of %d memory banks\n",
-               bank, early_info.mem.nr_banks);
-        early_info.mem.nr_banks = bank;
+               bank, bootinfo.mem.nr_banks);
+        bootinfo.mem.nr_banks = bank;
     }
 
     total_pages += ram_size >> PAGE_SHIFT;
diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c
index 03d495a..a1896d3 100644
--- a/xen/common/device_tree.c
+++ b/xen/common/device_tree.c
@@ -23,8 +23,8 @@ 
 #include <xen/cpumask.h>
 #include <xen/ctype.h>
 #include <xen/lib.h>
+#include <asm/setup.h>
 
-struct dt_early_info __initdata early_info;
 const void *device_tree_flattened;
 dt_irq_xlate_func dt_irq_xlate;
 /* Host device tree */
@@ -238,10 +238,10 @@  const char *device_tree_bootargs(const void *fdt)
     prop = fdt_get_property(fdt, node, "xen,xen-bootargs", NULL);
     if ( prop == NULL )
     {
-        struct dt_mb_module *dom0_mod = NULL;
+        struct bootmodule *dom0_mod = NULL;
 
-        if ( early_info.modules.nr_mods >= MOD_KERNEL )
-            dom0_mod = &early_info.modules.module[MOD_KERNEL];
+        if ( bootinfo.modules.nr_mods >= MOD_KERNEL )
+            dom0_mod = &bootinfo.modules.module[MOD_KERNEL];
 
         if (fdt_get_property(fdt, node, "xen,dom0-bootargs", NULL) ||
             ( dom0_mod && dom0_mod->cmdline[0] ) )
@@ -319,12 +319,12 @@  static void __init process_memory_node(const void *fdt, int node,
     cell = (const __be32 *)prop->data;
     banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
 
-    for ( i = 0; i < banks && early_info.mem.nr_banks < NR_MEM_BANKS; i++ )
+    for ( i = 0; i < banks && bootinfo.mem.nr_banks < NR_MEM_BANKS; i++ )
     {
         device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
-        early_info.mem.bank[early_info.mem.nr_banks].start = start;
-        early_info.mem.bank[early_info.mem.nr_banks].size = size;
-        early_info.mem.nr_banks++;
+        bootinfo.mem.bank[bootinfo.mem.nr_banks].start = start;
+        bootinfo.mem.bank[bootinfo.mem.nr_banks].size = size;
+        bootinfo.mem.nr_banks++;
     }
 }
 
@@ -335,7 +335,7 @@  static void __init process_multiboot_node(const void *fdt, int node,
     const struct fdt_property *prop;
     const __be32 *cell;
     int nr;
-    struct dt_mb_module *mod;
+    struct bootmodule *mod;
     int len;
 
     if ( fdt_node_check_compatible(fdt, node, "xen,linux-zimage") == 0 ||
@@ -349,7 +349,7 @@  static void __init process_multiboot_node(const void *fdt, int node,
     else
         panic("%s not a known xen multiboot type\n", name);
 
-    mod = &early_info.modules.module[nr];
+    mod = &bootinfo.modules.module[nr];
 
     prop = fdt_get_property(fdt, node, "reg", &len);
     if ( !prop )
@@ -374,8 +374,8 @@  static void __init process_multiboot_node(const void *fdt, int node,
     else
         mod->cmdline[0] = 0;
 
-    if ( nr > early_info.modules.nr_mods )
-        early_info.modules.nr_mods = nr;
+    if ( nr > bootinfo.modules.nr_mods )
+        bootinfo.modules.nr_mods = nr;
 }
 
 static void __init process_chosen_node(const void *fdt, int node,
@@ -383,7 +383,7 @@  static void __init process_chosen_node(const void *fdt, int node,
                                        u32 address_cells, u32 size_cells)
 {
     const struct fdt_property *prop;
-    struct dt_mb_module *mod = &early_info.modules.module[MOD_INITRD];
+    struct bootmodule *mod = &bootinfo.modules.module[MOD_INITRD];
     paddr_t start, end;
     int len;
 
@@ -425,7 +425,7 @@  static void __init process_chosen_node(const void *fdt, int node,
     mod->start = start;
     mod->size = end - start;
 
-    early_info.modules.nr_mods = max(MOD_INITRD, early_info.modules.nr_mods);
+    bootinfo.modules.nr_mods = max(MOD_INITRD, bootinfo.modules.nr_mods);
 }
 
 static int __init early_scan_node(const void *fdt,
@@ -446,8 +446,8 @@  static int __init early_scan_node(const void *fdt,
 
 static void __init early_print_info(void)
 {
-    struct dt_mem_info *mi = &early_info.mem;
-    struct dt_module_info *mods = &early_info.modules;
+    struct meminfo *mi = &bootinfo.mem;
+    struct bootmodules *mods = &bootinfo.modules;
     int i, nr_rsvd;
 
     for ( i = 0; i < mi->nr_banks; i++ )
@@ -483,18 +483,18 @@  static void __init early_print_info(void)
  */
 size_t __init device_tree_early_init(const void *fdt, paddr_t paddr)
 {
-    struct dt_mb_module *mod;
+    struct bootmodule *mod;
     int ret;
 
     ret = fdt_check_header(fdt);
     if ( ret < 0 )
         panic("No valid device tree\n");
 
-    mod = &early_info.modules.module[MOD_FDT];
+    mod = &bootinfo.modules.module[MOD_FDT];
     mod->start = paddr;
     mod->size = fdt_totalsize(fdt);
 
-    early_info.modules.nr_mods = max(MOD_FDT, early_info.modules.nr_mods);
+    bootinfo.modules.nr_mods = max(MOD_FDT, bootinfo.modules.nr_mods);
 
     device_tree_for_each_node((void *)fdt, early_scan_node, NULL);
     early_print_info();
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
index b09f688..ea0dc46 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -3,6 +3,46 @@ 
 
 #include <public/version.h>
 
+#define NR_MEM_BANKS 8
+
+#define MOD_XEN    0
+#define MOD_FDT    1
+#define MOD_KERNEL 2
+#define MOD_INITRD 3
+#define MOD_XSM    4
+#define NR_MODULES 5
+
+#define MOD_DISCARD_FIRST MOD_FDT
+
+struct membank {
+    paddr_t start;
+    paddr_t size;
+};
+
+struct meminfo {
+    int nr_banks;
+    struct membank bank[NR_MEM_BANKS];
+};
+
+struct bootmodule {
+    paddr_t start;
+    paddr_t size;
+    char cmdline[1024];
+};
+
+struct bootmodules {
+    int nr_mods;
+    /* Module 0 is Xen itself, followed by the provided modules-proper */
+    struct bootmodule module[NR_MODULES];
+};
+
+struct bootinfo {
+    struct meminfo mem;
+    struct bootmodules modules;
+};
+
+extern struct bootinfo bootinfo;
+
 void arch_init_memory(void);
 
 void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len);
diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h
index 25db076..74e98f5 100644
--- a/xen/include/xen/device_tree.h
+++ b/xen/include/xen/device_tree.h
@@ -20,44 +20,6 @@ 
 
 #define DEVICE_TREE_MAX_DEPTH 16
 
-#define NR_MEM_BANKS 8
-
-#define MOD_XEN    0
-#define MOD_FDT    1
-#define MOD_KERNEL 2
-#define MOD_INITRD 3
-#define MOD_XSM    4
-#define NR_MODULES 5
-
-#define MOD_DISCARD_FIRST MOD_FDT
-
-struct membank {
-    paddr_t start;
-    paddr_t size;
-};
-
-struct dt_mem_info {
-    int nr_banks;
-    struct membank bank[NR_MEM_BANKS];
-};
-
-struct dt_mb_module {
-    paddr_t start;
-    paddr_t size;
-    char cmdline[1024];
-};
-
-struct dt_module_info {
-    int nr_mods;
-    /* Module 0 is Xen itself, followed by the provided modules-proper */
-    struct dt_mb_module module[NR_MODULES];
-};
-
-struct dt_early_info {
-    struct dt_mem_info mem;
-    struct dt_module_info modules;
-};
-
 /*
  * Struct used for matching a device
  */
@@ -193,7 +155,6 @@  typedef int (*device_tree_node_func)(const void *fdt,
                                      u32 address_cells, u32 size_cells,
                                      void *data);
 
-extern struct dt_early_info early_info;
 extern const void *device_tree_flattened;
 
 size_t __init device_tree_early_init(const void *fdt, paddr_t paddr);