Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 May 2025 15:28:00 GMT
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ebeeeae67845 - main - subr_devmap: Implement pmap_mapdev with pmap_mapdev_attr
Message-ID:  <202505151528.54FFS0ux071528@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=ebeeeae678455dcb47846925176d825fc0dbd792

commit ebeeeae678455dcb47846925176d825fc0dbd792
Author:     Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2025-05-15 15:07:09 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2025-05-15 15:09:46 +0000

    subr_devmap: Implement pmap_mapdev with pmap_mapdev_attr
    
    We can now support pmap_mapdev_attr on arm. Switch to use this to
    implement pmap_mapdev to reduce duplicate code.
    
    Reviewed by:    mhorne, mmel
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D50309
---
 sys/arm/include/pmap.h |  8 +-------
 sys/kern/subr_devmap.c | 51 ++++++++++++--------------------------------------
 2 files changed, 13 insertions(+), 46 deletions(-)

diff --git a/sys/arm/include/pmap.h b/sys/arm/include/pmap.h
index dcd4e0a83ab1..87f4065f6ff4 100644
--- a/sys/arm/include/pmap.h
+++ b/sys/arm/include/pmap.h
@@ -172,15 +172,9 @@ void pmap_page_set_memattr(vm_page_t, vm_memattr_t);
 #define	pmap_map_delete(pmap, sva, eva)	pmap_remove(pmap, sva, eva)
 
 void *pmap_mapdev(vm_paddr_t, vm_size_t);
+void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, vm_memattr_t);
 void pmap_unmapdev(void *, vm_size_t);
 
-static inline void *
-pmap_mapdev_attr(vm_paddr_t addr __unused, vm_size_t size __unused,
-    int attr __unused)
-{
-	panic("%s is not implemented yet!\n", __func__);
-}
-
 struct pcb;
 void pmap_set_pcb_pagedir(pmap_t, struct pcb *);
 
diff --git a/sys/kern/subr_devmap.c b/sys/kern/subr_devmap.c
index d9026dd97311..2e86d11c7ad3 100644
--- a/sys/kern/subr_devmap.c
+++ b/sys/kern/subr_devmap.c
@@ -249,44 +249,9 @@ devmap_vtop(void * vpva, vm_size_t size)
 void *
 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
 {
-	vm_offset_t va, offset;
-#ifdef __HAVE_STATIC_DEVMAP
-	void * rva;
-
-	/* First look in the static mapping table. */
-	if ((rva = devmap_ptov(pa, size)) != NULL)
-		return (rva);
-#endif
-
-	offset = pa & PAGE_MASK;
-	pa = trunc_page(pa);
-	size = round_page(size + offset);
-
-#if defined(__aarch64__) || defined(__riscv)
-	if (early_boot) {
-		akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - size);
-		va = akva_devmap_vaddr;
-		KASSERT(va >= VM_MAX_KERNEL_ADDRESS - PMAP_MAPDEV_EARLY_SIZE,
-		    ("%s: Too many early devmap mappings", __func__));
-	} else
-#endif
-#ifdef __aarch64__
-	if (size >= L2_SIZE && (pa & L2_OFFSET) == 0)
-		va = kva_alloc_aligned(size, L2_SIZE);
-	else if (size >= L3C_SIZE && (pa & L3C_OFFSET) == 0)
-		va = kva_alloc_aligned(size, L3C_SIZE);
-	else
-#endif
-		va = kva_alloc(size);
-	if (!va)
-		panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
-
-	pmap_kenter_device(va, size, pa);
-
-	return ((void *)(va + offset));
+	return (pmap_mapdev_attr(pa, size, VM_MEMATTR_DEVICE));
 }
 
-#if defined(__aarch64__) || defined(__riscv)
 void *
 pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_memattr_t ma)
 {
@@ -294,21 +259,30 @@ pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_memattr_t ma)
 #ifdef __HAVE_STATIC_DEVMAP
 	void * rva;
 
-	/* First look in the static mapping table. */
-	if ((rva = devmap_ptov(pa, size)) != NULL)
+	/*
+	 * First look in the static mapping table. These are all mapped
+	 * as device memory, so only use the devmap for VM_MEMATTR_DEVICE.
+	 */
+	if ((rva = devmap_ptov(pa, size)) != NULL) {
+		KASSERT(ma == VM_MEMATTR_DEVICE,
+		    ("%s: Non-device mapping for pa %jx (type %x)", __func__,
+		    (uintmax_t)pa, ma));
 		return (rva);
+	}
 #endif
 
 	offset = pa & PAGE_MASK;
 	pa = trunc_page(pa);
 	size = round_page(size + offset);
 
+#ifdef PMAP_MAPDEV_EARLY_SIZE
 	if (early_boot) {
 		akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - size);
 		va = akva_devmap_vaddr;
 		KASSERT(va >= (VM_MAX_KERNEL_ADDRESS - PMAP_MAPDEV_EARLY_SIZE),
 		    ("%s: Too many early devmap mappings", __func__));
 	} else
+#endif
 #ifdef __aarch64__
 	if (size >= L2_SIZE && (pa & L2_OFFSET) == 0)
 		va = kva_alloc_aligned(size, L2_SIZE);
@@ -324,7 +298,6 @@ pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_memattr_t ma)
 
 	return ((void *)(va + offset));
 }
-#endif
 
 /*
  * Unmap device memory and free the kva space.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202505151528.54FFS0ux071528>