]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c
Retire PciHotplugDeviceGuid.
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / PciBusDxe / PciDeviceSupport.c
index e6d8ff923e0ad448e841eed0a75bc5b251ccadd9..e205fe9dc88cb696d32f9b4dcbb350f18aee7f73 100644 (file)
@@ -1,6 +1,6 @@
-/**@file\r
+/** @file\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \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
@@ -12,7 +12,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 \r
-#include "pcibus.h"\r
+#include "PciBus.h"\r
 #include "PciDeviceSupport.h"\r
 \r
 //\r
@@ -22,7 +22,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 LIST_ENTRY  gPciDevicePool;\r
 \r
 /**\r
-  Initialize the gPciDevicePool\r
+  Initialize the gPciDevicePool.\r
 **/\r
 EFI_STATUS\r
 InitializePciDevicePool (\r
@@ -75,7 +75,7 @@ InsertPciDevice (
 /**\r
   Destroy root bridge and remove it from deivce tree.\r
   \r
-  @param RootBridge   The bridge want to be removed\r
+  @param RootBridge   The bridge want to be removed.\r
   \r
 **/\r
 EFI_STATUS\r
@@ -174,7 +174,7 @@ DestroyRootBridgeByHandle (
 \r
   CurrentLink = gPciDevicePool.ForwardLink;\r
 \r
-  while (CurrentLink && CurrentLink != &gPciDevicePool) {\r
+  while (CurrentLink != NULL && CurrentLink != &gPciDevicePool) {\r
     Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
 \r
     if (Temp->Handle == Controller) {\r
@@ -220,6 +220,7 @@ RegisterPciDevice (
   UINT8               PciExpressCapRegOffset;\r
   EFI_PCI_IO_PROTOCOL *PciIo;\r
   UINT8               Data8;\r
+  BOOLEAN             HasEfiImage;\r
 \r
   //\r
   // Install the pciio protocol, device path protocol\r
@@ -261,7 +262,6 @@ RegisterPciDevice (
   // Process OpRom\r
   //\r
   if (!PciIoDevice->AllOpRomProcessed) {\r
-    PciIoDevice->AllOpRomProcessed = TRUE;\r
 \r
     //\r
     // Get the OpRom provided by platform\r
@@ -279,7 +279,7 @@ RegisterPciDevice (
         PciIoDevice->PciIo.RomImage = PlatformOpRomBuffer;\r
         //\r
         // For OpROM read from gPciPlatformProtocol:\r
-        //   Add the Rom Image to internal database for later PCI light enumeration\r
+        // Add the Rom Image to internal database for later PCI light enumeration\r
         //\r
         PciRomAddImageMapping (\r
           NULL,\r
@@ -290,16 +290,46 @@ RegisterPciDevice (
           (UINT64) (UINTN) PciIoDevice->PciIo.RomImage,\r
           PciIoDevice->PciIo.RomSize\r
           );\r
-        \r
       }\r
     }\r
+  }\r
+\r
+  //\r
+  // Determine if there are EFI images in the option rom\r
+  //\r
+  HasEfiImage = ContainEfiImage (PciIoDevice->PciIo.RomImage, PciIoDevice->PciIo.RomSize);\r
+\r
+  if (HasEfiImage) {\r
+    Status = gBS->InstallMultipleProtocolInterfaces (\r
+                    &PciIoDevice->Handle,\r
+                    &gEfiLoadFile2ProtocolGuid,\r
+                    &PciIoDevice->LoadFile2,\r
+                    NULL\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      gBS->UninstallMultipleProtocolInterfaces (\r
+             &PciIoDevice->Handle,\r
+             &gEfiDevicePathProtocolGuid,\r
+             PciIoDevice->DevicePath,\r
+             &gEfiPciIoProtocolGuid,\r
+             &PciIoDevice->PciIo,\r
+             NULL\r
+             );\r
+      return Status;\r
+    }\r
+  }\r
+\r
+\r
+  if (!PciIoDevice->AllOpRomProcessed) {\r
+\r
+    PciIoDevice->AllOpRomProcessed = TRUE;\r
 \r
     //\r
     // Dispatch the EFI OpRom for the PCI device.\r
     // The OpRom is got from platform in the above code\r
-    //   or loaded from device in previous bus enumeration\r
+    // or loaded from device in the previous round of bus enumeration\r
     //\r
-    if (PciIoDevice->RomSize > 0) {\r
+    if (HasEfiImage) {\r
       ProcessOpRomImage (PciIoDevice);\r
     }\r
   }\r
@@ -323,6 +353,14 @@ RegisterPciDevice (
              &PciIoDevice->PciIo,\r
              NULL\r
              );\r
+      if (HasEfiImage) {\r
+        gBS->UninstallMultipleProtocolInterfaces (\r
+               &PciIoDevice->Handle,\r
+               &gEfiLoadFile2ProtocolGuid,\r
+               &PciIoDevice->LoadFile2,\r
+               NULL\r
+               );\r
+      }\r
 \r
       return Status;\r
     }\r
@@ -340,12 +378,6 @@ RegisterPciDevice (
     return Status;\r
   }\r
 \r
-  //\r
-  // Install Pccard Hotplug GUID for Pccard device so that\r
-  // to notify CardBus driver to stop the device when de-register happens\r
-  //\r
-  InstallPciHotplugGuid (PciIoDevice);\r
-\r
   if (Handle != NULL) {\r
     *Handle = PciIoDevice->Handle;\r
   }\r
@@ -456,7 +488,7 @@ DeRegisterPciDevice (
 \r
       CurrentLink = PciIoDevice->ChildList.ForwardLink;\r
 \r
-      while (CurrentLink && CurrentLink != &PciIoDevice->ChildList) {\r
+      while (CurrentLink != NULL && CurrentLink != &PciIoDevice->ChildList) {\r
         Node    = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
         Status  = DeRegisterPciDevice (Controller, Node->Handle);\r
 \r
@@ -467,10 +499,6 @@ DeRegisterPciDevice (
         CurrentLink = CurrentLink->ForwardLink;\r
       }\r
     }\r
-    //\r
-    // Uninstall Pccard Hotplug GUID for Pccard device\r
-    //\r
-    UninstallPciHotplugGuid (PciIoDevice);\r
 \r
     //\r
     // Close the child handle\r
@@ -507,6 +535,33 @@ DeRegisterPciDevice (
                       );\r
     }\r
 \r
+    if (!EFI_ERROR (Status)) {\r
+      //\r
+      // Try to uninstall LoadFile2 protocol if exists\r
+      //\r
+      Status = gBS->OpenProtocol (\r
+                      Handle,\r
+                      &gEfiLoadFile2ProtocolGuid,\r
+                      NULL,\r
+                      gPciBusDriverBinding.DriverBindingHandle,\r
+                      Controller,\r
+                      EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
+                      );\r
+      if (!EFI_ERROR (Status)) {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        Handle,\r
+                        &gEfiLoadFile2ProtocolGuid,\r
+                        &PciIoDevice->LoadFile2,\r
+                        NULL\r
+                        );\r
+      }\r
+      //\r
+      // Restore Status\r
+      //\r
+      Status = EFI_SUCCESS;\r
+    }\r
+\r
+\r
     if (EFI_ERROR (Status)) {\r
       gBS->OpenProtocol (\r
             Controller,\r
@@ -571,7 +626,7 @@ StartPciDevicesOnBridge (
 \r
   CurrentLink = RootBridge->ChildList.ForwardLink;\r
 \r
-  while (CurrentLink && CurrentLink != &RootBridge->ChildList) {\r
+  while (CurrentLink != NULL && CurrentLink != &RootBridge->ChildList) {\r
 \r
     PciIoDevice = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
     if (RemainingDevicePath != NULL) {\r
@@ -612,8 +667,8 @@ StartPciDevicesOnBridge (
       //\r
       // Get the next device path\r
       //\r
-      CurrentDevicePath = EfiNextDevicePathNode (RemainingDevicePath);\r
-      if (EfiIsDevicePathEnd (CurrentDevicePath)) {\r
+      CurrentDevicePath = NextDevicePathNode (RemainingDevicePath);\r
+      if (IsDevicePathEnd (CurrentDevicePath)) {\r
         return EFI_SUCCESS;\r
       }\r
 \r
@@ -728,7 +783,7 @@ StartPciDevices (
 \r
   CurrentLink = gPciDevicePool.ForwardLink;\r
 \r
-  while (CurrentLink && CurrentLink != &gPciDevicePool) {\r
+  while (CurrentLink != NULL && CurrentLink != &gPciDevicePool) {\r
 \r
     RootBridge = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
     //\r
@@ -825,8 +880,9 @@ CreateRootBridge (
   //\r
   // Initialize the PCI I/O instance structure\r
   //\r
-  Status  = InitializePciIoInstance (Dev);\r
-  Status  = InitializePciDriverOverrideInstance (Dev);\r
+  InitializePciIoInstance (Dev);\r
+  InitializePciDriverOverrideInstance (Dev);\r
+  InitializePciLoadFile2 (Dev);\r
 \r
   //\r
   // Initialize reserved resource list and\r
@@ -839,11 +895,11 @@ CreateRootBridge (
 }\r
 \r
 /**\r
-  Get root bridge device instance by specific handle\r
+  Get root bridge device instance by specific handle.\r
 \r
-  @param RootBridgeHandle    Given root bridge handle\r
+  @param RootBridgeHandle    Given root bridge handle.\r
 \r
-  @return root bridge device instance\r
+  @return root bridge device instance.\r
 **/\r
 PCI_IO_DEVICE *\r
 GetRootBridgeByHandle (\r
@@ -855,7 +911,7 @@ GetRootBridgeByHandle (
 \r
   CurrentLink = gPciDevicePool.ForwardLink;\r
 \r
-  while (CurrentLink && CurrentLink != &gPciDevicePool) {\r
+  while (CurrentLink != NULL && CurrentLink != &gPciDevicePool) {\r
 \r
     RootBridgeDev = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
     if (RootBridgeDev->Handle == RootBridgeHandle) {\r
@@ -869,12 +925,12 @@ GetRootBridgeByHandle (
 }\r
 \r
 /**\r
-  Judege whether Pci device existed\r
+  Judege whether Pci device existed.\r
   \r
-  @param Bridge       Parent bridege instance \r
-  @param PciIoDevice  Device instance\r
+  @param Bridge       Parent bridege instance.\r
+  @param PciIoDevice  Device instance.\r
   \r
-  @return whether Pci device existed\r
+  @return whether Pci device existed.\r
 **/\r
 BOOLEAN\r
 PciDeviceExisted (\r
@@ -888,7 +944,7 @@ PciDeviceExisted (
 \r
   CurrentLink = Bridge->ChildList.ForwardLink;\r
 \r
-  while (CurrentLink && CurrentLink != &Bridge->ChildList) {\r
+  while (CurrentLink != NULL && CurrentLink != &Bridge->ChildList) {\r
 \r
     Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
 \r
@@ -909,11 +965,11 @@ PciDeviceExisted (
 }\r
 \r
 /**\r
-  Active VGA device\r
+  Active VGA device.\r
   \r
-  @param VgaDevice device instance for VGA\r
+  @param VgaDevice device instance for VGA.\r
   \r
-  @return device instance\r
+  @return device instance.\r
 **/\r
 PCI_IO_DEVICE *\r
 ActiveVGADeviceOnTheSameSegment (\r
@@ -925,7 +981,7 @@ ActiveVGADeviceOnTheSameSegment (
 \r
   CurrentLink = gPciDevicePool.ForwardLink;\r
 \r
-  while (CurrentLink && CurrentLink != &gPciDevicePool) {\r
+  while (CurrentLink != NULL && CurrentLink != &gPciDevicePool) {\r
 \r
     Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
 \r
@@ -945,11 +1001,11 @@ ActiveVGADeviceOnTheSameSegment (
 }\r
 \r
 /**\r
-  Active VGA device on root bridge\r
+  Active VGA device on root bridge.\r
   \r
-  @param RootBridge  Root bridge device instance\r
+  @param RootBridge  Root bridge device instance.\r
   \r
-  @return VGA device instance\r
+  @return VGA device instance.\r
 **/\r
 PCI_IO_DEVICE *\r
 ActiveVGADeviceOnTheRootBridge (\r
@@ -961,7 +1017,7 @@ ActiveVGADeviceOnTheRootBridge (
 \r
   CurrentLink = RootBridge->ChildList.ForwardLink;\r
 \r
-  while (CurrentLink && CurrentLink != &RootBridge->ChildList) {\r
+  while (CurrentLink != NULL && CurrentLink != &RootBridge->ChildList) {\r
 \r
     Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
 \r
@@ -969,7 +1025,7 @@ ActiveVGADeviceOnTheRootBridge (
         (Temp->Attributes &\r
          (EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY |\r
           EFI_PCI_IO_ATTRIBUTE_VGA_IO     |\r
-          EFI_PCI_IO_ATTRIBUTE_VGA_IO_16))) {\r
+          EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) != 0) {\r
       return Temp;\r
     }\r
 \r
@@ -989,13 +1045,13 @@ ActiveVGADeviceOnTheRootBridge (
 }\r
 \r
 /**\r
-  Get HPC PCI address according to its device path\r
-  @param PciRootBridgeIo   Root bridege Io instance\r
-  @param HpcDevicePath     Given searching device path\r
-  @param PciAddress        Buffer holding searched result\r
+  Get HPC PCI address according to its device path.\r
+  @param PciRootBridgeIo   Root bridege Io instance.\r
+  @param HpcDevicePath     Given searching device path.\r
+  @param PciAddress        Buffer holding searched result.\r
   \r
   @retval EFI_NOT_FOUND Can not find the specific device path.\r
-  @retval EFI_SUCCESS   Success to get the device path\r
+  @retval EFI_SUCCESS   Success to get the device path.\r
 **/\r
 EFI_STATUS\r
 GetHpcPciAddress (\r
@@ -1015,7 +1071,7 @@ GetHpcPciAddress (
   //\r
   // Get the remaining device path for this PCI device, if it is a PCI device\r
   //\r
-  while (!EfiIsDevicePathEnd (CurrentDevicePath)) {\r
+  while (!IsDevicePathEnd (CurrentDevicePath)) {\r
 \r
     Node.DevPath = CurrentDevicePath;\r
 \r
@@ -1025,7 +1081,7 @@ GetHpcPciAddress (
     if ((Node.DevPath->Type != HARDWARE_DEVICE_PATH) ||\r
         ((Node.DevPath->SubType != HW_PCI_DP)         &&\r
          (DevicePathNodeLength (Node.DevPath) != sizeof (PCI_DEVICE_PATH)))) {\r
-      CurrentDevicePath = EfiNextDevicePathNode (CurrentDevicePath);\r
+      CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);\r
       continue;\r
     }\r
 \r
@@ -1035,13 +1091,13 @@ GetHpcPciAddress (
   //\r
   // Check if it is not PCI device path\r
   //\r
-  if (EfiIsDevicePathEnd (CurrentDevicePath)) {\r
+  if (IsDevicePathEnd (CurrentDevicePath)) {\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
   CurrentLink = gPciDevicePool.ForwardLink;\r
 \r
-  while (CurrentLink && CurrentLink != &gPciDevicePool) {\r
+  while (CurrentLink != NULL && CurrentLink != &gPciDevicePool) {\r
 \r
     RootBridge = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
     //\r
@@ -1068,10 +1124,10 @@ GetHpcPciAddress (
 }\r
 \r
 /**\r
-  Get HPC PCI address according to its device path\r
-  @param RootBridge           Root bridege Io instance\r
-  @param RemainingDevicePath  Given searching device path\r
-  @param PciAddress           Buffer holding searched result\r
+  Get HPC PCI address according to its device path.\r
+  @param RootBridge           Root bridege Io instance.\r
+  @param RemainingDevicePath  Given searching device path.\r
+  @param PciAddress           Buffer holding searched result.\r
   \r
   @retval EFI_NOT_FOUND Can not find the specific device path.\r
 **/\r
@@ -1094,12 +1150,12 @@ GetHpcPciAddressFromRootBridge (
   Node.DevPath      = CurrentDevicePath;\r
   Temp              = NULL;\r
 \r
-  while (!EfiIsDevicePathEnd (CurrentDevicePath)) {\r
+  while (!IsDevicePathEnd (CurrentDevicePath)) {\r
 \r
     CurrentLink   = RootBridge->ChildList.ForwardLink;\r
     Node.DevPath  = CurrentDevicePath;\r
 \r
-    while (CurrentLink && CurrentLink != &RootBridge->ChildList) {\r
+    while (CurrentLink != NULL && CurrentLink != &RootBridge->ChildList) {\r
       Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
 \r
       if (Node.Pci->Device   == Temp->DeviceNumber &&\r
@@ -1121,14 +1177,14 @@ GetHpcPciAddressFromRootBridge (
 \r
     }\r
 \r
-    CurrentDevicePath = EfiNextDevicePathNode (CurrentDevicePath);\r
+    CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);\r
   }\r
 \r
   if (MisMatch) {\r
 \r
-    CurrentDevicePath = EfiNextDevicePathNode (CurrentDevicePath);\r
+    CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);\r
 \r
-    if (EfiIsDevicePathEnd (CurrentDevicePath)) {\r
+    if (IsDevicePathEnd (CurrentDevicePath)) {\r
       *PciAddress = EFI_PCI_ADDRESS (RootBridge->BusNumber, Node.Pci->Device, Node.Pci->Function, 0);\r
       return EFI_SUCCESS;\r
     }\r
@@ -1136,7 +1192,11 @@ GetHpcPciAddressFromRootBridge (
     return EFI_NOT_FOUND;\r
   }\r
 \r
-  *PciAddress = EFI_PCI_ADDRESS (Temp->BusNumber, Temp->DeviceNumber, Temp->FunctionNumber, 0);\r
+  if (Temp != NULL) {\r
+    *PciAddress = EFI_PCI_ADDRESS (Temp->BusNumber, Temp->DeviceNumber, Temp->FunctionNumber, 0);\r
+  } else {\r
+    return EFI_NOT_FOUND;\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 \r