.. | .. |
---|
30 | 30 | /* Don't have anything in the reserved bits and leaf bits */ |
---|
31 | 31 | #define RADIX_PMD_BAD_BITS 0x60000000000000e0UL |
---|
32 | 32 | #define RADIX_PUD_BAD_BITS 0x60000000000000e0UL |
---|
33 | | -#define RADIX_PGD_BAD_BITS 0x60000000000000e0UL |
---|
| 33 | +#define RADIX_P4D_BAD_BITS 0x60000000000000e0UL |
---|
34 | 34 | |
---|
35 | 35 | #define RADIX_PMD_SHIFT (PAGE_SHIFT + RADIX_PTE_INDEX_SIZE) |
---|
36 | 36 | #define RADIX_PUD_SHIFT (RADIX_PMD_SHIFT + RADIX_PMD_INDEX_SIZE) |
---|
.. | .. |
---|
72 | 72 | * | | |
---|
73 | 73 | * | | |
---|
74 | 74 | * | | |
---|
75 | | - * +------------------------------+ Kernel IO map end (0xc010000000000000) |
---|
| 75 | + * +------------------------------+ Kernel vmemmap end (0xc010000000000000) |
---|
76 | 76 | * | | |
---|
| 77 | + * | 512TB | |
---|
77 | 78 | * | | |
---|
78 | | - * | 1/2 of virtual map | |
---|
| 79 | + * +------------------------------+ Kernel IO map end/vmemap start |
---|
79 | 80 | * | | |
---|
| 81 | + * | 512TB | |
---|
80 | 82 | * | | |
---|
81 | | - * +------------------------------+ Kernel IO map start |
---|
| 83 | + * +------------------------------+ Kernel vmap end/ IO map start |
---|
82 | 84 | * | | |
---|
83 | | - * | 1/4 of virtual map | |
---|
84 | | - * | | |
---|
85 | | - * +------------------------------+ Kernel vmemap start |
---|
86 | | - * | | |
---|
87 | | - * | 1/4 of virtual map | |
---|
| 85 | + * | 512TB | |
---|
88 | 86 | * | | |
---|
89 | 87 | * +------------------------------+ Kernel virt start (0xc008000000000000) |
---|
90 | 88 | * | | |
---|
.. | .. |
---|
93 | 91 | * +------------------------------+ Kernel linear (0xc.....) |
---|
94 | 92 | */ |
---|
95 | 93 | |
---|
96 | | -#define RADIX_KERN_VIRT_START ASM_CONST(0xc008000000000000) |
---|
97 | | -#define RADIX_KERN_VIRT_SIZE ASM_CONST(0x0008000000000000) |
---|
98 | 94 | |
---|
99 | 95 | /* |
---|
100 | | - * The vmalloc space starts at the beginning of that region, and |
---|
101 | | - * occupies a quarter of it on radix config. |
---|
102 | | - * (we keep a quarter for the virtual memmap) |
---|
| 96 | + * If we store section details in page->flags we can't increase the MAX_PHYSMEM_BITS |
---|
| 97 | + * if we increase SECTIONS_WIDTH we will not store node details in page->flags and |
---|
| 98 | + * page_to_nid does a page->section->node lookup |
---|
| 99 | + * Hence only increase for VMEMMAP. Further depending on SPARSEMEM_EXTREME reduce |
---|
| 100 | + * memory requirements with large number of sections. |
---|
| 101 | + * 51 bits is the max physical real address on POWER9 |
---|
103 | 102 | */ |
---|
| 103 | + |
---|
| 104 | +#if defined(CONFIG_SPARSEMEM_VMEMMAP) && defined(CONFIG_SPARSEMEM_EXTREME) |
---|
| 105 | +#define R_MAX_PHYSMEM_BITS 51 |
---|
| 106 | +#else |
---|
| 107 | +#define R_MAX_PHYSMEM_BITS 46 |
---|
| 108 | +#endif |
---|
| 109 | + |
---|
| 110 | +#define RADIX_KERN_VIRT_START ASM_CONST(0xc008000000000000) |
---|
| 111 | +/* |
---|
| 112 | + * 49 = MAX_EA_BITS_PER_CONTEXT (hash specific). To make sure we pick |
---|
| 113 | + * the same value as hash. |
---|
| 114 | + */ |
---|
| 115 | +#define RADIX_KERN_MAP_SIZE (1UL << 49) |
---|
| 116 | + |
---|
104 | 117 | #define RADIX_VMALLOC_START RADIX_KERN_VIRT_START |
---|
105 | | -#define RADIX_VMALLOC_SIZE (RADIX_KERN_VIRT_SIZE >> 2) |
---|
| 118 | +#define RADIX_VMALLOC_SIZE RADIX_KERN_MAP_SIZE |
---|
106 | 119 | #define RADIX_VMALLOC_END (RADIX_VMALLOC_START + RADIX_VMALLOC_SIZE) |
---|
107 | | -/* |
---|
108 | | - * Defines the address of the vmemap area, in its own region on |
---|
109 | | - * hash table CPUs. |
---|
110 | | - */ |
---|
111 | | -#define RADIX_VMEMMAP_BASE (RADIX_VMALLOC_END) |
---|
112 | 120 | |
---|
113 | | -#define RADIX_KERN_IO_START (RADIX_KERN_VIRT_START + (RADIX_KERN_VIRT_SIZE >> 1)) |
---|
| 121 | +#define RADIX_KERN_IO_START RADIX_VMALLOC_END |
---|
| 122 | +#define RADIX_KERN_IO_SIZE RADIX_KERN_MAP_SIZE |
---|
| 123 | +#define RADIX_KERN_IO_END (RADIX_KERN_IO_START + RADIX_KERN_IO_SIZE) |
---|
| 124 | + |
---|
| 125 | +#define RADIX_VMEMMAP_START RADIX_KERN_IO_END |
---|
| 126 | +#define RADIX_VMEMMAP_SIZE RADIX_KERN_MAP_SIZE |
---|
| 127 | +#define RADIX_VMEMMAP_END (RADIX_VMEMMAP_START + RADIX_VMEMMAP_SIZE) |
---|
114 | 128 | |
---|
115 | 129 | #ifndef __ASSEMBLY__ |
---|
116 | 130 | #define RADIX_PTE_TABLE_SIZE (sizeof(pte_t) << RADIX_PTE_INDEX_SIZE) |
---|
.. | .. |
---|
126 | 140 | extern void radix__ptep_set_access_flags(struct vm_area_struct *vma, pte_t *ptep, |
---|
127 | 141 | pte_t entry, unsigned long address, |
---|
128 | 142 | int psize); |
---|
| 143 | + |
---|
| 144 | +extern void radix__ptep_modify_prot_commit(struct vm_area_struct *vma, |
---|
| 145 | + unsigned long addr, pte_t *ptep, |
---|
| 146 | + pte_t old_pte, pte_t pte); |
---|
129 | 147 | |
---|
130 | 148 | static inline unsigned long __radix_pte_update(pte_t *ptep, unsigned long clr, |
---|
131 | 149 | unsigned long set) |
---|
.. | .. |
---|
227 | 245 | } |
---|
228 | 246 | |
---|
229 | 247 | |
---|
230 | | -static inline int radix__pgd_bad(pgd_t pgd) |
---|
| 248 | +static inline int radix__p4d_bad(p4d_t p4d) |
---|
231 | 249 | { |
---|
232 | | - return !!(pgd_val(pgd) & RADIX_PGD_BAD_BITS); |
---|
| 250 | + return !!(p4d_val(p4d) & RADIX_P4D_BAD_BITS); |
---|
233 | 251 | } |
---|
234 | 252 | |
---|
235 | 253 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
---|
.. | .. |
---|
254 | 272 | extern pgtable_t radix__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp); |
---|
255 | 273 | extern pmd_t radix__pmdp_huge_get_and_clear(struct mm_struct *mm, |
---|
256 | 274 | unsigned long addr, pmd_t *pmdp); |
---|
257 | | -extern int radix__has_transparent_hugepage(void); |
---|
| 275 | +static inline int radix__has_transparent_hugepage(void) |
---|
| 276 | +{ |
---|
| 277 | + /* For radix 2M at PMD level means thp */ |
---|
| 278 | + if (mmu_psize_defs[MMU_PAGE_2M].shift == PMD_SHIFT) |
---|
| 279 | + return 1; |
---|
| 280 | + return 0; |
---|
| 281 | +} |
---|
258 | 282 | #endif |
---|
259 | 283 | |
---|
260 | 284 | static inline pmd_t radix__pmd_mkdevmap(pmd_t pmd) |
---|
.. | .. |
---|
288 | 312 | } |
---|
289 | 313 | |
---|
290 | 314 | #ifdef CONFIG_MEMORY_HOTPLUG |
---|
291 | | -int radix__create_section_mapping(unsigned long start, unsigned long end, int nid); |
---|
| 315 | +int radix__create_section_mapping(unsigned long start, unsigned long end, |
---|
| 316 | + int nid, pgprot_t prot); |
---|
292 | 317 | int radix__remove_section_mapping(unsigned long start, unsigned long end); |
---|
293 | 318 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
---|
294 | 319 | #endif /* __ASSEMBLY__ */ |
---|