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