/* Boot-time pagetable setup.
* Changes here may need matching changes in head.S */
-void __init setup_pagetables(unsigned long boot_phys_offset)
+void __init setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr)
{
- paddr_t xen_paddr;
unsigned long dest_va;
lpae_t pte, *p;
int i;
- xen_paddr = device_tree_get_xen_paddr();
-
/* Map the destination in the boot misc area. */
dest_va = BOOT_MISC_VIRT_START;
pte = mfn_to_xen_entry(xen_paddr >> PAGE_SHIFT);
#include <asm/current.h>
#include <asm/setup.h>
#include <asm/vfp.h>
+#include <asm/early_printk.h>
#include "gic.h"
static __attribute_used__ void init_done(void)
READ_CP32(ID_ISAR3), READ_CP32(ID_ISAR4), READ_CP32(ID_ISAR5));
}
+/**
+ * get_xen_paddr - get physical address to relocate Xen to
+ *
+ * Xen is relocated to the top of RAM and aligned to a XEN_PADDR_ALIGN
+ * boundary.
+ */
+static paddr_t __init get_xen_paddr(void)
+{
+ struct dt_mem_info *mi = &early_info.mem;
+ paddr_t min_size;
+ paddr_t paddr = 0, t;
+ int i;
+
+ min_size = (_end - _start + (XEN_PADDR_ALIGN-1)) & ~(XEN_PADDR_ALIGN-1);
+
+ /* Find the highest bank with enough space. */
+ for ( i = 0; i < mi->nr_banks; i++ )
+ {
+ if ( mi->bank[i].size >= min_size )
+ {
+ t = mi->bank[i].start + mi->bank[i].size - min_size;
+ if ( t > paddr )
+ paddr = t;
+ }
+ }
+
+ if ( !paddr )
+ early_panic("Not enough memory to relocate Xen\n");
+
+ return paddr;
+}
+
static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
{
paddr_t ram_start;
cmdline_parse(device_tree_bootargs(fdt));
- setup_pagetables(boot_phys_offset);
+ setup_pagetables(boot_phys_offset, get_xen_paddr());
#ifdef EARLY_UART_ADDRESS
/* Map the UART */
return fdt_totalsize(fdt);
}
-/**
- * device_tree_get_xen_paddr - get physical address to relocate Xen to
- *
- * Xen is relocated to the top of RAM and aligned to a XEN_PADDR_ALIGN
- * boundary.
- */
-paddr_t __init device_tree_get_xen_paddr(void)
-{
- struct dt_mem_info *mi = &early_info.mem;
- paddr_t min_size;
- paddr_t paddr = 0, t;
- int i;
-
- min_size = (_end - _start + (XEN_PADDR_ALIGN-1)) & ~(XEN_PADDR_ALIGN-1);
-
- /* Find the highest bank with enough space. */
- for ( i = 0; i < mi->nr_banks; i++ )
- {
- if ( mi->bank[i].size >= min_size )
- {
- t = mi->bank[i].start + mi->bank[i].size - min_size;
- if ( t > paddr )
- paddr = t;
- }
- }
-
- if ( !paddr )
- early_panic("Not enough memory to relocate Xen\n");
-
- return paddr;
-}
-
/*
* Local variables:
* mode: C
extern unsigned long total_pages;
/* Boot-time pagetable setup */
-extern void setup_pagetables(unsigned long boot_phys_offset);
+extern void setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr);
/* MMU setup for seccondary CPUS (which already have paging enabled) */
extern void __cpuinit mmu_init_secondary_cpu(void);
/* Set up the xenheap: up to 1GB of contiguous, always-mapped memory.
extern void *device_tree_flattened;
size_t device_tree_early_init(const void *fdt);
-paddr_t device_tree_get_xen_paddr(void);
void device_tree_get_reg(const u32 **cell, u32 address_cells, u32 size_cells,
u64 *start, u64 *size);