mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
mips: Implement basic pmap_kenter_device, pmap_kremove_device
Unbreak mips.BERI_DE4_SDROOT build, which uses device xdma. Device xdma depends on the pmap_kenter_device APIs. Reported by: tinderbox (local) Sponsored by: Dell EMC Isilon
This commit is contained in:
parent
7460ef5d7a
commit
fa3ac573a2
2 changed files with 40 additions and 0 deletions
|
|
@ -177,7 +177,9 @@ void pmap_unmapdev(vm_offset_t, vm_size_t);
|
|||
vm_offset_t pmap_steal_memory(vm_size_t size);
|
||||
void pmap_kenter(vm_offset_t va, vm_paddr_t pa);
|
||||
void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, vm_memattr_t attr);
|
||||
void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t);
|
||||
void pmap_kremove(vm_offset_t va);
|
||||
void pmap_kremove_device(vm_offset_t, vm_size_t);
|
||||
void *pmap_kenter_temporary(vm_paddr_t pa, int i);
|
||||
void pmap_kenter_temporary_free(vm_paddr_t pa);
|
||||
void pmap_flush_pvcache(vm_page_t m);
|
||||
|
|
|
|||
|
|
@ -854,6 +854,44 @@ pmap_kenter(vm_offset_t va, vm_paddr_t pa)
|
|||
pmap_kenter_attr(va, pa, VM_MEMATTR_DEFAULT);
|
||||
}
|
||||
|
||||
void
|
||||
pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa)
|
||||
{
|
||||
|
||||
KASSERT((size & PAGE_MASK) == 0,
|
||||
("%s: device mapping not page-sized", __func__));
|
||||
|
||||
for (; size > 0; size -= PAGE_SIZE) {
|
||||
/*
|
||||
* XXXCEM: this is somewhat inefficient on SMP systems in that
|
||||
* every single page is individually TLB-invalidated via
|
||||
* rendezvous (pmap_update_page()), instead of invalidating the
|
||||
* entire range via a single rendezvous.
|
||||
*/
|
||||
pmap_kenter_attr(va, pa, VM_MEMATTR_UNCACHEABLE);
|
||||
va += PAGE_SIZE;
|
||||
pa += PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pmap_kremove_device(vm_offset_t va, vm_size_t size)
|
||||
{
|
||||
|
||||
KASSERT((size & PAGE_MASK) == 0,
|
||||
("%s: device mapping not page-sized", __func__));
|
||||
|
||||
/*
|
||||
* XXXCEM: Similar to pmap_kenter_device, this is inefficient on SMP,
|
||||
* in that pages are invalidated individually instead of a single range
|
||||
* rendezvous.
|
||||
*/
|
||||
for (; size > 0; size -= PAGE_SIZE) {
|
||||
pmap_kremove(va);
|
||||
va += PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* remove a page from the kernel pagetables
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue