summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/powerpc/aim/mmu_oea.c27
-rw-r--r--sys/powerpc/include/pmap.h1
-rw-r--r--sys/powerpc/powerpc/mmu_oea.c27
-rw-r--r--sys/powerpc/powerpc/pmap.c27
4 files changed, 82 insertions, 0 deletions
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index 740b99d..f919550 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -1897,3 +1897,30 @@ pmap_new_proc(struct proc *p)
m->valid = VM_PAGE_BITS_ALL;
}
}
+
+void *
+pmap_mapdev(vm_offset_t pa, vm_size_t len)
+{
+ vm_offset_t faddr;
+ vm_offset_t taddr, va;
+ int off;
+
+ faddr = trunc_page(pa);
+ off = pa - faddr;
+ len = round_page(off + len);
+
+ GIANT_REQUIRED;
+
+ va = taddr = kmem_alloc_pageable(kernel_map, len);
+
+ if (va == 0)
+ return NULL;
+
+ for (; len > 0; len -= PAGE_SIZE) {
+ pmap_kenter(taddr, faddr);
+ faddr += PAGE_SIZE;
+ taddr += PAGE_SIZE;
+ }
+
+ return (void *)(va + off);
+}
diff --git a/sys/powerpc/include/pmap.h b/sys/powerpc/include/pmap.h
index 26c0d6a..ce744d9 100644
--- a/sys/powerpc/include/pmap.h
+++ b/sys/powerpc/include/pmap.h
@@ -96,6 +96,7 @@ extern vm_offset_t virtual_avail;
extern vm_offset_t virtual_end;
void pmap_bootstrap __P((void));
+void *pmap_mapdev __P((vm_offset_t, vm_size_t));
void pmap_setavailmem __P((u_int kernelstart, u_int kernelend));
vm_offset_t pmap_steal_memory __P((vm_size_t));
boolean_t ptemodify __P((struct vm_page *, u_int, u_int));
diff --git a/sys/powerpc/powerpc/mmu_oea.c b/sys/powerpc/powerpc/mmu_oea.c
index 740b99d..f919550 100644
--- a/sys/powerpc/powerpc/mmu_oea.c
+++ b/sys/powerpc/powerpc/mmu_oea.c
@@ -1897,3 +1897,30 @@ pmap_new_proc(struct proc *p)
m->valid = VM_PAGE_BITS_ALL;
}
}
+
+void *
+pmap_mapdev(vm_offset_t pa, vm_size_t len)
+{
+ vm_offset_t faddr;
+ vm_offset_t taddr, va;
+ int off;
+
+ faddr = trunc_page(pa);
+ off = pa - faddr;
+ len = round_page(off + len);
+
+ GIANT_REQUIRED;
+
+ va = taddr = kmem_alloc_pageable(kernel_map, len);
+
+ if (va == 0)
+ return NULL;
+
+ for (; len > 0; len -= PAGE_SIZE) {
+ pmap_kenter(taddr, faddr);
+ faddr += PAGE_SIZE;
+ taddr += PAGE_SIZE;
+ }
+
+ return (void *)(va + off);
+}
diff --git a/sys/powerpc/powerpc/pmap.c b/sys/powerpc/powerpc/pmap.c
index 740b99d..f919550 100644
--- a/sys/powerpc/powerpc/pmap.c
+++ b/sys/powerpc/powerpc/pmap.c
@@ -1897,3 +1897,30 @@ pmap_new_proc(struct proc *p)
m->valid = VM_PAGE_BITS_ALL;
}
}
+
+void *
+pmap_mapdev(vm_offset_t pa, vm_size_t len)
+{
+ vm_offset_t faddr;
+ vm_offset_t taddr, va;
+ int off;
+
+ faddr = trunc_page(pa);
+ off = pa - faddr;
+ len = round_page(off + len);
+
+ GIANT_REQUIRED;
+
+ va = taddr = kmem_alloc_pageable(kernel_map, len);
+
+ if (va == 0)
+ return NULL;
+
+ for (; len > 0; len -= PAGE_SIZE) {
+ pmap_kenter(taddr, faddr);
+ faddr += PAGE_SIZE;
+ taddr += PAGE_SIZE;
+ }
+
+ return (void *)(va + off);
+}
OpenPOWER on IntegriCloud