]> git.proxmox.com Git - mirror_edk2.git/blobdiff - PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c
BaseTools/BinToPcd: Fix Python 2.7.x compatibility issue
[mirror_edk2.git] / PcAtChipsetPkg / IsaAcpiDxe / PcatIsaAcpi.c
index a0f4cdfd40a0df99cc57d04552843ae072737709..533e1d3901ff1cba878e125e2ac12fb12a28f8ca 100644 (file)
@@ -1,26 +1,16 @@
-/*++\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 - 2018, 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
@@ -36,26 +26,24 @@ EFI_DRIVER_BINDING_PROTOCOL gPcatIsaAcpiDriverBinding = {
   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
@@ -63,6 +51,17 @@ PcatIsaAcpiDriverEntryPoint (
            );\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
@@ -70,28 +69,21 @@ PcatIsaAcpiDriverBindingSupported (
   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
@@ -105,9 +97,9 @@ Returns:
                     PciIo,\r
                     EfiPciIoWidthUint32,\r
                     0,\r
-                    sizeof(Pci) / sizeof(UINT32), \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
@@ -117,30 +109,57 @@ Returns:
         //\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 == 0x7110) {\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
@@ -148,48 +167,74 @@ PcatIsaAcpiDriverBindingStart (
   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
@@ -206,10 +251,16 @@ Returns:
   //\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
@@ -221,7 +272,7 @@ Returns:
   (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
@@ -233,18 +284,18 @@ Returns:
 \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
@@ -252,10 +303,25 @@ Done:
     }\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
@@ -264,29 +330,20 @@ PcatIsaAcpiDriverBindingStop (
   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
@@ -298,13 +355,19 @@ PcatIsaAcpiDriverBindingStop (
   //\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
@@ -317,13 +380,13 @@ PcatIsaAcpiDriverBindingStop (
   }\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