|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [PATCH v3 30/43] arm64: add a new helper ioremap
This patch adds a new helper : ioremap.
This helper is used by the GIC mapping.
The return address is got from the demand area.
Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx>
---
arch/arm/gic.c | 6 ++++--
arch/arm/mm.c | 38 ++++++++++++++++++++++++++++++++------
include/arm/arch_mm.h | 2 ++
3 files changed, 38 insertions(+), 8 deletions(-)
diff --git a/arch/arm/gic.c b/arch/arm/gic.c
index 1855293..1e37cdc 100644
--- a/arch/arm/gic.c
+++ b/arch/arm/gic.c
@@ -207,8 +207,10 @@ void gic_init(void) {
continue;
}
- gic.gicd_base = to_virt((long) fdt64_to_cpu(reg[0]));
- gic.gicc_base = to_virt((long) fdt64_to_cpu(reg[2]));
+ gic.gicd_base = ioremap((unsigned long) fdt64_to_cpu(reg[0]),
+ (unsigned long) fdt64_to_cpu(reg[1]));
+ gic.gicc_base = ioremap((unsigned long) fdt64_to_cpu(reg[2]),
+ (unsigned long) fdt64_to_cpu(reg[3]));
printk("Found GIC: gicd_base = %p, gicc_base = %p\n",
gic.gicd_base, gic.gicc_base);
break;
}
diff --git a/arch/arm/mm.c b/arch/arm/mm.c
index e83ac70..b1c192a 100644
--- a/arch/arm/mm.c
+++ b/arch/arm/mm.c
@@ -18,12 +18,6 @@ int arch_check_mem_block(int index, unsigned long *r_min,
unsigned long *r_max)
return 0;
}
-unsigned long allocate_ondemand(unsigned long n, unsigned long alignment)
-{
- // FIXME
- BUG();
-}
-
extern lpae_t boot_l0_pgtable[512];
static inline void set_pgt_entry(lpae_t *ptr, lpae_t val)
@@ -234,6 +228,7 @@ void init_pagetable(unsigned long *start_pfn, unsigned long
base,
}
static unsigned long virt_kernel_area_end;
+static unsigned long virt_demand_area_end;
void arch_mm_preinit(void *dtb_pointer)
{
paddr_t **dtb_p = dtb_pointer;
@@ -241,6 +236,7 @@ void arch_mm_preinit(void *dtb_pointer)
uintptr_t end = (uintptr_t) &_end;
virt_kernel_area_end = VIRT_KERNEL_AREA;
+ virt_demand_area_end = VIRT_DEMAND_AREA;
dtb = to_virt(((paddr_t)dtb));
first_free_pfn = PFN_UP(to_phys(end));
@@ -293,6 +289,36 @@ unsigned long map_frame_virt(unsigned long mfn)
return addr;
}
+unsigned long allocate_ondemand(unsigned long n, unsigned long alignment)
+{
+ unsigned long addr;
+
+ addr = virt_demand_area_end;
+
+ /* Just for simple, make it page aligned. */
+ virt_demand_area_end += (n + PAGE_SIZE - 1) & PAGE_MASK;
+
+ ASSERT(virt_demand_area_end <= VIRT_HEAP_AREA);
+
+ return addr;
+}
+
+void *ioremap(paddr_t paddr, unsigned long size)
+{
+ unsigned long addr;
+ int ret;
+
+ addr = allocate_ondemand(size, 1);
+ if (!addr)
+ return NULL;
+
+ ret = build_pagetable(addr, PHYS_PFN(paddr), PFN_UP(size), MEM_DEV_ATTR,
+ init_pagetable_ok? alloc_new_page: early_alloc_page, 3);
+ if (ret < 0)
+ return NULL;
+ return (void*)addr;
+}
+
void arch_init_mm(unsigned long *start_pfn_p, unsigned long *max_pfn_p)
{
int memory;
diff --git a/include/arm/arch_mm.h b/include/arm/arch_mm.h
index 4f3fd8f..ad122e7 100644
--- a/include/arm/arch_mm.h
+++ b/include/arm/arch_mm.h
@@ -7,6 +7,7 @@ typedef uint64_t paddr_t;
#define MAX_MEM_SIZE (1UL << 39)
#define VIRT_KERNEL_AREA ((unsigned long)to_virt(MAX_MEM_SIZE))
#define VIRT_DEMAND_AREA (VIRT_KERNEL_AREA + MAX_MEM_SIZE)
+#define VIRT_HEAP_AREA (VIRT_DEMAND_AREA + MAX_MEM_SIZE)
typedef uint64_t lpae_t;
@@ -40,4 +41,5 @@ void arch_mm_preinit(void *dtb_pointer);
// FIXME
#define map_frames(f, n) (NULL)
+void *ioremap(paddr_t addr, unsigned long size);
#endif
--
2.7.4
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |