18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _ASM_POWERPC_MMU_H_ 38c2ecf20Sopenharmony_ci#define _ASM_POWERPC_MMU_H_ 48c2ecf20Sopenharmony_ci#ifdef __KERNEL__ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/types.h> 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <asm/asm-const.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* 118c2ecf20Sopenharmony_ci * MMU features bit definitions 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/* 158c2ecf20Sopenharmony_ci * MMU families 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci#define MMU_FTR_HPTE_TABLE ASM_CONST(0x00000001) 188c2ecf20Sopenharmony_ci#define MMU_FTR_TYPE_8xx ASM_CONST(0x00000002) 198c2ecf20Sopenharmony_ci#define MMU_FTR_TYPE_40x ASM_CONST(0x00000004) 208c2ecf20Sopenharmony_ci#define MMU_FTR_TYPE_44x ASM_CONST(0x00000008) 218c2ecf20Sopenharmony_ci#define MMU_FTR_TYPE_FSL_E ASM_CONST(0x00000010) 228c2ecf20Sopenharmony_ci#define MMU_FTR_TYPE_47x ASM_CONST(0x00000020) 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* Radix page table supported and enabled */ 258c2ecf20Sopenharmony_ci#define MMU_FTR_TYPE_RADIX ASM_CONST(0x00000040) 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* 288c2ecf20Sopenharmony_ci * Individual features below. 298c2ecf20Sopenharmony_ci */ 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci/* 328c2ecf20Sopenharmony_ci * Support for KUEP feature. 338c2ecf20Sopenharmony_ci */ 348c2ecf20Sopenharmony_ci#define MMU_FTR_KUEP ASM_CONST(0x00000400) 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci/* 378c2ecf20Sopenharmony_ci * Support for memory protection keys. 388c2ecf20Sopenharmony_ci */ 398c2ecf20Sopenharmony_ci#define MMU_FTR_PKEY ASM_CONST(0x00000800) 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/* Guest Translation Shootdown Enable */ 428c2ecf20Sopenharmony_ci#define MMU_FTR_GTSE ASM_CONST(0x00001000) 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci/* 458c2ecf20Sopenharmony_ci * Support for 68 bit VA space. We added that from ISA 2.05 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_ci#define MMU_FTR_68_BIT_VA ASM_CONST(0x00002000) 488c2ecf20Sopenharmony_ci/* 498c2ecf20Sopenharmony_ci * Kernel read only support. 508c2ecf20Sopenharmony_ci * We added the ppp value 0b110 in ISA 2.04. 518c2ecf20Sopenharmony_ci */ 528c2ecf20Sopenharmony_ci#define MMU_FTR_KERNEL_RO ASM_CONST(0x00004000) 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci/* 558c2ecf20Sopenharmony_ci * We need to clear top 16bits of va (from the remaining 64 bits )in 568c2ecf20Sopenharmony_ci * tlbie* instructions 578c2ecf20Sopenharmony_ci */ 588c2ecf20Sopenharmony_ci#define MMU_FTR_TLBIE_CROP_VA ASM_CONST(0x00008000) 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci/* Enable use of high BAT registers */ 618c2ecf20Sopenharmony_ci#define MMU_FTR_USE_HIGH_BATS ASM_CONST(0x00010000) 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci/* Enable >32-bit physical addresses on 32-bit processor, only used 648c2ecf20Sopenharmony_ci * by CONFIG_PPC_BOOK3S_32 currently as BookE supports that from day 1 658c2ecf20Sopenharmony_ci */ 668c2ecf20Sopenharmony_ci#define MMU_FTR_BIG_PHYS ASM_CONST(0x00020000) 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci/* Enable use of broadcast TLB invalidations. We don't always set it 698c2ecf20Sopenharmony_ci * on processors that support it due to other constraints with the 708c2ecf20Sopenharmony_ci * use of such invalidations 718c2ecf20Sopenharmony_ci */ 728c2ecf20Sopenharmony_ci#define MMU_FTR_USE_TLBIVAX_BCAST ASM_CONST(0x00040000) 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* Enable use of tlbilx invalidate instructions. 758c2ecf20Sopenharmony_ci */ 768c2ecf20Sopenharmony_ci#define MMU_FTR_USE_TLBILX ASM_CONST(0x00080000) 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci/* This indicates that the processor cannot handle multiple outstanding 798c2ecf20Sopenharmony_ci * broadcast tlbivax or tlbsync. This makes the code use a spinlock 808c2ecf20Sopenharmony_ci * around such invalidate forms. 818c2ecf20Sopenharmony_ci */ 828c2ecf20Sopenharmony_ci#define MMU_FTR_LOCK_BCAST_INVAL ASM_CONST(0x00100000) 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci/* This indicates that the processor doesn't handle way selection 858c2ecf20Sopenharmony_ci * properly and needs SW to track and update the LRU state. This 868c2ecf20Sopenharmony_ci * is specific to an errata on e300c2/c3/c4 class parts 878c2ecf20Sopenharmony_ci */ 888c2ecf20Sopenharmony_ci#define MMU_FTR_NEED_DTLB_SW_LRU ASM_CONST(0x00200000) 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci/* Enable use of TLB reservation. Processor should support tlbsrx. 918c2ecf20Sopenharmony_ci * instruction and MAS0[WQ]. 928c2ecf20Sopenharmony_ci */ 938c2ecf20Sopenharmony_ci#define MMU_FTR_USE_TLBRSRV ASM_CONST(0x00800000) 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci/* Use paired MAS registers (MAS7||MAS3, etc.) 968c2ecf20Sopenharmony_ci */ 978c2ecf20Sopenharmony_ci#define MMU_FTR_USE_PAIRED_MAS ASM_CONST(0x01000000) 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci/* Doesn't support the B bit (1T segment) in SLBIE 1008c2ecf20Sopenharmony_ci */ 1018c2ecf20Sopenharmony_ci#define MMU_FTR_NO_SLBIE_B ASM_CONST(0x02000000) 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci/* Support 16M large pages 1048c2ecf20Sopenharmony_ci */ 1058c2ecf20Sopenharmony_ci#define MMU_FTR_16M_PAGE ASM_CONST(0x04000000) 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/* Supports TLBIEL variant 1088c2ecf20Sopenharmony_ci */ 1098c2ecf20Sopenharmony_ci#define MMU_FTR_TLBIEL ASM_CONST(0x08000000) 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci/* Supports tlbies w/o locking 1128c2ecf20Sopenharmony_ci */ 1138c2ecf20Sopenharmony_ci#define MMU_FTR_LOCKLESS_TLBIE ASM_CONST(0x10000000) 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci/* Large pages can be marked CI 1168c2ecf20Sopenharmony_ci */ 1178c2ecf20Sopenharmony_ci#define MMU_FTR_CI_LARGE_PAGE ASM_CONST(0x20000000) 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci/* 1T segments available 1208c2ecf20Sopenharmony_ci */ 1218c2ecf20Sopenharmony_ci#define MMU_FTR_1T_SEGMENT ASM_CONST(0x40000000) 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci/* 1248c2ecf20Sopenharmony_ci * Supports KUAP (key 0 controlling userspace addresses) on radix 1258c2ecf20Sopenharmony_ci */ 1268c2ecf20Sopenharmony_ci#define MMU_FTR_RADIX_KUAP ASM_CONST(0x80000000) 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci/* MMU feature bit sets for various CPUs */ 1298c2ecf20Sopenharmony_ci#define MMU_FTRS_DEFAULT_HPTE_ARCH_V2 \ 1308c2ecf20Sopenharmony_ci MMU_FTR_HPTE_TABLE | MMU_FTR_PPCAS_ARCH_V2 1318c2ecf20Sopenharmony_ci#define MMU_FTRS_POWER MMU_FTRS_DEFAULT_HPTE_ARCH_V2 1328c2ecf20Sopenharmony_ci#define MMU_FTRS_PPC970 MMU_FTRS_POWER | MMU_FTR_TLBIE_CROP_VA 1338c2ecf20Sopenharmony_ci#define MMU_FTRS_POWER5 MMU_FTRS_POWER | MMU_FTR_LOCKLESS_TLBIE 1348c2ecf20Sopenharmony_ci#define MMU_FTRS_POWER6 MMU_FTRS_POWER5 | MMU_FTR_KERNEL_RO | MMU_FTR_68_BIT_VA 1358c2ecf20Sopenharmony_ci#define MMU_FTRS_POWER7 MMU_FTRS_POWER6 1368c2ecf20Sopenharmony_ci#define MMU_FTRS_POWER8 MMU_FTRS_POWER6 1378c2ecf20Sopenharmony_ci#define MMU_FTRS_POWER9 MMU_FTRS_POWER6 1388c2ecf20Sopenharmony_ci#define MMU_FTRS_POWER10 MMU_FTRS_POWER6 1398c2ecf20Sopenharmony_ci#define MMU_FTRS_CELL MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ 1408c2ecf20Sopenharmony_ci MMU_FTR_CI_LARGE_PAGE 1418c2ecf20Sopenharmony_ci#define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ 1428c2ecf20Sopenharmony_ci MMU_FTR_CI_LARGE_PAGE | MMU_FTR_NO_SLBIE_B 1438c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__ 1448c2ecf20Sopenharmony_ci#include <linux/bug.h> 1458c2ecf20Sopenharmony_ci#include <asm/cputable.h> 1468c2ecf20Sopenharmony_ci#include <asm/page.h> 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_citypedef pte_t *pgtable_t; 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_FSL_BOOK3E 1518c2ecf20Sopenharmony_ci#include <asm/percpu.h> 1528c2ecf20Sopenharmony_ciDECLARE_PER_CPU(int, next_tlbcam_idx); 1538c2ecf20Sopenharmony_ci#endif 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_cienum { 1568c2ecf20Sopenharmony_ci MMU_FTRS_POSSIBLE = 1578c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S 1588c2ecf20Sopenharmony_ci MMU_FTR_HPTE_TABLE | 1598c2ecf20Sopenharmony_ci#endif 1608c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_8xx 1618c2ecf20Sopenharmony_ci MMU_FTR_TYPE_8xx | 1628c2ecf20Sopenharmony_ci#endif 1638c2ecf20Sopenharmony_ci#ifdef CONFIG_40x 1648c2ecf20Sopenharmony_ci MMU_FTR_TYPE_40x | 1658c2ecf20Sopenharmony_ci#endif 1668c2ecf20Sopenharmony_ci#ifdef CONFIG_44x 1678c2ecf20Sopenharmony_ci MMU_FTR_TYPE_44x | 1688c2ecf20Sopenharmony_ci#endif 1698c2ecf20Sopenharmony_ci#if defined(CONFIG_E200) || defined(CONFIG_E500) 1708c2ecf20Sopenharmony_ci MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | MMU_FTR_USE_TLBILX | 1718c2ecf20Sopenharmony_ci#endif 1728c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_47x 1738c2ecf20Sopenharmony_ci MMU_FTR_TYPE_47x | MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL | 1748c2ecf20Sopenharmony_ci#endif 1758c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_32 1768c2ecf20Sopenharmony_ci MMU_FTR_USE_HIGH_BATS | MMU_FTR_NEED_DTLB_SW_LRU | 1778c2ecf20Sopenharmony_ci#endif 1788c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3E_64 1798c2ecf20Sopenharmony_ci MMU_FTR_USE_TLBRSRV | MMU_FTR_USE_PAIRED_MAS | 1808c2ecf20Sopenharmony_ci#endif 1818c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_64 1828c2ecf20Sopenharmony_ci MMU_FTR_NO_SLBIE_B | MMU_FTR_16M_PAGE | MMU_FTR_TLBIEL | 1838c2ecf20Sopenharmony_ci MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_CI_LARGE_PAGE | 1848c2ecf20Sopenharmony_ci MMU_FTR_1T_SEGMENT | MMU_FTR_TLBIE_CROP_VA | 1858c2ecf20Sopenharmony_ci MMU_FTR_KERNEL_RO | MMU_FTR_68_BIT_VA | 1868c2ecf20Sopenharmony_ci#endif 1878c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_RADIX_MMU 1888c2ecf20Sopenharmony_ci MMU_FTR_TYPE_RADIX | 1898c2ecf20Sopenharmony_ci MMU_FTR_GTSE | 1908c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_KUAP 1918c2ecf20Sopenharmony_ci MMU_FTR_RADIX_KUAP | 1928c2ecf20Sopenharmony_ci#endif /* CONFIG_PPC_KUAP */ 1938c2ecf20Sopenharmony_ci#endif /* CONFIG_PPC_RADIX_MMU */ 1948c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_MEM_KEYS 1958c2ecf20Sopenharmony_ci MMU_FTR_PKEY | 1968c2ecf20Sopenharmony_ci#endif 1978c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_KUEP 1988c2ecf20Sopenharmony_ci MMU_FTR_KUEP | 1998c2ecf20Sopenharmony_ci#endif /* CONFIG_PPC_KUAP */ 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci 0, 2028c2ecf20Sopenharmony_ci}; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_cistatic inline bool early_mmu_has_feature(unsigned long feature) 2058c2ecf20Sopenharmony_ci{ 2068c2ecf20Sopenharmony_ci return !!(MMU_FTRS_POSSIBLE & cur_cpu_spec->mmu_features & feature); 2078c2ecf20Sopenharmony_ci} 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci#ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS 2108c2ecf20Sopenharmony_ci#include <linux/jump_label.h> 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci#define NUM_MMU_FTR_KEYS 32 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ciextern struct static_key_true mmu_feature_keys[NUM_MMU_FTR_KEYS]; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ciextern void mmu_feature_keys_init(void); 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cistatic __always_inline bool mmu_has_feature(unsigned long feature) 2198c2ecf20Sopenharmony_ci{ 2208c2ecf20Sopenharmony_ci int i; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci#ifndef __clang__ /* clang can't cope with this */ 2238c2ecf20Sopenharmony_ci BUILD_BUG_ON(!__builtin_constant_p(feature)); 2248c2ecf20Sopenharmony_ci#endif 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci#ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG 2278c2ecf20Sopenharmony_ci if (!static_key_initialized) { 2288c2ecf20Sopenharmony_ci printk("Warning! mmu_has_feature() used prior to jump label init!\n"); 2298c2ecf20Sopenharmony_ci dump_stack(); 2308c2ecf20Sopenharmony_ci return early_mmu_has_feature(feature); 2318c2ecf20Sopenharmony_ci } 2328c2ecf20Sopenharmony_ci#endif 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci if (!(MMU_FTRS_POSSIBLE & feature)) 2358c2ecf20Sopenharmony_ci return false; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci i = __builtin_ctzl(feature); 2388c2ecf20Sopenharmony_ci return static_branch_likely(&mmu_feature_keys[i]); 2398c2ecf20Sopenharmony_ci} 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_cistatic inline void mmu_clear_feature(unsigned long feature) 2428c2ecf20Sopenharmony_ci{ 2438c2ecf20Sopenharmony_ci int i; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci i = __builtin_ctzl(feature); 2468c2ecf20Sopenharmony_ci cur_cpu_spec->mmu_features &= ~feature; 2478c2ecf20Sopenharmony_ci static_branch_disable(&mmu_feature_keys[i]); 2488c2ecf20Sopenharmony_ci} 2498c2ecf20Sopenharmony_ci#else 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cistatic inline void mmu_feature_keys_init(void) 2528c2ecf20Sopenharmony_ci{ 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci} 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_cistatic inline bool mmu_has_feature(unsigned long feature) 2578c2ecf20Sopenharmony_ci{ 2588c2ecf20Sopenharmony_ci return early_mmu_has_feature(feature); 2598c2ecf20Sopenharmony_ci} 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_cistatic inline void mmu_clear_feature(unsigned long feature) 2628c2ecf20Sopenharmony_ci{ 2638c2ecf20Sopenharmony_ci cur_cpu_spec->mmu_features &= ~feature; 2648c2ecf20Sopenharmony_ci} 2658c2ecf20Sopenharmony_ci#endif /* CONFIG_JUMP_LABEL */ 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ciextern unsigned int __start___mmu_ftr_fixup, __stop___mmu_ftr_fixup; 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC64 2708c2ecf20Sopenharmony_ci/* This is our real memory area size on ppc64 server, on embedded, we 2718c2ecf20Sopenharmony_ci * make it match the size our of bolted TLB area 2728c2ecf20Sopenharmony_ci */ 2738c2ecf20Sopenharmony_ciextern u64 ppc64_rma_size; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci/* Cleanup function used by kexec */ 2768c2ecf20Sopenharmony_ciextern void mmu_cleanup_all(void); 2778c2ecf20Sopenharmony_ciextern void radix__mmu_cleanup_all(void); 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci/* Functions for creating and updating partition table on POWER9 */ 2808c2ecf20Sopenharmony_ciextern void mmu_partition_table_init(void); 2818c2ecf20Sopenharmony_ciextern void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0, 2828c2ecf20Sopenharmony_ci unsigned long dw1, bool flush); 2838c2ecf20Sopenharmony_ci#endif /* CONFIG_PPC64 */ 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_cistruct mm_struct; 2868c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_VM 2878c2ecf20Sopenharmony_ciextern void assert_pte_locked(struct mm_struct *mm, unsigned long addr); 2888c2ecf20Sopenharmony_ci#else /* CONFIG_DEBUG_VM */ 2898c2ecf20Sopenharmony_cistatic inline void assert_pte_locked(struct mm_struct *mm, unsigned long addr) 2908c2ecf20Sopenharmony_ci{ 2918c2ecf20Sopenharmony_ci} 2928c2ecf20Sopenharmony_ci#endif /* !CONFIG_DEBUG_VM */ 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_RADIX_MMU 2958c2ecf20Sopenharmony_cistatic inline bool radix_enabled(void) 2968c2ecf20Sopenharmony_ci{ 2978c2ecf20Sopenharmony_ci return mmu_has_feature(MMU_FTR_TYPE_RADIX); 2988c2ecf20Sopenharmony_ci} 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_cistatic inline bool early_radix_enabled(void) 3018c2ecf20Sopenharmony_ci{ 3028c2ecf20Sopenharmony_ci return early_mmu_has_feature(MMU_FTR_TYPE_RADIX); 3038c2ecf20Sopenharmony_ci} 3048c2ecf20Sopenharmony_ci#else 3058c2ecf20Sopenharmony_cistatic inline bool radix_enabled(void) 3068c2ecf20Sopenharmony_ci{ 3078c2ecf20Sopenharmony_ci return false; 3088c2ecf20Sopenharmony_ci} 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_cistatic inline bool early_radix_enabled(void) 3118c2ecf20Sopenharmony_ci{ 3128c2ecf20Sopenharmony_ci return false; 3138c2ecf20Sopenharmony_ci} 3148c2ecf20Sopenharmony_ci#endif 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci#ifdef CONFIG_STRICT_KERNEL_RWX 3178c2ecf20Sopenharmony_cistatic inline bool strict_kernel_rwx_enabled(void) 3188c2ecf20Sopenharmony_ci{ 3198c2ecf20Sopenharmony_ci return rodata_enabled; 3208c2ecf20Sopenharmony_ci} 3218c2ecf20Sopenharmony_ci#else 3228c2ecf20Sopenharmony_cistatic inline bool strict_kernel_rwx_enabled(void) 3238c2ecf20Sopenharmony_ci{ 3248c2ecf20Sopenharmony_ci return false; 3258c2ecf20Sopenharmony_ci} 3268c2ecf20Sopenharmony_ci#endif 3278c2ecf20Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci/* The kernel use the constants below to index in the page sizes array. 3308c2ecf20Sopenharmony_ci * The use of fixed constants for this purpose is better for performances 3318c2ecf20Sopenharmony_ci * of the low level hash refill handlers. 3328c2ecf20Sopenharmony_ci * 3338c2ecf20Sopenharmony_ci * A non supported page size has a "shift" field set to 0 3348c2ecf20Sopenharmony_ci * 3358c2ecf20Sopenharmony_ci * Any new page size being implemented can get a new entry in here. Whether 3368c2ecf20Sopenharmony_ci * the kernel will use it or not is a different matter though. The actual page 3378c2ecf20Sopenharmony_ci * size used by hugetlbfs is not defined here and may be made variable 3388c2ecf20Sopenharmony_ci * 3398c2ecf20Sopenharmony_ci * Note: This array ended up being a false good idea as it's growing to the 3408c2ecf20Sopenharmony_ci * point where I wonder if we should replace it with something different, 3418c2ecf20Sopenharmony_ci * to think about, feedback welcome. --BenH. 3428c2ecf20Sopenharmony_ci */ 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_ci/* These are #defines as they have to be used in assembly */ 3458c2ecf20Sopenharmony_ci#define MMU_PAGE_4K 0 3468c2ecf20Sopenharmony_ci#define MMU_PAGE_16K 1 3478c2ecf20Sopenharmony_ci#define MMU_PAGE_64K 2 3488c2ecf20Sopenharmony_ci#define MMU_PAGE_64K_AP 3 /* "Admixed pages" (hash64 only) */ 3498c2ecf20Sopenharmony_ci#define MMU_PAGE_256K 4 3508c2ecf20Sopenharmony_ci#define MMU_PAGE_512K 5 3518c2ecf20Sopenharmony_ci#define MMU_PAGE_1M 6 3528c2ecf20Sopenharmony_ci#define MMU_PAGE_2M 7 3538c2ecf20Sopenharmony_ci#define MMU_PAGE_4M 8 3548c2ecf20Sopenharmony_ci#define MMU_PAGE_8M 9 3558c2ecf20Sopenharmony_ci#define MMU_PAGE_16M 10 3568c2ecf20Sopenharmony_ci#define MMU_PAGE_64M 11 3578c2ecf20Sopenharmony_ci#define MMU_PAGE_256M 12 3588c2ecf20Sopenharmony_ci#define MMU_PAGE_1G 13 3598c2ecf20Sopenharmony_ci#define MMU_PAGE_16G 14 3608c2ecf20Sopenharmony_ci#define MMU_PAGE_64G 15 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ci/* 3638c2ecf20Sopenharmony_ci * N.B. we need to change the type of hpte_page_sizes if this gets to be > 16 3648c2ecf20Sopenharmony_ci * Also we need to change he type of mm_context.low/high_slices_psize. 3658c2ecf20Sopenharmony_ci */ 3668c2ecf20Sopenharmony_ci#define MMU_PAGE_COUNT 16 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_64 3698c2ecf20Sopenharmony_ci#include <asm/book3s/64/mmu.h> 3708c2ecf20Sopenharmony_ci#else /* CONFIG_PPC_BOOK3S_64 */ 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__ 3738c2ecf20Sopenharmony_ci/* MMU initialization */ 3748c2ecf20Sopenharmony_ciextern void early_init_mmu(void); 3758c2ecf20Sopenharmony_ciextern void early_init_mmu_secondary(void); 3768c2ecf20Sopenharmony_ciextern void setup_initial_memory_limit(phys_addr_t first_memblock_base, 3778c2ecf20Sopenharmony_ci phys_addr_t first_memblock_size); 3788c2ecf20Sopenharmony_cistatic inline void mmu_early_init_devtree(void) { } 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_cistatic inline void pkey_early_init_devtree(void) {} 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ciextern void *abatron_pteptrs[2]; 3838c2ecf20Sopenharmony_ci#endif /* __ASSEMBLY__ */ 3848c2ecf20Sopenharmony_ci#endif 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ci#if defined(CONFIG_PPC_BOOK3S_32) 3878c2ecf20Sopenharmony_ci/* 32-bit classic hash table MMU */ 3888c2ecf20Sopenharmony_ci#include <asm/book3s/32/mmu-hash.h> 3898c2ecf20Sopenharmony_ci#elif defined(CONFIG_PPC_MMU_NOHASH) 3908c2ecf20Sopenharmony_ci#include <asm/nohash/mmu.h> 3918c2ecf20Sopenharmony_ci#endif 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_ci#if defined(CONFIG_FA_DUMP) || defined(CONFIG_PRESERVE_FA_DUMP) 3948c2ecf20Sopenharmony_ci#define __HAVE_ARCH_RESERVED_KERNEL_PAGES 3958c2ecf20Sopenharmony_ci#endif 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_ci#endif /* __KERNEL__ */ 3988c2ecf20Sopenharmony_ci#endif /* _ASM_POWERPC_MMU_H_ */ 399