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