@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
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
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
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
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
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
default:\r
break;\r
};\r
- \r
- Temp += sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) ;\r
} \r
\r
return EFI_SUCCESS;\r
}\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