summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorbenno <benno@FreeBSD.org>2002-06-29 09:45:59 +0000
committerbenno <benno@FreeBSD.org>2002-06-29 09:45:59 +0000
commitd8edf207d8090febb91076ecb709862c08042da6 (patch)
tree0010b1bea7dce5e473013e1d730d898406088494 /sys
parent668238a99c8db47bb82a5df79911fe991ddd5332 (diff)
downloadFreeBSD-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.c43
-rw-r--r--sys/powerpc/include/pmap.h2
-rw-r--r--sys/powerpc/powerpc/mmu_oea.c43
-rw-r--r--sys/powerpc/powerpc/pmap.c43
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);
+}
OpenPOWER on IntegriCloud