]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciBusDxe / PciIo.c
index fef3eceb7f62eee18c338ee2d1dcab20b28286a6..40171f9ed5136325caf6c6dd36581822fbda4900 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   EFI PCI IO protocol functions implementation for PCI Bus module.\r
 \r
-Copyright (c) 2006 - 2017, 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
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -232,7 +226,7 @@ PciIoPollMem (
 \r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((Offset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Status  = PciIoMemRead (This, Width, BarIndex, Offset, 1, Result);\r
@@ -262,7 +256,7 @@ PciIoPollMem (
       } while (TRUE);\r
     }\r
   }\r
-  \r
+\r
   Status = PciIoDevice->PciRootBridgeIo->PollMem (\r
                                            PciIoDevice->PciRootBridgeIo,\r
                                            (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
@@ -335,7 +329,7 @@ PciIoPollIo (
 \r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((Offset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Status  = PciIoIoRead (This, Width, BarIndex, Offset, 1, Result);\r
@@ -365,7 +359,7 @@ PciIoPollIo (
       } while (TRUE);\r
     }\r
   }\r
-  \r
+\r
   Status = PciIoDevice->PciRootBridgeIo->PollIo (\r
                                            PciIoDevice->PciRootBridgeIo,\r
                                            (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
@@ -438,14 +432,14 @@ PciIoMemRead (
 \r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((Offset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Count *=  (UINTN)(1 << (Width & 0x03));\r
       Width = (EFI_PCI_IO_PROTOCOL_WIDTH) (Width & (~0x03));\r
     }\r
-  }  \r
-  \r
+  }\r
+\r
 \r
   Status = PciIoDevice->PciRootBridgeIo->Mem.Read (\r
                                               PciIoDevice->PciRootBridgeIo,\r
@@ -517,7 +511,7 @@ PciIoMemWrite (
 \r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((Offset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Count *=  (UINTN)(1 << (Width & 0x03));\r
@@ -595,13 +589,13 @@ PciIoIoRead (
 \r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((Offset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Count *=  (UINTN)(1 << (Width & 0x03));\r
       Width = (EFI_PCI_IO_PROTOCOL_WIDTH) (Width & (~0x03));\r
     }\r
-  }    \r
+  }\r
 \r
   Status = PciIoDevice->PciRootBridgeIo->Io.Read (\r
                                               PciIoDevice->PciRootBridgeIo,\r
@@ -673,13 +667,13 @@ PciIoIoWrite (
 \r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((Offset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Count *=  (UINTN)(1 << (Width & 0x03));\r
       Width = (EFI_PCI_IO_PROTOCOL_WIDTH) (Width & (~0x03));\r
     }\r
-  }  \r
+  }\r
 \r
   Status = PciIoDevice->PciRootBridgeIo->Io.Write (\r
                                               PciIoDevice->PciRootBridgeIo,\r
@@ -739,16 +733,16 @@ PciIoConfigRead (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((Offset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Count *=  (UINTN)(1 << (Width & 0x03));\r
       Width = (EFI_PCI_IO_PROTOCOL_WIDTH) (Width & (~0x03));\r
     }\r
-  }    \r
+  }\r
 \r
   Status = PciIoDevice->PciRootBridgeIo->Pci.Read (\r
                                                PciIoDevice->PciRootBridgeIo,\r
@@ -811,14 +805,14 @@ PciIoConfigWrite (
 \r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((Offset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Count *=  (UINTN)(1 << (Width & 0x03));\r
       Width = (EFI_PCI_IO_PROTOCOL_WIDTH) (Width & (~0x03));\r
     }\r
-  }  \r
-  \r
+  }\r
+\r
   Status = PciIoDevice->PciRootBridgeIo->Pci.Write (\r
                                               PciIoDevice->PciRootBridgeIo,\r
                                               (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
@@ -910,13 +904,13 @@ PciIoCopyMem (
 \r
   //\r
   // If request is not aligned, then convert request to EfiPciIoWithXXXUint8\r
-  //  \r
+  //\r
   if (FeaturePcdGet (PcdUnalignedPciIoEnable)) {\r
     if ((SrcOffset & ((1 << (Width & 0x03)) - 1)) != 0 || (DestOffset & ((1 << (Width & 0x03)) - 1)) != 0) {\r
       Count *=  (UINTN)(1 << (Width & 0x03));\r
       Width = (EFI_PCI_IO_PROTOCOL_WIDTH) (Width & (~0x03));\r
     }\r
-  }  \r
+  }\r
 \r
   Status = PciIoDevice->PciRootBridgeIo->CopyMem (\r
                                           PciIoDevice->PciRootBridgeIo,\r
@@ -1316,7 +1310,7 @@ CheckBarType (
   @param  Operation    Set or Disable.\r
 \r
   @retval  EFI_UNSUPPORTED  If root bridge does not support change attribute.\r
-  @retval  EFI_SUCCESS      Successfully set new attributs.\r
+  @retval  EFI_SUCCESS      Successfully set new attributes.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1413,13 +1407,13 @@ SupportPaletteSnoopAttributes (
   }\r
 \r
   //\r
-  // Get the boot VGA on the same segement\r
+  // Get the boot VGA on the same Host Bridge\r
   //\r
-  Temp = ActiveVGADeviceOnTheSameSegment (PciIoDevice);\r
+  Temp = LocateVgaDeviceOnHostBridge (PciIoDevice->PciRootBridgeIo->ParentHandle);\r
 \r
   if (Temp == NULL) {\r
     //\r
-    // If there is no VGA device on the segement, set\r
+    // If there is no VGA device on the segment, set\r
     // this graphics card to decode the palette range\r
     //\r
     return EFI_SUCCESS;\r
@@ -1588,7 +1582,7 @@ PciIoAttributes (
   //\r
   // Just a trick for ENABLE attribute\r
   // EFI_PCI_DEVICE_ENABLE is not defined in UEFI spec, which is the internal usage.\r
-  // So, this logic doesn't confrom to UEFI spec, which should be removed.\r
+  // So, this logic doesn't conform to UEFI spec, which should be removed.\r
   // But this trick logic is still kept for some binary drivers that depend on it.\r
   //\r
   if ((Attributes & EFI_PCI_DEVICE_ENABLE) == EFI_PCI_DEVICE_ENABLE) {\r
@@ -1668,9 +1662,9 @@ PciIoAttributes (
       //\r
       if (Operation == EfiPciIoAttributeOperationEnable) {\r
         //\r
-        // Check if there have been an active VGA device on the same segment\r
+        // Check if there have been an active VGA device on the same Host Bridge\r
         //\r
-        Temp = ActiveVGADeviceOnTheSameSegment (PciIoDevice);\r
+        Temp = LocateVgaDeviceOnHostBridge (PciIoDevice->PciRootBridgeIo->ParentHandle);\r
         if (Temp != NULL && Temp != PciIoDevice) {\r
           //\r
           // An active VGA has been detected, so can not enable another\r
@@ -1725,7 +1719,7 @@ PciIoAttributes (
     Command |= EFI_PCI_COMMAND_BUS_MASTER;\r
   }\r
   //\r
-  // The upstream bridge should be also set to revelant attribute\r
+  // The upstream bridge should be also set to relevant attribute\r
   // expect for IO, Mem and BusMaster\r
   //\r
   UpStreamAttributes = Attributes &\r
@@ -1790,7 +1784,7 @@ PciIoAttributes (
   @param AddrRangeMin    The base address of the MMIO.\r
   @param AddrLen         The length of the MMIO.\r
 \r
-  @retval The AddrTranslationOffset from RootBridgeIo for the \r
+  @retval The AddrTranslationOffset from RootBridgeIo for the\r
           specified range, or (UINT64) -1 if the range is not\r
           found in RootBridgeIo.\r
 **/\r
@@ -1911,7 +1905,7 @@ PciIoGetBarAttributes (
 \r
     case PciBarTypePMem32:\r
       //\r
-      // prefechable\r
+      // prefetchable\r
       //\r
       Descriptor->SpecificFlag = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE;\r
       //\r
@@ -1930,7 +1924,7 @@ PciIoGetBarAttributes (
 \r
     case PciBarTypePMem64:\r
       //\r
-      // prefechable\r
+      // prefetchable\r
       //\r
       Descriptor->SpecificFlag = EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE;\r
       //\r
@@ -1972,6 +1966,10 @@ PciIoGetBarAttributes (
         return EFI_UNSUPPORTED;\r
       }\r
     }\r
+\r
+    // According to UEFI spec 2.7, we need return host address for\r
+    // PciIo->GetBarAttributes, and host address = device address - translation.\r
+    Descriptor->AddrRangeMin -= Descriptor->AddrTranslationOffset;\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -2038,7 +2036,7 @@ PciIoSetBarAttributes (
     return EFI_UNSUPPORTED;\r
   }\r
   //\r
-  // Attributes must be supported.  Make sure the BAR range describd by BarIndex, Offset, and\r
+  // Attributes must be supported.  Make sure the BAR range described by BarIndex, Offset, and\r
   // Length are valid for this PCI device.\r
   //\r
   NonRelativeOffset = *Offset;\r
@@ -2057,47 +2055,6 @@ PciIoSetBarAttributes (
   return EFI_SUCCESS;\r
 }\r
 \r
-/**\r
-  Program parent bridge's attribute recurrently.\r
-\r
-  @param PciIoDevice  Child Pci device instance\r
-  @param Operation    The operation to perform on the attributes for this PCI controller.\r
-  @param Attributes   The mask of attributes that are used for Set, Enable, and Disable\r
-                      operations.\r
-\r
-  @retval EFI_SUCCESS           The operation on the PCI controller's attributes was completed.\r
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
-  @retval EFI_UNSUPPORTED       one or more of the bits set in\r
-                                Attributes are not supported by this PCI controller or one of\r
-                                its parent bridges when Operation is Set, Enable or Disable.\r
-\r
-**/\r
-EFI_STATUS\r
-UpStreamBridgesAttributes (\r
-  IN PCI_IO_DEVICE                            *PciIoDevice,\r
-  IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION  Operation,\r
-  IN UINT64                                   Attributes\r
-  )\r
-{\r
-  PCI_IO_DEVICE       *Parent;\r
-  EFI_PCI_IO_PROTOCOL *PciIo;\r
-\r
-  Parent = PciIoDevice->Parent;\r
-\r
-  while (Parent != NULL && IS_PCI_BRIDGE (&Parent->Pci)) {\r
-\r
-    //\r
-    // Get the PciIo Protocol\r
-    //\r
-    PciIo = &Parent->PciIo;\r
-\r
-    PciIo->Attributes (PciIo, Operation, Attributes, NULL);\r
-\r
-    Parent = Parent->Parent;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
 \r
 /**\r
   Test whether two Pci devices has same parent bridge.\r