arm64: enable superpage mappings by pmap_mapdev{,_attr}()
In order for pmap_kenter{,_device}() to create superpage mappings,
either 64 KB or 2 MB, pmap_mapdev{,_attr}() must request appropriately
aligned virtual addresses.
Reviewed by: markj
Tested by: gallatin
Differential Revision: https://reviews.freebsd.org/D42737
This commit is contained in:
@@ -273,6 +273,13 @@ pmap_mapdev(vm_paddr_t pa, vm_size_t size)
|
||||
KASSERT(va >= VM_MAX_KERNEL_ADDRESS - PMAP_MAPDEV_EARLY_SIZE,
|
||||
("Too many early devmap mappings"));
|
||||
} 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)
|
||||
@@ -304,6 +311,13 @@ pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_memattr_t ma)
|
||||
KASSERT(va >= (VM_MAX_KERNEL_ADDRESS - (PMAP_MAPDEV_EARLY_SIZE)),
|
||||
("Too many early devmap mappings 2"));
|
||||
} else
|
||||
#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");
|
||||
|
||||
Reference in New Issue
Block a user