blob: d2ac6db68e2a014e593ccb4be156713726289bb4 [file] [log] [blame]
Soby Mathew44170c42016-03-22 15:51:08 +00001/*
2 * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of ARM nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef __XLAT_TABLES_H__
32#define __XLAT_TABLES_H__
33
34/* Miscellaneous MMU related constants */
Soby Mathew44170c42016-03-22 15:51:08 +000035#define FOUR_KB_SHIFT 12
36
Soby Mathew44170c42016-03-22 15:51:08 +000037#define INVALID_DESC 0x0
Antonio Nino Diazd48ae612016-08-02 09:21:41 +010038#define BLOCK_DESC 0x1 /* Table levels 0-2 */
39#define TABLE_DESC 0x3 /* Table levels 0-2 */
40#define PAGE_DESC 0x3 /* Table level 3 */
Soby Mathew44170c42016-03-22 15:51:08 +000041
42#define XN (1ull << 2)
43#define PXN (1ull << 1)
44#define CONT_HINT (1ull << 0)
45
46#define UPPER_ATTRS(x) (x & 0x7) << 52
47#define NON_GLOBAL (1 << 9)
48#define ACCESS_FLAG (1 << 8)
49#define NSH (0x0 << 6)
50#define OSH (0x2 << 6)
51#define ISH (0x3 << 6)
52
53#define PAGE_SIZE_SHIFT FOUR_KB_SHIFT
54#define PAGE_SIZE (1 << PAGE_SIZE_SHIFT)
55#define PAGE_SIZE_MASK (PAGE_SIZE - 1)
56#define IS_PAGE_ALIGNED(addr) (((addr) & PAGE_SIZE_MASK) == 0)
57
58#define XLAT_ENTRY_SIZE_SHIFT 3 /* Each MMU table entry is 8 bytes (1 << 3) */
59#define XLAT_ENTRY_SIZE (1 << XLAT_ENTRY_SIZE_SHIFT)
60
61#define XLAT_TABLE_SIZE_SHIFT PAGE_SIZE_SHIFT
62#define XLAT_TABLE_SIZE (1 << XLAT_TABLE_SIZE_SHIFT)
63
Antonio Nino Diazd48ae612016-08-02 09:21:41 +010064#ifdef AARCH32
65#define XLAT_TABLE_LEVEL_MIN 1
66#else
67#define XLAT_TABLE_LEVEL_MIN 0
68#endif /* AARCH32 */
69
70#define XLAT_TABLE_LEVEL_MAX 3
71
Soby Mathew44170c42016-03-22 15:51:08 +000072/* Values for number of entries in each MMU translation table */
73#define XLAT_TABLE_ENTRIES_SHIFT (XLAT_TABLE_SIZE_SHIFT - XLAT_ENTRY_SIZE_SHIFT)
74#define XLAT_TABLE_ENTRIES (1 << XLAT_TABLE_ENTRIES_SHIFT)
75#define XLAT_TABLE_ENTRIES_MASK (XLAT_TABLE_ENTRIES - 1)
76
77/* Values to convert a memory address to an index into a translation table */
78#define L3_XLAT_ADDRESS_SHIFT PAGE_SIZE_SHIFT
79#define L2_XLAT_ADDRESS_SHIFT (L3_XLAT_ADDRESS_SHIFT + XLAT_TABLE_ENTRIES_SHIFT)
80#define L1_XLAT_ADDRESS_SHIFT (L2_XLAT_ADDRESS_SHIFT + XLAT_TABLE_ENTRIES_SHIFT)
Antonio Nino Diazd48ae612016-08-02 09:21:41 +010081#define L0_XLAT_ADDRESS_SHIFT (L1_XLAT_ADDRESS_SHIFT + XLAT_TABLE_ENTRIES_SHIFT)
Soby Mathew44170c42016-03-22 15:51:08 +000082
83/*
84 * AP[1] bit is ignored by hardware and is
85 * treated as if it is One in EL2/EL3
86 */
87#define AP_RO (0x1 << 5)
88#define AP_RW (0x0 << 5)
89
90#define NS (0x1 << 3)
91#define ATTR_NON_CACHEABLE_INDEX 0x2
92#define ATTR_DEVICE_INDEX 0x1
93#define ATTR_IWBWA_OWBWA_NTR_INDEX 0x0
94#define LOWER_ATTRS(x) (((x) & 0xfff) << 2)
95#define ATTR_NON_CACHEABLE (0x44)
96#define ATTR_DEVICE (0x4)
97#define ATTR_IWBWA_OWBWA_NTR (0xff)
98#define MAIR_ATTR_SET(attr, index) (attr << (index << 3))
99
100/*
101 * Flags to override default values used to program system registers while
102 * enabling the MMU.
103 */
104#define DISABLE_DCACHE (1 << 0)
105
106#ifndef __ASSEMBLY__
107#include <stddef.h>
108#include <stdint.h>
109
110/* Helper macro to define entries for mmap_region_t. It creates
111 * identity mappings for each region.
112 */
113#define MAP_REGION_FLAT(adr, sz, attr) MAP_REGION(adr, adr, sz, attr)
114
115/* Helper macro to define entries for mmap_region_t. It allows to
116 * re-map address mappings from 'pa' to 'va' for each region.
117 */
118#define MAP_REGION(pa, va, sz, attr) {(pa), (va), (sz), (attr)}
119
120/*
121 * Shifts and masks to access fields of an mmap_attr_t
122 */
123#define MT_TYPE_MASK 0x7
124#define MT_TYPE(_attr) ((_attr) & MT_TYPE_MASK)
125/* Access permissions (RO/RW) */
126#define MT_PERM_SHIFT 3
127/* Security state (SECURE/NS) */
128#define MT_SEC_SHIFT 4
Sandrine Bailleuxac3aa682016-06-14 16:31:09 +0100129/* Access permissions for instruction execution (EXECUTE/EXECUTE_NEVER) */
130#define MT_EXECUTE_SHIFT 5
Soby Mathew44170c42016-03-22 15:51:08 +0000131
132/*
133 * Memory mapping attributes
134 */
135typedef enum {
136 /*
137 * Memory types supported.
138 * These are organised so that, going down the list, the memory types
139 * are getting weaker; conversely going up the list the memory types are
140 * getting stronger.
141 */
142 MT_DEVICE,
143 MT_NON_CACHEABLE,
144 MT_MEMORY,
145 /* Values up to 7 are reserved to add new memory types in the future */
146
Soby Mathew44170c42016-03-22 15:51:08 +0000147 MT_RO = 0 << MT_PERM_SHIFT,
148 MT_RW = 1 << MT_PERM_SHIFT,
149
150 MT_SECURE = 0 << MT_SEC_SHIFT,
151 MT_NS = 1 << MT_SEC_SHIFT,
Sandrine Bailleuxac3aa682016-06-14 16:31:09 +0100152
153 /*
154 * Access permissions for instruction execution are only relevant for
155 * normal read-only memory, i.e. MT_MEMORY | MT_RO. They are ignored
156 * (and potentially overridden) otherwise:
157 * - Device memory is always marked as execute-never.
158 * - Read-write normal memory is always marked as execute-never.
159 */
160 MT_EXECUTE = 0 << MT_EXECUTE_SHIFT,
161 MT_EXECUTE_NEVER = 1 << MT_EXECUTE_SHIFT,
Soby Mathew44170c42016-03-22 15:51:08 +0000162} mmap_attr_t;
163
Sandrine Bailleuxac3aa682016-06-14 16:31:09 +0100164#define MT_CODE (MT_MEMORY | MT_RO | MT_EXECUTE)
165#define MT_RO_DATA (MT_MEMORY | MT_RO | MT_EXECUTE_NEVER)
166
Soby Mathew44170c42016-03-22 15:51:08 +0000167/*
168 * Structure for specifying a single region of memory.
169 */
170typedef struct mmap_region {
171 unsigned long long base_pa;
172 uintptr_t base_va;
173 size_t size;
174 mmap_attr_t attr;
175} mmap_region_t;
176
177/* Generic translation table APIs */
178void init_xlat_tables(void);
179void mmap_add_region(unsigned long long base_pa, uintptr_t base_va,
180 size_t size, unsigned int attr);
181void mmap_add(const mmap_region_t *mm);
182
Soby Mathew935c2e72016-06-30 15:11:07 +0100183#ifdef AARCH32
184/* AArch32 specific translation table API */
185void enable_mmu_secure(uint32_t flags);
186#else
Soby Mathew44170c42016-03-22 15:51:08 +0000187/* AArch64 specific translation table APIs */
188void enable_mmu_el1(unsigned int flags);
189void enable_mmu_el3(unsigned int flags);
Soby Mathew935c2e72016-06-30 15:11:07 +0100190#endif /* AARCH32 */
Soby Mathew44170c42016-03-22 15:51:08 +0000191
192#endif /*__ASSEMBLY__*/
193#endif /* __XLAT_TABLES_H__ */