Date: Wed, 21 Jul 2021 13:24:16 GMT From: Mateusz Guzik <mjg@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 2b0a97f0c75f - stable/12 - mips: Implement basic pmap_kenter_device, pmap_kremove_device Message-ID: <202107211324.16LDOGpU051495@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch stable/12 has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=2b0a97f0c75fc7a2af81150be892ac345a5b24a3 commit 2b0a97f0c75fc7a2af81150be892ac345a5b24a3 Author: Conrad Meyer <cem@FreeBSD.org> AuthorDate: 2019-05-16 19:10:48 +0000 Commit: Mateusz Guzik <mjg@FreeBSD.org> CommitDate: 2021-07-21 13:24:09 +0000 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 (cherry picked from commit fa3ac573a2f712393cebd195bf7331cff3d1b8fe) --- sys/mips/include/pmap.h | 2 ++ sys/mips/mips/pmap.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/sys/mips/include/pmap.h b/sys/mips/include/pmap.h index ba31de835d23..edc9089a6fbc 100644 --- a/sys/mips/include/pmap.h +++ b/sys/mips/include/pmap.h @@ -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); diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index 3b55f43c6b80..f41bae28a9ea 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -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 */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202107211324.16LDOGpU051495>