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 // GICD_CTLR bits 51 #define ARM_GIC_ICDDCR_ARE (1 << 4) // Affinity Routing Enable (ARE) 52 #define ARM_GIC_ICDDCR_DS (1 << 6) // Disable Security (DS) 53 54 // 55 // GIC Redistributor 56 // 57 58 #define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB 59 #define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB 60 61 // GIC Redistributor Control frame 62 #define ARM_GICR_TYPER 0x0008 // Redistributor Type Register 63 64 // GIC SGI & PPI Redistributor frame 65 #define ARM_GICR_ISENABLER 0x0100 // Interrupt Set-Enable Registers 66 #define ARM_GICR_ICENABLER 0x0180 // Interrupt Clear-Enable Registers 67 68 // 69 // GIC Cpu interface 70 // 71 #define ARM_GIC_ICCICR 0x00 // CPU Interface Control Register 72 #define ARM_GIC_ICCPMR 0x04 // Interrupt Priority Mask Register 73 #define ARM_GIC_ICCBPR 0x08 // Binary Point Register 74 #define ARM_GIC_ICCIAR 0x0C // Interrupt Acknowledge Register 75 #define ARM_GIC_ICCEIOR 0x10 // End Of Interrupt Register 76 #define ARM_GIC_ICCRPR 0x14 // Running Priority Register 77 #define ARM_GIC_ICCPIR 0x18 // Highest Pending Interrupt Register 78 #define ARM_GIC_ICCABPR 0x1C // Aliased Binary Point Register 79 #define ARM_GIC_ICCIIDR 0xFC // Identification Register 80 81 #define ARM_GIC_ICDSGIR_FILTER_TARGETLIST 0x0 82 #define ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE 0x1 83 #define ARM_GIC_ICDSGIR_FILTER_ITSELF 0x2 84 85 // Bit-masks to configure the CPU Interface Control register 86 #define ARM_GIC_ICCICR_ENABLE_SECURE 0x01 87 #define ARM_GIC_ICCICR_ENABLE_NS 0x02 88 #define ARM_GIC_ICCICR_ACK_CTL 0x04 89 #define ARM_GIC_ICCICR_SIGNAL_SECURE_TO_FIQ 0x08 90 #define ARM_GIC_ICCICR_USE_SBPR 0x10 91 92 // Bit Mask for GICC_IIDR 93 #define ARM_GIC_ICCIIDR_GET_PRODUCT_ID(IccIidr) (((IccIidr) >> 20) & 0xFFF) 94 #define ARM_GIC_ICCIIDR_GET_ARCH_VERSION(IccIidr) (((IccIidr) >> 16) & 0xF) 95 #define ARM_GIC_ICCIIDR_GET_REVISION(IccIidr) (((IccIidr) >> 12) & 0xF) 96 #define ARM_GIC_ICCIIDR_GET_IMPLEMENTER(IccIidr) ((IccIidr) & 0xFFF) 97 98 // Bit Mask for 99 #define ARM_GIC_ICCIAR_ACKINTID 0x3FF 100 101 UINTN 102 EFIAPI 103 ArmGicGetInterfaceIdentification ( 104 IN INTN GicInterruptInterfaceBase 105 ); 106 107 // 108 // GIC Secure interfaces 109 // 110 VOID 111 EFIAPI 112 ArmGicSetupNonSecure ( 113 IN UINTN MpId, 114 IN INTN GicDistributorBase, 115 IN INTN GicInterruptInterfaceBase 116 ); 117 118 VOID 119 EFIAPI 120 ArmGicSetSecureInterrupts ( 121 IN UINTN GicDistributorBase, 122 IN UINTN* GicSecureInterruptMask, 123 IN UINTN GicSecureInterruptMaskSize 124 ); 125 126 VOID 127 EFIAPI 128 ArmGicEnableInterruptInterface ( 129 IN INTN GicInterruptInterfaceBase 130 ); 131 132 VOID 133 EFIAPI 134 ArmGicDisableInterruptInterface ( 135 IN INTN GicInterruptInterfaceBase 136 ); 137 138 VOID 139 EFIAPI 140 ArmGicEnableDistributor ( 141 IN INTN GicDistributorBase 142 ); 143 144 VOID 145 EFIAPI 146 ArmGicDisableDistributor ( 147 IN INTN GicDistributorBase 148 ); 149 150 UINTN 151 EFIAPI 152 ArmGicGetMaxNumInterrupts ( 153 IN INTN GicDistributorBase 154 ); 155 156 VOID 157 EFIAPI 158 ArmGicSendSgiTo ( 159 IN INTN GicDistributorBase, 160 IN INTN TargetListFilter, 161 IN INTN CPUTargetList, 162 IN INTN SgiId 163 ); 164 165 /* 166 * Acknowledge and return the value of the Interrupt Acknowledge Register 167 * 168 * InterruptId is returned separately from the register value because in 169 * the GICv2 the register value contains the CpuId and InterruptId while 170 * in the GICv3 the register value is only the InterruptId. 171 * 172 * @param GicInterruptInterfaceBase Base Address of the GIC CPU Interface 173 * @param InterruptId InterruptId read from the Interrupt Acknowledge Register 174 * 175 * @retval value returned by the Interrupt Acknowledge Register 176 * 177 */ 178 UINTN 179 EFIAPI 180 ArmGicAcknowledgeInterrupt ( 181 IN UINTN GicInterruptInterfaceBase, 182 OUT UINTN *InterruptId 183 ); 184 185 VOID 186 EFIAPI 187 ArmGicEndOfInterrupt ( 188 IN UINTN GicInterruptInterfaceBase, 189 IN UINTN Source 190 ); 191 192 UINTN 193 EFIAPI 194 ArmGicSetPriorityMask ( 195 IN INTN GicInterruptInterfaceBase, 196 IN INTN PriorityMask 197 ); 198 199 VOID 200 EFIAPI 201 ArmGicEnableInterrupt ( 202 IN UINTN GicDistributorBase, 203 IN UINTN GicRedistributorBase, 204 IN UINTN Source 205 ); 206 207 VOID 208 EFIAPI 209 ArmGicDisableInterrupt ( 210 IN UINTN GicDistributorBase, 211 IN UINTN GicRedistributorBase, 212 IN UINTN Source 213 ); 214 215 BOOLEAN 216 EFIAPI 217 ArmGicIsInterruptEnabled ( 218 IN UINTN GicDistributorBase, 219 IN UINTN GicRedistributorBase, 220 IN UINTN Source 221 ); 222 223 // 224 // GIC revision 2 specific declarations 225 // 226 227 // Interrupts from 1020 to 1023 are considered as special interrupts (eg: spurious interrupts) 228 #define ARM_GIC_IS_SPECIAL_INTERRUPTS(Interrupt) (((Interrupt) >= 1020) && ((Interrupt) <= 1023)) 229 230 VOID 231 EFIAPI 232 ArmGicV2SetupNonSecure ( 233 IN UINTN MpId, 234 IN INTN GicDistributorBase, 235 IN INTN GicInterruptInterfaceBase 236 ); 237 238 VOID 239 EFIAPI 240 ArmGicV2EnableInterruptInterface ( 241 IN INTN GicInterruptInterfaceBase 242 ); 243 244 VOID 245 EFIAPI 246 ArmGicV2DisableInterruptInterface ( 247 IN INTN GicInterruptInterfaceBase 248 ); 249 250 UINTN 251 EFIAPI 252 ArmGicV2AcknowledgeInterrupt ( 253 IN UINTN GicInterruptInterfaceBase 254 ); 255 256 VOID 257 EFIAPI 258 ArmGicV2EndOfInterrupt ( 259 IN UINTN GicInterruptInterfaceBase, 260 IN UINTN Source 261 ); 262 263 // 264 // GIC revision 3 specific declarations 265 // 266 267 #define ICC_SRE_EL2_SRE (1 << 0) 268 269 #define ARM_GICD_IROUTER_IRM BIT31 270 271 UINT32 272 EFIAPI 273 ArmGicV3GetControlSystemRegisterEnable ( 274 VOID 275 ); 276 277 VOID 278 EFIAPI 279 ArmGicV3SetControlSystemRegisterEnable ( 280 IN UINT32 ControlSystemRegisterEnable 281 ); 282 283 VOID 284 EFIAPI 285 ArmGicV3EnableInterruptInterface ( 286 VOID 287 ); 288 289 VOID 290 EFIAPI 291 ArmGicV3DisableInterruptInterface ( 292 VOID 293 ); 294 295 UINTN 296 EFIAPI 297 ArmGicV3AcknowledgeInterrupt ( 298 VOID 299 ); 300 301 VOID 302 EFIAPI 303 ArmGicV3EndOfInterrupt ( 304 IN UINTN Source 305 ); 306 307 VOID 308 ArmGicV3SetBinaryPointer ( 309 IN UINTN BinaryPoint 310 ); 311 312 VOID 313 ArmGicV3SetPriorityMask ( 314 IN UINTN Priority 315 ); 316 317 #endif 318