Skip site navigation (1)Skip section navigation (2)
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>