Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#ifndef _ASM_RISCV_VMALLOC_H
2#define _ASM_RISCV_VMALLOC_H
3
4#ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
5
6#define IOREMAP_MAX_ORDER (PUD_SHIFT)
7
8#define arch_vmap_pud_supported arch_vmap_pud_supported
9static inline bool arch_vmap_pud_supported(pgprot_t prot)
10{
11 return true;
12}
13
14#define arch_vmap_pmd_supported arch_vmap_pmd_supported
15static inline bool arch_vmap_pmd_supported(pgprot_t prot)
16{
17 return true;
18}
19
20#ifdef CONFIG_RISCV_ISA_SVNAPOT
21#include <linux/pgtable.h>
22
23#define arch_vmap_pte_range_map_size arch_vmap_pte_range_map_size
24static inline unsigned long arch_vmap_pte_range_map_size(unsigned long addr, unsigned long end,
25 u64 pfn, unsigned int max_page_shift)
26{
27 unsigned long map_size = PAGE_SIZE;
28 unsigned long size, order;
29
30 if (!has_svnapot())
31 return map_size;
32
33 for_each_napot_order_rev(order) {
34 if (napot_cont_shift(order) > max_page_shift)
35 continue;
36
37 size = napot_cont_size(order);
38 if (end - addr < size)
39 continue;
40
41 if (!IS_ALIGNED(addr, size))
42 continue;
43
44 if (!IS_ALIGNED(PFN_PHYS(pfn), size))
45 continue;
46
47 map_size = size;
48 break;
49 }
50
51 return map_size;
52}
53
54#define arch_vmap_pte_supported_shift arch_vmap_pte_supported_shift
55static inline int arch_vmap_pte_supported_shift(unsigned long size)
56{
57 int shift = PAGE_SHIFT;
58 unsigned long order;
59
60 if (!has_svnapot())
61 return shift;
62
63 WARN_ON_ONCE(size >= PMD_SIZE);
64
65 for_each_napot_order_rev(order) {
66 if (napot_cont_size(order) > size)
67 continue;
68
69 if (!IS_ALIGNED(size, napot_cont_size(order)))
70 continue;
71
72 shift = napot_cont_shift(order);
73 break;
74 }
75
76 return shift;
77}
78
79#endif /* CONFIG_RISCV_ISA_SVNAPOT */
80#endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
81#endif /* _ASM_RISCV_VMALLOC_H */