mirror of https://github.com/acidanthera/audk.git
OvmfPkg: PciHostBridgeDxe: factor out InitRootBridge() function
This new function incorporates the current loop body found in the entry point function, InitializePciHostBridge(). It will be called once for each root bus discovered. Cc: Jordan Justen <jordan.l.justen@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Regression-tested-by: Gabriel Somlo <somlo@cmu.edu> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17958 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
fe907a688c
commit
f5f9496c79
|
@ -76,6 +76,83 @@ PCI_HOST_BRIDGE_INSTANCE mPciHostBridgeInstanceTemplate = {
|
||||||
// Implementation
|
// Implementation
|
||||||
//
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
Allocate and initialize a root bridge.
|
||||||
|
|
||||||
|
param[in] RootBusNumber The bus number of the root bus (root bridge) to
|
||||||
|
create.
|
||||||
|
RootBusNumber is expected to fall into the valid
|
||||||
|
offset range of mResAperture.
|
||||||
|
|
||||||
|
param[in] HostBridgeHandle The EFI_HANDLE corresponding to the host bridge
|
||||||
|
that is the parent of the root bridge to create.
|
||||||
|
HostBridgeHandle is expected to have
|
||||||
|
EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
|
||||||
|
installed on it.
|
||||||
|
|
||||||
|
param[out] RootBus The private PCI_ROOT_BRIDGE_INSTANCE that has
|
||||||
|
been created as the result of the function call.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Initialization successful. A new
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL has been
|
||||||
|
created as the child of HostBridgeHandle. A
|
||||||
|
device path consisting of an ACPI device path
|
||||||
|
node, with UID = RootBusNumber, has been
|
||||||
|
installed on the same new handle.
|
||||||
|
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Memory allocation failed.
|
||||||
|
|
||||||
|
@return Error codes from
|
||||||
|
gBS->InstallMultipleProtocolInterfaces().
|
||||||
|
**/
|
||||||
|
STATIC
|
||||||
|
EFI_STATUS
|
||||||
|
InitRootBridge (
|
||||||
|
IN UINT8 RootBusNumber,
|
||||||
|
IN EFI_HANDLE HostBridgeHandle,
|
||||||
|
OUT PCI_ROOT_BRIDGE_INSTANCE **RootBus
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PCI_ROOT_BRIDGE_INSTANCE *PrivateData;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
PrivateData = AllocateZeroPool (sizeof *PrivateData);
|
||||||
|
if (PrivateData == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrivateData->Signature = PCI_ROOT_BRIDGE_SIGNATURE;
|
||||||
|
|
||||||
|
CopyMem (&PrivateData->DevicePath, &mRootBridgeDevicePathTemplate,
|
||||||
|
sizeof mRootBridgeDevicePathTemplate);
|
||||||
|
PrivateData->DevicePath.AcpiDevicePath.UID = RootBusNumber;
|
||||||
|
|
||||||
|
//
|
||||||
|
// The function call below allocates no resources and performs no actions
|
||||||
|
// that have to be rolled back on later failure. It always succeeds.
|
||||||
|
//
|
||||||
|
Status = RootBridgeConstructor (&PrivateData->Io, HostBridgeHandle,
|
||||||
|
EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM,
|
||||||
|
&mResAperture[RootBusNumber]);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
Status = gBS->InstallMultipleProtocolInterfaces (&PrivateData->Handle,
|
||||||
|
&gEfiDevicePathProtocolGuid, &PrivateData->DevicePath,
|
||||||
|
&gEfiPciRootBridgeIoProtocolGuid, &PrivateData->Io,
|
||||||
|
NULL);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto FreePrivateData;
|
||||||
|
}
|
||||||
|
|
||||||
|
*RootBus = PrivateData;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
|
FreePrivateData:
|
||||||
|
FreePool (PrivateData);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Entry point of this driver
|
Entry point of this driver
|
||||||
|
|
||||||
|
@ -94,9 +171,9 @@ InitializePciHostBridge (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Loop2;
|
UINTN RootBridgeNumber;
|
||||||
PCI_HOST_BRIDGE_INSTANCE *HostBridge;
|
PCI_HOST_BRIDGE_INSTANCE *HostBridge;
|
||||||
PCI_ROOT_BRIDGE_INSTANCE *PrivateData;
|
PCI_ROOT_BRIDGE_INSTANCE *RootBus;
|
||||||
|
|
||||||
mDriverImageHandle = ImageHandle;
|
mDriverImageHandle = ImageHandle;
|
||||||
|
|
||||||
|
@ -123,43 +200,18 @@ InitializePciHostBridge (
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
for (RootBridgeNumber = 0;
|
||||||
// Create Root Bridge Device Handle in this Host Bridge
|
RootBridgeNumber < HostBridge->RootBridgeNumber;
|
||||||
//
|
++RootBridgeNumber) {
|
||||||
|
Status = InitRootBridge (
|
||||||
for (Loop2 = 0; Loop2 < HostBridge->RootBridgeNumber; Loop2++) {
|
(UINT8)RootBridgeNumber,
|
||||||
PrivateData = AllocateZeroPool (sizeof(PCI_ROOT_BRIDGE_INSTANCE));
|
HostBridge->HostBridgeHandle,
|
||||||
if (PrivateData == NULL) {
|
&RootBus
|
||||||
return EFI_OUT_OF_RESOURCES;
|
);
|
||||||
}
|
|
||||||
|
|
||||||
PrivateData->Signature = PCI_ROOT_BRIDGE_SIGNATURE;
|
|
||||||
|
|
||||||
CopyMem (&PrivateData->DevicePath, &mRootBridgeDevicePathTemplate,
|
|
||||||
sizeof mRootBridgeDevicePathTemplate);
|
|
||||||
PrivateData->DevicePath.AcpiDevicePath.UID = Loop2;
|
|
||||||
|
|
||||||
RootBridgeConstructor (
|
|
||||||
&PrivateData->Io,
|
|
||||||
HostBridge->HostBridgeHandle,
|
|
||||||
EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM,
|
|
||||||
&mResAperture[Loop2]
|
|
||||||
);
|
|
||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces(
|
|
||||||
&PrivateData->Handle,
|
|
||||||
&gEfiDevicePathProtocolGuid,
|
|
||||||
&PrivateData->DevicePath,
|
|
||||||
&gEfiPciRootBridgeIoProtocolGuid,
|
|
||||||
&PrivateData->Io,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
FreePool(PrivateData);
|
return Status;
|
||||||
return EFI_DEVICE_ERROR;
|
|
||||||
}
|
}
|
||||||
|
InsertTailList (&HostBridge->Head, &RootBus->Link);
|
||||||
InsertTailList (&HostBridge->Head, &PrivateData->Link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue