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