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:
Conrad Meyer 2019-05-16 19:10:48 +00:00
parent 7460ef5d7a
commit fa3ac573a2
2 changed files with 40 additions and 0 deletions

View file

@ -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);

View file

@ -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
*/