1 /** @file
2 *
3 *  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
4 *
5 *  This program and the accompanying materials
6 *  are licensed and made available under the terms and conditions of the BSD License
7 *  which accompanies this distribution.  The full text of the license may be found at
8 *  http://opensource.org/licenses/bsd-license.php
9 *
10 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 *
13 **/
14 
15 #ifndef __ARMGIC_H
16 #define __ARMGIC_H
17 
18 #include <Library/ArmGicArchLib.h>
19 
20 //
21 // GIC Distributor
22 //
23 #define ARM_GIC_ICDDCR          0x000 // Distributor Control Register
24 #define ARM_GIC_ICDICTR         0x004 // Interrupt Controller Type Register
25 #define ARM_GIC_ICDIIDR         0x008 // Implementer Identification Register
26 
27 // Each reg base below repeats for Number of interrupts / 4 (see GIC spec)
28 #define ARM_GIC_ICDISR          0x080 // Interrupt Security Registers
29 #define ARM_GIC_ICDISER         0x100 // Interrupt Set-Enable Registers
30 #define ARM_GIC_ICDICER         0x180 // Interrupt Clear-Enable Registers
31 #define ARM_GIC_ICDSPR          0x200 // Interrupt Set-Pending Registers
32 #define ARM_GIC_ICDICPR         0x280 // Interrupt Clear-Pending Registers
33 #define ARM_GIC_ICDABR          0x300 // Active Bit Registers
34 
35 // Each reg base below repeats for Number of interrupts / 4
36 #define ARM_GIC_ICDIPR          0x400 // Interrupt Priority Registers
37 
38 // Each reg base below repeats for Number of interrupts
39 #define ARM_GIC_ICDIPTR         0x800 // Interrupt Processor Target Registers
40 #define ARM_GIC_ICDICFR         0xC00 // Interrupt Configuration Registers
41 
42 #define ARM_GIC_ICDPPISR        0xD00 // PPI Status register
43 
44 // just one of these
45 #define ARM_GIC_ICDSGIR         0xF00 // Software Generated Interrupt Register
46 
47 // GICv3 specific registers
48 #define ARM_GICD_IROUTER        0x6100 // Interrupt Routing Registers
49 
50 // the Affinity Routing Enable (ARE) bit in GICD_CTLR
51 #define ARM_GIC_ICDDCR_ARE      (1 << 4)
52 
53 //
54 // GIC Redistributor
55 //
56 
57 #define ARM_GICR_CTLR_FRAME_SIZE    SIZE_64KB
58 #define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB
59 
60 // GIC Redistributor Control frame
61 #define ARM_GICR_TYPER          0x0008  // Redistributor Type Register
62 
63 // GIC SGI & PPI Redistributor frame
64 #define ARM_GICR_ISENABLER      0x0100  // Interrupt Set-Enable Registers
65 #define ARM_GICR_ICENABLER      0x0180  // Interrupt Clear-Enable Registers
66 
67 //
68 // GIC Cpu interface
69 //
70 #define ARM_GIC_ICCICR          0x00  // CPU Interface Control Register
71 #define ARM_GIC_ICCPMR          0x04  // Interrupt Priority Mask Register
72 #define ARM_GIC_ICCBPR          0x08  // Binary Point Register
73 #define ARM_GIC_ICCIAR          0x0C  // Interrupt Acknowledge Register
74 #define ARM_GIC_ICCEIOR         0x10  // End Of Interrupt Register
75 #define ARM_GIC_ICCRPR          0x14  // Running Priority Register
76 #define ARM_GIC_ICCPIR          0x18  // Highest Pending Interrupt Register
77 #define ARM_GIC_ICCABPR         0x1C  // Aliased Binary Point Register
78 #define ARM_GIC_ICCIIDR         0xFC  // Identification Register
79 
80 #define ARM_GIC_ICDSGIR_FILTER_TARGETLIST       0x0
81 #define ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE     0x1
82 #define ARM_GIC_ICDSGIR_FILTER_ITSELF           0x2
83 
84 // Bit-masks to configure the CPU Interface Control register
85 #define ARM_GIC_ICCICR_ENABLE_SECURE            0x01
86 #define ARM_GIC_ICCICR_ENABLE_NS                0x02
87 #define ARM_GIC_ICCICR_ACK_CTL                  0x04
88 #define ARM_GIC_ICCICR_SIGNAL_SECURE_TO_FIQ     0x08
89 #define ARM_GIC_ICCICR_USE_SBPR                 0x10
90 
91 // Bit Mask for GICC_IIDR
92 #define ARM_GIC_ICCIIDR_GET_PRODUCT_ID(IccIidr)   (((IccIidr) >> 20) & 0xFFF)
93 #define ARM_GIC_ICCIIDR_GET_ARCH_VERSION(IccIidr) (((IccIidr) >> 16) & 0xF)
94 #define ARM_GIC_ICCIIDR_GET_REVISION(IccIidr)     (((IccIidr) >> 12) & 0xF)
95 #define ARM_GIC_ICCIIDR_GET_IMPLEMENTER(IccIidr)  ((IccIidr) & 0xFFF)
96 
97 // Bit Mask for
98 #define ARM_GIC_ICCIAR_ACKINTID                 0x3FF
99 
100 UINTN
101 EFIAPI
102 ArmGicGetInterfaceIdentification (
103   IN  INTN          GicInterruptInterfaceBase
104   );
105 
106 //
107 // GIC Secure interfaces
108 //
109 VOID
110 EFIAPI
111 ArmGicSetupNonSecure (
112   IN  UINTN         MpId,
113   IN  INTN          GicDistributorBase,
114   IN  INTN          GicInterruptInterfaceBase
115   );
116 
117 VOID
118 EFIAPI
119 ArmGicSetSecureInterrupts (
120   IN  UINTN         GicDistributorBase,
121   IN  UINTN*        GicSecureInterruptMask,
122   IN  UINTN         GicSecureInterruptMaskSize
123   );
124 
125 VOID
126 EFIAPI
127 ArmGicEnableInterruptInterface (
128   IN  INTN          GicInterruptInterfaceBase
129   );
130 
131 VOID
132 EFIAPI
133 ArmGicDisableInterruptInterface (
134   IN  INTN          GicInterruptInterfaceBase
135   );
136 
137 VOID
138 EFIAPI
139 ArmGicEnableDistributor (
140   IN  INTN          GicDistributorBase
141   );
142 
143 VOID
144 EFIAPI
145 ArmGicDisableDistributor (
146   IN  INTN          GicDistributorBase
147   );
148 
149 UINTN
150 EFIAPI
151 ArmGicGetMaxNumInterrupts (
152   IN  INTN          GicDistributorBase
153   );
154 
155 VOID
156 EFIAPI
157 ArmGicSendSgiTo (
158   IN  INTN          GicDistributorBase,
159   IN  INTN          TargetListFilter,
160   IN  INTN          CPUTargetList,
161   IN  INTN          SgiId
162   );
163 
164 /*
165  * Acknowledge and return the value of the Interrupt Acknowledge Register
166  *
167  * InterruptId is returned separately from the register value because in
168  * the GICv2 the register value contains the CpuId and InterruptId while
169  * in the GICv3 the register value is only the InterruptId.
170  *
171  * @param GicInterruptInterfaceBase   Base Address of the GIC CPU Interface
172  * @param InterruptId                 InterruptId read from the Interrupt Acknowledge Register
173  *
174  * @retval value returned by the Interrupt Acknowledge Register
175  *
176  */
177 UINTN
178 EFIAPI
179 ArmGicAcknowledgeInterrupt (
180   IN  UINTN          GicInterruptInterfaceBase,
181   OUT UINTN          *InterruptId
182   );
183 
184 VOID
185 EFIAPI
186 ArmGicEndOfInterrupt (
187   IN  UINTN                 GicInterruptInterfaceBase,
188   IN UINTN                  Source
189   );
190 
191 UINTN
192 EFIAPI
193 ArmGicSetPriorityMask (
194   IN  INTN          GicInterruptInterfaceBase,
195   IN  INTN          PriorityMask
196   );
197 
198 VOID
199 EFIAPI
200 ArmGicEnableInterrupt (
201   IN UINTN                  GicDistributorBase,
202   IN UINTN                  GicRedistributorBase,
203   IN UINTN                  Source
204   );
205 
206 VOID
207 EFIAPI
208 ArmGicDisableInterrupt (
209   IN UINTN                  GicDistributorBase,
210   IN UINTN                  GicRedistributorBase,
211   IN UINTN                  Source
212   );
213 
214 BOOLEAN
215 EFIAPI
216 ArmGicIsInterruptEnabled (
217   IN UINTN                  GicDistributorBase,
218   IN UINTN                  GicRedistributorBase,
219   IN UINTN                  Source
220   );
221 
222 //
223 // GIC revision 2 specific declarations
224 //
225 
226 // Interrupts from 1020 to 1023 are considered as special interrupts (eg: spurious interrupts)
227 #define ARM_GIC_IS_SPECIAL_INTERRUPTS(Interrupt) (((Interrupt) >= 1020) && ((Interrupt) <= 1023))
228 
229 VOID
230 EFIAPI
231 ArmGicV2SetupNonSecure (
232   IN  UINTN         MpId,
233   IN  INTN          GicDistributorBase,
234   IN  INTN          GicInterruptInterfaceBase
235   );
236 
237 VOID
238 EFIAPI
239 ArmGicV2EnableInterruptInterface (
240   IN  INTN          GicInterruptInterfaceBase
241   );
242 
243 VOID
244 EFIAPI
245 ArmGicV2DisableInterruptInterface (
246   IN  INTN          GicInterruptInterfaceBase
247   );
248 
249 UINTN
250 EFIAPI
251 ArmGicV2AcknowledgeInterrupt (
252   IN  UINTN          GicInterruptInterfaceBase
253   );
254 
255 VOID
256 EFIAPI
257 ArmGicV2EndOfInterrupt (
258   IN UINTN                  GicInterruptInterfaceBase,
259   IN UINTN                  Source
260   );
261 
262 //
263 // GIC revision 3 specific declarations
264 //
265 
266 #define ICC_SRE_EL2_SRE         (1 << 0)
267 
268 #define ARM_GICD_IROUTER_IRM BIT31
269 
270 UINT32
271 EFIAPI
272 ArmGicV3GetControlSystemRegisterEnable (
273   VOID
274   );
275 
276 VOID
277 EFIAPI
278 ArmGicV3SetControlSystemRegisterEnable (
279   IN UINT32         ControlSystemRegisterEnable
280   );
281 
282 VOID
283 EFIAPI
284 ArmGicV3EnableInterruptInterface (
285   VOID
286   );
287 
288 VOID
289 EFIAPI
290 ArmGicV3DisableInterruptInterface (
291   VOID
292   );
293 
294 UINTN
295 EFIAPI
296 ArmGicV3AcknowledgeInterrupt (
297   VOID
298   );
299 
300 VOID
301 EFIAPI
302 ArmGicV3EndOfInterrupt (
303   IN UINTN                  Source
304   );
305 
306 VOID
307 ArmGicV3SetBinaryPointer (
308   IN UINTN                  BinaryPoint
309   );
310 
311 VOID
312 ArmGicV3SetPriorityMask (
313   IN UINTN                  Priority
314   );
315 
316 #endif
317