]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridge.c
OvmfPkg/XenBusDxe: Fix build issue with VS2010
[mirror_edk2.git] / ArmPlatformPkg / ArmVirtualizationPkg / PciHostBridgeDxe / PciHostBridge.c
index ced7528a2ea49fa932fc68438b4ab500f895f8d3..6332f79cbc533a73d65dddc50980472b252a1fd7 100644 (file)
@@ -85,6 +85,7 @@ PCI_HOST_BRIDGE_INSTANCE mPciHostBridgeInstanceTemplate = {
   @param ImageHandle     Handle of driver image\r
   @param SystemTable     Point to EFI_SYSTEM_TABLE\r
 \r
+  @retval EFI_ABORTED           PCI host bridge not present\r
   @retval EFI_OUT_OF_RESOURCES  Can not allocate memory resource\r
   @retval EFI_DEVICE_ERROR      Can not install the protocol instance\r
   @retval EFI_SUCCESS           Success to initialize the Pci host bridge.\r
@@ -96,12 +97,18 @@ InitializePciHostBridge (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
+  UINT64                      MmioAttributes;\r
   EFI_STATUS                  Status;\r
   UINTN                       Loop1;\r
   UINTN                       Loop2;\r
   PCI_HOST_BRIDGE_INSTANCE    *HostBridge;\r
   PCI_ROOT_BRIDGE_INSTANCE    *PrivateData;\r
  \r
+  if (PcdGet64 (PcdPciExpressBaseAddress) == 0) {\r
+    DEBUG ((EFI_D_INFO, "%a: PCI host bridge not present\n", __FUNCTION__));\r
+    return EFI_ABORTED;\r
+  }\r
+\r
   mDriverImageHandle = ImageHandle;\r
   \r
   mResAperture[0][0].BusBase  = PcdGet32 (PcdPciBusMin);\r
@@ -116,6 +123,42 @@ InitializePciHostBridge (
                                      PcdGet64 (PcdPciIoSize) - 1;\r
   mResAperture[0][0].IoTranslation = PcdGet64 (PcdPciIoTranslation);\r
 \r
+  //\r
+  // Add IO and MMIO memory space, so that resources can be allocated in the\r
+  // EfiPciHostBridgeAllocateResources phase.\r
+  //\r
+  Status = gDS->AddIoSpace (\r
+                  EfiGcdIoTypeIo,\r
+                  PcdGet64 (PcdPciIoBase),\r
+                  PcdGet64 (PcdPciIoSize)\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  MmioAttributes = FeaturePcdGet (PcdKludgeMapPciMmioAsCached) ?\r
+                   EFI_MEMORY_WB : EFI_MEMORY_UC;\r
+\r
+  Status = gDS->AddMemorySpace (\r
+                  EfiGcdMemoryTypeMemoryMappedIo,\r
+                  PcdGet32 (PcdPciMmio32Base),\r
+                  PcdGet32 (PcdPciMmio32Size),\r
+                  MmioAttributes\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "%a: AddMemorySpace: %r\n", __FUNCTION__, Status));\r
+    return Status;\r
+  }\r
+\r
+  Status = gDS->SetMemorySpaceAttributes (\r
+                  PcdGet32 (PcdPciMmio32Base),\r
+                  PcdGet32 (PcdPciMmio32Size),\r
+                  MmioAttributes\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "%a: SetMemorySpaceAttributes: %r\n", __FUNCTION__,\r
+      Status));\r
+    return Status;\r
+  }\r
+\r
   //\r
   // Create Host Bridge Device Handle\r
   //\r
@@ -346,8 +389,9 @@ NotifyPhase(
                   BitsOfAlignment = 0;\r
                 }\r
                   \r
+                BaseAddress = mResAperture[0][0].IoLimit;\r
                 Status = gDS->AllocateIoSpace (\r
-                                EfiGcdAllocateAnySearchBottomUp, \r
+                                EfiGcdAllocateMaxAddressSearchTopDown,\r
                                 EfiGcdIoTypeIo, \r
                                 BitsOfAlignment,\r
                                 AddrLen,\r
@@ -379,8 +423,9 @@ NotifyPhase(
                   BitsOfAlignment = 0;\r
                 }\r
                   \r
+                BaseAddress = mResAperture[0][0].MemLimit;\r
                 Status = gDS->AllocateMemorySpace (\r
-                                EfiGcdAllocateAnySearchBottomUp, \r
+                                EfiGcdAllocateMaxAddressSearchTopDown,\r
                                 EfiGcdMemoryTypeMemoryMappedIo, \r
                                 BitsOfAlignment,\r
                                 AddrLen,\r
@@ -884,12 +929,19 @@ SubmitResources(
   while (List != &HostBridgeInstance->Head) {\r
     RootBridgeInstance = DRIVER_INSTANCE_FROM_LIST_ENTRY (List);\r
     if (RootBridgeHandle == RootBridgeInstance->Handle) {\r
-      while ( *Temp == 0x8A) {\r
+      for (;\r
+           *Temp == 0x8A;\r
+           Temp += sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR)\r
+           ) {\r
         Ptr = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Temp ;\r
 \r
         //\r
         // Check Address Length\r
         //\r
+        if (Ptr->AddrLen == 0) {\r
+          HostBridgeInstance->ResourceSubmited = TRUE;\r
+          continue;\r
+        }\r
         if (Ptr->AddrLen > 0xffffffff) {\r
           return EFI_INVALID_PARAMETER;\r
         }\r
@@ -957,8 +1009,6 @@ SubmitResources(
         default:\r
             break;\r
         };\r
-    \r
-        Temp += sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) ;\r
       } \r
       \r
       return EFI_SUCCESS;\r
@@ -1029,7 +1079,15 @@ GetProposedResources(
       }\r
       \r
       if (Number ==  0) {\r
-        return EFI_INVALID_PARAMETER;\r
+        EFI_ACPI_END_TAG_DESCRIPTOR *End;\r
+\r
+        End = AllocateZeroPool (sizeof *End);\r
+        if (End == NULL) {\r
+          return EFI_OUT_OF_RESOURCES;\r
+        }\r
+        End->Desc = ACPI_END_TAG_DESCRIPTOR;\r
+        *Configuration = End;\r
+        return EFI_SUCCESS;\r
       }\r
 \r
       Buffer = AllocateZeroPool (Number * sizeof(EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) + sizeof(EFI_ACPI_END_TAG_DESCRIPTOR));\r