First version
[3rdparty/ote_partner/tlk.git] / arch / arm / include / arch / arm / mmu_ldesc.h
1 /*
2  * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 #ifndef __ARCH_ARM_MMU_LDESC_H
24 #define __ARCH_ARM_MMU_LDESC_H
25
26 /*
27  * Initialize banked copy of MAIR0/MAIR1 registers with the memory
28  * attributes the kernel will be using:
29  *
30  * idx0 = strongly-ordered
31  * idx1 = outer: writeback/no alloc, inner: writeback/alloc
32  *
33  * and let the remaining indexes be allocated when a lookup during
34  * a page mapping fails to find an existing entry.
35  */
36 #define MMU_MEMORY_ATTR_INDIR_0         0x0000EF00
37 #define MMU_MEMORY_ATTR_INDIR_1         0x00000000
38
39 /* indices into attr indirect regs */
40 #define MMU_MEMORY_STRONGLY_ORDERED                     0
41 #define MMU_MEMORY_WB_OUTER_NO_ALLOC_INNER_ALLOC        1
42
43 #define MMU_MEMORY_SET_ATTR_IDX(val)    (((val) & 0x7) << 2)
44
45 #define MMU_MEMORY_WRITE_BACK_NO_ALLOCATE       0xE
46 #define MMU_MEMORY_WRITE_BACK_ALLOCATE          0xF
47
48 /* permissions */
49 #define MMU_MEMORY_AP_P_RW_U_NA ((0x0 << 7) | (0x0 << 6))
50 #define MMU_MEMORY_AP_P_RW_U_RW ((0x0 << 7) | (0x1 << 6))
51 #define MMU_MEMORY_AP_P_RO_U_NA ((0x1 << 7) | (0x0 << 6))
52 #define MMU_MEMORY_AP_P_RO_U_RO ((0x1 << 7) | (0x1 << 6))
53
54 /* shareable */
55 #define MMU_MEMORY_SH_NON_SHAREABLE     ((0x0 << 9) | (0x0 << 8))
56 #define MMU_MEMORY_SH_OUTER_SHAREABLE   ((0x1 << 9) | (0x0 << 8))
57 #define MMU_MEMORY_SH_INNER_SHAREABLE   ((0x1 << 9) | (0x1 << 8))
58
59 #define MMU_MEMORY_NON_GLOBAL   (1 << 11)
60 #define MMU_MEMORY_ACCESS_FLAG  (1 << 10)
61 #define MMU_MEMORY_NON_SECURE   (1 << 5)
62
63 /* ttbcr */
64 #define MMU_MEMORY_TTBCR_EAE    (1 << 31)
65 #define MMU_MEMORY_TTBCR_A1     (0 << 22)
66
67 #define MMU_MEMORY_RGN_NON_CACHEABLE            0
68 #define MMU_MEMORY_RGN_WRITE_BACK_ALLOCATE      1
69 #define MMU_MEMORY_RGN_WRITE_THROUGH            2
70 #define MMU_MEMORY_RGN_WRITE_BACK_NO_ALLOCATE   3
71
72 #define MMU_MEMORY_TTBCR_OUTER_RGN1(val)        (((val) & 0x3) << 26)
73 #define MMU_MEMORY_TTBCR_OUTER_RGN0(val)        (((val) & 0x3) << 10)
74 #define MMU_MEMORY_TTBCR_INNER_RGN1(val)        (((val) & 0x3) << 24)
75 #define MMU_MEMORY_TTBCR_INNER_RGN0(val)        (((val) & 0x3) << 8)
76
77 /* 1GB user (TTBR0) and 3GB kernel (TTBR1) */
78 #define MMU_MEMORY_TTBCR_T0SZ   (2 << 0)
79 #define MMU_MEMORY_TTBCR_T1SZ   (0 << 16)
80
81 #define MMU_ENTRY_SHIFT         (3)
82
83 /* table descriptor level 2 */
84 #define MMU_MEMORY_TTBR_L2_VADDR_SHIFT  21
85 #define MMU_MEMORY_TTBR_L2_INDEX_BITS   ((29 - 21) + 1)
86 #define MMU_MEMORY_TTBR_L2_INDEX_MASK   ((1 << MMU_MEMORY_TTBR_L2_INDEX_BITS) - 1)
87 #define MMU_MEMORY_TTBR_L2_SIZE         (1 << (MMU_MEMORY_TTBR_L2_INDEX_BITS + 3))
88
89 #define MMU_L2_BLOCK_SHIFT      (MMU_MEMORY_TTBR_L2_VADDR_SHIFT)
90 #define MMU_L2_BLOCK_SIZE       (1 << MMU_L2_BLOCK_SHIFT)
91
92 /* table descriptor level 3 */
93 #define MMU_MEMORY_TTBR_L3_VADDR_SHIFT  12
94 #define MMU_MEMORY_TTBR_L3_INDEX_BITS   ((20 - 12) + 1)
95 #define MMU_MEMORY_TTBR_L3_INDEX_MASK   ((1 << MMU_MEMORY_TTBR_L3_INDEX_BITS) - 1)
96 #define MMU_MEMORY_TTBR_L3_SIZE         (1 << (MMU_MEMORY_TTBR_L3_INDEX_BITS + 3))
97
98 /* L3 is 2^12 bytes in size and maps 2^21 of VA space */
99 #define MMU_L3_MAP_SHIFT        (MMU_MEMORY_TTBR_L2_VADDR_SHIFT)
100 #define MMU_L3_SIZE_SHIFT       (MMU_MEMORY_TTBR_L3_VADDR_SHIFT)
101
102 /* phys address of next table (for level 2/level 3 tables) */
103 #define MMU_MEMORY_TABLE_ADDR_SHIFT     12
104 #define MMU_MEMORY_TABLE_ADDR_ALIGN     (1 << MMU_MEMORY_TABLE_ADDR_SHIFT)
105 #define MMU_MEMORY_TABLE_ADDR_BITS      ((39 - 12) + 1)
106 #define MMU_MEMORY_TABLE_ADDR_MASK      (((1 << MMU_MEMORY_TABLE_ADDR_BITS) - 1) \
107                                                 << MMU_MEMORY_TABLE_ADDR_SHIFT)
108 #endif