First version
[3rdparty/ote_partner/tlk.git] / lib / monitor / arm64 / include / arm64 / 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 #include <arch/defines.h>
27
28 /*
29  * Initialize banked copy of MAIR0/MAIR1 registers with the memory
30  * attributes the kernel will be using:
31  *
32  * idx0 = strongly-ordered
33  * idx1 = outer: writeback/no alloc, inner: writeback/alloc
34  *
35  * and let the remaining indexes be allocated when a lookup during
36  * a page mapping fails to find an existing entry.
37  */
38 #define MMU_MEMORY_ATTR_INDIR           0x0000EF00
39
40 /* indices into attr indirect regs */
41 #define MMU_MEMORY_STRONGLY_ORDERED                     0
42 #define MMU_MEMORY_WB_OUTER_NO_ALLOC_INNER_ALLOC        1
43
44 #define MMU_MEMORY_SET_ATTR_IDX(val)    (((val) & 0x7) << 2)
45
46 #define MMU_MEMORY_WRITE_BACK_NO_ALLOCATE       0xE
47 #define MMU_MEMORY_WRITE_BACK_ALLOCATE          0xF
48
49 /* permissions */
50 #define MMU_MEMORY_AP_P_RW_U_NA ((0x0 << 7) | (0x0 << 6))
51 #define MMU_MEMORY_AP_P_RW_U_RW ((0x0 << 7) | (0x1 << 6))
52 #define MMU_MEMORY_AP_P_RO_U_NA ((0x1 << 7) | (0x0 << 6))
53 #define MMU_MEMORY_AP_P_RO_U_RO ((0x1 << 7) | (0x1 << 6))
54
55 /* shareable */
56 #define MMU_MEMORY_SH_NON_SHAREABLE     ((0x0 << 9) | (0x0 << 8))
57 #define MMU_MEMORY_SH_OUTER_SHAREABLE   ((0x1 << 9) | (0x0 << 8))
58 #define MMU_MEMORY_SH_INNER_SHAREABLE   ((0x1 << 9) | (0x1 << 8))
59
60 #define MMU_MEMORY_NON_GLOBAL   (1 << 11)
61 #define MMU_MEMORY_ACCESS_FLAG  (1 << 10)
62 #define MMU_MEMORY_NON_SECURE   (1 << 5)
63
64 /* tcr */
65 #define MMU_MEMORY_TCR_T0SZ(x)          ((64 - (x)) << 0)
66 #define MMU_MEMORY_TCR_T1SZ(x)          ((64 - (x)) << 16)
67
68 #define MMU_MEMORY_TCR_SH0_NON_SHARED   (0 << 12)
69 #define MMU_MEMORY_TCR_TG0_4K           (0 << 14)
70 #define MMU_MEMORY_TCR_TG0_16K          (2 << 14)
71 #define MMU_MEMORY_TCR_TG0_64K          (1 << 14)
72 #define MMU_MEMORY_TCR_PS_40BIT         (2 << 16)
73 #define MMU_MEMORY_TCR_ASID_IN_TTBR0    (0 << 22)
74 #define MMU_MEMORY_TCR_SH1_NON_SHARED   (0 << 28)
75 #define MMU_MEMORY_TCR_TG1_4K           (2 << 30)
76 #define MMU_MEMORY_TCR_TG1_16K          (1 << 30)
77 #define MMU_MEMORY_TCR_TG1_64K          (3 << 30)
78 #define MMU_MEMORY_TCR_IPS_40BIT        (2 << 32)
79 #define MMU_MEMORY_TCR_ASID_16BIT       (1 << 36)
80
81 #define MMU_MEMORY_RGN_NON_CACHEABLE            0
82 #define MMU_MEMORY_RGN_WRITE_BACK_ALLOCATE      1
83 #define MMU_MEMORY_RGN_WRITE_THROUGH            2
84 #define MMU_MEMORY_RGN_WRITE_BACK_NO_ALLOCATE   3
85
86 #define MMU_MEMORY_TCR_OUTER_RGN1(val)  (((val) & 0x3) << 26)
87 #define MMU_MEMORY_TCR_OUTER_RGN0(val)  (((val) & 0x3) << 10)
88 #define MMU_MEMORY_TCR_INNER_RGN1(val)  (((val) & 0x3) << 24)
89 #define MMU_MEMORY_TCR_INNER_RGN0(val)  (((val) & 0x3) << 8)
90
91 /* page granule (using 4K) */
92 #define MMU_PAGE_GRANULE_4K     (12)
93 #define MMU_PAGE_GRANULE_16K    (14)
94 #define MMU_PAGE_GRANULE_64K    (16)
95
96 #define MMU_ENTRY_SHIFT         (3)     /* each entry takes 2^3 (8) bytes */
97 #define MMU_ENTRY_PHYS_ADDR_MSB (48)    /* block/table holds max 2^48 phys addr */
98
99 #define MMU_ENTRIES_PER_LEVEL_BITS      (MMU_PAGE_GRANULE - MMU_ENTRY_SHIFT)
100 #define MMU_ENTRIES_PER_LEVEL           (1 << MMU_ENTRIES_PER_LEVEL_BITS)
101 #define MMU_ENTRIES_LEVEL_MASK          (MMU_ENTRIES_PER_LEVEL - 1)
102
103 #define MMU_L3_INDEX_LSB        (MMU_PAGE_GRANULE)
104 #define MMU_L2_INDEX_LSB        (MMU_L3_INDEX_LSB + MMU_ENTRIES_PER_LEVEL_BITS)
105 #define MMU_L1_INDEX_LSB        (MMU_L2_INDEX_LSB + MMU_ENTRIES_PER_LEVEL_BITS)
106 #define MMU_L0_INDEX_LSB        (MMU_L1_INDEX_LSB + MMU_ENTRIES_PER_LEVEL_BITS)
107
108 /* table descriptor level 2 */
109 #define MMU_MEMORY_TTBR_L2_VADDR_SHIFT  MMU_L2_INDEX_LSB
110 #define MMU_MEMORY_TTBR_L2_INDEX_BITS   MMU_ENTRIES_PER_LEVEL_BITS
111 #define MMU_MEMORY_TTBR_L2_INDEX_MASK   MMU_ENTRIES_LEVEL_MASK
112 #define MMU_MEMORY_TTBR_L2_SIZE         (1 << (MMU_MEMORY_TTBR_L2_INDEX_BITS + 3))
113
114 #define MMU_L2_BLOCK_SHIFT      (MMU_L2_INDEX_LSB)
115 #define MMU_L2_BLOCK_SIZE       (1 << MMU_L2_BLOCK_SHIFT)
116
117 /* table descriptor level 3 */
118 #define MMU_MEMORY_TTBR_L3_VADDR_SHIFT  MMU_PAGE_GRANULE
119 #define MMU_MEMORY_TTBR_L3_INDEX_BITS   MMU_ENTRIES_PER_LEVEL_BITS
120 #define MMU_MEMORY_TTBR_L3_INDEX_MASK   MMU_ENTRIES_LEVEL_MASK
121 #define MMU_MEMORY_TTBR_L3_SIZE         (1 << (MMU_MEMORY_TTBR_L3_INDEX_BITS + 3))
122
123 /* phys address of next table (for level 2/level 3 tables) */
124 #define MMU_MEMORY_TABLE_ADDR_ALIGN     (1 << MMU_PAGE_GRANULE)
125 #define MMU_MEMORY_TABLE_ADDR_BITS      (MMU_ENTRY_PHYS_ADDR_MSB - MMU_PAGE_GRANULE)
126 #define MMU_MEMORY_TABLE_ADDR_MASK      (((1UL << MMU_MEMORY_TABLE_ADDR_BITS) - 1) \
127                                                 << MMU_PAGE_GRANULE)
128 #endif