]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c
OvmfPkg: Apply uncrustify changes
[mirror_edk2.git] / OvmfPkg / Csm / CsmSupportLib / LegacyInterrupt.c
CommitLineData
8016da21 1/** @file\r
2 Legacy Interrupt Support\r
3\r
4 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
5\r
b26f0cf9 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8016da21 7\r
8**/\r
9\r
10#include "LegacyInterrupt.h"\r
11\r
12//\r
13// Handle for the Legacy Interrupt Protocol instance produced by this driver\r
14//\r
ac0a286f 15STATIC EFI_HANDLE mLegacyInterruptHandle = NULL;\r
8016da21 16\r
72a11001
GS
17//\r
18// Legacy Interrupt Device number (0x01 on piix4, 0x1f on q35/mch)\r
19//\r
ac0a286f 20STATIC UINT8 mLegacyInterruptDevice;\r
72a11001 21\r
8016da21 22//\r
23// The Legacy Interrupt Protocol instance produced by this driver\r
24//\r
ac0a286f 25STATIC EFI_LEGACY_INTERRUPT_PROTOCOL mLegacyInterrupt = {\r
8016da21 26 GetNumberPirqs,\r
27 GetLocation,\r
28 ReadPirq,\r
29 WritePirq\r
30};\r
31\r
ac0a286f 32STATIC UINT8 PirqReg[MAX_PIRQ_NUMBER] = { PIRQA, PIRQB, PIRQC, PIRQD, PIRQE, PIRQF, PIRQG, PIRQH };\r
8016da21 33\r
34/**\r
35 Return the number of PIRQs supported by this chipset.\r
36\r
37 @param[in] This Pointer to LegacyInterrupt Protocol\r
38 @param[out] NumberPirqs The pointer to return the max IRQ number supported\r
39\r
40 @retval EFI_SUCCESS Max PIRQs successfully returned\r
41\r
42**/\r
43EFI_STATUS\r
44EFIAPI\r
45GetNumberPirqs (\r
46 IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,\r
47 OUT UINT8 *NumberPirqs\r
48 )\r
49{\r
50 *NumberPirqs = MAX_PIRQ_NUMBER;\r
51\r
52 return EFI_SUCCESS;\r
53}\r
54\r
8016da21 55/**\r
56 Return PCI location of this device.\r
57 $PIR table requires this info.\r
58\r
59 @param[in] This - Protocol instance pointer.\r
60 @param[out] Bus - PCI Bus\r
61 @param[out] Device - PCI Device\r
62 @param[out] Function - PCI Function\r
63\r
64 @retval EFI_SUCCESS Bus/Device/Function returned\r
65\r
66**/\r
67EFI_STATUS\r
68EFIAPI\r
69GetLocation (\r
70 IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,\r
71 OUT UINT8 *Bus,\r
72 OUT UINT8 *Device,\r
73 OUT UINT8 *Function\r
74 )\r
75{\r
76 *Bus = LEGACY_INT_BUS;\r
72a11001 77 *Device = mLegacyInterruptDevice;\r
8016da21 78 *Function = LEGACY_INT_FUNC;\r
79\r
80 return EFI_SUCCESS;\r
81}\r
82\r
8016da21 83/**\r
84 Builds the PCI configuration address for the register specified by PirqNumber\r
85\r
86 @param[in] PirqNumber - The PIRQ number to build the PCI configuration address for\r
87\r
88 @return The PCI Configuration address for the PIRQ\r
89**/\r
90UINTN\r
91GetAddress (\r
92 UINT8 PirqNumber\r
93 )\r
94{\r
ac0a286f
MK
95 return PCI_LIB_ADDRESS (\r
96 LEGACY_INT_BUS,\r
97 mLegacyInterruptDevice,\r
98 LEGACY_INT_FUNC,\r
99 PirqReg[PirqNumber]\r
100 );\r
8016da21 101}\r
102\r
103/**\r
104 Read the given PIRQ register\r
105\r
106 @param[in] This Protocol instance pointer\r
107 @param[in] PirqNumber The Pirq register 0 = A, 1 = B etc\r
108 @param[out] PirqData Value read\r
109\r
110 @retval EFI_SUCCESS Decoding change affected.\r
111 @retval EFI_INVALID_PARAMETER Invalid PIRQ number\r
112\r
113**/\r
114EFI_STATUS\r
115EFIAPI\r
116ReadPirq (\r
117 IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,\r
118 IN UINT8 PirqNumber,\r
119 OUT UINT8 *PirqData\r
120 )\r
121{\r
122 if (PirqNumber >= MAX_PIRQ_NUMBER) {\r
123 return EFI_INVALID_PARAMETER;\r
124 }\r
125\r
126 *PirqData = PciRead8 (GetAddress (PirqNumber));\r
ac0a286f 127 *PirqData = (UINT8)(*PirqData & 0x7f);\r
8016da21 128\r
129 return EFI_SUCCESS;\r
130}\r
131\r
8016da21 132/**\r
133 Write the given PIRQ register\r
134\r
135 @param[in] This Protocol instance pointer\r
136 @param[in] PirqNumber The Pirq register 0 = A, 1 = B etc\r
137 @param[out] PirqData Value to write\r
138\r
139 @retval EFI_SUCCESS Decoding change affected.\r
140 @retval EFI_INVALID_PARAMETER Invalid PIRQ number\r
141\r
142**/\r
143EFI_STATUS\r
144EFIAPI\r
145WritePirq (\r
146 IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,\r
147 IN UINT8 PirqNumber,\r
148 IN UINT8 PirqData\r
149 )\r
150{\r
151 if (PirqNumber >= MAX_PIRQ_NUMBER) {\r
152 return EFI_INVALID_PARAMETER;\r
153 }\r
154\r
155 PciWrite8 (GetAddress (PirqNumber), PirqData);\r
156 return EFI_SUCCESS;\r
157}\r
158\r
8016da21 159/**\r
160 Initialize Legacy Interrupt support\r
161\r
162 @retval EFI_SUCCESS Successfully initialized\r
163\r
164**/\r
165EFI_STATUS\r
166LegacyInterruptInstall (\r
167 VOID\r
168 )\r
169{\r
72a11001 170 UINT16 HostBridgeDevId;\r
8016da21 171 EFI_STATUS Status;\r
172\r
173 //\r
174 // Make sure the Legacy Interrupt Protocol is not already installed in the system\r
175 //\r
ac0a286f 176 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiLegacyInterruptProtocolGuid);\r
8016da21 177\r
72a11001
GS
178 //\r
179 // Query Host Bridge DID to determine platform type, then set device number\r
180 //\r
181 HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);\r
182 switch (HostBridgeDevId) {\r
183 case INTEL_82441_DEVICE_ID:\r
184 mLegacyInterruptDevice = LEGACY_INT_DEV_PIIX4;\r
185 break;\r
186 case INTEL_Q35_MCH_DEVICE_ID:\r
187 mLegacyInterruptDevice = LEGACY_INT_DEV_Q35;\r
188 break;\r
189 default:\r
ac0a286f
MK
190 DEBUG ((\r
191 DEBUG_ERROR,\r
192 "%a: Unknown Host Bridge Device ID: 0x%04x\n",\r
193 __FUNCTION__,\r
194 HostBridgeDevId\r
195 ));\r
72a11001
GS
196 ASSERT (FALSE);\r
197 return EFI_UNSUPPORTED;\r
198 }\r
199\r
8016da21 200 //\r
201 // Make a new handle and install the protocol\r
202 //\r
203 Status = gBS->InstallMultipleProtocolInterfaces (\r
204 &mLegacyInterruptHandle,\r
205 &gEfiLegacyInterruptProtocolGuid,\r
206 &mLegacyInterrupt,\r
207 NULL\r
208 );\r
ac0a286f 209 ASSERT_EFI_ERROR (Status);\r
8016da21 210\r
211 return Status;\r
212}\r