#include <xen/sched.h>
#include <xen/vmap.h>
#include <xsm/xsm.h>
+#include <xen/pfn.h>
struct domain *dom_xen, *dom_io, *dom_cow;
frametable_virt_end = FRAMETABLE_VIRT_START + (nr_pages * sizeof(struct page_info));
}
-/* Map the physical memory range start - start + len into virtual
- * memory and return the virtual address of the mapping.
- * start has to be 2MB aligned.
- * len has to be < VMAP_VIRT_END - VMAP_VIRT_START.
- */
-static __initdata unsigned long early_vmap_start = VMAP_VIRT_END;
-void* __init early_ioremap(paddr_t start, size_t len, unsigned attributes)
+void *__init arch_vmap_virt_end(void)
{
- paddr_t end = start + len;
- unsigned long map_start;
-
- len = (len + SECOND_SIZE - 1) & ~SECOND_MASK;
- early_vmap_start -= len;
-
- ASSERT(!(start & (~SECOND_MASK)));
- ASSERT(!(early_vmap_start & (~SECOND_MASK)));
-
- /* The range we need to map is too big */
- if ( early_vmap_start >= VMAP_VIRT_START )
- return NULL;
-
- map_start = early_vmap_start;
- while ( start < end )
- {
- lpae_t e = mfn_to_xen_entry(start >> PAGE_SHIFT);
- e.pt.ai = attributes;
- write_pte(xen_second + second_table_offset(map_start), e);
-
- start += SECOND_SIZE;
- map_start += SECOND_SIZE;
- }
- flush_xen_data_tlb_range_va(early_vmap_start, len);
-
- return (void*)early_vmap_start;
+ return (void *)VMAP_VIRT_END;
}
-void *__init arch_vmap_virt_end(void)
+/*
+ * This function should only be used to remap device address ranges
+ * TODO: add a check to verify this assumption
+ */
+void *ioremap_attr(paddr_t pa, size_t len, unsigned int attributes)
{
- return (void *)early_vmap_start;
+ unsigned long pfn = PFN_DOWN(pa);
+ unsigned int offs = pa & (PAGE_SIZE - 1);
+ unsigned int nr = PFN_UP(offs + len);
+
+ return (__vmap(&pfn, nr, 1, 1, attributes) + offs);
}
static int create_xen_table(lpae_t *entry)
setup_pagetables(boot_phys_offset, get_xen_paddr());
setup_mm(fdt_paddr, fdt_size);
+ vm_init();
+
#ifdef EARLY_UART_ADDRESS
/* TODO Need to get device tree or command line for UART address */
pl011_init(0, FIXMAP_ADDR(FIXMAP_CONSOLE));
console_init_postirq();
- vm_init();
-
do_presmp_initcalls();
for_each_present_cpu ( i )
extern void set_fixmap(unsigned map, unsigned long mfn, unsigned attributes);
/* Remove a mapping from a fixmap entry */
extern void clear_fixmap(unsigned map);
-/* map a 2MB aligned physical range in virtual memory. */
-void* early_ioremap(paddr_t start, size_t len, unsigned attributes);
+/* map a physical range in virtual memory */
+void __iomem *ioremap_attr(paddr_t start, size_t len, unsigned attributes);
+
+static inline void __iomem *ioremap_nocache(paddr_t start, size_t len)
+{
+ return ioremap_attr(start, len, PAGE_HYPERVISOR_NOCACHE);
+}
+
+static inline void __iomem *ioremap_cache(paddr_t start, size_t len)
+{
+ return ioremap_attr(start, len, PAGE_HYPERVISOR);
+}
+
+static inline void __iomem *ioremap_wc(paddr_t start, size_t len)
+{
+ return ioremap_attr(start, len, PAGE_HYPERVISOR_WC);
+}
#define mfn_valid(mfn) ({ \
unsigned long __m_f_n = (mfn); \