diff options
author | benno <benno@FreeBSD.org> | 2002-06-29 09:45:59 +0000 |
---|---|---|
committer | benno <benno@FreeBSD.org> | 2002-06-29 09:45:59 +0000 |
commit | d8edf207d8090febb91076ecb709862c08042da6 (patch) | |
tree | 0010b1bea7dce5e473013e1d730d898406088494 /sys | |
parent | 668238a99c8db47bb82a5df79911fe991ddd5332 (diff) | |
download | FreeBSD-src-d8edf207d8090febb91076ecb709862c08042da6.zip FreeBSD-src-d8edf207d8090febb91076ecb709862c08042da6.tar.gz |
Add pmap_mapdev and pmap_unmapdev.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/powerpc/aim/mmu_oea.c | 43 | ||||
-rw-r--r-- | sys/powerpc/include/pmap.h | 2 | ||||
-rw-r--r-- | sys/powerpc/powerpc/mmu_oea.c | 43 | ||||
-rw-r--r-- | sys/powerpc/powerpc/pmap.c | 43 |
4 files changed, 131 insertions, 0 deletions
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index e8ae11d..afeb8ce 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -2272,3 +2272,46 @@ pmap_clear_bit(vm_page_t m, int ptebit) return ((rv & ptebit) != 0); } + +/* + * Map a set of physical memory pages into the kernel virtual + * address space. Return a pointer to where it is mapped. This + * routine is intended to be used for mapping device memory, + * NOT real memory. + */ +void * +pmap_mapdev(vm_offset_t pa, vm_size_t size) +{ + vm_offset_t va, tmpva, offset; + + pa = trunc_page(pa); + offset = pa & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + + GIANT_REQUIRED; + + va = kmem_alloc_pageable(kernel_map, size); + if (!va) + panic("pmap_mapdev: Couldn't alloc kernel virtual memory"); + + for (tmpva = va; size > 0;) { + pmap_kenter(tmpva, pa); + TLBIE(tmpva); /* XXX or should it be invalidate-all ? */ + size -= PAGE_SIZE; + tmpva += PAGE_SIZE; + pa += PAGE_SIZE; + } + + return ((void *)(va + offset)); +} + +void +pmap_unmapdev(vm_offset_t va, vm_size_t size) +{ + vm_offset_t base, offset; + + base = trunc_page(va); + offset = va & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + kmem_free(kernel_map, base, size); +} diff --git a/sys/powerpc/include/pmap.h b/sys/powerpc/include/pmap.h index 19b3d96..27f9ba0 100644 --- a/sys/powerpc/include/pmap.h +++ b/sys/powerpc/include/pmap.h @@ -68,6 +68,8 @@ extern struct pmap kernel_pmap_store; #ifdef _KERNEL void pmap_bootstrap(vm_offset_t, vm_offset_t); +void *pmap_mapdev(vm_offset_t, vm_size_t); +void pmap_unmapdev(vm_offset_t, vm_size_t); void pmap_deactivate(struct thread *); vm_offset_t pmap_kextract(vm_offset_t); diff --git a/sys/powerpc/powerpc/mmu_oea.c b/sys/powerpc/powerpc/mmu_oea.c index e8ae11d..afeb8ce 100644 --- a/sys/powerpc/powerpc/mmu_oea.c +++ b/sys/powerpc/powerpc/mmu_oea.c @@ -2272,3 +2272,46 @@ pmap_clear_bit(vm_page_t m, int ptebit) return ((rv & ptebit) != 0); } + +/* + * Map a set of physical memory pages into the kernel virtual + * address space. Return a pointer to where it is mapped. This + * routine is intended to be used for mapping device memory, + * NOT real memory. + */ +void * +pmap_mapdev(vm_offset_t pa, vm_size_t size) +{ + vm_offset_t va, tmpva, offset; + + pa = trunc_page(pa); + offset = pa & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + + GIANT_REQUIRED; + + va = kmem_alloc_pageable(kernel_map, size); + if (!va) + panic("pmap_mapdev: Couldn't alloc kernel virtual memory"); + + for (tmpva = va; size > 0;) { + pmap_kenter(tmpva, pa); + TLBIE(tmpva); /* XXX or should it be invalidate-all ? */ + size -= PAGE_SIZE; + tmpva += PAGE_SIZE; + pa += PAGE_SIZE; + } + + return ((void *)(va + offset)); +} + +void +pmap_unmapdev(vm_offset_t va, vm_size_t size) +{ + vm_offset_t base, offset; + + base = trunc_page(va); + offset = va & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + kmem_free(kernel_map, base, size); +} diff --git a/sys/powerpc/powerpc/pmap.c b/sys/powerpc/powerpc/pmap.c index e8ae11d..afeb8ce 100644 --- a/sys/powerpc/powerpc/pmap.c +++ b/sys/powerpc/powerpc/pmap.c @@ -2272,3 +2272,46 @@ pmap_clear_bit(vm_page_t m, int ptebit) return ((rv & ptebit) != 0); } + +/* + * Map a set of physical memory pages into the kernel virtual + * address space. Return a pointer to where it is mapped. This + * routine is intended to be used for mapping device memory, + * NOT real memory. + */ +void * +pmap_mapdev(vm_offset_t pa, vm_size_t size) +{ + vm_offset_t va, tmpva, offset; + + pa = trunc_page(pa); + offset = pa & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + + GIANT_REQUIRED; + + va = kmem_alloc_pageable(kernel_map, size); + if (!va) + panic("pmap_mapdev: Couldn't alloc kernel virtual memory"); + + for (tmpva = va; size > 0;) { + pmap_kenter(tmpva, pa); + TLBIE(tmpva); /* XXX or should it be invalidate-all ? */ + size -= PAGE_SIZE; + tmpva += PAGE_SIZE; + pa += PAGE_SIZE; + } + + return ((void *)(va + offset)); +} + +void +pmap_unmapdev(vm_offset_t va, vm_size_t size) +{ + vm_offset_t base, offset; + + base = trunc_page(va); + offset = va & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + kmem_free(kernel_map, base, size); +} |