| .. | .. |
|---|
| 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__ */ |
|---|