1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_POWERPC_MMU_44X_H_ 3*4882a593Smuzhiyun #define _ASM_POWERPC_MMU_44X_H_ 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * PPC440 support 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <asm/asm-const.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define PPC44x_MMUCR_TID 0x000000ff 11*4882a593Smuzhiyun #define PPC44x_MMUCR_STS 0x00010000 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define PPC44x_TLB_PAGEID 0 14*4882a593Smuzhiyun #define PPC44x_TLB_XLAT 1 15*4882a593Smuzhiyun #define PPC44x_TLB_ATTRIB 2 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* Page identification fields */ 18*4882a593Smuzhiyun #define PPC44x_TLB_EPN_MASK 0xfffffc00 /* Effective Page Number */ 19*4882a593Smuzhiyun #define PPC44x_TLB_VALID 0x00000200 /* Valid flag */ 20*4882a593Smuzhiyun #define PPC44x_TLB_TS 0x00000100 /* Translation address space */ 21*4882a593Smuzhiyun #define PPC44x_TLB_1K 0x00000000 /* Page sizes */ 22*4882a593Smuzhiyun #define PPC44x_TLB_4K 0x00000010 23*4882a593Smuzhiyun #define PPC44x_TLB_16K 0x00000020 24*4882a593Smuzhiyun #define PPC44x_TLB_64K 0x00000030 25*4882a593Smuzhiyun #define PPC44x_TLB_256K 0x00000040 26*4882a593Smuzhiyun #define PPC44x_TLB_1M 0x00000050 27*4882a593Smuzhiyun #define PPC44x_TLB_16M 0x00000070 28*4882a593Smuzhiyun #define PPC44x_TLB_256M 0x00000090 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* Translation fields */ 31*4882a593Smuzhiyun #define PPC44x_TLB_RPN_MASK 0xfffffc00 /* Real Page Number */ 32*4882a593Smuzhiyun #define PPC44x_TLB_ERPN_MASK 0x0000000f 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Storage attribute and access control fields */ 35*4882a593Smuzhiyun #define PPC44x_TLB_ATTR_MASK 0x0000ff80 36*4882a593Smuzhiyun #define PPC44x_TLB_U0 0x00008000 /* User 0 */ 37*4882a593Smuzhiyun #define PPC44x_TLB_U1 0x00004000 /* User 1 */ 38*4882a593Smuzhiyun #define PPC44x_TLB_U2 0x00002000 /* User 2 */ 39*4882a593Smuzhiyun #define PPC44x_TLB_U3 0x00001000 /* User 3 */ 40*4882a593Smuzhiyun #define PPC44x_TLB_W 0x00000800 /* Caching is write-through */ 41*4882a593Smuzhiyun #define PPC44x_TLB_I 0x00000400 /* Caching is inhibited */ 42*4882a593Smuzhiyun #define PPC44x_TLB_M 0x00000200 /* Memory is coherent */ 43*4882a593Smuzhiyun #define PPC44x_TLB_G 0x00000100 /* Memory is guarded */ 44*4882a593Smuzhiyun #define PPC44x_TLB_E 0x00000080 /* Memory is little endian */ 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define PPC44x_TLB_PERM_MASK 0x0000003f 47*4882a593Smuzhiyun #define PPC44x_TLB_UX 0x00000020 /* User execution */ 48*4882a593Smuzhiyun #define PPC44x_TLB_UW 0x00000010 /* User write */ 49*4882a593Smuzhiyun #define PPC44x_TLB_UR 0x00000008 /* User read */ 50*4882a593Smuzhiyun #define PPC44x_TLB_SX 0x00000004 /* Super execution */ 51*4882a593Smuzhiyun #define PPC44x_TLB_SW 0x00000002 /* Super write */ 52*4882a593Smuzhiyun #define PPC44x_TLB_SR 0x00000001 /* Super read */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* Number of TLB entries */ 55*4882a593Smuzhiyun #define PPC44x_TLB_SIZE 64 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* 47x bits */ 58*4882a593Smuzhiyun #define PPC47x_MMUCR_TID 0x0000ffff 59*4882a593Smuzhiyun #define PPC47x_MMUCR_STS 0x00010000 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* Page identification fields */ 62*4882a593Smuzhiyun #define PPC47x_TLB0_EPN_MASK 0xfffff000 /* Effective Page Number */ 63*4882a593Smuzhiyun #define PPC47x_TLB0_VALID 0x00000800 /* Valid flag */ 64*4882a593Smuzhiyun #define PPC47x_TLB0_TS 0x00000400 /* Translation address space */ 65*4882a593Smuzhiyun #define PPC47x_TLB0_4K 0x00000000 66*4882a593Smuzhiyun #define PPC47x_TLB0_16K 0x00000010 67*4882a593Smuzhiyun #define PPC47x_TLB0_64K 0x00000030 68*4882a593Smuzhiyun #define PPC47x_TLB0_1M 0x00000070 69*4882a593Smuzhiyun #define PPC47x_TLB0_16M 0x000000f0 70*4882a593Smuzhiyun #define PPC47x_TLB0_256M 0x000001f0 71*4882a593Smuzhiyun #define PPC47x_TLB0_1G 0x000003f0 72*4882a593Smuzhiyun #define PPC47x_TLB0_BOLTED_R 0x00000008 /* tlbre only */ 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* Translation fields */ 75*4882a593Smuzhiyun #define PPC47x_TLB1_RPN_MASK 0xfffff000 /* Real Page Number */ 76*4882a593Smuzhiyun #define PPC47x_TLB1_ERPN_MASK 0x000003ff 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* Storage attribute and access control fields */ 79*4882a593Smuzhiyun #define PPC47x_TLB2_ATTR_MASK 0x0003ff80 80*4882a593Smuzhiyun #define PPC47x_TLB2_IL1I 0x00020000 /* Memory is guarded */ 81*4882a593Smuzhiyun #define PPC47x_TLB2_IL1D 0x00010000 /* Memory is guarded */ 82*4882a593Smuzhiyun #define PPC47x_TLB2_U0 0x00008000 /* User 0 */ 83*4882a593Smuzhiyun #define PPC47x_TLB2_U1 0x00004000 /* User 1 */ 84*4882a593Smuzhiyun #define PPC47x_TLB2_U2 0x00002000 /* User 2 */ 85*4882a593Smuzhiyun #define PPC47x_TLB2_U3 0x00001000 /* User 3 */ 86*4882a593Smuzhiyun #define PPC47x_TLB2_W 0x00000800 /* Caching is write-through */ 87*4882a593Smuzhiyun #define PPC47x_TLB2_I 0x00000400 /* Caching is inhibited */ 88*4882a593Smuzhiyun #define PPC47x_TLB2_M 0x00000200 /* Memory is coherent */ 89*4882a593Smuzhiyun #define PPC47x_TLB2_G 0x00000100 /* Memory is guarded */ 90*4882a593Smuzhiyun #define PPC47x_TLB2_E 0x00000080 /* Memory is little endian */ 91*4882a593Smuzhiyun #define PPC47x_TLB2_PERM_MASK 0x0000003f 92*4882a593Smuzhiyun #define PPC47x_TLB2_UX 0x00000020 /* User execution */ 93*4882a593Smuzhiyun #define PPC47x_TLB2_UW 0x00000010 /* User write */ 94*4882a593Smuzhiyun #define PPC47x_TLB2_UR 0x00000008 /* User read */ 95*4882a593Smuzhiyun #define PPC47x_TLB2_SX 0x00000004 /* Super execution */ 96*4882a593Smuzhiyun #define PPC47x_TLB2_SW 0x00000002 /* Super write */ 97*4882a593Smuzhiyun #define PPC47x_TLB2_SR 0x00000001 /* Super read */ 98*4882a593Smuzhiyun #define PPC47x_TLB2_U_RWX (PPC47x_TLB2_UX|PPC47x_TLB2_UW|PPC47x_TLB2_UR) 99*4882a593Smuzhiyun #define PPC47x_TLB2_S_RWX (PPC47x_TLB2_SX|PPC47x_TLB2_SW|PPC47x_TLB2_SR) 100*4882a593Smuzhiyun #define PPC47x_TLB2_S_RW (PPC47x_TLB2_SW | PPC47x_TLB2_SR) 101*4882a593Smuzhiyun #define PPC47x_TLB2_IMG (PPC47x_TLB2_I | PPC47x_TLB2_M | PPC47x_TLB2_G) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun extern unsigned int tlb_44x_hwater; 106*4882a593Smuzhiyun extern unsigned int tlb_44x_index; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun typedef struct { 109*4882a593Smuzhiyun unsigned int id; 110*4882a593Smuzhiyun unsigned int active; 111*4882a593Smuzhiyun unsigned long vdso_base; 112*4882a593Smuzhiyun } mm_context_t; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* patch sites */ 115*4882a593Smuzhiyun extern s32 patch__tlb_44x_hwater_D, patch__tlb_44x_hwater_I; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #endif /* !__ASSEMBLY__ */ 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #ifndef CONFIG_PPC_EARLY_DEBUG_44x 120*4882a593Smuzhiyun #define PPC44x_EARLY_TLBS 1 121*4882a593Smuzhiyun #else 122*4882a593Smuzhiyun #define PPC44x_EARLY_TLBS 2 123*4882a593Smuzhiyun #define PPC44x_EARLY_DEBUG_VIRTADDR (ASM_CONST(0xf0000000) \ 124*4882a593Smuzhiyun | (ASM_CONST(CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW) & 0xffff)) 125*4882a593Smuzhiyun #endif 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /* Size of the TLBs used for pinning in lowmem */ 128*4882a593Smuzhiyun #define PPC_PIN_SIZE (1 << 28) /* 256M */ 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #if defined(CONFIG_PPC_4K_PAGES) 131*4882a593Smuzhiyun #define PPC44x_TLBE_SIZE PPC44x_TLB_4K 132*4882a593Smuzhiyun #define PPC47x_TLBE_SIZE PPC47x_TLB0_4K 133*4882a593Smuzhiyun #define mmu_virtual_psize MMU_PAGE_4K 134*4882a593Smuzhiyun #elif defined(CONFIG_PPC_16K_PAGES) 135*4882a593Smuzhiyun #define PPC44x_TLBE_SIZE PPC44x_TLB_16K 136*4882a593Smuzhiyun #define PPC47x_TLBE_SIZE PPC47x_TLB0_16K 137*4882a593Smuzhiyun #define mmu_virtual_psize MMU_PAGE_16K 138*4882a593Smuzhiyun #elif defined(CONFIG_PPC_64K_PAGES) 139*4882a593Smuzhiyun #define PPC44x_TLBE_SIZE PPC44x_TLB_64K 140*4882a593Smuzhiyun #define PPC47x_TLBE_SIZE PPC47x_TLB0_64K 141*4882a593Smuzhiyun #define mmu_virtual_psize MMU_PAGE_64K 142*4882a593Smuzhiyun #elif defined(CONFIG_PPC_256K_PAGES) 143*4882a593Smuzhiyun #define PPC44x_TLBE_SIZE PPC44x_TLB_256K 144*4882a593Smuzhiyun #define mmu_virtual_psize MMU_PAGE_256K 145*4882a593Smuzhiyun #else 146*4882a593Smuzhiyun #error "Unsupported PAGE_SIZE" 147*4882a593Smuzhiyun #endif 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #define mmu_linear_psize MMU_PAGE_256M 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #define PPC44x_PGD_OFF_SHIFT (32 - PGDIR_SHIFT + PGD_T_LOG2) 152*4882a593Smuzhiyun #define PPC44x_PGD_OFF_MASK_BIT (PGDIR_SHIFT - PGD_T_LOG2) 153*4882a593Smuzhiyun #define PPC44x_PTE_ADD_SHIFT (32 - PGDIR_SHIFT + PTE_SHIFT + PTE_T_LOG2) 154*4882a593Smuzhiyun #define PPC44x_PTE_ADD_MASK_BIT (32 - PTE_T_LOG2 - PTE_SHIFT) 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #endif /* _ASM_POWERPC_MMU_44X_H_ */ 157