mirror of https://github.com/acidanthera/audk.git
OvmfPkg/PciHostBridgeLib: Extract InitRootBridge() / UninitRootBridge()
Extract InitRootBridge() / UninitRootBridge() to PciHostBridgeUtilityLib as common utility functions. No change of functionality. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3059 Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Cc: Anthony Perard <anthony.perard@citrix.com> Cc: Julien Grall <julien@xen.org> Signed-off-by: Jiahui Cen <cenjiahui@huawei.com> Signed-off-by: Yubo Miao <miaoyubo@huawei.com> Message-Id: <20210119011302.10908-5-cenjiahui@huawei.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
parent
517055d298
commit
7ac1f28d4d
|
@ -14,6 +14,83 @@
|
||||||
#define __PCI_HOST_BRIDGE_UTILITY_LIB_H__
|
#define __PCI_HOST_BRIDGE_UTILITY_LIB_H__
|
||||||
|
|
||||||
|
|
||||||
|
#include <Library/PciHostBridgeLib.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Utility function to initialize a PCI_ROOT_BRIDGE structure.
|
||||||
|
|
||||||
|
@param[in] Supports Supported attributes.
|
||||||
|
|
||||||
|
@param[in] Attributes Initial attributes.
|
||||||
|
|
||||||
|
@param[in] AllocAttributes Allocation attributes.
|
||||||
|
|
||||||
|
@param[in] RootBusNumber The bus number to store in RootBus.
|
||||||
|
|
||||||
|
@param[in] MaxSubBusNumber The inclusive maximum bus number that can be
|
||||||
|
assigned to any subordinate bus found behind any
|
||||||
|
PCI bridge hanging off this root bus.
|
||||||
|
|
||||||
|
The caller is repsonsible for ensuring that
|
||||||
|
RootBusNumber <= MaxSubBusNumber. If
|
||||||
|
RootBusNumber equals MaxSubBusNumber, then the
|
||||||
|
root bus has no room for subordinate buses.
|
||||||
|
|
||||||
|
@param[in] Io IO aperture.
|
||||||
|
|
||||||
|
@param[in] Mem MMIO aperture.
|
||||||
|
|
||||||
|
@param[in] MemAbove4G MMIO aperture above 4G.
|
||||||
|
|
||||||
|
@param[in] PMem Prefetchable MMIO aperture.
|
||||||
|
|
||||||
|
@param[in] PMemAbove4G Prefetchable MMIO aperture above 4G.
|
||||||
|
|
||||||
|
@param[out] RootBus The PCI_ROOT_BRIDGE structure (allocated by the
|
||||||
|
caller) that should be filled in by this
|
||||||
|
function.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Initialization successful. A device path
|
||||||
|
consisting of an ACPI device path node, with
|
||||||
|
UID = RootBusNumber, has been allocated and
|
||||||
|
linked into RootBus.
|
||||||
|
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Memory allocation failed.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
PciHostBridgeUtilityInitRootBridge (
|
||||||
|
IN UINT64 Supports,
|
||||||
|
IN UINT64 Attributes,
|
||||||
|
IN UINT64 AllocAttributes,
|
||||||
|
IN UINT8 RootBusNumber,
|
||||||
|
IN UINT8 MaxSubBusNumber,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *Io,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *PMem,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G,
|
||||||
|
OUT PCI_ROOT_BRIDGE *RootBus
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Utility function to uninitialize a PCI_ROOT_BRIDGE structure set up with
|
||||||
|
PciHostBridgeUtilityInitRootBridge().
|
||||||
|
|
||||||
|
@param[in] RootBus The PCI_ROOT_BRIDGE structure, allocated by the caller and
|
||||||
|
initialized with PciHostBridgeUtilityInitRootBridge(),
|
||||||
|
that should be uninitialized. This function doesn't free
|
||||||
|
RootBus.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
PciHostBridgeUtilityUninitRootBridge (
|
||||||
|
IN PCI_ROOT_BRIDGE *RootBus
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Utility function to inform the platform that the resource conflict happens.
|
Utility function to inform the platform that the resource conflict happens.
|
||||||
|
|
||||||
|
|
|
@ -11,59 +11,3 @@ PCI_ROOT_BRIDGE *
|
||||||
ScanForRootBridges (
|
ScanForRootBridges (
|
||||||
UINTN *NumberOfRootBridges
|
UINTN *NumberOfRootBridges
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
Initialize a PCI_ROOT_BRIDGE structure.
|
|
||||||
|
|
||||||
@param[in] Supports Supported attributes.
|
|
||||||
|
|
||||||
@param[in] Attributes Initial attributes.
|
|
||||||
|
|
||||||
@param[in] AllocAttributes Allocation attributes.
|
|
||||||
|
|
||||||
@param[in] RootBusNumber The bus number to store in RootBus.
|
|
||||||
|
|
||||||
@param[in] MaxSubBusNumber The inclusive maximum bus number that can be
|
|
||||||
assigned to any subordinate bus found behind any
|
|
||||||
PCI bridge hanging off this root bus.
|
|
||||||
|
|
||||||
The caller is repsonsible for ensuring that
|
|
||||||
RootBusNumber <= MaxSubBusNumber. If
|
|
||||||
RootBusNumber equals MaxSubBusNumber, then the
|
|
||||||
root bus has no room for subordinate buses.
|
|
||||||
|
|
||||||
@param[in] Io IO aperture.
|
|
||||||
|
|
||||||
@param[in] Mem MMIO aperture.
|
|
||||||
|
|
||||||
@param[in] MemAbove4G MMIO aperture above 4G.
|
|
||||||
|
|
||||||
@param[in] PMem Prefetchable MMIO aperture.
|
|
||||||
|
|
||||||
@param[in] PMemAbove4G Prefetchable MMIO aperture above 4G.
|
|
||||||
|
|
||||||
@param[out] RootBus The PCI_ROOT_BRIDGE structure (allocated by the
|
|
||||||
caller) that should be filled in by this
|
|
||||||
function.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS Initialization successful. A device path
|
|
||||||
consisting of an ACPI device path node, with
|
|
||||||
UID = RootBusNumber, has been allocated and
|
|
||||||
linked into RootBus.
|
|
||||||
|
|
||||||
@retval EFI_OUT_OF_RESOURCES Memory allocation failed.
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
InitRootBridge (
|
|
||||||
IN UINT64 Supports,
|
|
||||||
IN UINT64 Attributes,
|
|
||||||
IN UINT64 AllocAttributes,
|
|
||||||
IN UINT8 RootBusNumber,
|
|
||||||
IN UINT8 MaxSubBusNumber,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *Io,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *PMem,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G,
|
|
||||||
OUT PCI_ROOT_BRIDGE *RootBus
|
|
||||||
);
|
|
||||||
|
|
|
@ -10,14 +10,12 @@
|
||||||
#include <PiDxe.h>
|
#include <PiDxe.h>
|
||||||
|
|
||||||
#include <IndustryStandard/Pci.h>
|
#include <IndustryStandard/Pci.h>
|
||||||
#include <IndustryStandard/Q35MchIch9.h>
|
|
||||||
|
|
||||||
#include <Protocol/PciHostBridgeResourceAllocation.h>
|
#include <Protocol/PciHostBridgeResourceAllocation.h>
|
||||||
#include <Protocol/PciRootBridgeIo.h>
|
#include <Protocol/PciRootBridgeIo.h>
|
||||||
|
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/DevicePathLib.h>
|
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/PciHostBridgeLib.h>
|
#include <Library/PciHostBridgeLib.h>
|
||||||
|
@ -27,156 +25,8 @@
|
||||||
#include "PciHostBridge.h"
|
#include "PciHostBridge.h"
|
||||||
|
|
||||||
|
|
||||||
#pragma pack(1)
|
|
||||||
typedef struct {
|
|
||||||
ACPI_HID_DEVICE_PATH AcpiDevicePath;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
|
|
||||||
} OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH;
|
|
||||||
#pragma pack ()
|
|
||||||
|
|
||||||
|
|
||||||
STATIC
|
|
||||||
CONST
|
|
||||||
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {
|
|
||||||
{
|
|
||||||
{
|
|
||||||
ACPI_DEVICE_PATH,
|
|
||||||
ACPI_DP,
|
|
||||||
{
|
|
||||||
(UINT8) (sizeof(ACPI_HID_DEVICE_PATH)),
|
|
||||||
(UINT8) ((sizeof(ACPI_HID_DEVICE_PATH)) >> 8)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
EISA_PNP_ID(0x0A03), // HID
|
|
||||||
0 // UID
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
END_DEVICE_PATH_TYPE,
|
|
||||||
END_ENTIRE_DEVICE_PATH_SUBTYPE,
|
|
||||||
{
|
|
||||||
END_DEVICE_PATH_LENGTH,
|
|
||||||
0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 };
|
STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 };
|
||||||
|
|
||||||
/**
|
|
||||||
Initialize a PCI_ROOT_BRIDGE structure.
|
|
||||||
|
|
||||||
@param[in] Supports Supported attributes.
|
|
||||||
|
|
||||||
@param[in] Attributes Initial attributes.
|
|
||||||
|
|
||||||
@param[in] AllocAttributes Allocation attributes.
|
|
||||||
|
|
||||||
@param[in] RootBusNumber The bus number to store in RootBus.
|
|
||||||
|
|
||||||
@param[in] MaxSubBusNumber The inclusive maximum bus number that can be
|
|
||||||
assigned to any subordinate bus found behind any
|
|
||||||
PCI bridge hanging off this root bus.
|
|
||||||
|
|
||||||
The caller is repsonsible for ensuring that
|
|
||||||
RootBusNumber <= MaxSubBusNumber. If
|
|
||||||
RootBusNumber equals MaxSubBusNumber, then the
|
|
||||||
root bus has no room for subordinate buses.
|
|
||||||
|
|
||||||
@param[in] Io IO aperture.
|
|
||||||
|
|
||||||
@param[in] Mem MMIO aperture.
|
|
||||||
|
|
||||||
@param[in] MemAbove4G MMIO aperture above 4G.
|
|
||||||
|
|
||||||
@param[in] PMem Prefetchable MMIO aperture.
|
|
||||||
|
|
||||||
@param[in] PMemAbove4G Prefetchable MMIO aperture above 4G.
|
|
||||||
|
|
||||||
@param[out] RootBus The PCI_ROOT_BRIDGE structure (allocated by the
|
|
||||||
caller) that should be filled in by this
|
|
||||||
function.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS Initialization successful. A device path
|
|
||||||
consisting of an ACPI device path node, with
|
|
||||||
UID = RootBusNumber, has been allocated and
|
|
||||||
linked into RootBus.
|
|
||||||
|
|
||||||
@retval EFI_OUT_OF_RESOURCES Memory allocation failed.
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
InitRootBridge (
|
|
||||||
IN UINT64 Supports,
|
|
||||||
IN UINT64 Attributes,
|
|
||||||
IN UINT64 AllocAttributes,
|
|
||||||
IN UINT8 RootBusNumber,
|
|
||||||
IN UINT8 MaxSubBusNumber,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *Io,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *PMem,
|
|
||||||
IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G,
|
|
||||||
OUT PCI_ROOT_BRIDGE *RootBus
|
|
||||||
)
|
|
||||||
{
|
|
||||||
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Be safe if other fields are added to PCI_ROOT_BRIDGE later.
|
|
||||||
//
|
|
||||||
ZeroMem (RootBus, sizeof *RootBus);
|
|
||||||
|
|
||||||
RootBus->Segment = 0;
|
|
||||||
|
|
||||||
RootBus->Supports = Supports;
|
|
||||||
RootBus->Attributes = Attributes;
|
|
||||||
|
|
||||||
RootBus->DmaAbove4G = FALSE;
|
|
||||||
|
|
||||||
RootBus->AllocationAttributes = AllocAttributes;
|
|
||||||
RootBus->Bus.Base = RootBusNumber;
|
|
||||||
RootBus->Bus.Limit = MaxSubBusNumber;
|
|
||||||
CopyMem (&RootBus->Io, Io, sizeof (*Io));
|
|
||||||
CopyMem (&RootBus->Mem, Mem, sizeof (*Mem));
|
|
||||||
CopyMem (&RootBus->MemAbove4G, MemAbove4G, sizeof (*MemAbove4G));
|
|
||||||
CopyMem (&RootBus->PMem, PMem, sizeof (*PMem));
|
|
||||||
CopyMem (&RootBus->PMemAbove4G, PMemAbove4G, sizeof (*PMemAbove4G));
|
|
||||||
|
|
||||||
RootBus->NoExtendedConfigSpace = (PcdGet16 (PcdOvmfHostBridgePciDevId) !=
|
|
||||||
INTEL_Q35_MCH_DEVICE_ID);
|
|
||||||
|
|
||||||
DevicePath = AllocateCopyPool (sizeof mRootBridgeDevicePathTemplate,
|
|
||||||
&mRootBridgeDevicePathTemplate);
|
|
||||||
if (DevicePath == NULL) {
|
|
||||||
DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, EFI_OUT_OF_RESOURCES));
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
DevicePath->AcpiDevicePath.UID = RootBusNumber;
|
|
||||||
RootBus->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)DevicePath;
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO,
|
|
||||||
"%a: populated root bus %d, with room for %d subordinate bus(es)\n",
|
|
||||||
__FUNCTION__, RootBusNumber, MaxSubBusNumber - RootBusNumber));
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Uninitialize a PCI_ROOT_BRIDGE structure set up with InitRootBridge().
|
|
||||||
|
|
||||||
param[in] RootBus The PCI_ROOT_BRIDGE structure, allocated by the caller and
|
|
||||||
initialized with InitRootBridge(), that should be
|
|
||||||
uninitialized. This function doesn't free RootBus.
|
|
||||||
**/
|
|
||||||
STATIC
|
|
||||||
VOID
|
|
||||||
UninitRootBridge (
|
|
||||||
IN PCI_ROOT_BRIDGE *RootBus
|
|
||||||
)
|
|
||||||
{
|
|
||||||
FreePool (RootBus->DevicePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Return all the root bridge instances in an array.
|
Return all the root bridge instances in an array.
|
||||||
|
@ -297,7 +147,7 @@ PciHostBridgeGetRootBridges (
|
||||||
// because now we know how big a bus number range *that* one has, for any
|
// because now we know how big a bus number range *that* one has, for any
|
||||||
// subordinate buses that might exist behind PCI bridges hanging off it.
|
// subordinate buses that might exist behind PCI bridges hanging off it.
|
||||||
//
|
//
|
||||||
Status = InitRootBridge (
|
Status = PciHostBridgeUtilityInitRootBridge (
|
||||||
Attributes,
|
Attributes,
|
||||||
Attributes,
|
Attributes,
|
||||||
AllocationAttributes,
|
AllocationAttributes,
|
||||||
|
@ -322,7 +172,7 @@ PciHostBridgeGetRootBridges (
|
||||||
// Install the last root bus (which might be the only, ie. main, root bus, if
|
// Install the last root bus (which might be the only, ie. main, root bus, if
|
||||||
// we've found no extra root buses).
|
// we've found no extra root buses).
|
||||||
//
|
//
|
||||||
Status = InitRootBridge (
|
Status = PciHostBridgeUtilityInitRootBridge (
|
||||||
Attributes,
|
Attributes,
|
||||||
Attributes,
|
Attributes,
|
||||||
AllocationAttributes,
|
AllocationAttributes,
|
||||||
|
@ -346,7 +196,7 @@ PciHostBridgeGetRootBridges (
|
||||||
FreeBridges:
|
FreeBridges:
|
||||||
while (Initialized > 0) {
|
while (Initialized > 0) {
|
||||||
--Initialized;
|
--Initialized;
|
||||||
UninitRootBridge (&Bridges[Initialized]);
|
PciHostBridgeUtilityUninitRootBridge (&Bridges[Initialized]);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Bridges);
|
FreePool (Bridges);
|
||||||
|
@ -375,7 +225,7 @@ PciHostBridgeFreeRootBridges (
|
||||||
|
|
||||||
do {
|
do {
|
||||||
--Count;
|
--Count;
|
||||||
UninitRootBridge (&Bridges[Count]);
|
PciHostBridgeUtilityUninitRootBridge (&Bridges[Count]);
|
||||||
} while (Count > 0);
|
} while (Count > 0);
|
||||||
|
|
||||||
FreePool (Bridges);
|
FreePool (Bridges);
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
BaseMemoryLib
|
BaseMemoryLib
|
||||||
DebugLib
|
DebugLib
|
||||||
DevicePathLib
|
|
||||||
MemoryAllocationLib
|
MemoryAllocationLib
|
||||||
PcdLib
|
PcdLib
|
||||||
PciHostBridgeUtilityLib
|
PciHostBridgeUtilityLib
|
||||||
|
@ -51,5 +50,4 @@
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio32Size
|
gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio32Size
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Base
|
gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Base
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Size
|
gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Size
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
|
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration
|
gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/PciHostBridgeLib.h>
|
#include <Library/PciHostBridgeLib.h>
|
||||||
|
#include <Library/PciHostBridgeUtilityLib.h>
|
||||||
#include <Library/PciLib.h>
|
#include <Library/PciLib.h>
|
||||||
#include "PciHostBridge.h"
|
#include "PciHostBridge.h"
|
||||||
|
|
||||||
|
@ -453,7 +454,7 @@ ScanForRootBridges (
|
||||||
RootBridges
|
RootBridges
|
||||||
);
|
);
|
||||||
ASSERT (RootBridges != NULL);
|
ASSERT (RootBridges != NULL);
|
||||||
InitRootBridge (
|
PciHostBridgeUtilityInitRootBridge (
|
||||||
Attributes, Attributes, 0,
|
Attributes, Attributes, 0,
|
||||||
(UINT8) PrimaryBus, (UINT8) SubBus,
|
(UINT8) PrimaryBus, (UINT8) SubBus,
|
||||||
&Io, &Mem, &MemAbove4G, &mNonExistAperture, &mNonExistAperture,
|
&Io, &Mem, &MemAbove4G, &mNonExistAperture, &mNonExistAperture,
|
||||||
|
|
|
@ -11,16 +11,174 @@
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <IndustryStandard/Acpi10.h>
|
#include <IndustryStandard/Acpi10.h>
|
||||||
|
#include <IndustryStandard/Q35MchIch9.h>
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/DevicePathLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/PciHostBridgeUtilityLib.h>
|
#include <Library/PciHostBridgeUtilityLib.h>
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
typedef struct {
|
||||||
|
ACPI_HID_DEVICE_PATH AcpiDevicePath;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
|
||||||
|
} OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH;
|
||||||
|
#pragma pack ()
|
||||||
|
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
CHAR16 *mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[] = {
|
CHAR16 *mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[] = {
|
||||||
L"Mem", L"I/O", L"Bus"
|
L"Mem", L"I/O", L"Bus"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
STATIC
|
||||||
|
CONST
|
||||||
|
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {
|
||||||
|
{
|
||||||
|
{
|
||||||
|
ACPI_DEVICE_PATH,
|
||||||
|
ACPI_DP,
|
||||||
|
{
|
||||||
|
(UINT8) (sizeof(ACPI_HID_DEVICE_PATH)),
|
||||||
|
(UINT8) ((sizeof(ACPI_HID_DEVICE_PATH)) >> 8)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
EISA_PNP_ID(0x0A03), // HID
|
||||||
|
0 // UID
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
END_DEVICE_PATH_TYPE,
|
||||||
|
END_ENTIRE_DEVICE_PATH_SUBTYPE,
|
||||||
|
{
|
||||||
|
END_DEVICE_PATH_LENGTH,
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Utility function to initialize a PCI_ROOT_BRIDGE structure.
|
||||||
|
|
||||||
|
@param[in] Supports Supported attributes.
|
||||||
|
|
||||||
|
@param[in] Attributes Initial attributes.
|
||||||
|
|
||||||
|
@param[in] AllocAttributes Allocation attributes.
|
||||||
|
|
||||||
|
@param[in] RootBusNumber The bus number to store in RootBus.
|
||||||
|
|
||||||
|
@param[in] MaxSubBusNumber The inclusive maximum bus number that can be
|
||||||
|
assigned to any subordinate bus found behind any
|
||||||
|
PCI bridge hanging off this root bus.
|
||||||
|
|
||||||
|
The caller is repsonsible for ensuring that
|
||||||
|
RootBusNumber <= MaxSubBusNumber. If
|
||||||
|
RootBusNumber equals MaxSubBusNumber, then the
|
||||||
|
root bus has no room for subordinate buses.
|
||||||
|
|
||||||
|
@param[in] Io IO aperture.
|
||||||
|
|
||||||
|
@param[in] Mem MMIO aperture.
|
||||||
|
|
||||||
|
@param[in] MemAbove4G MMIO aperture above 4G.
|
||||||
|
|
||||||
|
@param[in] PMem Prefetchable MMIO aperture.
|
||||||
|
|
||||||
|
@param[in] PMemAbove4G Prefetchable MMIO aperture above 4G.
|
||||||
|
|
||||||
|
@param[out] RootBus The PCI_ROOT_BRIDGE structure (allocated by the
|
||||||
|
caller) that should be filled in by this
|
||||||
|
function.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Initialization successful. A device path
|
||||||
|
consisting of an ACPI device path node, with
|
||||||
|
UID = RootBusNumber, has been allocated and
|
||||||
|
linked into RootBus.
|
||||||
|
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Memory allocation failed.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
PciHostBridgeUtilityInitRootBridge (
|
||||||
|
IN UINT64 Supports,
|
||||||
|
IN UINT64 Attributes,
|
||||||
|
IN UINT64 AllocAttributes,
|
||||||
|
IN UINT8 RootBusNumber,
|
||||||
|
IN UINT8 MaxSubBusNumber,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *Io,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *PMem,
|
||||||
|
IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G,
|
||||||
|
OUT PCI_ROOT_BRIDGE *RootBus
|
||||||
|
)
|
||||||
|
{
|
||||||
|
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Be safe if other fields are added to PCI_ROOT_BRIDGE later.
|
||||||
|
//
|
||||||
|
ZeroMem (RootBus, sizeof *RootBus);
|
||||||
|
|
||||||
|
RootBus->Segment = 0;
|
||||||
|
|
||||||
|
RootBus->Supports = Supports;
|
||||||
|
RootBus->Attributes = Attributes;
|
||||||
|
|
||||||
|
RootBus->DmaAbove4G = FALSE;
|
||||||
|
|
||||||
|
RootBus->AllocationAttributes = AllocAttributes;
|
||||||
|
RootBus->Bus.Base = RootBusNumber;
|
||||||
|
RootBus->Bus.Limit = MaxSubBusNumber;
|
||||||
|
CopyMem (&RootBus->Io, Io, sizeof (*Io));
|
||||||
|
CopyMem (&RootBus->Mem, Mem, sizeof (*Mem));
|
||||||
|
CopyMem (&RootBus->MemAbove4G, MemAbove4G, sizeof (*MemAbove4G));
|
||||||
|
CopyMem (&RootBus->PMem, PMem, sizeof (*PMem));
|
||||||
|
CopyMem (&RootBus->PMemAbove4G, PMemAbove4G, sizeof (*PMemAbove4G));
|
||||||
|
|
||||||
|
RootBus->NoExtendedConfigSpace = (PcdGet16 (PcdOvmfHostBridgePciDevId) !=
|
||||||
|
INTEL_Q35_MCH_DEVICE_ID);
|
||||||
|
|
||||||
|
DevicePath = AllocateCopyPool (sizeof mRootBridgeDevicePathTemplate,
|
||||||
|
&mRootBridgeDevicePathTemplate);
|
||||||
|
if (DevicePath == NULL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, EFI_OUT_OF_RESOURCES));
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
DevicePath->AcpiDevicePath.UID = RootBusNumber;
|
||||||
|
RootBus->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)DevicePath;
|
||||||
|
|
||||||
|
DEBUG ((DEBUG_INFO,
|
||||||
|
"%a: populated root bus %d, with room for %d subordinate bus(es)\n",
|
||||||
|
__FUNCTION__, RootBusNumber, MaxSubBusNumber - RootBusNumber));
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Utility function to uninitialize a PCI_ROOT_BRIDGE structure set up with
|
||||||
|
PciHostBridgeUtilityInitRootBridge().
|
||||||
|
|
||||||
|
@param[in] RootBus The PCI_ROOT_BRIDGE structure, allocated by the caller and
|
||||||
|
initialized with PciHostBridgeUtilityInitRootBridge(),
|
||||||
|
that should be uninitialized. This function doesn't free
|
||||||
|
RootBus.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
PciHostBridgeUtilityUninitRootBridge (
|
||||||
|
IN PCI_ROOT_BRIDGE *RootBus
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FreePool (RootBus->DevicePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Utility function to inform the platform that the resource conflict happens.
|
Utility function to inform the platform that the resource conflict happens.
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,16 @@
|
||||||
PciHostBridgeUtilityLib.c
|
PciHostBridgeUtilityLib.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
OvmfPkg/OvmfPkg.dec
|
OvmfPkg/OvmfPkg.dec
|
||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
|
BaseMemoryLib
|
||||||
DebugLib
|
DebugLib
|
||||||
|
DevicePathLib
|
||||||
|
MemoryAllocationLib
|
||||||
|
PcdLib
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
|
||||||
|
|
Loading…
Reference in New Issue