-/*++\r
+/** @file\r
+ EFI PCAT ISA ACPI Driver for a Generic PC Platform\r
\r
-Copyright (c) 2006, 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 - 2014, Intel Corporation. All rights reserved.<BR>\r
+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
\r
-Module Name:\r
-\r
- PcatIsaAcpi.c\r
- \r
-Abstract:\r
-\r
- EFI PCAT ISA ACPI Driver for a Generic PC Platform\r
-\r
-Revision History\r
-\r
---*/\r
+**/\r
\r
#include "PcatIsaAcpi.h"\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 Sucess 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
);\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
0,\r
sizeof(Pci) / sizeof(UINT32), \r
&Pci);\r
- \r
+\r
if (!EFI_ERROR (Status)) {\r
Status = EFI_UNSUPPORTED;\r
if ((Pci.Hdr.Command & 0x03) == 0x03) {\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 == 0x7110) {\r
- Status = EFI_SUCCESS;\r
+ if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE && \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
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
+ BOOLEAN Enabled;\r
+\r
+ Enabled = FALSE;\r
+ Supports = 0;\r
PcatIsaAcpiDev = NULL;\r
//\r
// Open the PCI I/O Protocol Interface\r
goto Done;\r
}\r
\r
+ //\r
+ // Get supported PCI attributes\r
+ //\r
+ Status = PciIo->Attributes (\r
+ PciIo,\r
+ EfiPciIoAttributeOperationSupported,\r
+ 0,\r
+ &Supports\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\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
+ Enabled = TRUE;\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
+ EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, \r
NULL \r
);\r
if (EFI_ERROR (Status)) {\r
PcatIsaAcpiDev->Signature = PCAT_ISA_ACPI_DEV_SIGNATURE;\r
PcatIsaAcpiDev->Handle = Controller;\r
PcatIsaAcpiDev->PciIo = PciIo;\r
+\r
+ //\r
+ // Initialize PcatIsaAcpiDeviceList\r
+ //\r
+ InitializePcatIsaAcpiDeviceList ();\r
\r
//\r
// IsaAcpi interface\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
+ EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
NULL \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
+ UINT64 Supports;\r
\r
//\r
// Get the ISA ACPI Protocol Interface\r
//\r
PcatIsaAcpiDev = PCAT_ISA_ACPI_DEV_FROM_THIS (IsaAcpi);\r
\r
+ //\r
+ // Get supported PCI attributes\r
+ //\r
+ Status = PcatIsaAcpiDev->PciIo->Attributes (\r
+ PcatIsaAcpiDev->PciIo,\r
+ EfiPciIoAttributeOperationSupported,\r
+ 0,\r
+ &Supports\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Supports &= (UINT64) (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16);\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
+ EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
NULL \r
);\r
\r