diff options
-rw-r--r-- | sys/powerpc/aim/mmu_oea.c | 27 | ||||
-rw-r--r-- | sys/powerpc/include/pmap.h | 1 | ||||
-rw-r--r-- | sys/powerpc/powerpc/mmu_oea.c | 27 | ||||
-rw-r--r-- | sys/powerpc/powerpc/pmap.c | 27 |
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); +} |