xref: /linux/arch/arm64/include/asm/vmalloc.h (revision feafee284579d29537a5a56ba8f23894f0463f3d)
1 #ifndef _ASM_ARM64_VMALLOC_H
2 #define _ASM_ARM64_VMALLOC_H
3 
4 #include <asm/page.h>
5 #include <asm/pgtable.h>
6 
7 #ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
8 
9 #define arch_vmap_pud_supported arch_vmap_pud_supported
arch_vmap_pud_supported(pgprot_t prot)10 static inline bool arch_vmap_pud_supported(pgprot_t prot)
11 {
12 	return pud_sect_supported();
13 }
14 
15 #define arch_vmap_pmd_supported arch_vmap_pmd_supported
arch_vmap_pmd_supported(pgprot_t prot)16 static inline bool arch_vmap_pmd_supported(pgprot_t prot)
17 {
18 	return true;
19 }
20 
21 #define arch_vmap_pte_range_map_size arch_vmap_pte_range_map_size
arch_vmap_pte_range_map_size(unsigned long addr,unsigned long end,u64 pfn,unsigned int max_page_shift)22 static inline unsigned long arch_vmap_pte_range_map_size(unsigned long addr,
23 						unsigned long end, u64 pfn,
24 						unsigned int max_page_shift)
25 {
26 	/*
27 	 * If the block is at least CONT_PTE_SIZE in size, and is naturally
28 	 * aligned in both virtual and physical space, then we can pte-map the
29 	 * block using the PTE_CONT bit for more efficient use of the TLB.
30 	 */
31 	if (max_page_shift < CONT_PTE_SHIFT)
32 		return PAGE_SIZE;
33 
34 	if (end - addr < CONT_PTE_SIZE)
35 		return PAGE_SIZE;
36 
37 	if (!IS_ALIGNED(addr, CONT_PTE_SIZE))
38 		return PAGE_SIZE;
39 
40 	if (!IS_ALIGNED(PFN_PHYS(pfn), CONT_PTE_SIZE))
41 		return PAGE_SIZE;
42 
43 	return CONT_PTE_SIZE;
44 }
45 
46 #define arch_vmap_pte_range_unmap_size arch_vmap_pte_range_unmap_size
arch_vmap_pte_range_unmap_size(unsigned long addr,pte_t * ptep)47 static inline unsigned long arch_vmap_pte_range_unmap_size(unsigned long addr,
48 							   pte_t *ptep)
49 {
50 	/*
51 	 * The caller handles alignment so it's sufficient just to check
52 	 * PTE_CONT.
53 	 */
54 	return pte_valid_cont(__ptep_get(ptep)) ? CONT_PTE_SIZE : PAGE_SIZE;
55 }
56 
57 #define arch_vmap_pte_supported_shift arch_vmap_pte_supported_shift
arch_vmap_pte_supported_shift(unsigned long size)58 static inline int arch_vmap_pte_supported_shift(unsigned long size)
59 {
60 	if (size >= CONT_PTE_SIZE)
61 		return CONT_PTE_SHIFT;
62 
63 	return PAGE_SHIFT;
64 }
65 
66 #endif
67 
68 #define arch_vmap_pgprot_tagged arch_vmap_pgprot_tagged
arch_vmap_pgprot_tagged(pgprot_t prot)69 static inline pgprot_t arch_vmap_pgprot_tagged(pgprot_t prot)
70 {
71 	return pgprot_tagged(prot);
72 }
73 
74 #endif /* _ASM_ARM64_VMALLOC_H */
75