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>