Add pmap_mapdev and pmap_unmapdev.
This commit is contained in:
parent
0d29067503
commit
8bbfa33a79
@ -2272,3 +2272,46 @@ pmap_clear_bit(vm_page_t m, int ptebit)
|
|||||||
|
|
||||||
return ((rv & ptebit) != 0);
|
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);
|
||||||
|
}
|
||||||
|
@ -68,6 +68,8 @@ extern struct pmap kernel_pmap_store;
|
|||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
|
|
||||||
void pmap_bootstrap(vm_offset_t, vm_offset_t);
|
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 *);
|
void pmap_deactivate(struct thread *);
|
||||||
vm_offset_t pmap_kextract(vm_offset_t);
|
vm_offset_t pmap_kextract(vm_offset_t);
|
||||||
|
|
||||||
|
@ -2272,3 +2272,46 @@ pmap_clear_bit(vm_page_t m, int ptebit)
|
|||||||
|
|
||||||
return ((rv & ptebit) != 0);
|
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);
|
||||||
|
}
|
||||||
|
@ -2272,3 +2272,46 @@ pmap_clear_bit(vm_page_t m, int ptebit)
|
|||||||
|
|
||||||
return ((rv & ptebit) != 0);
|
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);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user