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