]> git.proxmox.com Git - mirror_edk2.git/blob - PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c
Fixes to get CodeSourcery GCC and RVCT 3.1 compiling.
[mirror_edk2.git] / PcAtChipsetPkg / IsaAcpiDxe / PcatIsaAcpi.c
1 /** @file
2 EFI PCAT ISA ACPI Driver for a Generic PC Platform
3
4 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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 #include "PcatIsaAcpi.h"
16
17 //
18 // PcatIsaAcpi Driver Binding Protocol
19 //
20 EFI_DRIVER_BINDING_PROTOCOL gPcatIsaAcpiDriverBinding = {
21 PcatIsaAcpiDriverBindingSupported,
22 PcatIsaAcpiDriverBindingStart,
23 PcatIsaAcpiDriverBindingStop,
24 0xa,
25 NULL,
26 NULL
27 };
28
29 /**
30 the entry point of the PcatIsaAcpi driver.
31
32 @param ImageHandle Handle for driver image
33 @param SystemTable Point to EFI_SYSTEM_TABLE
34
35 @return Sucess or not for installing driver binding protocol
36 **/
37 EFI_STATUS
38 EFIAPI
39 PcatIsaAcpiDriverEntryPoint (
40 IN EFI_HANDLE ImageHandle,
41 IN EFI_SYSTEM_TABLE *SystemTable
42 )
43 {
44 return EfiLibInstallDriverBindingComponentName2 (
45 ImageHandle,
46 SystemTable,
47 &gPcatIsaAcpiDriverBinding,
48 ImageHandle,
49 &gPcatIsaAcpiComponentName,
50 &gPcatIsaAcpiComponentName2
51 );
52 }
53
54 /**
55 ControllerDriver Protocol Method
56
57 @param This Driver Binding protocol instance pointer.
58 @param Controller Handle of device to test.
59 @param RemainingDevicePath Optional parameter use to pick a specific child
60 device to start.
61 @retval EFI_SUCCESS This driver supports this device.
62 @retval other This driver does not support this device.
63
64 **/
65 EFI_STATUS
66 EFIAPI
67 PcatIsaAcpiDriverBindingSupported (
68 IN EFI_DRIVER_BINDING_PROTOCOL *This,
69 IN EFI_HANDLE Controller,
70 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
71 )
72 {
73 EFI_STATUS Status;
74 EFI_PCI_IO_PROTOCOL *PciIo;
75 PCI_TYPE00 Pci;
76 UINTN SegmentNumber;
77 UINTN BusNumber;
78 UINTN DeviceNumber;
79 UINTN FunctionNumber;
80
81 //
82 // Get PciIo protocol instance
83 //
84 Status = gBS->OpenProtocol (
85 Controller,
86 &gEfiPciIoProtocolGuid,
87 (VOID**)&PciIo,
88 This->DriverBindingHandle,
89 Controller,
90 EFI_OPEN_PROTOCOL_BY_DRIVER
91 );
92 if (EFI_ERROR(Status)) {
93 return Status;
94 }
95
96 Status = PciIo->Pci.Read (
97 PciIo,
98 EfiPciIoWidthUint32,
99 0,
100 sizeof(Pci) / sizeof(UINT32),
101 &Pci);
102
103 if (!EFI_ERROR (Status)) {
104 Status = EFI_UNSUPPORTED;
105 if ((Pci.Hdr.Command & 0x03) == 0x03) {
106 if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) {
107 //
108 // See if this is a standard PCI to ISA Bridge from the Base Code and Class Code
109 //
110 if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) {
111 Status = EFI_SUCCESS;
112 }
113
114 //
115 // See if this is an Intel PCI to ISA bridge in Positive Decode Mode
116 //
117 if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE &&
118 Pci.Hdr.VendorId == 0x8086 ) {
119 //
120 // See if this is on Function #0 to avoid false positives on
121 // PCI_CLASS_BRIDGE_OTHER that has the same value as
122 // PCI_CLASS_BRIDGE_ISA_PDECODE
123 //
124 Status = PciIo->GetLocation (
125 PciIo,
126 &SegmentNumber,
127 &BusNumber,
128 &DeviceNumber,
129 &FunctionNumber
130 );
131 if (!EFI_ERROR (Status) && FunctionNumber == 0) {
132 Status = EFI_SUCCESS;
133 } else {
134 Status = EFI_UNSUPPORTED;
135 }
136 }
137 }
138 }
139 }
140
141 gBS->CloseProtocol (
142 Controller,
143 &gEfiPciIoProtocolGuid,
144 This->DriverBindingHandle,
145 Controller
146 );
147
148 return Status;
149 }
150
151 /**
152 Install EFI_ISA_ACPI_PROTOCOL.
153
154 @param This Driver Binding protocol instance pointer.
155 @param ControllerHandle Handle of device to bind driver to.
156 @param RemainingDevicePath Optional parameter use to pick a specific child
157 device to start.
158
159 @retval EFI_SUCCESS This driver is added to ControllerHandle
160 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
161 @retval other This driver does not support this device
162 **/
163 EFI_STATUS
164 EFIAPI
165 PcatIsaAcpiDriverBindingStart (
166 IN EFI_DRIVER_BINDING_PROTOCOL *This,
167 IN EFI_HANDLE Controller,
168 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
169 )
170 {
171 EFI_STATUS Status;
172 EFI_PCI_IO_PROTOCOL *PciIo;
173 PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;
174 UINT64 Supports;
175 BOOLEAN Enabled;
176
177 Enabled = FALSE;
178 Supports = 0;
179 PcatIsaAcpiDev = NULL;
180 //
181 // Open the PCI I/O Protocol Interface
182 //
183 PciIo = NULL;
184 Status = gBS->OpenProtocol (
185 Controller,
186 &gEfiPciIoProtocolGuid,
187 (VOID**)&PciIo,
188 This->DriverBindingHandle,
189 Controller,
190 EFI_OPEN_PROTOCOL_BY_DRIVER
191 );
192 if (EFI_ERROR (Status)) {
193 goto Done;
194 }
195
196 //
197 // Get supported PCI attributes
198 //
199 Status = PciIo->Attributes (
200 PciIo,
201 EfiPciIoAttributeOperationSupported,
202 0,
203 &Supports
204 );
205 if (EFI_ERROR (Status)) {
206 goto Done;
207 }
208
209 Supports &= (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16);
210 if (Supports == 0 || Supports == (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16)) {
211 Status = EFI_UNSUPPORTED;
212 goto Done;
213 }
214
215 Enabled = TRUE;
216 Status = PciIo->Attributes (
217 PciIo,
218 EfiPciIoAttributeOperationEnable,
219 EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,
220 NULL
221 );
222 if (EFI_ERROR (Status)) {
223 goto Done;
224 }
225
226 //
227 // Allocate memory for the PCAT ISA ACPI Device structure
228 //
229 PcatIsaAcpiDev = NULL;
230 Status = gBS->AllocatePool (
231 EfiBootServicesData,
232 sizeof(PCAT_ISA_ACPI_DEV),
233 (VOID**)&PcatIsaAcpiDev
234 );
235 if (EFI_ERROR (Status)) {
236 goto Done;
237 }
238
239 //
240 // Initialize the PCAT ISA ACPI Device structure
241 //
242 PcatIsaAcpiDev->Signature = PCAT_ISA_ACPI_DEV_SIGNATURE;
243 PcatIsaAcpiDev->Handle = Controller;
244 PcatIsaAcpiDev->PciIo = PciIo;
245
246 //
247 // IsaAcpi interface
248 //
249 (PcatIsaAcpiDev->IsaAcpi).DeviceEnumerate = IsaDeviceEnumerate;
250 (PcatIsaAcpiDev->IsaAcpi).SetPower = IsaDeviceSetPower;
251 (PcatIsaAcpiDev->IsaAcpi).GetCurResource = IsaGetCurrentResource;
252 (PcatIsaAcpiDev->IsaAcpi).GetPosResource = IsaGetPossibleResource;
253 (PcatIsaAcpiDev->IsaAcpi).SetResource = IsaSetResource;
254 (PcatIsaAcpiDev->IsaAcpi).EnableDevice = IsaEnableDevice;
255 (PcatIsaAcpiDev->IsaAcpi).InitDevice = IsaInitDevice;
256 (PcatIsaAcpiDev->IsaAcpi).InterfaceInit = IsaInterfaceInit;
257
258 //
259 // Install the ISA ACPI Protocol interface
260 //
261 Status = gBS->InstallMultipleProtocolInterfaces (
262 &Controller,
263 &gEfiIsaAcpiProtocolGuid, &PcatIsaAcpiDev->IsaAcpi,
264 NULL
265 );
266
267 Done:
268 if (EFI_ERROR (Status)) {
269 if (PciIo != NULL && Enabled) {
270 PciIo->Attributes (
271 PciIo,
272 EfiPciIoAttributeOperationDisable,
273 EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,
274 NULL
275 );
276 }
277 gBS->CloseProtocol (
278 Controller,
279 &gEfiPciIoProtocolGuid,
280 This->DriverBindingHandle,
281 Controller
282 );
283 if (PcatIsaAcpiDev != NULL) {
284 gBS->FreePool (PcatIsaAcpiDev);
285 }
286 return Status;
287 }
288
289 return EFI_SUCCESS;
290 }
291
292
293 /**
294 Stop this driver on ControllerHandle. Support stopping any child handles
295 created by this driver.
296
297 @param This Protocol instance pointer.
298 @param ControllerHandle Handle of device to stop driver on
299 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
300 children is zero stop the entire bus driver.
301 @param ChildHandleBuffer List of Child Handles to Stop.
302
303 @retval EFI_SUCCESS This driver is removed ControllerHandle
304 @retval other This driver was not removed from this device
305
306 **/
307 EFI_STATUS
308 EFIAPI
309 PcatIsaAcpiDriverBindingStop (
310 IN EFI_DRIVER_BINDING_PROTOCOL *This,
311 IN EFI_HANDLE Controller,
312 IN UINTN NumberOfChildren,
313 IN EFI_HANDLE *ChildHandleBuffer
314 )
315 {
316 EFI_STATUS Status;
317 EFI_ISA_ACPI_PROTOCOL *IsaAcpi;
318 PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;
319 UINT64 Supports;
320
321 //
322 // Get the ISA ACPI Protocol Interface
323 //
324 Status = gBS->OpenProtocol (
325 Controller,
326 &gEfiIsaAcpiProtocolGuid,
327 (VOID**)&IsaAcpi,
328 This->DriverBindingHandle,
329 Controller,
330 EFI_OPEN_PROTOCOL_GET_PROTOCOL
331 );
332 if (EFI_ERROR (Status)) {
333 return Status;
334 }
335
336 //
337 // Get the PCAT ISA ACPI Device structure from the ISA ACPI Protocol
338 //
339 PcatIsaAcpiDev = PCAT_ISA_ACPI_DEV_FROM_THIS (IsaAcpi);
340
341 //
342 // Get supported PCI attributes
343 //
344 Status = PcatIsaAcpiDev->PciIo->Attributes (
345 PcatIsaAcpiDev->PciIo,
346 EfiPciIoAttributeOperationSupported,
347 0,
348 &Supports
349 );
350 if (EFI_ERROR (Status)) {
351 return Status;
352 }
353
354 Supports &= (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16);
355
356 PcatIsaAcpiDev->PciIo->Attributes (
357 PcatIsaAcpiDev->PciIo,
358 EfiPciIoAttributeOperationDisable,
359 EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,
360 NULL
361 );
362
363 //
364 // Uninstall protocol interface: EFI_ISA_ACPI_PROTOCOL
365 //
366 Status = gBS->UninstallProtocolInterface (
367 Controller,
368 &gEfiIsaAcpiProtocolGuid, &PcatIsaAcpiDev->IsaAcpi
369 );
370 if (EFI_ERROR (Status)) {
371 return Status;
372 }
373
374 gBS->CloseProtocol (
375 Controller,
376 &gEfiPciIoProtocolGuid,
377 This->DriverBindingHandle,
378 Controller
379 );
380
381 gBS->FreePool (PcatIsaAcpiDev);
382
383 return EFI_SUCCESS;
384 }