1 /** @file
2 
3   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
4   Copyright (c) 2011 - 2015, ARM Ltd. All rights reserved.<BR>
5 
6   This program and the accompanying materials
7   are licensed and made available under the terms and conditions of the BSD License
8   which accompanies this distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef __AARCH64_H__
17 #define __AARCH64_H__
18 
19 #include <Chipset/AArch64Mmu.h>
20 #include <Chipset/ArmArchTimer.h>
21 
22 // ARM Interrupt ID in Exception Table
23 #define ARM_ARCH_EXCEPTION_IRQ            EXCEPT_AARCH64_IRQ
24 
25 // CPACR - Coprocessor Access Control Register definitions
26 #define CPACR_TTA_EN            (1UL << 28)
27 #define CPACR_FPEN_EL1          (1UL << 20)
28 #define CPACR_FPEN_FULL         (3UL << 20)
29 #define CPACR_CP_FULL_ACCESS    0x300000
30 
31 // Coprocessor Trap Register (CPTR)
32 #define AARCH64_CPTR_TFP        (1 << 10)
33 
34 // ID_AA64PFR0 - AArch64 Processor Feature Register 0 definitions
35 #define AARCH64_PFR0_FP         (0xF << 16)
36 #define AARCH64_PFR0_GIC        (0xF << 24)
37 
38 // SCR - Secure Configuration Register definitions
39 #define SCR_NS                  (1 << 0)
40 #define SCR_IRQ                 (1 << 1)
41 #define SCR_FIQ                 (1 << 2)
42 #define SCR_EA                  (1 << 3)
43 #define SCR_FW                  (1 << 4)
44 #define SCR_AW                  (1 << 5)
45 
46 // MIDR - Main ID Register definitions
47 #define ARM_CPU_TYPE_SHIFT      4
48 #define ARM_CPU_TYPE_MASK       0xFFF
49 #define ARM_CPU_TYPE_AEMv8      0xD0F
50 #define ARM_CPU_TYPE_A53        0xD03
51 #define ARM_CPU_TYPE_A57        0xD07
52 #define ARM_CPU_TYPE_A15        0xC0F
53 #define ARM_CPU_TYPE_A9         0xC09
54 #define ARM_CPU_TYPE_A7         0xC07
55 #define ARM_CPU_TYPE_A5         0xC05
56 
57 #define ARM_CPU_REV_MASK        ((0xF << 20) | (0xF) )
58 #define ARM_CPU_REV(rn, pn)     ((((rn) & 0xF) << 20) | ((pn) & 0xF))
59 
60 // Hypervisor Configuration Register
61 #define ARM_HCR_FMO       BIT3
62 #define ARM_HCR_IMO       BIT4
63 #define ARM_HCR_AMO       BIT5
64 #define ARM_HCR_TSC       BIT19
65 #define ARM_HCR_TGE       BIT27
66 
67 // Exception Syndrome Register
68 #define AARCH64_ESR_EC(Ecr)    ((0x3F << 26) & (Ecr))
69 #define AARCH64_ESR_ISS(Ecr)   ((0x1FFFFFF) & (Ecr))
70 
71 #define AARCH64_ESR_EC_SMC32   (0x13 << 26)
72 #define AARCH64_ESR_EC_SMC64   (0x17 << 26)
73 
74 // AArch64 Exception Level
75 #define AARCH64_EL3       0xC
76 #define AARCH64_EL2       0x8
77 #define AARCH64_EL1       0x4
78 
79 // Saved Program Status Register definitions
80 #define SPSR_A                  BIT8
81 #define SPSR_I                  BIT7
82 #define SPSR_F                  BIT6
83 
84 #define SPSR_AARCH32            BIT4
85 
86 #define SPSR_AARCH32_MODE_USER  0x0
87 #define SPSR_AARCH32_MODE_FIQ   0x1
88 #define SPSR_AARCH32_MODE_IRQ   0x2
89 #define SPSR_AARCH32_MODE_SVC   0x3
90 #define SPSR_AARCH32_MODE_ABORT 0x7
91 #define SPSR_AARCH32_MODE_UNDEF 0xB
92 #define SPSR_AARCH32_MODE_SYS   0xF
93 
94 // Counter-timer Hypervisor Control register definitions
95 #define CNTHCTL_EL2_EL1PCTEN    BIT0
96 #define CNTHCTL_EL2_EL1PCEN     BIT1
97 
98 #define ARM_VECTOR_TABLE_ALIGNMENT ((1 << 11)-1)
99 
100 // Vector table offset definitions
101 #define ARM_VECTOR_CUR_SP0_SYNC 0x000
102 #define ARM_VECTOR_CUR_SP0_IRQ  0x080
103 #define ARM_VECTOR_CUR_SP0_FIQ  0x100
104 #define ARM_VECTOR_CUR_SP0_SERR 0x180
105 
106 #define ARM_VECTOR_CUR_SPx_SYNC 0x200
107 #define ARM_VECTOR_CUR_SPx_IRQ  0x280
108 #define ARM_VECTOR_CUR_SPx_FIQ  0x300
109 #define ARM_VECTOR_CUR_SPx_SERR 0x380
110 
111 #define ARM_VECTOR_LOW_A64_SYNC 0x400
112 #define ARM_VECTOR_LOW_A64_IRQ  0x480
113 #define ARM_VECTOR_LOW_A64_FIQ  0x500
114 #define ARM_VECTOR_LOW_A64_SERR 0x580
115 
116 #define ARM_VECTOR_LOW_A32_SYNC 0x600
117 #define ARM_VECTOR_LOW_A32_IRQ  0x680
118 #define ARM_VECTOR_LOW_A32_FIQ  0x700
119 #define ARM_VECTOR_LOW_A32_SERR 0x780
120 
121 #define VECTOR_BASE(tbl)          \
122   .section .text.##tbl##,"ax";    \
123   .align 11;                      \
124   .org 0x0;                       \
125   GCC_ASM_EXPORT(tbl);            \
126   ASM_PFX(tbl):                   \
127 
128 #define VECTOR_ENTRY(tbl, off)    \
129   .org off
130 
131 #define VECTOR_END(tbl)           \
132   .org 0x800;                     \
133   .previous
134 
135 VOID
136 EFIAPI
137 ArmEnableSWPInstruction (
138   VOID
139   );
140 
141 UINTN
142 EFIAPI
143 ArmReadCbar (
144   VOID
145   );
146 
147 UINTN
148 EFIAPI
149 ArmReadTpidrurw (
150   VOID
151   );
152 
153 VOID
154 EFIAPI
155 ArmWriteTpidrurw (
156   UINTN Value
157   );
158 
159 UINTN
160 EFIAPI
161 ArmGetTCR (
162   VOID
163   );
164 
165 VOID
166 EFIAPI
167 ArmSetTCR (
168   UINTN Value
169   );
170 
171 UINTN
172 EFIAPI
173 ArmGetMAIR (
174   VOID
175   );
176 
177 VOID
178 EFIAPI
179 ArmSetMAIR (
180   UINTN Value
181   );
182 
183 VOID
184 EFIAPI
185 ArmDisableAlignmentCheck (
186   VOID
187   );
188 
189 VOID
190 EFIAPI
191 ArmEnableAlignmentCheck (
192   VOID
193   );
194 
195 VOID
196 EFIAPI
197 ArmDisableAllExceptions (
198   VOID
199   );
200 
201 VOID
202 ArmWriteHcr (
203   IN UINTN Hcr
204   );
205 
206 UINTN
207 ArmReadCurrentEL (
208   VOID
209   );
210 
211 UINT64
212 PageAttributeToGcdAttribute (
213   IN UINT64 PageAttributes
214   );
215 
216 UINTN
217 ArmWriteCptr (
218   IN  UINT64 Cptr
219   );
220 
221 #endif // __AARCH64_H__
222