xref: /linux/arch/powerpc/include/asm/nohash/32/mmu-44x.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
257d7909eSDavid Gibson #ifndef _ASM_POWERPC_MMU_44X_H_
357d7909eSDavid Gibson #define _ASM_POWERPC_MMU_44X_H_
457d7909eSDavid Gibson /*
557d7909eSDavid Gibson  * PPC440 support
657d7909eSDavid Gibson  */
757d7909eSDavid Gibson 
8ec0c464cSChristophe Leroy #include <asm/asm-const.h>
9ca9153a3SIlya Yanok 
1057d7909eSDavid Gibson #define PPC44x_MMUCR_TID	0x000000ff
1157d7909eSDavid Gibson #define PPC44x_MMUCR_STS	0x00010000
1257d7909eSDavid Gibson 
1357d7909eSDavid Gibson #define	PPC44x_TLB_PAGEID	0
1457d7909eSDavid Gibson #define	PPC44x_TLB_XLAT		1
1557d7909eSDavid Gibson #define	PPC44x_TLB_ATTRIB	2
1657d7909eSDavid Gibson 
1757d7909eSDavid Gibson /* Page identification fields */
1857d7909eSDavid Gibson #define PPC44x_TLB_EPN_MASK	0xfffffc00      /* Effective Page Number */
1957d7909eSDavid Gibson #define	PPC44x_TLB_VALID	0x00000200      /* Valid flag */
2057d7909eSDavid Gibson #define PPC44x_TLB_TS		0x00000100	/* Translation address space */
2157d7909eSDavid Gibson #define PPC44x_TLB_1K		0x00000000	/* Page sizes */
2257d7909eSDavid Gibson #define PPC44x_TLB_4K		0x00000010
2357d7909eSDavid Gibson #define PPC44x_TLB_16K		0x00000020
2457d7909eSDavid Gibson #define PPC44x_TLB_64K		0x00000030
2557d7909eSDavid Gibson #define PPC44x_TLB_256K		0x00000040
2657d7909eSDavid Gibson #define PPC44x_TLB_1M		0x00000050
2757d7909eSDavid Gibson #define PPC44x_TLB_16M		0x00000070
2857d7909eSDavid Gibson #define	PPC44x_TLB_256M		0x00000090
2957d7909eSDavid Gibson 
3057d7909eSDavid Gibson /* Translation fields */
3157d7909eSDavid Gibson #define PPC44x_TLB_RPN_MASK	0xfffffc00      /* Real Page Number */
3257d7909eSDavid Gibson #define	PPC44x_TLB_ERPN_MASK	0x0000000f
3357d7909eSDavid Gibson 
3457d7909eSDavid Gibson /* Storage attribute and access control fields */
3557d7909eSDavid Gibson #define PPC44x_TLB_ATTR_MASK	0x0000ff80
3657d7909eSDavid Gibson #define PPC44x_TLB_U0		0x00008000      /* User 0 */
3757d7909eSDavid Gibson #define PPC44x_TLB_U1		0x00004000      /* User 1 */
3857d7909eSDavid Gibson #define PPC44x_TLB_U2		0x00002000      /* User 2 */
3957d7909eSDavid Gibson #define PPC44x_TLB_U3		0x00001000      /* User 3 */
4057d7909eSDavid Gibson #define PPC44x_TLB_W		0x00000800      /* Caching is write-through */
4157d7909eSDavid Gibson #define PPC44x_TLB_I		0x00000400      /* Caching is inhibited */
4257d7909eSDavid Gibson #define PPC44x_TLB_M		0x00000200      /* Memory is coherent */
4357d7909eSDavid Gibson #define PPC44x_TLB_G		0x00000100      /* Memory is guarded */
44e7f75ad0SDave Kleikamp #define PPC44x_TLB_E		0x00000080      /* Memory is little endian */
4557d7909eSDavid Gibson 
4657d7909eSDavid Gibson #define PPC44x_TLB_PERM_MASK	0x0000003f
4757d7909eSDavid Gibson #define PPC44x_TLB_UX		0x00000020      /* User execution */
4857d7909eSDavid Gibson #define PPC44x_TLB_UW		0x00000010      /* User write */
4957d7909eSDavid Gibson #define PPC44x_TLB_UR		0x00000008      /* User read */
5057d7909eSDavid Gibson #define PPC44x_TLB_SX		0x00000004      /* Super execution */
5157d7909eSDavid Gibson #define PPC44x_TLB_SW		0x00000002      /* Super write */
5257d7909eSDavid Gibson #define PPC44x_TLB_SR		0x00000001      /* Super read */
5357d7909eSDavid Gibson 
5457d7909eSDavid Gibson /* Number of TLB entries */
5557d7909eSDavid Gibson #define PPC44x_TLB_SIZE		64
5657d7909eSDavid Gibson 
57e7f75ad0SDave Kleikamp /* 47x bits */
58e7f75ad0SDave Kleikamp #define PPC47x_MMUCR_TID	0x0000ffff
59e7f75ad0SDave Kleikamp #define PPC47x_MMUCR_STS	0x00010000
60e7f75ad0SDave Kleikamp 
61e7f75ad0SDave Kleikamp /* Page identification fields */
62e7f75ad0SDave Kleikamp #define PPC47x_TLB0_EPN_MASK	0xfffff000      /* Effective Page Number */
63e7f75ad0SDave Kleikamp #define PPC47x_TLB0_VALID	0x00000800      /* Valid flag */
64e7f75ad0SDave Kleikamp #define PPC47x_TLB0_TS		0x00000400	/* Translation address space */
65e7f75ad0SDave Kleikamp #define PPC47x_TLB0_4K		0x00000000
66e7f75ad0SDave Kleikamp #define PPC47x_TLB0_16K		0x00000010
67e7f75ad0SDave Kleikamp #define PPC47x_TLB0_64K		0x00000030
68e7f75ad0SDave Kleikamp #define PPC47x_TLB0_1M		0x00000070
69e7f75ad0SDave Kleikamp #define PPC47x_TLB0_16M		0x000000f0
70e7f75ad0SDave Kleikamp #define PPC47x_TLB0_256M	0x000001f0
71e7f75ad0SDave Kleikamp #define PPC47x_TLB0_1G		0x000003f0
72e7f75ad0SDave Kleikamp #define PPC47x_TLB0_BOLTED_R	0x00000008	/* tlbre only */
73e7f75ad0SDave Kleikamp 
74e7f75ad0SDave Kleikamp /* Translation fields */
75e7f75ad0SDave Kleikamp #define PPC47x_TLB1_RPN_MASK	0xfffff000      /* Real Page Number */
76e7f75ad0SDave Kleikamp #define PPC47x_TLB1_ERPN_MASK	0x000003ff
77e7f75ad0SDave Kleikamp 
78e7f75ad0SDave Kleikamp /* Storage attribute and access control fields */
79e7f75ad0SDave Kleikamp #define PPC47x_TLB2_ATTR_MASK	0x0003ff80
80e7f75ad0SDave Kleikamp #define PPC47x_TLB2_IL1I	0x00020000      /* Memory is guarded */
81e7f75ad0SDave Kleikamp #define PPC47x_TLB2_IL1D	0x00010000      /* Memory is guarded */
82e7f75ad0SDave Kleikamp #define PPC47x_TLB2_U0		0x00008000      /* User 0 */
83e7f75ad0SDave Kleikamp #define PPC47x_TLB2_U1		0x00004000      /* User 1 */
84e7f75ad0SDave Kleikamp #define PPC47x_TLB2_U2		0x00002000      /* User 2 */
85e7f75ad0SDave Kleikamp #define PPC47x_TLB2_U3		0x00001000      /* User 3 */
86e7f75ad0SDave Kleikamp #define PPC47x_TLB2_W		0x00000800      /* Caching is write-through */
87e7f75ad0SDave Kleikamp #define PPC47x_TLB2_I		0x00000400      /* Caching is inhibited */
88e7f75ad0SDave Kleikamp #define PPC47x_TLB2_M		0x00000200      /* Memory is coherent */
89e7f75ad0SDave Kleikamp #define PPC47x_TLB2_G		0x00000100      /* Memory is guarded */
90e7f75ad0SDave Kleikamp #define PPC47x_TLB2_E		0x00000080      /* Memory is little endian */
91e7f75ad0SDave Kleikamp #define PPC47x_TLB2_PERM_MASK	0x0000003f
92e7f75ad0SDave Kleikamp #define PPC47x_TLB2_UX		0x00000020      /* User execution */
93e7f75ad0SDave Kleikamp #define PPC47x_TLB2_UW		0x00000010      /* User write */
94e7f75ad0SDave Kleikamp #define PPC47x_TLB2_UR		0x00000008      /* User read */
95e7f75ad0SDave Kleikamp #define PPC47x_TLB2_SX		0x00000004      /* Super execution */
96e7f75ad0SDave Kleikamp #define PPC47x_TLB2_SW		0x00000002      /* Super write */
97e7f75ad0SDave Kleikamp #define PPC47x_TLB2_SR		0x00000001      /* Super read */
98e7f75ad0SDave Kleikamp #define PPC47x_TLB2_U_RWX	(PPC47x_TLB2_UX|PPC47x_TLB2_UW|PPC47x_TLB2_UR)
99e7f75ad0SDave Kleikamp #define PPC47x_TLB2_S_RWX	(PPC47x_TLB2_SX|PPC47x_TLB2_SW|PPC47x_TLB2_SR)
100e7f75ad0SDave Kleikamp #define PPC47x_TLB2_S_RW	(PPC47x_TLB2_SW | PPC47x_TLB2_SR)
101e7f75ad0SDave Kleikamp #define PPC47x_TLB2_IMG		(PPC47x_TLB2_I | PPC47x_TLB2_M | PPC47x_TLB2_G)
102e7f75ad0SDave Kleikamp 
10357d7909eSDavid Gibson #ifndef __ASSEMBLY__
10457d7909eSDavid Gibson 
1054baacfb0SHollis Blanchard extern unsigned int tlb_44x_hwater;
106c0ca609cSHollis Blanchard extern unsigned int tlb_44x_index;
1074baacfb0SHollis Blanchard 
10857d7909eSDavid Gibson typedef struct {
1092ca8cf73SBenjamin Herrenschmidt 	unsigned int	id;
1102ca8cf73SBenjamin Herrenschmidt 	unsigned int	active;
111c102f076SChristophe Leroy 	void __user	*vdso;
11257d7909eSDavid Gibson } mm_context_t;
11357d7909eSDavid Gibson 
1146c16816bSChristophe Leroy /* patch sites */
1156c16816bSChristophe Leroy extern s32 patch__tlb_44x_hwater_D, patch__tlb_44x_hwater_I;
1166c16816bSChristophe Leroy 
11757d7909eSDavid Gibson #endif /* !__ASSEMBLY__ */
11857d7909eSDavid Gibson 
119d9b55a03SDavid Gibson #ifndef CONFIG_PPC_EARLY_DEBUG_44x
12057d7909eSDavid Gibson #define PPC44x_EARLY_TLBS	1
121d9b55a03SDavid Gibson #else
122d9b55a03SDavid Gibson #define PPC44x_EARLY_TLBS	2
123d9b55a03SDavid Gibson #define PPC44x_EARLY_DEBUG_VIRTADDR	(ASM_CONST(0xf0000000) \
124d9b55a03SDavid Gibson 	| (ASM_CONST(CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW) & 0xffff))
125d9b55a03SDavid Gibson #endif
12657d7909eSDavid Gibson 
12757d7909eSDavid Gibson /* Size of the TLBs used for pinning in lowmem */
12857d7909eSDavid Gibson #define PPC_PIN_SIZE	(1 << 28)	/* 256M */
12957d7909eSDavid Gibson 
1307bc39695SChristophe Leroy #if defined(CONFIG_PPC_4K_PAGES)
131ca9153a3SIlya Yanok #define PPC44x_TLBE_SIZE	PPC44x_TLB_4K
132e7f75ad0SDave Kleikamp #define PPC47x_TLBE_SIZE	PPC47x_TLB0_4K
13325d21ad6SBenjamin Herrenschmidt #define mmu_virtual_psize	MMU_PAGE_4K
1347bc39695SChristophe Leroy #elif defined(CONFIG_PPC_16K_PAGES)
135ca9153a3SIlya Yanok #define PPC44x_TLBE_SIZE	PPC44x_TLB_16K
136e7f75ad0SDave Kleikamp #define PPC47x_TLBE_SIZE	PPC47x_TLB0_16K
13725d21ad6SBenjamin Herrenschmidt #define mmu_virtual_psize	MMU_PAGE_16K
1387bc39695SChristophe Leroy #elif defined(CONFIG_PPC_64K_PAGES)
139ca9153a3SIlya Yanok #define PPC44x_TLBE_SIZE	PPC44x_TLB_64K
140e7f75ad0SDave Kleikamp #define PPC47x_TLBE_SIZE	PPC47x_TLB0_64K
14125d21ad6SBenjamin Herrenschmidt #define mmu_virtual_psize	MMU_PAGE_64K
1427bc39695SChristophe Leroy #elif defined(CONFIG_PPC_256K_PAGES)
143e1240122SYuri Tikhonov #define PPC44x_TLBE_SIZE	PPC44x_TLB_256K
14425d21ad6SBenjamin Herrenschmidt #define mmu_virtual_psize	MMU_PAGE_256K
145ca9153a3SIlya Yanok #else
146ca9153a3SIlya Yanok #error "Unsupported PAGE_SIZE"
147ca9153a3SIlya Yanok #endif
148ca9153a3SIlya Yanok 
14925d21ad6SBenjamin Herrenschmidt #define mmu_linear_psize	MMU_PAGE_256M
15025d21ad6SBenjamin Herrenschmidt 
151ca9153a3SIlya Yanok #define PPC44x_PGD_OFF_SHIFT	(32 - PGDIR_SHIFT + PGD_T_LOG2)
152ca9153a3SIlya Yanok #define PPC44x_PGD_OFF_MASK_BIT	(PGDIR_SHIFT - PGD_T_LOG2)
153ca9153a3SIlya Yanok #define PPC44x_PTE_ADD_SHIFT	(32 - PGDIR_SHIFT + PTE_SHIFT + PTE_T_LOG2)
154ca9153a3SIlya Yanok #define PPC44x_PTE_ADD_MASK_BIT	(32 - PTE_T_LOG2 - PTE_SHIFT)
155ca9153a3SIlya Yanok 
15657d7909eSDavid Gibson #endif /* _ASM_POWERPC_MMU_44X_H_ */
157