1*4882a593Smuzhiyun============================= 2*4882a593SmuzhiyunMMUv3 initialization sequence 3*4882a593Smuzhiyun============================= 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunThe code in the initialize_mmu macro sets up MMUv3 memory mapping 6*4882a593Smuzhiyunidentically to MMUv2 fixed memory mapping. Depending on 7*4882a593SmuzhiyunCONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX symbol this code is 8*4882a593Smuzhiyunlocated in addresses it was linked for (symbol undefined), or not 9*4882a593Smuzhiyun(symbol defined), so it needs to be position-independent. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunThe code has the following assumptions: 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun - This code fragment is run only on an MMU v3. 14*4882a593Smuzhiyun - TLBs are in their reset state. 15*4882a593Smuzhiyun - ITLBCFG and DTLBCFG are zero (reset state). 16*4882a593Smuzhiyun - RASID is 0x04030201 (reset state). 17*4882a593Smuzhiyun - PS.RING is zero (reset state). 18*4882a593Smuzhiyun - LITBASE is zero (reset state, PC-relative literals); required to be PIC. 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunTLB setup proceeds along the following steps. 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun Legend: 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun - VA = virtual address (two upper nibbles of it); 25*4882a593Smuzhiyun - PA = physical address (two upper nibbles of it); 26*4882a593Smuzhiyun - pc = physical range that contains this code; 27*4882a593Smuzhiyun 28*4882a593SmuzhiyunAfter step 2, we jump to virtual address in the range 0x40000000..0x5fffffff 29*4882a593Smuzhiyunor 0x00000000..0x1fffffff, depending on whether the kernel was loaded below 30*4882a593Smuzhiyun0x40000000 or above. That address corresponds to next instruction to execute 31*4882a593Smuzhiyunin this code. After step 4, we jump to intended (linked) address of this code. 32*4882a593SmuzhiyunThe scheme below assumes that the kernel is loaded below 0x40000000. 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun ====== ===== ===== ===== ===== ====== ===== ===== 35*4882a593Smuzhiyun - Step0 Step1 Step2 Step3 Step4 Step5 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun VA PA PA PA PA VA PA PA 38*4882a593Smuzhiyun ====== ===== ===== ===== ===== ====== ===== ===== 39*4882a593Smuzhiyun E0..FF -> E0 -> E0 -> E0 F0..FF -> F0 -> F0 40*4882a593Smuzhiyun C0..DF -> C0 -> C0 -> C0 E0..EF -> F0 -> F0 41*4882a593Smuzhiyun A0..BF -> A0 -> A0 -> A0 D8..DF -> 00 -> 00 42*4882a593Smuzhiyun 80..9F -> 80 -> 80 -> 80 D0..D7 -> 00 -> 00 43*4882a593Smuzhiyun 60..7F -> 60 -> 60 -> 60 44*4882a593Smuzhiyun 40..5F -> 40 -> pc -> pc 40..5F -> pc 45*4882a593Smuzhiyun 20..3F -> 20 -> 20 -> 20 46*4882a593Smuzhiyun 00..1F -> 00 -> 00 -> 00 47*4882a593Smuzhiyun ====== ===== ===== ===== ===== ====== ===== ===== 48*4882a593Smuzhiyun 49*4882a593SmuzhiyunThe default location of IO peripherals is above 0xf0000000. This may be changed 50*4882a593Smuzhiyunusing a "ranges" property in a device tree simple-bus node. See the Devicetree 51*4882a593SmuzhiyunSpecification, section 4.5 for details on the syntax and semantics of 52*4882a593Smuzhiyunsimple-bus nodes. The following limitations apply: 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun1. Only top level simple-bus nodes are considered 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun2. Only one (first) simple-bus node is considered 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun3. Empty "ranges" properties are not supported 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun4. Only the first triplet in the "ranges" property is considered 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun5. The parent-bus-address value is rounded down to the nearest 256MB boundary 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun6. The IO area covers the entire 256MB segment of parent-bus-address; the 65*4882a593Smuzhiyun "ranges" triplet length field is ignored 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun 68*4882a593SmuzhiyunMMUv3 address space layouts. 69*4882a593Smuzhiyun============================ 70*4882a593Smuzhiyun 71*4882a593SmuzhiyunDefault MMUv2-compatible layout:: 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun Symbol VADDR Size 74*4882a593Smuzhiyun +------------------+ 75*4882a593Smuzhiyun | Userspace | 0x00000000 TASK_SIZE 76*4882a593Smuzhiyun +------------------+ 0x40000000 77*4882a593Smuzhiyun +------------------+ 78*4882a593Smuzhiyun | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE 79*4882a593Smuzhiyun +------------------+ 80*4882a593Smuzhiyun | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE 81*4882a593Smuzhiyun +------------------+ 0x8e400000 82*4882a593Smuzhiyun +------------------+ 83*4882a593Smuzhiyun | VMALLOC area | VMALLOC_START 0xc0000000 128MB - 64KB 84*4882a593Smuzhiyun +------------------+ VMALLOC_END 85*4882a593Smuzhiyun +------------------+ 86*4882a593Smuzhiyun | Cache aliasing | TLBTEMP_BASE_1 0xc8000000 DCACHE_WAY_SIZE 87*4882a593Smuzhiyun | remap area 1 | 88*4882a593Smuzhiyun +------------------+ 89*4882a593Smuzhiyun | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE 90*4882a593Smuzhiyun | remap area 2 | 91*4882a593Smuzhiyun +------------------+ 92*4882a593Smuzhiyun +------------------+ 93*4882a593Smuzhiyun | KMAP area | PKMAP_BASE PTRS_PER_PTE * 94*4882a593Smuzhiyun | | DCACHE_N_COLORS * 95*4882a593Smuzhiyun | | PAGE_SIZE 96*4882a593Smuzhiyun | | (4MB * DCACHE_N_COLORS) 97*4882a593Smuzhiyun +------------------+ 98*4882a593Smuzhiyun | Atomic KMAP area | FIXADDR_START KM_TYPE_NR * 99*4882a593Smuzhiyun | | NR_CPUS * 100*4882a593Smuzhiyun | | DCACHE_N_COLORS * 101*4882a593Smuzhiyun | | PAGE_SIZE 102*4882a593Smuzhiyun +------------------+ FIXADDR_TOP 0xcffff000 103*4882a593Smuzhiyun +------------------+ 104*4882a593Smuzhiyun | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xd0000000 128MB 105*4882a593Smuzhiyun +------------------+ 106*4882a593Smuzhiyun | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xd8000000 128MB 107*4882a593Smuzhiyun +------------------+ 108*4882a593Smuzhiyun | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB 109*4882a593Smuzhiyun +------------------+ 110*4882a593Smuzhiyun | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB 111*4882a593Smuzhiyun +------------------+ 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun256MB cached + 256MB uncached layout:: 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun Symbol VADDR Size 117*4882a593Smuzhiyun +------------------+ 118*4882a593Smuzhiyun | Userspace | 0x00000000 TASK_SIZE 119*4882a593Smuzhiyun +------------------+ 0x40000000 120*4882a593Smuzhiyun +------------------+ 121*4882a593Smuzhiyun | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE 122*4882a593Smuzhiyun +------------------+ 123*4882a593Smuzhiyun | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE 124*4882a593Smuzhiyun +------------------+ 0x8e400000 125*4882a593Smuzhiyun +------------------+ 126*4882a593Smuzhiyun | VMALLOC area | VMALLOC_START 0xa0000000 128MB - 64KB 127*4882a593Smuzhiyun +------------------+ VMALLOC_END 128*4882a593Smuzhiyun +------------------+ 129*4882a593Smuzhiyun | Cache aliasing | TLBTEMP_BASE_1 0xa8000000 DCACHE_WAY_SIZE 130*4882a593Smuzhiyun | remap area 1 | 131*4882a593Smuzhiyun +------------------+ 132*4882a593Smuzhiyun | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE 133*4882a593Smuzhiyun | remap area 2 | 134*4882a593Smuzhiyun +------------------+ 135*4882a593Smuzhiyun +------------------+ 136*4882a593Smuzhiyun | KMAP area | PKMAP_BASE PTRS_PER_PTE * 137*4882a593Smuzhiyun | | DCACHE_N_COLORS * 138*4882a593Smuzhiyun | | PAGE_SIZE 139*4882a593Smuzhiyun | | (4MB * DCACHE_N_COLORS) 140*4882a593Smuzhiyun +------------------+ 141*4882a593Smuzhiyun | Atomic KMAP area | FIXADDR_START KM_TYPE_NR * 142*4882a593Smuzhiyun | | NR_CPUS * 143*4882a593Smuzhiyun | | DCACHE_N_COLORS * 144*4882a593Smuzhiyun | | PAGE_SIZE 145*4882a593Smuzhiyun +------------------+ FIXADDR_TOP 0xaffff000 146*4882a593Smuzhiyun +------------------+ 147*4882a593Smuzhiyun | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xb0000000 256MB 148*4882a593Smuzhiyun +------------------+ 149*4882a593Smuzhiyun | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xc0000000 256MB 150*4882a593Smuzhiyun +------------------+ 151*4882a593Smuzhiyun +------------------+ 152*4882a593Smuzhiyun | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB 153*4882a593Smuzhiyun +------------------+ 154*4882a593Smuzhiyun | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB 155*4882a593Smuzhiyun +------------------+ 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun512MB cached + 512MB uncached layout:: 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun Symbol VADDR Size 161*4882a593Smuzhiyun +------------------+ 162*4882a593Smuzhiyun | Userspace | 0x00000000 TASK_SIZE 163*4882a593Smuzhiyun +------------------+ 0x40000000 164*4882a593Smuzhiyun +------------------+ 165*4882a593Smuzhiyun | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE 166*4882a593Smuzhiyun +------------------+ 167*4882a593Smuzhiyun | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE 168*4882a593Smuzhiyun +------------------+ 0x8e400000 169*4882a593Smuzhiyun +------------------+ 170*4882a593Smuzhiyun | VMALLOC area | VMALLOC_START 0x90000000 128MB - 64KB 171*4882a593Smuzhiyun +------------------+ VMALLOC_END 172*4882a593Smuzhiyun +------------------+ 173*4882a593Smuzhiyun | Cache aliasing | TLBTEMP_BASE_1 0x98000000 DCACHE_WAY_SIZE 174*4882a593Smuzhiyun | remap area 1 | 175*4882a593Smuzhiyun +------------------+ 176*4882a593Smuzhiyun | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE 177*4882a593Smuzhiyun | remap area 2 | 178*4882a593Smuzhiyun +------------------+ 179*4882a593Smuzhiyun +------------------+ 180*4882a593Smuzhiyun | KMAP area | PKMAP_BASE PTRS_PER_PTE * 181*4882a593Smuzhiyun | | DCACHE_N_COLORS * 182*4882a593Smuzhiyun | | PAGE_SIZE 183*4882a593Smuzhiyun | | (4MB * DCACHE_N_COLORS) 184*4882a593Smuzhiyun +------------------+ 185*4882a593Smuzhiyun | Atomic KMAP area | FIXADDR_START KM_TYPE_NR * 186*4882a593Smuzhiyun | | NR_CPUS * 187*4882a593Smuzhiyun | | DCACHE_N_COLORS * 188*4882a593Smuzhiyun | | PAGE_SIZE 189*4882a593Smuzhiyun +------------------+ FIXADDR_TOP 0x9ffff000 190*4882a593Smuzhiyun +------------------+ 191*4882a593Smuzhiyun | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xa0000000 512MB 192*4882a593Smuzhiyun +------------------+ 193*4882a593Smuzhiyun | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xc0000000 512MB 194*4882a593Smuzhiyun +------------------+ 195*4882a593Smuzhiyun | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB 196*4882a593Smuzhiyun +------------------+ 197*4882a593Smuzhiyun | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB 198*4882a593Smuzhiyun +------------------+ 199