blob: e6f44bfa16ceae8d8b89dd8af5d3f09798e0f166 [file] [log] [blame]
Antonio Nino Diaz7bb01fb2017-03-08 14:40:23 +00001/*
2 * Copyright (c) 2017, 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_DEFS_H__
32#define __XLAT_TABLES_DEFS_H__
33
Scott Branden53d9c9c2017-04-10 11:45:52 -070034#include <utils_def.h>
Antonio Nino Diaz7bb01fb2017-03-08 14:40:23 +000035
36/* Miscellaneous MMU related constants */
37#define NUM_2MB_IN_GB (1 << 9)
38#define NUM_4K_IN_2MB (1 << 9)
39#define NUM_GB_IN_4GB (1 << 2)
40
41#define TWO_MB_SHIFT 21
42#define ONE_GB_SHIFT 30
43#define FOUR_KB_SHIFT 12
44
45#define ONE_GB_INDEX(x) ((x) >> ONE_GB_SHIFT)
46#define TWO_MB_INDEX(x) ((x) >> TWO_MB_SHIFT)
47#define FOUR_KB_INDEX(x) ((x) >> FOUR_KB_SHIFT)
48
49#define INVALID_DESC 0x0
50#define BLOCK_DESC 0x1 /* Table levels 0-2 */
51#define TABLE_DESC 0x3 /* Table levels 0-2 */
52#define PAGE_DESC 0x3 /* Table level 3 */
53#define DESC_MASK 0x3
54
55#define FIRST_LEVEL_DESC_N ONE_GB_SHIFT
56#define SECOND_LEVEL_DESC_N TWO_MB_SHIFT
57#define THIRD_LEVEL_DESC_N FOUR_KB_SHIFT
58
Antonio Nino Diaza5640252017-04-27 13:30:22 +010059/* XN: Translation regimes that support one VA range (EL2 and EL3). */
Antonio Nino Diaz7bb01fb2017-03-08 14:40:23 +000060#define XN (ULL(1) << 2)
Antonio Nino Diaza5640252017-04-27 13:30:22 +010061/* UXN, PXN: Translation regimes that support two VA ranges (EL1&0). */
62#define UXN (ULL(1) << 2)
Antonio Nino Diaz7bb01fb2017-03-08 14:40:23 +000063#define PXN (ULL(1) << 1)
64#define CONT_HINT (ULL(1) << 0)
65#define UPPER_ATTRS(x) (((x) & ULL(0x7)) << 52)
66
67#define NON_GLOBAL (1 << 9)
68#define ACCESS_FLAG (1 << 8)
69#define NSH (0x0 << 6)
70#define OSH (0x2 << 6)
71#define ISH (0x3 << 6)
72
73#define TABLE_ADDR_MASK ULL(0x0000FFFFFFFFF000)
74
75#define PAGE_SIZE_SHIFT FOUR_KB_SHIFT /* 4, 16 or 64 KB */
76#define PAGE_SIZE (1 << PAGE_SIZE_SHIFT)
77#define PAGE_SIZE_MASK (PAGE_SIZE - 1)
78#define IS_PAGE_ALIGNED(addr) (((addr) & PAGE_SIZE_MASK) == 0)
79
80#define XLAT_ENTRY_SIZE_SHIFT 3 /* Each MMU table entry is 8 bytes (1 << 3) */
81#define XLAT_ENTRY_SIZE (1 << XLAT_ENTRY_SIZE_SHIFT)
82
83#define XLAT_TABLE_SIZE_SHIFT PAGE_SIZE_SHIFT /* Size of one complete table */
84#define XLAT_TABLE_SIZE (1 << XLAT_TABLE_SIZE_SHIFT)
85
86#ifdef AARCH32
87#define XLAT_TABLE_LEVEL_MIN 1
88#else
89#define XLAT_TABLE_LEVEL_MIN 0
90#endif /* AARCH32 */
91
92#define XLAT_TABLE_LEVEL_MAX 3
93
94/* Values for number of entries in each MMU translation table */
95#define XLAT_TABLE_ENTRIES_SHIFT (XLAT_TABLE_SIZE_SHIFT - XLAT_ENTRY_SIZE_SHIFT)
96#define XLAT_TABLE_ENTRIES (1 << XLAT_TABLE_ENTRIES_SHIFT)
97#define XLAT_TABLE_ENTRIES_MASK (XLAT_TABLE_ENTRIES - 1)
98
99/* Values to convert a memory address to an index into a translation table */
100#define L3_XLAT_ADDRESS_SHIFT PAGE_SIZE_SHIFT
101#define L2_XLAT_ADDRESS_SHIFT (L3_XLAT_ADDRESS_SHIFT + XLAT_TABLE_ENTRIES_SHIFT)
102#define L1_XLAT_ADDRESS_SHIFT (L2_XLAT_ADDRESS_SHIFT + XLAT_TABLE_ENTRIES_SHIFT)
103#define L0_XLAT_ADDRESS_SHIFT (L1_XLAT_ADDRESS_SHIFT + XLAT_TABLE_ENTRIES_SHIFT)
104#define XLAT_ADDR_SHIFT(level) (PAGE_SIZE_SHIFT + \
105 ((XLAT_TABLE_LEVEL_MAX - (level)) * XLAT_TABLE_ENTRIES_SHIFT))
106
107#define XLAT_BLOCK_SIZE(level) ((u_register_t)1 << XLAT_ADDR_SHIFT(level))
108/* Mask to get the bits used to index inside a block of a certain level */
109#define XLAT_BLOCK_MASK(level) (XLAT_BLOCK_SIZE(level) - 1)
110/* Mask to get the address bits common to a block of a certain table level*/
111#define XLAT_ADDR_MASK(level) (~XLAT_BLOCK_MASK(level))
112
113/*
114 * AP[1] bit is ignored by hardware and is
115 * treated as if it is One in EL2/EL3
116 */
117#define AP_RO (0x1 << 5)
118#define AP_RW (0x0 << 5)
119
120#define NS (0x1 << 3)
121#define ATTR_NON_CACHEABLE_INDEX 0x2
122#define ATTR_DEVICE_INDEX 0x1
123#define ATTR_IWBWA_OWBWA_NTR_INDEX 0x0
124#define LOWER_ATTRS(x) (((x) & 0xfff) << 2)
125/* Normal Memory, Outer Write-Through non-transient, Inner Non-cacheable */
126#define ATTR_NON_CACHEABLE (0x44)
127/* Device-nGnRE */
128#define ATTR_DEVICE (0x4)
129/* Normal Memory, Outer Write-Back non-transient, Inner Write-Back non-transient */
130#define ATTR_IWBWA_OWBWA_NTR (0xff)
131#define MAIR_ATTR_SET(attr, index) ((attr) << ((index) << 3))
132#define ATTR_INDEX_MASK 0x3
133#define ATTR_INDEX_GET(attr) (((attr) >> 2) & ATTR_INDEX_MASK)
134
135/*
136 * Flags to override default values used to program system registers while
137 * enabling the MMU.
138 */
139#define DISABLE_DCACHE (1 << 0)
140
Summer Qin5d21b032017-03-16 17:16:34 +0000141/*
142 * This flag marks the translation tables are Non-cacheable for MMU accesses.
143 * If the flag is not specified, by default the tables are cacheable.
144 */
145#define XLAT_TABLE_NC (1 << 1)
146
Antonio Nino Diaz7bb01fb2017-03-08 14:40:23 +0000147#endif /* __XLAT_TABLES_DEFS_H__ */