xref: /OK3568_Linux_fs/kernel/Documentation/xtensa/mmu.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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