Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sh: default to extended TLB support.

All SH-X2 and SH-X3 parts support an extended TLB mode, which has been
left as experimental since support was originally merged. Now that it's
had some time to stabilize and get some exposure to various platforms,
we can drop it as an option and default enable it across the board.

This is also good future proofing for newer parts that will drop support
for the legacy TLB mode completely.

This will also force 3-level page tables for all newer parts, which is
necessary both for the varying page sizes and larger memories.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>

+17 -41
+1 -1
arch/sh/include/asm/pgalloc.h
··· 9 9 extern pgd_t *pgd_alloc(struct mm_struct *); 10 10 extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); 11 11 12 - #ifdef CONFIG_PGTABLE_LEVELS_3 12 + #if PAGETABLE_LEVELS > 2 13 13 extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd); 14 14 extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address); 15 15 extern void pmd_free(struct mm_struct *mm, pmd_t *pmd);
+1 -1
arch/sh/include/asm/pgtable.h
··· 12 12 #ifndef __ASM_SH_PGTABLE_H 13 13 #define __ASM_SH_PGTABLE_H 14 14 15 - #ifdef CONFIG_PGTABLE_LEVELS_3 15 + #ifdef CONFIG_X2TLB 16 16 #include <asm/pgtable_pmd.h> 17 17 #else 18 18 #include <asm/pgtable_nopmd.h>
+6 -5
arch/sh/include/asm/pgtable_nopmd.h
··· 6 6 /* 7 7 * traditional two-level paging structure 8 8 */ 9 + #define PAGETABLE_LEVELS 2 9 10 10 11 /* PTE bits */ 11 - #define PTE_MAGNITUDE 2 /* 32-bit PTEs */ 12 + #define PTE_MAGNITUDE 2 /* 32-bit PTEs */ 12 13 13 - #define PTE_SHIFT PAGE_SHIFT 14 - #define PTE_BITS (PTE_SHIFT - PTE_MAGNITUDE) 14 + #define PTE_SHIFT PAGE_SHIFT 15 + #define PTE_BITS (PTE_SHIFT - PTE_MAGNITUDE) 15 16 16 17 /* PGD bits */ 17 - #define PGDIR_SHIFT (PTE_SHIFT + PTE_BITS) 18 + #define PGDIR_SHIFT (PTE_SHIFT + PTE_BITS) 18 19 19 - #define PTRS_PER_PGD (PAGE_SIZE / (1 << PTE_MAGNITUDE)) 20 + #define PTRS_PER_PGD (PAGE_SIZE / (1 << PTE_MAGNITUDE)) 20 21 #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) 21 22 22 23 #endif /* __ASM_SH_PGTABLE_NOPMD_H */
+3 -2
arch/sh/include/asm/pgtable_pmd.h
··· 7 7 * Some cores need a 3-level page table layout, for example when using 8 8 * 64-bit PTEs and 4K pages. 9 9 */ 10 + #define PAGETABLE_LEVELS 3 10 11 11 - #define PTE_MAGNITUDE 3 /* 64-bit PTEs on extended mode SH-X2 TLB */ 12 + #define PTE_MAGNITUDE 3 /* 64-bit PTEs on SH-X2 TLB */ 12 13 13 14 /* PGD bits */ 14 - #define PGDIR_SHIFT 30 15 + #define PGDIR_SHIFT 30 15 16 16 17 #define PTRS_PER_PGD 4 17 18 #define USER_PTRS_PER_PGD 2
+2 -27
arch/sh/mm/Kconfig
··· 100 100 and allows systems to support up to 512MiB of system memory. 101 101 102 102 config X2TLB 103 - bool "Enable extended TLB mode" 104 - depends on (CPU_SHX2 || CPU_SHX3) && MMU && EXPERIMENTAL 105 - help 106 - Selecting this option will enable the extended mode of the SH-X2 107 - TLB. For legacy SH-X behaviour and interoperability, say N. For 108 - all of the fun new features and a willingless to submit bug reports, 109 - say Y. 103 + def_bool y 104 + depends on (CPU_SHX2 || CPU_SHX3) && MMU 110 105 111 106 config VSYSCALL 112 107 bool "Support vsyscall page" ··· 170 175 depends on MEMORY_HOTPLUG 171 176 172 177 choice 173 - prompt "Page table layout" 174 - default PGTABLE_LEVELS_3 if X2TLB 175 - default PGTABLE_LEVELS_2 176 - 177 - config PGTABLE_LEVELS_2 178 - bool "2 Levels" 179 - help 180 - This is the default page table layout for all SuperH CPUs. 181 - 182 - config PGTABLE_LEVELS_3 183 - bool "3 Levels" 184 - depends on X2TLB 185 - help 186 - This enables a 3 level page table structure. 187 - 188 - endchoice 189 - 190 - choice 191 178 prompt "Kernel page size" 192 - default PAGE_SIZE_8KB if X2TLB 193 179 default PAGE_SIZE_4KB 194 180 195 181 config PAGE_SIZE_4KB 196 182 bool "4kB" 197 - depends on !MMU || !X2TLB || PGTABLE_LEVELS_3 198 183 help 199 184 This is the default page size used by all SuperH CPUs. 200 185
+4 -5
arch/sh/mm/pgtable.c
··· 3 3 #define PGALLOC_GFP GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO 4 4 5 5 static struct kmem_cache *pgd_cachep; 6 - 7 - #ifdef CONFIG_PGTABLE_LEVELS_3 6 + #if PAGETABLE_LEVELS > 2 8 7 static struct kmem_cache *pmd_cachep; 9 8 #endif 10 9 ··· 21 22 pgd_cachep = kmem_cache_create("pgd_cache", 22 23 PTRS_PER_PGD * (1<<PTE_MAGNITUDE), 23 24 PAGE_SIZE, SLAB_PANIC, pgd_ctor); 24 - #ifdef CONFIG_PGTABLE_LEVELS_3 25 + #if PAGETABLE_LEVELS > 2 25 26 pmd_cachep = kmem_cache_create("pmd_cache", 26 27 PTRS_PER_PMD * (1<<PTE_MAGNITUDE), 27 28 PAGE_SIZE, SLAB_PANIC, NULL); ··· 38 39 kmem_cache_free(pgd_cachep, pgd); 39 40 } 40 41 41 - #ifdef CONFIG_PGTABLE_LEVELS_3 42 + #if PAGETABLE_LEVELS > 2 42 43 void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) 43 44 { 44 45 set_pud(pud, __pud((unsigned long)pmd)); ··· 53 54 { 54 55 kmem_cache_free(pmd_cachep, pmd); 55 56 } 56 - #endif /* CONFIG_PGTABLE_LEVELS_3 */ 57 + #endif /* PAGETABLE_LEVELS > 2 */