forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/arch/powerpc/include/asm/book3s/64/radix.h
....@@ -30,7 +30,7 @@
3030 /* Don't have anything in the reserved bits and leaf bits */
3131 #define RADIX_PMD_BAD_BITS 0x60000000000000e0UL
3232 #define RADIX_PUD_BAD_BITS 0x60000000000000e0UL
33
-#define RADIX_PGD_BAD_BITS 0x60000000000000e0UL
33
+#define RADIX_P4D_BAD_BITS 0x60000000000000e0UL
3434
3535 #define RADIX_PMD_SHIFT (PAGE_SHIFT + RADIX_PTE_INDEX_SIZE)
3636 #define RADIX_PUD_SHIFT (RADIX_PMD_SHIFT + RADIX_PMD_INDEX_SIZE)
....@@ -72,19 +72,17 @@
7272 * | |
7373 * | |
7474 * | |
75
- * +------------------------------+ Kernel IO map end (0xc010000000000000)
75
+ * +------------------------------+ Kernel vmemmap end (0xc010000000000000)
7676 * | |
77
+ * | 512TB |
7778 * | |
78
- * | 1/2 of virtual map |
79
+ * +------------------------------+ Kernel IO map end/vmemap start
7980 * | |
81
+ * | 512TB |
8082 * | |
81
- * +------------------------------+ Kernel IO map start
83
+ * +------------------------------+ Kernel vmap end/ IO map start
8284 * | |
83
- * | 1/4 of virtual map |
84
- * | |
85
- * +------------------------------+ Kernel vmemap start
86
- * | |
87
- * | 1/4 of virtual map |
85
+ * | 512TB |
8886 * | |
8987 * +------------------------------+ Kernel virt start (0xc008000000000000)
9088 * | |
....@@ -93,24 +91,40 @@
9391 * +------------------------------+ Kernel linear (0xc.....)
9492 */
9593
96
-#define RADIX_KERN_VIRT_START ASM_CONST(0xc008000000000000)
97
-#define RADIX_KERN_VIRT_SIZE ASM_CONST(0x0008000000000000)
9894
9995 /*
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
103102 */
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
+
104117 #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
106119 #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)
112120
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)
114128
115129 #ifndef __ASSEMBLY__
116130 #define RADIX_PTE_TABLE_SIZE (sizeof(pte_t) << RADIX_PTE_INDEX_SIZE)
....@@ -126,6 +140,10 @@
126140 extern void radix__ptep_set_access_flags(struct vm_area_struct *vma, pte_t *ptep,
127141 pte_t entry, unsigned long address,
128142 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);
129147
130148 static inline unsigned long __radix_pte_update(pte_t *ptep, unsigned long clr,
131149 unsigned long set)
....@@ -227,9 +245,9 @@
227245 }
228246
229247
230
-static inline int radix__pgd_bad(pgd_t pgd)
248
+static inline int radix__p4d_bad(p4d_t p4d)
231249 {
232
- return !!(pgd_val(pgd) & RADIX_PGD_BAD_BITS);
250
+ return !!(p4d_val(p4d) & RADIX_P4D_BAD_BITS);
233251 }
234252
235253 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
....@@ -254,7 +272,13 @@
254272 extern pgtable_t radix__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
255273 extern pmd_t radix__pmdp_huge_get_and_clear(struct mm_struct *mm,
256274 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
+}
258282 #endif
259283
260284 static inline pmd_t radix__pmd_mkdevmap(pmd_t pmd)
....@@ -288,7 +312,8 @@
288312 }
289313
290314 #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);
292317 int radix__remove_section_mapping(unsigned long start, unsigned long end);
293318 #endif /* CONFIG_MEMORY_HOTPLUG */
294319 #endif /* __ASSEMBLY__ */