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
This commit is contained in:
Andrew Turner 2025-05-15 16:07:09 +01:00
parent 66886d9d96
commit ebeeeae678
2 changed files with 13 additions and 46 deletions

View file

@ -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 *);

View file

@ -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.