git: ebeeeae67845 - main - subr_devmap: Implement pmap_mapdev with pmap_mapdev_attr
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 15 May 2025 15:28:00 UTC
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.