mirror of
https://github.com/opnsense/src.git
synced 2026-06-12 18:20:49 -04:00
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:
parent
66886d9d96
commit
ebeeeae678
2 changed files with 13 additions and 46 deletions
|
|
@ -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 *);
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue