Index: head/sys/arm64/arm64/pmap.c =================================================================== --- head/sys/arm64/arm64/pmap.c +++ head/sys/arm64/arm64/pmap.c @@ -1142,7 +1142,7 @@ * Low level mapping routines..... ***************************************************/ -static void +void pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode) { pd_entry_t *pde; Index: head/sys/arm64/include/pmap.h =================================================================== --- head/sys/arm64/include/pmap.h +++ head/sys/arm64/include/pmap.h @@ -140,10 +140,12 @@ ((((va) | (pa)) & L1_OFFSET) == 0 && (size) >= L1_SIZE) void pmap_bootstrap(vm_offset_t, vm_offset_t, vm_paddr_t, vm_size_t); +void pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode); void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t); vm_paddr_t pmap_kextract(vm_offset_t va); void pmap_kremove(vm_offset_t); void pmap_kremove_device(vm_offset_t, vm_size_t); +void *pmap_mapdev_attr(vm_offset_t pa, vm_size_t size, vm_memattr_t ma); void *pmap_mapdev(vm_offset_t, vm_size_t); void *pmap_mapbios(vm_paddr_t, vm_size_t); Index: head/sys/kern/subr_devmap.c =================================================================== --- head/sys/kern/subr_devmap.c +++ head/sys/kern/subr_devmap.c @@ -287,6 +287,37 @@ return ((void *)(va + offset)); } +#if defined(__aarch64__) +void * +pmap_mapdev_attr(vm_offset_t pa, vm_size_t size, vm_memattr_t ma) +{ + vm_offset_t va, offset; + void * rva; + + /* First look in the static mapping table. */ + if ((rva = devmap_ptov(pa, size)) != NULL) + return (rva); + + offset = pa & PAGE_MASK; + pa = trunc_page(pa); + size = round_page(size + offset); + + if (early_boot) { + akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - size); + va = akva_devmap_vaddr; + KASSERT(va >= VM_MAX_KERNEL_ADDRESS - L2_SIZE, + ("Too many early devmap mappings")); + } else + va = kva_alloc(size); + if (!va) + panic("pmap_mapdev: Couldn't alloc kernel virtual memory"); + + pmap_kenter(va, size, pa, ma); + + return ((void *)(va + offset)); +} +#endif + /* * Unmap device memory and free the kva space. */