]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Drivers/ArmGic/ArmGicLib.c
ArmPkg/ArmGic: Introduced support for GicV2 to ArmGicDxe
[mirror_edk2.git] / ArmPkg / Drivers / ArmGic / ArmGicLib.c
CommitLineData
397bdc99
OM
1/** @file\r
2*\r
3* Copyright (c) 2011-2014, ARM Limited. All rights reserved.\r
4*\r
5* This program and the accompanying materials\r
6* are licensed and made available under the terms and conditions of the BSD License\r
7* which accompanies this distribution. The full text of the license may be found at\r
8* http://opensource.org/licenses/bsd-license.php\r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12*\r
13**/\r
14\r
60775c51 15#include <Base.h>\r
397bdc99 16#include <Library/ArmGicLib.h>\r
60775c51 17#include <Library/IoLib.h>\r
397bdc99 18\r
793ca69f
OM
19#include "GicV2/ArmGicV2Lib.h"\r
20\r
397bdc99
OM
21UINTN\r
22EFIAPI\r
23ArmGicGetInterfaceIdentification (\r
24 IN INTN GicInterruptInterfaceBase\r
25 )\r
26{\r
27 // Read the GIC Identification Register\r
28 return MmioRead32 (GicInterruptInterfaceBase + ARM_GIC_ICCIIDR);\r
29}\r
30\r
31UINTN\r
32EFIAPI\r
33ArmGicGetMaxNumInterrupts (\r
34 IN INTN GicDistributorBase\r
35 )\r
36{\r
37 return 32 * ((MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & 0x1F) + 1);\r
38}\r
39\r
40VOID\r
41EFIAPI\r
42ArmGicSendSgiTo (\r
43 IN INTN GicDistributorBase,\r
44 IN INTN TargetListFilter,\r
45 IN INTN CPUTargetList,\r
46 IN INTN SgiId\r
47 )\r
48{\r
49 MmioWrite32 (GicDistributorBase + ARM_GIC_ICDSGIR, ((TargetListFilter & 0x3) << 24) | ((CPUTargetList & 0xFF) << 16) | SgiId);\r
50}\r
51\r
52UINTN\r
53EFIAPI\r
54ArmGicAcknowledgeInterrupt (\r
55 IN UINTN GicInterruptInterfaceBase\r
56 )\r
57{\r
793ca69f 58 return ArmGicV2AcknowledgeInterrupt (GicInterruptInterfaceBase);\r
397bdc99
OM
59}\r
60\r
61VOID\r
62EFIAPI\r
63ArmGicEndOfInterrupt (\r
64 IN UINTN GicInterruptInterfaceBase,\r
65 IN UINTN Source\r
66 )\r
67{\r
793ca69f 68 ArmGicV2EndOfInterrupt (GicInterruptInterfaceBase, Source);\r
397bdc99
OM
69}\r
70\r
71VOID\r
72EFIAPI\r
73ArmGicEnableInterrupt (\r
74 IN UINTN GicDistributorBase,\r
75 IN UINTN Source\r
76 )\r
77{\r
78 UINT32 RegOffset;\r
79 UINTN RegShift;\r
80\r
81 // Calculate enable register offset and bit position\r
82 RegOffset = Source / 32;\r
83 RegShift = Source % 32;\r
84\r
85 // Write set-enable register\r
86 MmioWrite32 (GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset), 1 << RegShift);\r
87}\r
88\r
89VOID\r
90EFIAPI\r
91ArmGicDisableInterrupt (\r
92 IN UINTN GicDistributorBase,\r
93 IN UINTN Source\r
94 )\r
95{\r
96 UINT32 RegOffset;\r
97 UINTN RegShift;\r
98\r
99 // Calculate enable register offset and bit position\r
100 RegOffset = Source / 32;\r
101 RegShift = Source % 32;\r
102\r
103 // Write clear-enable register\r
104 MmioWrite32 (GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset), 1 << RegShift);\r
105}\r
106\r
107BOOLEAN\r
108EFIAPI\r
109ArmGicIsInterruptEnabled (\r
110 IN UINTN GicDistributorBase,\r
111 IN UINTN Source\r
112 )\r
113{\r
114 UINT32 RegOffset;\r
115 UINTN RegShift;\r
116\r
117 // Calculate enable register offset and bit position\r
118 RegOffset = Source / 32;\r
119 RegShift = Source % 32;\r
120\r
121 return ((MmioRead32 (GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)) & (1 << RegShift)) != 0);\r
122}\r
60775c51
OM
123\r
124VOID\r
125EFIAPI\r
126ArmGicDisableDistributor (\r
127 IN INTN GicDistributorBase\r
128 )\r
129{\r
130 // Disable Gic Distributor\r
131 MmioWrite32 (GicDistributorBase + ARM_GIC_ICDDCR, 0x0);\r
132}\r
793ca69f
OM
133
134VOID\r
135EFIAPI\r
136ArmGicEnableInterruptInterface (\r
137 IN INTN GicInterruptInterfaceBase\r
138 )\r
139{\r
140 return ArmGicV2EnableInterruptInterface (GicInterruptInterfaceBase);\r
141}\r
142\r
143VOID\r
144EFIAPI\r
145ArmGicDisableInterruptInterface (\r
146 IN INTN GicInterruptInterfaceBase\r
147 )\r
148{\r
149 return ArmGicV2DisableInterruptInterface (GicInterruptInterfaceBase);\r
150}\r