162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_MMU_H_ 362306a36Sopenharmony_ci#define _ASM_POWERPC_MMU_H_ 462306a36Sopenharmony_ci#ifdef __KERNEL__ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/types.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <asm/asm-const.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* 1162306a36Sopenharmony_ci * MMU features bit definitions 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * MMU families 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci#define MMU_FTR_HPTE_TABLE ASM_CONST(0x00000001) 1862306a36Sopenharmony_ci#define MMU_FTR_TYPE_8xx ASM_CONST(0x00000002) 1962306a36Sopenharmony_ci#define MMU_FTR_TYPE_40x ASM_CONST(0x00000004) 2062306a36Sopenharmony_ci#define MMU_FTR_TYPE_44x ASM_CONST(0x00000008) 2162306a36Sopenharmony_ci#define MMU_FTR_TYPE_FSL_E ASM_CONST(0x00000010) 2262306a36Sopenharmony_ci#define MMU_FTR_TYPE_47x ASM_CONST(0x00000020) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* Radix page table supported and enabled */ 2562306a36Sopenharmony_ci#define MMU_FTR_TYPE_RADIX ASM_CONST(0x00000040) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* 2862306a36Sopenharmony_ci * Individual features below. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* 3262306a36Sopenharmony_ci * Supports KUAP feature 3362306a36Sopenharmony_ci * key 0 controlling userspace addresses on radix 3462306a36Sopenharmony_ci * Key 3 on hash 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci#define MMU_FTR_KUAP ASM_CONST(0x00000200) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * Supports KUEP feature 4062306a36Sopenharmony_ci * key 0 controlling userspace addresses on radix 4162306a36Sopenharmony_ci * Key 3 on hash 4262306a36Sopenharmony_ci */ 4362306a36Sopenharmony_ci#define MMU_FTR_BOOK3S_KUEP ASM_CONST(0x00000400) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* 4662306a36Sopenharmony_ci * Support for memory protection keys. 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_ci#define MMU_FTR_PKEY ASM_CONST(0x00000800) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* Guest Translation Shootdown Enable */ 5162306a36Sopenharmony_ci#define MMU_FTR_GTSE ASM_CONST(0x00001000) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* 5462306a36Sopenharmony_ci * Support for 68 bit VA space. We added that from ISA 2.05 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci#define MMU_FTR_68_BIT_VA ASM_CONST(0x00002000) 5762306a36Sopenharmony_ci/* 5862306a36Sopenharmony_ci * Kernel read only support. 5962306a36Sopenharmony_ci * We added the ppp value 0b110 in ISA 2.04. 6062306a36Sopenharmony_ci */ 6162306a36Sopenharmony_ci#define MMU_FTR_KERNEL_RO ASM_CONST(0x00004000) 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* 6462306a36Sopenharmony_ci * We need to clear top 16bits of va (from the remaining 64 bits )in 6562306a36Sopenharmony_ci * tlbie* instructions 6662306a36Sopenharmony_ci */ 6762306a36Sopenharmony_ci#define MMU_FTR_TLBIE_CROP_VA ASM_CONST(0x00008000) 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* Enable use of high BAT registers */ 7062306a36Sopenharmony_ci#define MMU_FTR_USE_HIGH_BATS ASM_CONST(0x00010000) 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* Enable >32-bit physical addresses on 32-bit processor, only used 7362306a36Sopenharmony_ci * by CONFIG_PPC_BOOK3S_32 currently as BookE supports that from day 1 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci#define MMU_FTR_BIG_PHYS ASM_CONST(0x00020000) 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* Enable use of broadcast TLB invalidations. We don't always set it 7862306a36Sopenharmony_ci * on processors that support it due to other constraints with the 7962306a36Sopenharmony_ci * use of such invalidations 8062306a36Sopenharmony_ci */ 8162306a36Sopenharmony_ci#define MMU_FTR_USE_TLBIVAX_BCAST ASM_CONST(0x00040000) 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* Enable use of tlbilx invalidate instructions. 8462306a36Sopenharmony_ci */ 8562306a36Sopenharmony_ci#define MMU_FTR_USE_TLBILX ASM_CONST(0x00080000) 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* This indicates that the processor cannot handle multiple outstanding 8862306a36Sopenharmony_ci * broadcast tlbivax or tlbsync. This makes the code use a spinlock 8962306a36Sopenharmony_ci * around such invalidate forms. 9062306a36Sopenharmony_ci */ 9162306a36Sopenharmony_ci#define MMU_FTR_LOCK_BCAST_INVAL ASM_CONST(0x00100000) 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/* This indicates that the processor doesn't handle way selection 9462306a36Sopenharmony_ci * properly and needs SW to track and update the LRU state. This 9562306a36Sopenharmony_ci * is specific to an errata on e300c2/c3/c4 class parts 9662306a36Sopenharmony_ci */ 9762306a36Sopenharmony_ci#define MMU_FTR_NEED_DTLB_SW_LRU ASM_CONST(0x00200000) 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* Doesn't support the B bit (1T segment) in SLBIE 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_ci#define MMU_FTR_NO_SLBIE_B ASM_CONST(0x02000000) 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci/* Support 16M large pages 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_ci#define MMU_FTR_16M_PAGE ASM_CONST(0x04000000) 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* Supports TLBIEL variant 10862306a36Sopenharmony_ci */ 10962306a36Sopenharmony_ci#define MMU_FTR_TLBIEL ASM_CONST(0x08000000) 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci/* Supports tlbies w/o locking 11262306a36Sopenharmony_ci */ 11362306a36Sopenharmony_ci#define MMU_FTR_LOCKLESS_TLBIE ASM_CONST(0x10000000) 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci/* Large pages can be marked CI 11662306a36Sopenharmony_ci */ 11762306a36Sopenharmony_ci#define MMU_FTR_CI_LARGE_PAGE ASM_CONST(0x20000000) 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci/* 1T segments available 12062306a36Sopenharmony_ci */ 12162306a36Sopenharmony_ci#define MMU_FTR_1T_SEGMENT ASM_CONST(0x40000000) 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci// NX paste RMA reject in DSI 12462306a36Sopenharmony_ci#define MMU_FTR_NX_DSI ASM_CONST(0x80000000) 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci/* MMU feature bit sets for various CPUs */ 12762306a36Sopenharmony_ci#define MMU_FTRS_DEFAULT_HPTE_ARCH_V2 (MMU_FTR_HPTE_TABLE | MMU_FTR_TLBIEL | MMU_FTR_16M_PAGE) 12862306a36Sopenharmony_ci#define MMU_FTRS_POWER MMU_FTRS_DEFAULT_HPTE_ARCH_V2 12962306a36Sopenharmony_ci#define MMU_FTRS_PPC970 MMU_FTRS_POWER | MMU_FTR_TLBIE_CROP_VA 13062306a36Sopenharmony_ci#define MMU_FTRS_POWER5 MMU_FTRS_POWER | MMU_FTR_LOCKLESS_TLBIE 13162306a36Sopenharmony_ci#define MMU_FTRS_POWER6 MMU_FTRS_POWER5 | MMU_FTR_KERNEL_RO | MMU_FTR_68_BIT_VA 13262306a36Sopenharmony_ci#define MMU_FTRS_POWER7 MMU_FTRS_POWER6 13362306a36Sopenharmony_ci#define MMU_FTRS_POWER8 MMU_FTRS_POWER6 13462306a36Sopenharmony_ci#define MMU_FTRS_POWER9 MMU_FTRS_POWER6 13562306a36Sopenharmony_ci#define MMU_FTRS_POWER10 MMU_FTRS_POWER6 13662306a36Sopenharmony_ci#define MMU_FTRS_CELL MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ 13762306a36Sopenharmony_ci MMU_FTR_CI_LARGE_PAGE 13862306a36Sopenharmony_ci#define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ 13962306a36Sopenharmony_ci MMU_FTR_CI_LARGE_PAGE | MMU_FTR_NO_SLBIE_B 14062306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 14162306a36Sopenharmony_ci#include <linux/bug.h> 14262306a36Sopenharmony_ci#include <asm/cputable.h> 14362306a36Sopenharmony_ci#include <asm/page.h> 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_citypedef pte_t *pgtable_t; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cienum { 14862306a36Sopenharmony_ci MMU_FTRS_POSSIBLE = 14962306a36Sopenharmony_ci#if defined(CONFIG_PPC_BOOK3S_604) 15062306a36Sopenharmony_ci MMU_FTR_HPTE_TABLE | 15162306a36Sopenharmony_ci#endif 15262306a36Sopenharmony_ci#ifdef CONFIG_PPC_8xx 15362306a36Sopenharmony_ci MMU_FTR_TYPE_8xx | 15462306a36Sopenharmony_ci#endif 15562306a36Sopenharmony_ci#ifdef CONFIG_40x 15662306a36Sopenharmony_ci MMU_FTR_TYPE_40x | 15762306a36Sopenharmony_ci#endif 15862306a36Sopenharmony_ci#ifdef CONFIG_PPC_47x 15962306a36Sopenharmony_ci MMU_FTR_TYPE_47x | MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL | 16062306a36Sopenharmony_ci#elif defined(CONFIG_44x) 16162306a36Sopenharmony_ci MMU_FTR_TYPE_44x | 16262306a36Sopenharmony_ci#endif 16362306a36Sopenharmony_ci#ifdef CONFIG_PPC_E500 16462306a36Sopenharmony_ci MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | MMU_FTR_USE_TLBILX | 16562306a36Sopenharmony_ci#endif 16662306a36Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_32 16762306a36Sopenharmony_ci MMU_FTR_USE_HIGH_BATS | 16862306a36Sopenharmony_ci#endif 16962306a36Sopenharmony_ci#ifdef CONFIG_PPC_83xx 17062306a36Sopenharmony_ci MMU_FTR_NEED_DTLB_SW_LRU | 17162306a36Sopenharmony_ci#endif 17262306a36Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_64 17362306a36Sopenharmony_ci MMU_FTR_KERNEL_RO | 17462306a36Sopenharmony_ci#ifdef CONFIG_PPC_64S_HASH_MMU 17562306a36Sopenharmony_ci MMU_FTR_NO_SLBIE_B | MMU_FTR_16M_PAGE | MMU_FTR_TLBIEL | 17662306a36Sopenharmony_ci MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_CI_LARGE_PAGE | 17762306a36Sopenharmony_ci MMU_FTR_1T_SEGMENT | MMU_FTR_TLBIE_CROP_VA | 17862306a36Sopenharmony_ci MMU_FTR_68_BIT_VA | MMU_FTR_HPTE_TABLE | 17962306a36Sopenharmony_ci#endif 18062306a36Sopenharmony_ci#ifdef CONFIG_PPC_RADIX_MMU 18162306a36Sopenharmony_ci MMU_FTR_TYPE_RADIX | 18262306a36Sopenharmony_ci MMU_FTR_GTSE | MMU_FTR_NX_DSI | 18362306a36Sopenharmony_ci#endif /* CONFIG_PPC_RADIX_MMU */ 18462306a36Sopenharmony_ci#endif 18562306a36Sopenharmony_ci#ifdef CONFIG_PPC_KUAP 18662306a36Sopenharmony_ci MMU_FTR_KUAP | 18762306a36Sopenharmony_ci#endif /* CONFIG_PPC_KUAP */ 18862306a36Sopenharmony_ci#ifdef CONFIG_PPC_MEM_KEYS 18962306a36Sopenharmony_ci MMU_FTR_PKEY | 19062306a36Sopenharmony_ci#endif 19162306a36Sopenharmony_ci#ifdef CONFIG_PPC_KUEP 19262306a36Sopenharmony_ci MMU_FTR_BOOK3S_KUEP | 19362306a36Sopenharmony_ci#endif /* CONFIG_PPC_KUAP */ 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci 0, 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#if defined(CONFIG_PPC_BOOK3S_604) && !defined(CONFIG_PPC_BOOK3S_603) 19962306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS MMU_FTR_HPTE_TABLE 20062306a36Sopenharmony_ci#endif 20162306a36Sopenharmony_ci#ifdef CONFIG_PPC_8xx 20262306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS MMU_FTR_TYPE_8xx 20362306a36Sopenharmony_ci#endif 20462306a36Sopenharmony_ci#ifdef CONFIG_40x 20562306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS MMU_FTR_TYPE_40x 20662306a36Sopenharmony_ci#endif 20762306a36Sopenharmony_ci#ifdef CONFIG_PPC_47x 20862306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS MMU_FTR_TYPE_47x 20962306a36Sopenharmony_ci#elif defined(CONFIG_44x) 21062306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS MMU_FTR_TYPE_44x 21162306a36Sopenharmony_ci#endif 21262306a36Sopenharmony_ci#ifdef CONFIG_PPC_E500 21362306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS MMU_FTR_TYPE_FSL_E 21462306a36Sopenharmony_ci#endif 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci/* BOOK3S_64 options */ 21762306a36Sopenharmony_ci#if defined(CONFIG_PPC_RADIX_MMU) && !defined(CONFIG_PPC_64S_HASH_MMU) 21862306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS MMU_FTR_TYPE_RADIX 21962306a36Sopenharmony_ci#elif !defined(CONFIG_PPC_RADIX_MMU) && defined(CONFIG_PPC_64S_HASH_MMU) 22062306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS MMU_FTR_HPTE_TABLE 22162306a36Sopenharmony_ci#endif 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci#ifndef MMU_FTRS_ALWAYS 22462306a36Sopenharmony_ci#define MMU_FTRS_ALWAYS 0 22562306a36Sopenharmony_ci#endif 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_cistatic __always_inline bool early_mmu_has_feature(unsigned long feature) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci if (MMU_FTRS_ALWAYS & feature) 23062306a36Sopenharmony_ci return true; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci return !!(MMU_FTRS_POSSIBLE & cur_cpu_spec->mmu_features & feature); 23362306a36Sopenharmony_ci} 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci#ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS 23662306a36Sopenharmony_ci#include <linux/jump_label.h> 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci#define NUM_MMU_FTR_KEYS 32 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ciextern struct static_key_true mmu_feature_keys[NUM_MMU_FTR_KEYS]; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ciextern void mmu_feature_keys_init(void); 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistatic __always_inline bool mmu_has_feature(unsigned long feature) 24562306a36Sopenharmony_ci{ 24662306a36Sopenharmony_ci int i; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci#ifndef __clang__ /* clang can't cope with this */ 24962306a36Sopenharmony_ci BUILD_BUG_ON(!__builtin_constant_p(feature)); 25062306a36Sopenharmony_ci#endif 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci#ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG 25362306a36Sopenharmony_ci if (!static_key_initialized) { 25462306a36Sopenharmony_ci printk("Warning! mmu_has_feature() used prior to jump label init!\n"); 25562306a36Sopenharmony_ci dump_stack(); 25662306a36Sopenharmony_ci return early_mmu_has_feature(feature); 25762306a36Sopenharmony_ci } 25862306a36Sopenharmony_ci#endif 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci if (MMU_FTRS_ALWAYS & feature) 26162306a36Sopenharmony_ci return true; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci if (!(MMU_FTRS_POSSIBLE & feature)) 26462306a36Sopenharmony_ci return false; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci i = __builtin_ctzl(feature); 26762306a36Sopenharmony_ci return static_branch_likely(&mmu_feature_keys[i]); 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_cistatic inline void mmu_clear_feature(unsigned long feature) 27162306a36Sopenharmony_ci{ 27262306a36Sopenharmony_ci int i; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci i = __builtin_ctzl(feature); 27562306a36Sopenharmony_ci cur_cpu_spec->mmu_features &= ~feature; 27662306a36Sopenharmony_ci static_branch_disable(&mmu_feature_keys[i]); 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci#else 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_cistatic inline void mmu_feature_keys_init(void) 28162306a36Sopenharmony_ci{ 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci} 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistatic __always_inline bool mmu_has_feature(unsigned long feature) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci return early_mmu_has_feature(feature); 28862306a36Sopenharmony_ci} 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistatic inline void mmu_clear_feature(unsigned long feature) 29162306a36Sopenharmony_ci{ 29262306a36Sopenharmony_ci cur_cpu_spec->mmu_features &= ~feature; 29362306a36Sopenharmony_ci} 29462306a36Sopenharmony_ci#endif /* CONFIG_JUMP_LABEL */ 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ciextern unsigned int __start___mmu_ftr_fixup, __stop___mmu_ftr_fixup; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci#ifdef CONFIG_PPC64 29962306a36Sopenharmony_ci/* This is our real memory area size on ppc64 server, on embedded, we 30062306a36Sopenharmony_ci * make it match the size our of bolted TLB area 30162306a36Sopenharmony_ci */ 30262306a36Sopenharmony_ciextern u64 ppc64_rma_size; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci/* Cleanup function used by kexec */ 30562306a36Sopenharmony_ciextern void mmu_cleanup_all(void); 30662306a36Sopenharmony_ciextern void radix__mmu_cleanup_all(void); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci/* Functions for creating and updating partition table on POWER9 */ 30962306a36Sopenharmony_ciextern void mmu_partition_table_init(void); 31062306a36Sopenharmony_ciextern void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0, 31162306a36Sopenharmony_ci unsigned long dw1, bool flush); 31262306a36Sopenharmony_ci#endif /* CONFIG_PPC64 */ 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistruct mm_struct; 31562306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_VM 31662306a36Sopenharmony_ciextern void assert_pte_locked(struct mm_struct *mm, unsigned long addr); 31762306a36Sopenharmony_ci#else /* CONFIG_DEBUG_VM */ 31862306a36Sopenharmony_cistatic inline void assert_pte_locked(struct mm_struct *mm, unsigned long addr) 31962306a36Sopenharmony_ci{ 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_ci#endif /* !CONFIG_DEBUG_VM */ 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistatic __always_inline bool radix_enabled(void) 32462306a36Sopenharmony_ci{ 32562306a36Sopenharmony_ci return mmu_has_feature(MMU_FTR_TYPE_RADIX); 32662306a36Sopenharmony_ci} 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic __always_inline bool early_radix_enabled(void) 32962306a36Sopenharmony_ci{ 33062306a36Sopenharmony_ci return early_mmu_has_feature(MMU_FTR_TYPE_RADIX); 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci#ifdef CONFIG_STRICT_KERNEL_RWX 33462306a36Sopenharmony_cistatic inline bool strict_kernel_rwx_enabled(void) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci return rodata_enabled; 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci#else 33962306a36Sopenharmony_cistatic inline bool strict_kernel_rwx_enabled(void) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci return false; 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci#endif 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_cistatic inline bool strict_module_rwx_enabled(void) 34662306a36Sopenharmony_ci{ 34762306a36Sopenharmony_ci return IS_ENABLED(CONFIG_STRICT_MODULE_RWX) && strict_kernel_rwx_enabled(); 34862306a36Sopenharmony_ci} 34962306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci/* The kernel use the constants below to index in the page sizes array. 35262306a36Sopenharmony_ci * The use of fixed constants for this purpose is better for performances 35362306a36Sopenharmony_ci * of the low level hash refill handlers. 35462306a36Sopenharmony_ci * 35562306a36Sopenharmony_ci * A non supported page size has a "shift" field set to 0 35662306a36Sopenharmony_ci * 35762306a36Sopenharmony_ci * Any new page size being implemented can get a new entry in here. Whether 35862306a36Sopenharmony_ci * the kernel will use it or not is a different matter though. The actual page 35962306a36Sopenharmony_ci * size used by hugetlbfs is not defined here and may be made variable 36062306a36Sopenharmony_ci * 36162306a36Sopenharmony_ci * Note: This array ended up being a false good idea as it's growing to the 36262306a36Sopenharmony_ci * point where I wonder if we should replace it with something different, 36362306a36Sopenharmony_ci * to think about, feedback welcome. --BenH. 36462306a36Sopenharmony_ci */ 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci/* These are #defines as they have to be used in assembly */ 36762306a36Sopenharmony_ci#define MMU_PAGE_4K 0 36862306a36Sopenharmony_ci#define MMU_PAGE_16K 1 36962306a36Sopenharmony_ci#define MMU_PAGE_64K 2 37062306a36Sopenharmony_ci#define MMU_PAGE_64K_AP 3 /* "Admixed pages" (hash64 only) */ 37162306a36Sopenharmony_ci#define MMU_PAGE_256K 4 37262306a36Sopenharmony_ci#define MMU_PAGE_512K 5 37362306a36Sopenharmony_ci#define MMU_PAGE_1M 6 37462306a36Sopenharmony_ci#define MMU_PAGE_2M 7 37562306a36Sopenharmony_ci#define MMU_PAGE_4M 8 37662306a36Sopenharmony_ci#define MMU_PAGE_8M 9 37762306a36Sopenharmony_ci#define MMU_PAGE_16M 10 37862306a36Sopenharmony_ci#define MMU_PAGE_64M 11 37962306a36Sopenharmony_ci#define MMU_PAGE_256M 12 38062306a36Sopenharmony_ci#define MMU_PAGE_1G 13 38162306a36Sopenharmony_ci#define MMU_PAGE_16G 14 38262306a36Sopenharmony_ci#define MMU_PAGE_64G 15 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci/* 38562306a36Sopenharmony_ci * N.B. we need to change the type of hpte_page_sizes if this gets to be > 16 38662306a36Sopenharmony_ci * Also we need to change he type of mm_context.low/high_slices_psize. 38762306a36Sopenharmony_ci */ 38862306a36Sopenharmony_ci#define MMU_PAGE_COUNT 16 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_64 39162306a36Sopenharmony_ci#include <asm/book3s/64/mmu.h> 39262306a36Sopenharmony_ci#else /* CONFIG_PPC_BOOK3S_64 */ 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 39562306a36Sopenharmony_ci/* MMU initialization */ 39662306a36Sopenharmony_ciextern void early_init_mmu(void); 39762306a36Sopenharmony_ciextern void early_init_mmu_secondary(void); 39862306a36Sopenharmony_ciextern void setup_initial_memory_limit(phys_addr_t first_memblock_base, 39962306a36Sopenharmony_ci phys_addr_t first_memblock_size); 40062306a36Sopenharmony_cistatic inline void mmu_early_init_devtree(void) { } 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cistatic inline void pkey_early_init_devtree(void) {} 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ciextern void *abatron_pteptrs[2]; 40562306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */ 40662306a36Sopenharmony_ci#endif 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci#if defined(CONFIG_PPC_BOOK3S_32) 40962306a36Sopenharmony_ci/* 32-bit classic hash table MMU */ 41062306a36Sopenharmony_ci#include <asm/book3s/32/mmu-hash.h> 41162306a36Sopenharmony_ci#elif defined(CONFIG_PPC_MMU_NOHASH) 41262306a36Sopenharmony_ci#include <asm/nohash/mmu.h> 41362306a36Sopenharmony_ci#endif 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci#if defined(CONFIG_FA_DUMP) || defined(CONFIG_PRESERVE_FA_DUMP) 41662306a36Sopenharmony_ci#define __HAVE_ARCH_RESERVED_KERNEL_PAGES 41762306a36Sopenharmony_ci#endif 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci#endif /* __KERNEL__ */ 42062306a36Sopenharmony_ci#endif /* _ASM_POWERPC_MMU_H_ */ 421