xref: /nrf52832-nimble/rt-thread/libcpu/arm/armv6/mmu.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  */
9*10465441SEvalZero 
10*10465441SEvalZero #ifndef __MMU_H__
11*10465441SEvalZero #define __MMU_H__
12*10465441SEvalZero 
13*10465441SEvalZero #include <rtthread.h>
14*10465441SEvalZero 
15*10465441SEvalZero #define CACHE_LINE_SIZE	32
16*10465441SEvalZero 
17*10465441SEvalZero /*
18*10465441SEvalZero  * Hardware page table definitions.
19*10465441SEvalZero  *
20*10465441SEvalZero  * + Level 1 descriptor (PGD)
21*10465441SEvalZero  *   - common
22*10465441SEvalZero  */
23*10465441SEvalZero #define PGD_TYPE_MASK       (3 << 0)
24*10465441SEvalZero #define PGD_TYPE_FAULT      (0 << 0)
25*10465441SEvalZero #define PGD_TYPE_TABLE      (1 << 0)
26*10465441SEvalZero #define PGD_TYPE_SECT       (2 << 0)
27*10465441SEvalZero #define PGD_BIT4            (1 << 4)
28*10465441SEvalZero #define PGD_DOMAIN(x)       ((x) << 5)
29*10465441SEvalZero #define PGD_PROTECTION      (1 << 9)    /* ARMv5 */
30*10465441SEvalZero /*
31*10465441SEvalZero  *   - section
32*10465441SEvalZero  */
33*10465441SEvalZero #define PGD_SECT_BUFFERABLE	(1 << 2)
34*10465441SEvalZero #define PGD_SECT_CACHEABLE  (1 << 3)
35*10465441SEvalZero #define PGD_SECT_XN         (1 << 4)    /* ARMv6 */
36*10465441SEvalZero #define PGD_SECT_AP0        (1 << 10)
37*10465441SEvalZero #define PGD_SECT_AP1        (1 << 11)
38*10465441SEvalZero #define PGD_SECT_TEX(x)     ((x) << 12) /* ARMv5 */
39*10465441SEvalZero #define PGD_SECT_APX        (1 << 15)   /* ARMv6 */
40*10465441SEvalZero #define PGD_SECT_S          (1 << 16)   /* ARMv6 */
41*10465441SEvalZero #define PGD_SECT_nG         (1 << 17)   /* ARMv6 */
42*10465441SEvalZero #define PGD_SECT_SUPER      (1 << 18)   /* ARMv6 */
43*10465441SEvalZero 
44*10465441SEvalZero #define PGD_SECT_UNCACHED   (0)
45*10465441SEvalZero #define PGD_SECT_BUFFERED   (PGD_SECT_BUFFERABLE)
46*10465441SEvalZero #define PGD_SECT_WT         (PGD_SECT_CACHEABLE)
47*10465441SEvalZero #define PGD_SECT_WB         (PGD_SECT_CACHEABLE | PGD_SECT_BUFFERABLE)
48*10465441SEvalZero #define PGD_SECT_MINICACHE  (PGD_SECT_TEX(1) | PGD_SECT_CACHEABLE)
49*10465441SEvalZero #define PGD_SECT_WBWA       (PGD_SECT_TEX(1) | PGD_SECT_CACHEABLE | PGD_SECT_BUFFERABLE)
50*10465441SEvalZero #define PGD_SECT_NONSHARED_DEV  (PGD_SECT_TEX(2))
51*10465441SEvalZero 
52*10465441SEvalZero 
53*10465441SEvalZero /*
54*10465441SEvalZero  * + Level 2 descriptor (PTE)
55*10465441SEvalZero  *   - common
56*10465441SEvalZero  */
57*10465441SEvalZero #define PTE_TYPE_MASK       (3 << 0)
58*10465441SEvalZero #define PTE_TYPE_FAULT      (0 << 0)
59*10465441SEvalZero #define PTE_TYPE_LARGE      (1 << 0)
60*10465441SEvalZero #define PTE_TYPE_SMALL      (2 << 0)
61*10465441SEvalZero #define PTE_TYPE_EXT        (3 << 0)    /* ARMv5 */
62*10465441SEvalZero #define PTE_BUFFERABLE      (1 << 2)
63*10465441SEvalZero #define PTE_CACHEABLE       (1 << 3)
64*10465441SEvalZero 
65*10465441SEvalZero /*
66*10465441SEvalZero  *   - extended small page/tiny page
67*10465441SEvalZero  */
68*10465441SEvalZero #define PTE_EXT_XN          (1 << 0)    /* ARMv6 */
69*10465441SEvalZero #define PTE_EXT_AP_MASK     (3 << 4)
70*10465441SEvalZero #define PTE_EXT_AP0         (1 << 4)
71*10465441SEvalZero #define PTE_EXT_AP1         (2 << 4)
72*10465441SEvalZero #define PTE_EXT_AP_UNO_SRO  (0 << 4)
73*10465441SEvalZero #define PTE_EXT_AP_UNO_SRW  (PTE_EXT_AP0)
74*10465441SEvalZero #define PTE_EXT_AP_URO_SRW  (PTE_EXT_AP1)
75*10465441SEvalZero #define PTE_EXT_AP_URW_SRW  (PTE_EXT_AP1|PTE_EXT_AP0)
76*10465441SEvalZero #define PTE_EXT_TEX(x)      ((x) << 6)  /* ARMv5 */
77*10465441SEvalZero #define PTE_EXT_APX         (1 << 9)    /* ARMv6 */
78*10465441SEvalZero #define PTE_EXT_SHARED      (1 << 10)   /* ARMv6 */
79*10465441SEvalZero #define PTE_EXT_NG          (1 << 11)   /* ARMv6 */
80*10465441SEvalZero 
81*10465441SEvalZero /*
82*10465441SEvalZero  *   - small page
83*10465441SEvalZero  */
84*10465441SEvalZero #define PTE_SMALL_AP_MASK       (0xff << 4)
85*10465441SEvalZero #define PTE_SMALL_AP_UNO_SRO    (0x00 << 4)
86*10465441SEvalZero #define PTE_SMALL_AP_UNO_SRW    (0x55 << 4)
87*10465441SEvalZero #define PTE_SMALL_AP_URO_SRW    (0xaa << 4)
88*10465441SEvalZero #define PTE_SMALL_AP_URW_SRW    (0xff << 4)
89*10465441SEvalZero 
90*10465441SEvalZero 
91*10465441SEvalZero /*
92*10465441SEvalZero  *  sector table properities
93*10465441SEvalZero  */
94*10465441SEvalZero #define SECT_CB          (PGD_SECT_CACHEABLE|PGD_SECT_BUFFERABLE) //cache_on, write_back
95*10465441SEvalZero #define SECT_CNB         (PGD_SECT_CACHEABLE)                     //cache_on, write_through
96*10465441SEvalZero #define SECT_NCB         (PGD_SECT_BUFFERABLE)                    //cache_off,WR_BUF on
97*10465441SEvalZero #define SECT_NCNB        (0 << 2)                                 //cache_off,WR_BUF off
98*10465441SEvalZero 
99*10465441SEvalZero #define SECT_AP_RW       (PGD_SECT_AP0|PGD_SECT_AP1)              //supervisor=RW, user=RW
100*10465441SEvalZero #define SECT_AP_RO       (PGD_SECT_AP0|PGD_SECT_AP1|PGD_SECT_APX) //supervisor=RO, user=RO
101*10465441SEvalZero 
102*10465441SEvalZero #define SECT_RWX_CB      (SECT_AP_RW|PGD_DOMAIN(0)|PGD_SECT_WB|PGD_TYPE_SECT) /* Read/Write/executable, cache, write back */
103*10465441SEvalZero #define SECT_RWX_CNB     (SECT_AP_RW|PGD_DOMAIN(0)|PGD_SECT_WT|PGD_TYPE_SECT) /* Read/Write/executable, cache, write through */
104*10465441SEvalZero #define SECT_RWX_NCNB    (SECT_AP_RW|PGD_DOMAIN(0)|PGD_TYPE_SECT) /* Read/Write/executable without cache and write buffer */
105*10465441SEvalZero #define SECT_RWX_FAULT   (SECT_AP_RW|PGD_DOMAIN(1)|PGD_TYPE_SECT) /* Read/Write without cache and write buffer */
106*10465441SEvalZero 
107*10465441SEvalZero #define SECT_RWNX_CB     (SECT_AP_RW|PGD_DOMAIN(0)|PGD_SECT_WB|PGD_TYPE_SECT|PGD_SECT_XN) /* Read/Write, cache, write back */
108*10465441SEvalZero #define SECT_RWNX_CNB    (SECT_AP_RW|PGD_DOMAIN(0)|PGD_SECT_WT|PGD_TYPE_SECT|PGD_SECT_XN) /* Read/Write, cache, write through */
109*10465441SEvalZero #define SECT_RWNX_NCNB   (SECT_AP_RW|PGD_DOMAIN(0)|PGD_TYPE_SECT|PGD_SECT_XN) /* Read/Write without cache and write buffer */
110*10465441SEvalZero #define SECT_RWNX_FAULT  (SECT_AP_RW|PGD_DOMAIN(1)|PGD_TYPE_SECT|PGD_SECT_XN) /* Read/Write without cache and write buffer */
111*10465441SEvalZero 
112*10465441SEvalZero 
113*10465441SEvalZero #define SECT_ROX_CB      (SECT_AP_RO|PGD_DOMAIN(0)|PGD_SECT_WB|PGD_TYPE_SECT) /* Read Only/executable, cache, write back */
114*10465441SEvalZero #define SECT_ROX_CNB     (SECT_AP_RO|PGD_DOMAIN(0)|PGD_SECT_WT|PGD_TYPE_SECT) /* Read Only/executable, cache, write through */
115*10465441SEvalZero #define SECT_ROX_NCNB    (SECT_AP_RO|PGD_DOMAIN(0)|PGD_TYPE_SECT) /* Read Only/executable without cache and write buffer */
116*10465441SEvalZero #define SECT_ROX_FAULT   (SECT_AP_RO|PGD_DOMAIN(1)|PGD_TYPE_SECT) /* Read Only without cache and write buffer */
117*10465441SEvalZero 
118*10465441SEvalZero #define SECT_RONX_CB     (SECT_AP_RO|PGD_DOMAIN(0)|PGD_SECT_WB|PGD_TYPE_SECT|PGD_SECT_XN) /* Read Only, cache, write back */
119*10465441SEvalZero #define SECT_RONX_CNB    (SECT_AP_RO|PGD_DOMAIN(0)|PGD_SECT_WT|PGD_TYPE_SECT|PGD_SECT_XN) /* Read Only, cache, write through */
120*10465441SEvalZero #define SECT_RONX_NCNB   (SECT_AP_RO|PGD_DOMAIN(0)|PGD_TYPE_SECT|PGD_SECT_XN) /* Read Only without cache and write buffer */
121*10465441SEvalZero #define SECT_RONX_FAULT  (SECT_AP_RO|PGD_DOMAIN(1)|PGD_TYPE_SECT|PGD_SECT_XN) /* Read Only without cache and write buffer */
122*10465441SEvalZero 
123*10465441SEvalZero #define SECT_TO_PAGE     (PGD_DOMAIN(0)|PGD_TYPE_TABLE) /* Level 2 descriptor (PTE) entry properity */
124*10465441SEvalZero 
125*10465441SEvalZero /*
126*10465441SEvalZero  * page table properities
127*10465441SEvalZero  */
128*10465441SEvalZero #define PAGE_CB          (PTE_BUFFERABLE|PTE_CACHEABLE)  //cache_on, write_back
129*10465441SEvalZero #define PAGE_CNB         (PTE_CACHEABLE)                 //cache_on, write_through
130*10465441SEvalZero #define PAGE_NCB         (PTE_BUFFERABLE)                //cache_off,WR_BUF on
131*10465441SEvalZero #define PAGE_NCNB        (0 << 2)                        //cache_off,WR_BUF off
132*10465441SEvalZero 
133*10465441SEvalZero #define PAGE_AP_RW       (PTE_EXT_AP0|PTE_EXT_AP1)             //supervisor=RW, user=RW
134*10465441SEvalZero #define PAGE_AP_RO       (PTE_EXT_AP0|PTE_EXT_AP1|PTE_EXT_APX) //supervisor=RO, user=RO
135*10465441SEvalZero 
136*10465441SEvalZero #define PAGE_RWX_CB      (PAGE_AP_RW|PAGE_CB|PTE_TYPE_SMALL) /* Read/Write/executable, cache, write back */
137*10465441SEvalZero #define PAGE_RWX_CNB     (PAGE_AP_RW|PAGE_CNB|PTE_TYPE_SMALL) /* Read/Write/executable, cache, write through */
138*10465441SEvalZero #define PAGE_RWX_NCNB    (PAGE_AP_RW|PTE_TYPE_SMALL) /* Read/Write/executable without cache and write buffer */
139*10465441SEvalZero #define PAGE_RWX_FAULT   (PAGE_AP_RW|PTE_TYPE_SMALL) /* Read/Write without cache and write buffer */
140*10465441SEvalZero 
141*10465441SEvalZero #define PAGE_RWNX_CB     (PAGE_AP_RW|PAGE_CB|PTE_TYPE_SMALL|PTE_EXT_XN) /* Read/Write, cache, write back */
142*10465441SEvalZero #define PAGE_RWNX_CNB    (PAGE_AP_RW|PAGE_CNB|PTE_TYPE_SMALL|PTE_EXT_XN) /* Read/Write, cache, write through */
143*10465441SEvalZero #define PAGE_RWNX_NCNB   (PAGE_AP_RW|PTE_TYPE_SMALL|PTE_EXT_XN) /* Read/Write without cache and write buffer */
144*10465441SEvalZero #define PAGE_RWNX_FAULT  (PAGE_AP_RW|PTE_TYPE_SMALL|PTE_EXT_XN) /* Read/Write without cache and write buffer */
145*10465441SEvalZero 
146*10465441SEvalZero 
147*10465441SEvalZero #define PAGE_ROX_CB      (PAGE_AP_RO|PAGE_CB|PTE_TYPE_SMALL) /* Read Only/executable, cache, write back */
148*10465441SEvalZero #define PAGE_ROX_CNB     (PAGE_AP_RO|PAGE_CNB|PTE_TYPE_SMALL) /* Read Only/executable, cache, write through */
149*10465441SEvalZero #define PAGE_ROX_NCNB    (PAGE_AP_RO|PTE_TYPE_SMALL) /* Read Only/executable without cache and write buffer */
150*10465441SEvalZero #define PAGE_ROX_FAULT   (PAGE_AP_RO|PTE_TYPE_SMALL) /* Read Only without cache and write buffer */
151*10465441SEvalZero 
152*10465441SEvalZero #define PAGE_RONX_CB     (PAGE_AP_RO|PAGE_CB|PTE_TYPE_SMALL|PTE_EXT_XN) /* Read Only, cache, write back */
153*10465441SEvalZero #define PAGE_RONX_CNB    (PAGE_AP_RO|PAGE_CNB|PTE_TYPE_SMALL|PTE_EXT_XN) /* Read Only, cache, write through */
154*10465441SEvalZero #define PAGE_RONX_NCNB   (PAGE_AP_RO|PTE_TYPE_SMALL|PTE_EXT_XN) /* Read Only without cache and write buffer */
155*10465441SEvalZero #define PAGE_RONX_FAULT  (PAGE_AP_RO|PTE_TYPE_SMALL|PTE_EXT_XN) /* Read Only without cache and write buffer */
156*10465441SEvalZero 
157*10465441SEvalZero 
158*10465441SEvalZero #define DESC_SEC		(0x2|(1<<4))
159*10465441SEvalZero #define CB				(3<<2)  //cache_on, write_back
160*10465441SEvalZero #define CNB				(2<<2)  //cache_on, write_through
161*10465441SEvalZero #define NCB				(1<<2)  //cache_off,WR_BUF on
162*10465441SEvalZero #define NCNB			(0<<2)  //cache_off,WR_BUF off
163*10465441SEvalZero #define AP_RW			(3<<10) //supervisor=RW, user=RW
164*10465441SEvalZero #define AP_RO			(2<<10) //supervisor=RW, user=RO
165*10465441SEvalZero 
166*10465441SEvalZero #define DOMAIN_FAULT	(0x0)
167*10465441SEvalZero #define DOMAIN_CHK		(0x1)
168*10465441SEvalZero #define DOMAIN_NOTCHK	(0x3)
169*10465441SEvalZero #define DOMAIN0			(0x0<<5)
170*10465441SEvalZero #define DOMAIN1			(0x1<<5)
171*10465441SEvalZero 
172*10465441SEvalZero #define DOMAIN0_ATTR	(DOMAIN_CHK<<0)
173*10465441SEvalZero #define DOMAIN1_ATTR	(DOMAIN_FAULT<<2)
174*10465441SEvalZero 
175*10465441SEvalZero #define RW_CB		(AP_RW|DOMAIN0|CB|DESC_SEC)		/* Read/Write, cache, write back */
176*10465441SEvalZero #define RW_CNB		(AP_RW|DOMAIN0|CNB|DESC_SEC)	/* Read/Write, cache, write through */
177*10465441SEvalZero #define RW_NCNB		(AP_RW|DOMAIN0|NCNB|DESC_SEC)	/* Read/Write without cache and write buffer */
178*10465441SEvalZero #define RW_FAULT	(AP_RW|DOMAIN1|NCNB|DESC_SEC)	/* Read/Write without cache and write buffer */
179*10465441SEvalZero 
180*10465441SEvalZero struct mem_desc {
181*10465441SEvalZero 	rt_uint32_t vaddr_start;
182*10465441SEvalZero 	rt_uint32_t vaddr_end;
183*10465441SEvalZero 	rt_uint32_t paddr_start;
184*10465441SEvalZero 	rt_uint32_t sect_attr;   /* when page mapped */
185*10465441SEvalZero 	rt_uint32_t page_attr;   /* only sector mapped valid */
186*10465441SEvalZero 	rt_uint32_t mapped_mode;
187*10465441SEvalZero #define     SECT_MAPPED  0
188*10465441SEvalZero #define     PAGE_MAPPED  1
189*10465441SEvalZero };
190*10465441SEvalZero 
191*10465441SEvalZero void rt_hw_mmu_init(struct mem_desc *mdesc, rt_uint32_t size);
192*10465441SEvalZero 
193*10465441SEvalZero #endif
194*10465441SEvalZero 
195