2 EFI PCAT ISA ACPI Driver for a Generic PC Platform
4 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "PcatIsaAcpi.h"
12 // PcatIsaAcpi Driver Binding Protocol
14 EFI_DRIVER_BINDING_PROTOCOL gPcatIsaAcpiDriverBinding
= {
15 PcatIsaAcpiDriverBindingSupported
,
16 PcatIsaAcpiDriverBindingStart
,
17 PcatIsaAcpiDriverBindingStop
,
24 the entry point of the PcatIsaAcpi driver.
26 @param ImageHandle Handle for driver image
27 @param SystemTable Point to EFI_SYSTEM_TABLE
29 @return Success or not for installing driver binding protocol
33 PcatIsaAcpiDriverEntryPoint (
34 IN EFI_HANDLE ImageHandle
,
35 IN EFI_SYSTEM_TABLE
*SystemTable
38 return EfiLibInstallDriverBindingComponentName2 (
41 &gPcatIsaAcpiDriverBinding
,
43 &gPcatIsaAcpiComponentName
,
44 &gPcatIsaAcpiComponentName2
49 ControllerDriver Protocol Method
51 @param This Driver Binding protocol instance pointer.
52 @param Controller Handle of device to test.
53 @param RemainingDevicePath Optional parameter use to pick a specific child
55 @retval EFI_SUCCESS This driver supports this device.
56 @retval other This driver does not support this device.
61 PcatIsaAcpiDriverBindingSupported (
62 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
63 IN EFI_HANDLE Controller
,
64 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
68 EFI_PCI_IO_PROTOCOL
*PciIo
;
76 // Get PciIo protocol instance
78 Status
= gBS
->OpenProtocol (
80 &gEfiPciIoProtocolGuid
,
82 This
->DriverBindingHandle
,
84 EFI_OPEN_PROTOCOL_BY_DRIVER
86 if (EFI_ERROR(Status
)) {
90 Status
= PciIo
->Pci
.Read (
94 sizeof(Pci
) / sizeof(UINT32
),
97 if (!EFI_ERROR (Status
)) {
98 Status
= EFI_UNSUPPORTED
;
99 if ((Pci
.Hdr
.Command
& 0x03) == 0x03) {
100 if (Pci
.Hdr
.ClassCode
[2] == PCI_CLASS_BRIDGE
) {
102 // See if this is a standard PCI to ISA Bridge from the Base Code and Class Code
104 if (Pci
.Hdr
.ClassCode
[1] == PCI_CLASS_BRIDGE_ISA
) {
105 Status
= EFI_SUCCESS
;
109 // See if this is an Intel PCI to ISA bridge in Positive Decode Mode
111 if (Pci
.Hdr
.ClassCode
[1] == PCI_CLASS_BRIDGE_ISA_PDECODE
&&
112 Pci
.Hdr
.VendorId
== 0x8086 ) {
114 // See if this is on Function #0 to avoid false positives on
115 // PCI_CLASS_BRIDGE_OTHER that has the same value as
116 // PCI_CLASS_BRIDGE_ISA_PDECODE
118 Status
= PciIo
->GetLocation (
125 if (!EFI_ERROR (Status
) && FunctionNumber
== 0) {
126 Status
= EFI_SUCCESS
;
128 Status
= EFI_UNSUPPORTED
;
137 &gEfiPciIoProtocolGuid
,
138 This
->DriverBindingHandle
,
146 Install EFI_ISA_ACPI_PROTOCOL.
148 @param This Driver Binding protocol instance pointer.
149 @param ControllerHandle Handle of device to bind driver to.
150 @param RemainingDevicePath Optional parameter use to pick a specific child
153 @retval EFI_SUCCESS This driver is added to ControllerHandle
154 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
155 @retval other This driver does not support this device
159 PcatIsaAcpiDriverBindingStart (
160 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
161 IN EFI_HANDLE Controller
,
162 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
166 EFI_PCI_IO_PROTOCOL
*PciIo
;
167 PCAT_ISA_ACPI_DEV
*PcatIsaAcpiDev
;
169 UINT64 OriginalAttributes
;
174 PcatIsaAcpiDev
= NULL
;
175 OriginalAttributes
= 0;
177 // Open the PCI I/O Protocol Interface
180 Status
= gBS
->OpenProtocol (
182 &gEfiPciIoProtocolGuid
,
184 This
->DriverBindingHandle
,
186 EFI_OPEN_PROTOCOL_BY_DRIVER
188 if (EFI_ERROR (Status
)) {
193 // Get supported PCI attributes
195 Status
= PciIo
->Attributes (
197 EfiPciIoAttributeOperationSupported
,
201 if (EFI_ERROR (Status
)) {
205 Supports
&= (UINT64
) (EFI_PCI_IO_ATTRIBUTE_ISA_IO
| EFI_PCI_IO_ATTRIBUTE_ISA_IO_16
);
206 if (Supports
== 0 || Supports
== (EFI_PCI_IO_ATTRIBUTE_ISA_IO
| EFI_PCI_IO_ATTRIBUTE_ISA_IO_16
)) {
207 Status
= EFI_UNSUPPORTED
;
211 Status
= PciIo
->Attributes (
213 EfiPciIoAttributeOperationGet
,
217 if (EFI_ERROR (Status
)) {
221 Status
= PciIo
->Attributes (
223 EfiPciIoAttributeOperationEnable
,
224 EFI_PCI_DEVICE_ENABLE
| Supports
| EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO
,
227 if (EFI_ERROR (Status
)) {
233 // Allocate memory for the PCAT ISA ACPI Device structure
235 PcatIsaAcpiDev
= NULL
;
236 Status
= gBS
->AllocatePool (
238 sizeof(PCAT_ISA_ACPI_DEV
),
239 (VOID
**)&PcatIsaAcpiDev
241 if (EFI_ERROR (Status
)) {
246 // Initialize the PCAT ISA ACPI Device structure
248 PcatIsaAcpiDev
->Signature
= PCAT_ISA_ACPI_DEV_SIGNATURE
;
249 PcatIsaAcpiDev
->Handle
= Controller
;
250 PcatIsaAcpiDev
->PciIo
= PciIo
;
251 PcatIsaAcpiDev
->OriginalAttributes
= OriginalAttributes
;
254 // Initialize PcatIsaAcpiDeviceList
256 InitializePcatIsaAcpiDeviceList ();
261 (PcatIsaAcpiDev
->IsaAcpi
).DeviceEnumerate
= IsaDeviceEnumerate
;
262 (PcatIsaAcpiDev
->IsaAcpi
).SetPower
= IsaDeviceSetPower
;
263 (PcatIsaAcpiDev
->IsaAcpi
).GetCurResource
= IsaGetCurrentResource
;
264 (PcatIsaAcpiDev
->IsaAcpi
).GetPosResource
= IsaGetPossibleResource
;
265 (PcatIsaAcpiDev
->IsaAcpi
).SetResource
= IsaSetResource
;
266 (PcatIsaAcpiDev
->IsaAcpi
).EnableDevice
= IsaEnableDevice
;
267 (PcatIsaAcpiDev
->IsaAcpi
).InitDevice
= IsaInitDevice
;
268 (PcatIsaAcpiDev
->IsaAcpi
).InterfaceInit
= IsaInterfaceInit
;
271 // Install the ISA ACPI Protocol interface
273 Status
= gBS
->InstallMultipleProtocolInterfaces (
275 &gEfiIsaAcpiProtocolGuid
, &PcatIsaAcpiDev
->IsaAcpi
,
280 if (EFI_ERROR (Status
)) {
281 if (PciIo
!= NULL
&& Enabled
) {
284 EfiPciIoAttributeOperationSet
,
291 &gEfiPciIoProtocolGuid
,
292 This
->DriverBindingHandle
,
295 if (PcatIsaAcpiDev
!= NULL
) {
296 gBS
->FreePool (PcatIsaAcpiDev
);
306 Stop this driver on ControllerHandle. Support stopping any child handles
307 created by this driver.
309 @param This Protocol instance pointer.
310 @param ControllerHandle Handle of device to stop driver on
311 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
312 children is zero stop the entire bus driver.
313 @param ChildHandleBuffer List of Child Handles to Stop.
315 @retval EFI_SUCCESS This driver is removed ControllerHandle
316 @retval other This driver was not removed from this device
321 PcatIsaAcpiDriverBindingStop (
322 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
323 IN EFI_HANDLE Controller
,
324 IN UINTN NumberOfChildren
,
325 IN EFI_HANDLE
*ChildHandleBuffer
329 EFI_ISA_ACPI_PROTOCOL
*IsaAcpi
;
330 PCAT_ISA_ACPI_DEV
*PcatIsaAcpiDev
;
333 // Get the ISA ACPI Protocol Interface
335 Status
= gBS
->OpenProtocol (
337 &gEfiIsaAcpiProtocolGuid
,
339 This
->DriverBindingHandle
,
341 EFI_OPEN_PROTOCOL_GET_PROTOCOL
343 if (EFI_ERROR (Status
)) {
348 // Get the PCAT ISA ACPI Device structure from the ISA ACPI Protocol
350 PcatIsaAcpiDev
= PCAT_ISA_ACPI_DEV_FROM_THIS (IsaAcpi
);
353 // Restore PCI attributes
355 Status
= PcatIsaAcpiDev
->PciIo
->Attributes (
356 PcatIsaAcpiDev
->PciIo
,
357 EfiPciIoAttributeOperationSet
,
358 PcatIsaAcpiDev
->OriginalAttributes
,
361 if (EFI_ERROR (Status
)) {
366 // Uninstall protocol interface: EFI_ISA_ACPI_PROTOCOL
368 Status
= gBS
->UninstallProtocolInterface (
370 &gEfiIsaAcpiProtocolGuid
, &PcatIsaAcpiDev
->IsaAcpi
372 if (EFI_ERROR (Status
)) {
378 &gEfiPciIoProtocolGuid
,
379 This
->DriverBindingHandle
,
383 gBS
->FreePool (PcatIsaAcpiDev
);