/** @file\r
EFI PCAT ISA ACPI Driver for a Generic PC Platform\r
\r
- Copyright (c) 2006, 2009, Intel Corporation \r
- All rights reserved. This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
NULL\r
};\r
\r
+/**\r
+ the entry point of the PcatIsaAcpi driver.\r
+\r
+ @param ImageHandle Handle for driver image\r
+ @param SystemTable Point to EFI_SYSTEM_TABLE\r
+\r
+ @return Success or not for installing driver binding protocol\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PcatIsaAcpiDriverEntryPoint (\r
IN EFI_HANDLE ImageHandle,\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
-/*++\r
- \r
- Routine Description:\r
- the entry point of the PcatIsaAcpi driver\r
- \r
- Arguments:\r
- \r
- Returns:\r
- \r
---*/ \r
{\r
return EfiLibInstallDriverBindingComponentName2 (\r
- ImageHandle, \r
- SystemTable, \r
+ ImageHandle,\r
+ SystemTable,\r
&gPcatIsaAcpiDriverBinding,\r
ImageHandle,\r
&gPcatIsaAcpiComponentName,\r
);\r
}\r
\r
+/**\r
+ ControllerDriver Protocol Method\r
+\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param Controller Handle of device to test.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval other This driver does not support this device.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PcatIsaAcpiDriverBindingSupported (\r
IN EFI_HANDLE Controller,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- ControllerDriver Protocol Method\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
PCI_TYPE00 Pci;\r
+ UINTN SegmentNumber;\r
+ UINTN BusNumber;\r
+ UINTN DeviceNumber;\r
+ UINTN FunctionNumber;\r
\r
//\r
// Get PciIo protocol instance\r
- // \r
+ //\r
Status = gBS->OpenProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
+ Controller,\r
+ &gEfiPciIoProtocolGuid,\r
(VOID**)&PciIo,\r
This->DriverBindingHandle,\r
Controller,\r
PciIo,\r
EfiPciIoWidthUint32,\r
0,\r
- sizeof(Pci) / sizeof(UINT32), \r
+ sizeof(Pci) / sizeof(UINT32),\r
&Pci);\r
\r
if (!EFI_ERROR (Status)) {\r
//\r
if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) {\r
Status = EFI_SUCCESS;\r
- } \r
+ }\r
\r
//\r
// See if this is an Intel PCI to ISA bridge in Positive Decode Mode\r
//\r
if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE &&\r
- Pci.Hdr.VendorId == 0x8086 && \r
- (Pci.Hdr.DeviceId & 0xF000) == 0x7000) {\r
- Status = EFI_SUCCESS;\r
+ Pci.Hdr.VendorId == 0x8086 ) {\r
+ //\r
+ // See if this is on Function #0 to avoid false positives on\r
+ // PCI_CLASS_BRIDGE_OTHER that has the same value as\r
+ // PCI_CLASS_BRIDGE_ISA_PDECODE\r
+ //\r
+ Status = PciIo->GetLocation (\r
+ PciIo,\r
+ &SegmentNumber,\r
+ &BusNumber,\r
+ &DeviceNumber,\r
+ &FunctionNumber\r
+ );\r
+ if (!EFI_ERROR (Status) && FunctionNumber == 0) {\r
+ Status = EFI_SUCCESS;\r
+ } else {\r
+ Status = EFI_UNSUPPORTED;\r
+ }\r
}\r
- } \r
+ }\r
}\r
}\r
\r
gBS->CloseProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
- This->DriverBindingHandle, \r
- Controller \r
+ Controller,\r
+ &gEfiPciIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
);\r
- \r
+\r
return Status;\r
}\r
\r
+/**\r
+ Install EFI_ISA_ACPI_PROTOCOL.\r
+\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to bind driver to.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
+\r
+ @retval EFI_SUCCESS This driver is added to ControllerHandle\r
+ @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
+ @retval other This driver does not support this device\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PcatIsaAcpiDriverBindingStart (\r
IN EFI_HANDLE Controller,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
-/*++\r
-\r
-Routine Description:\r
- Install EFI_ISA_ACPI_PROTOCOL\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;\r
- \r
+ UINT64 Supports;\r
+ UINT64 OriginalAttributes;\r
+ BOOLEAN Enabled;\r
+\r
+ Enabled = FALSE;\r
+ Supports = 0;\r
PcatIsaAcpiDev = NULL;\r
+ OriginalAttributes = 0;\r
//\r
// Open the PCI I/O Protocol Interface\r
//\r
PciIo = NULL;\r
Status = gBS->OpenProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
+ Controller,\r
+ &gEfiPciIoProtocolGuid,\r
(VOID**)&PciIo,\r
- This->DriverBindingHandle, \r
- Controller, \r
- EFI_OPEN_PROTOCOL_BY_DRIVER \r
+ This->DriverBindingHandle,\r
+ Controller,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
\r
+ //\r
+ // Get supported PCI attributes\r
+ //\r
Status = PciIo->Attributes (\r
- PciIo, \r
- EfiPciIoAttributeOperationEnable, \r
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, \r
- NULL \r
+ PciIo,\r
+ EfiPciIoAttributeOperationSupported,\r
+ 0,\r
+ &Supports\r
);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
- \r
+\r
+ Supports &= (UINT64) (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16);\r
+ if (Supports == 0 || Supports == (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16)) {\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Done;\r
+ }\r
+\r
+ Status = PciIo->Attributes (\r
+ PciIo,\r
+ EfiPciIoAttributeOperationGet,\r
+ 0,\r
+ &OriginalAttributes\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = PciIo->Attributes (\r
+ PciIo,\r
+ EfiPciIoAttributeOperationEnable,\r
+ EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Enabled = TRUE;\r
//\r
// Allocate memory for the PCAT ISA ACPI Device structure\r
//\r
//\r
// Initialize the PCAT ISA ACPI Device structure\r
//\r
- PcatIsaAcpiDev->Signature = PCAT_ISA_ACPI_DEV_SIGNATURE;\r
- PcatIsaAcpiDev->Handle = Controller;\r
- PcatIsaAcpiDev->PciIo = PciIo;\r
- \r
+ PcatIsaAcpiDev->Signature = PCAT_ISA_ACPI_DEV_SIGNATURE;\r
+ PcatIsaAcpiDev->Handle = Controller;\r
+ PcatIsaAcpiDev->PciIo = PciIo;\r
+ PcatIsaAcpiDev->OriginalAttributes = OriginalAttributes;\r
+\r
+ //\r
+ // Initialize PcatIsaAcpiDeviceList\r
+ //\r
+ InitializePcatIsaAcpiDeviceList ();\r
+\r
//\r
// IsaAcpi interface\r
//\r
(PcatIsaAcpiDev->IsaAcpi).EnableDevice = IsaEnableDevice;\r
(PcatIsaAcpiDev->IsaAcpi).InitDevice = IsaInitDevice;\r
(PcatIsaAcpiDev->IsaAcpi).InterfaceInit = IsaInterfaceInit;\r
- \r
+\r
//\r
// Install the ISA ACPI Protocol interface\r
//\r
\r
Done:\r
if (EFI_ERROR (Status)) {\r
- if (PciIo) {\r
+ if (PciIo != NULL && Enabled) {\r
PciIo->Attributes (\r
- PciIo, \r
- EfiPciIoAttributeOperationDisable, \r
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
- NULL \r
+ PciIo,\r
+ EfiPciIoAttributeOperationSet,\r
+ OriginalAttributes,\r
+ NULL\r
);\r
}\r
gBS->CloseProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
- This->DriverBindingHandle, \r
+ Controller,\r
+ &gEfiPciIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
Controller\r
);\r
if (PcatIsaAcpiDev != NULL) {\r
}\r
return Status;\r
}\r
- \r
+\r
return EFI_SUCCESS;\r
}\r
\r
+\r
+/**\r
+ Stop this driver on ControllerHandle. Support stopping any child handles\r
+ created by this driver.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param ControllerHandle Handle of device to stop driver on\r
+ @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
+ children is zero stop the entire bus driver.\r
+ @param ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+ @retval EFI_SUCCESS This driver is removed ControllerHandle\r
+ @retval other This driver was not removed from this device\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PcatIsaAcpiDriverBindingStop (\r
IN UINTN NumberOfChildren,\r
IN EFI_HANDLE *ChildHandleBuffer\r
)\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Arguments:\r
-\r
- Returns:\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
EFI_ISA_ACPI_PROTOCOL *IsaAcpi;\r
PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;\r
- \r
+\r
//\r
// Get the ISA ACPI Protocol Interface\r
- // \r
+ //\r
Status = gBS->OpenProtocol (\r
- Controller, \r
- &gEfiIsaAcpiProtocolGuid, \r
+ Controller,\r
+ &gEfiIsaAcpiProtocolGuid,\r
(VOID**)&IsaAcpi,\r
- This->DriverBindingHandle, \r
- Controller, \r
+ This->DriverBindingHandle,\r
+ Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
if (EFI_ERROR (Status)) {\r
//\r
PcatIsaAcpiDev = PCAT_ISA_ACPI_DEV_FROM_THIS (IsaAcpi);\r
\r
- PcatIsaAcpiDev->PciIo->Attributes (\r
- PcatIsaAcpiDev->PciIo, \r
- EfiPciIoAttributeOperationDisable, \r
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
- NULL \r
- );\r
- \r
+ //\r
+ // Restore PCI attributes\r
+ //\r
+ Status = PcatIsaAcpiDev->PciIo->Attributes (\r
+ PcatIsaAcpiDev->PciIo,\r
+ EfiPciIoAttributeOperationSet,\r
+ PcatIsaAcpiDev->OriginalAttributes,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
//\r
// Uninstall protocol interface: EFI_ISA_ACPI_PROTOCOL\r
//\r
}\r
\r
gBS->CloseProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
- This->DriverBindingHandle, \r
+ Controller,\r
+ &gEfiPciIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
Controller\r
);\r
- \r
+\r
gBS->FreePool (PcatIsaAcpiDev);\r
- \r
+\r
return EFI_SUCCESS;\r
}\r