mirror of https://github.com/acidanthera/audk.git
OvmfPkg: Introduce PciHostBridgeUtilityLib class
Introduce a new PciHostBridgeUtilityLib class to share duplicate code between OvmfPkg and ArmVirtPkg. Extract function PciHostBridgeUtilityResourceConflict from PciHostBridgeResourceConflict in OvmfPkg/PciHostBridgeLib. 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: Rebecca Cran <rebecca@bsdio.com> Cc: Peter Grehan <grehan@freebsd.org> 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> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20210119011302.10908-2-cenjiahui@huawei.com>
This commit is contained in:
parent
ca272b9513
commit
7a6172f88b
|
@ -670,6 +670,7 @@
|
||||||
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
||||||
<LibraryClasses>
|
<LibraryClasses>
|
||||||
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
||||||
|
PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
|
||||||
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
||||||
}
|
}
|
||||||
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
||||||
|
|
|
@ -663,6 +663,7 @@
|
||||||
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
||||||
<LibraryClasses>
|
<LibraryClasses>
|
||||||
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
||||||
|
PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
|
||||||
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
||||||
}
|
}
|
||||||
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/** @file
|
||||||
|
Provide common utility functions to PciHostBridgeLib instances in
|
||||||
|
ArmVirtPkg and OvmfPkg.
|
||||||
|
|
||||||
|
Copyright (C) 2016, Red Hat, Inc.
|
||||||
|
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
|
||||||
|
Copyright (c) 2020, Huawei Corporation. All rights reserved.<BR>
|
||||||
|
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef __PCI_HOST_BRIDGE_UTILITY_LIB_H__
|
||||||
|
#define __PCI_HOST_BRIDGE_UTILITY_LIB_H__
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Utility function to inform the platform that the resource conflict happens.
|
||||||
|
|
||||||
|
@param[in] Configuration Pointer to PCI I/O and PCI memory resource
|
||||||
|
descriptors. The Configuration contains the
|
||||||
|
resources for all the root bridges. The resource
|
||||||
|
for each root bridge is terminated with END
|
||||||
|
descriptor and an additional END is appended
|
||||||
|
indicating the end of the entire resources. The
|
||||||
|
resource descriptor field values follow the
|
||||||
|
description in
|
||||||
|
EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
|
||||||
|
.SubmitResources().
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
PciHostBridgeUtilityResourceConflict (
|
||||||
|
IN VOID *Configuration
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __PCI_HOST_BRIDGE_UTILITY_LIB_H__
|
|
@ -20,6 +20,7 @@
|
||||||
#include <Library/DevicePathLib.h>
|
#include <Library/DevicePathLib.h>
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/PciHostBridgeLib.h>
|
#include <Library/PciHostBridgeLib.h>
|
||||||
|
#include <Library/PciHostBridgeUtilityLib.h>
|
||||||
#include <Library/PciLib.h>
|
#include <Library/PciLib.h>
|
||||||
#include <Library/QemuFwCfgLib.h>
|
#include <Library/QemuFwCfgLib.h>
|
||||||
#include "PciHostBridge.h"
|
#include "PciHostBridge.h"
|
||||||
|
@ -33,12 +34,6 @@ typedef struct {
|
||||||
#pragma pack ()
|
#pragma pack ()
|
||||||
|
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
|
||||||
CHAR16 *mPciHostBridgeLibAcpiAddressSpaceTypeStr[] = {
|
|
||||||
L"Mem", L"I/O", L"Bus"
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
CONST
|
CONST
|
||||||
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {
|
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {
|
||||||
|
@ -407,37 +402,5 @@ PciHostBridgeResourceConflict (
|
||||||
VOID *Configuration
|
VOID *Configuration
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;
|
PciHostBridgeUtilityResourceConflict (Configuration);
|
||||||
UINTN RootBridgeIndex;
|
|
||||||
DEBUG ((DEBUG_ERROR, "PciHostBridge: Resource conflict happens!\n"));
|
|
||||||
|
|
||||||
RootBridgeIndex = 0;
|
|
||||||
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Configuration;
|
|
||||||
while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {
|
|
||||||
DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++));
|
|
||||||
for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {
|
|
||||||
ASSERT (Descriptor->ResType <
|
|
||||||
ARRAY_SIZE (mPciHostBridgeLibAcpiAddressSpaceTypeStr)
|
|
||||||
);
|
|
||||||
DEBUG ((DEBUG_ERROR, " %s: Length/Alignment = 0x%lx / 0x%lx\n",
|
|
||||||
mPciHostBridgeLibAcpiAddressSpaceTypeStr[Descriptor->ResType],
|
|
||||||
Descriptor->AddrLen, Descriptor->AddrRangeMax
|
|
||||||
));
|
|
||||||
if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
|
|
||||||
DEBUG ((DEBUG_ERROR, " Granularity/SpecificFlag = %ld / %02x%s\n",
|
|
||||||
Descriptor->AddrSpaceGranularity, Descriptor->SpecificFlag,
|
|
||||||
((Descriptor->SpecificFlag &
|
|
||||||
EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE
|
|
||||||
) != 0) ? L" (Prefetchable)" : L""
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Skip the END descriptor for root bridge
|
|
||||||
//
|
|
||||||
ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR);
|
|
||||||
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)(
|
|
||||||
(EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
DebugLib
|
DebugLib
|
||||||
DevicePathLib
|
DevicePathLib
|
||||||
MemoryAllocationLib
|
MemoryAllocationLib
|
||||||
|
PciHostBridgeUtilityLib
|
||||||
PciLib
|
PciLib
|
||||||
QemuFwCfgLib
|
QemuFwCfgLib
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/** @file
|
||||||
|
Provide common utility functions to PciHostBridgeLib instances in
|
||||||
|
ArmVirtPkg and OvmfPkg.
|
||||||
|
|
||||||
|
Copyright (C) 2016, Red Hat, Inc.
|
||||||
|
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
|
||||||
|
Copyright (c) 2020, Huawei Corporation. All rights reserved.<BR>
|
||||||
|
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include <IndustryStandard/Acpi10.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/PciHostBridgeUtilityLib.h>
|
||||||
|
|
||||||
|
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
|
CHAR16 *mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[] = {
|
||||||
|
L"Mem", L"I/O", L"Bus"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Utility function to inform the platform that the resource conflict happens.
|
||||||
|
|
||||||
|
@param[in] Configuration Pointer to PCI I/O and PCI memory resource
|
||||||
|
descriptors. The Configuration contains the
|
||||||
|
resources for all the root bridges. The resource
|
||||||
|
for each root bridge is terminated with END
|
||||||
|
descriptor and an additional END is appended
|
||||||
|
indicating the end of the entire resources. The
|
||||||
|
resource descriptor field values follow the
|
||||||
|
description in
|
||||||
|
EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
|
||||||
|
.SubmitResources().
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
PciHostBridgeUtilityResourceConflict (
|
||||||
|
IN VOID *Configuration
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;
|
||||||
|
UINTN RootBridgeIndex;
|
||||||
|
DEBUG ((DEBUG_ERROR, "PciHostBridge: Resource conflict happens!\n"));
|
||||||
|
|
||||||
|
RootBridgeIndex = 0;
|
||||||
|
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Configuration;
|
||||||
|
while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++));
|
||||||
|
for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {
|
||||||
|
ASSERT (Descriptor->ResType <
|
||||||
|
ARRAY_SIZE (mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr)
|
||||||
|
);
|
||||||
|
DEBUG ((DEBUG_ERROR, " %s: Length/Alignment = 0x%lx / 0x%lx\n",
|
||||||
|
mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[Descriptor->ResType],
|
||||||
|
Descriptor->AddrLen, Descriptor->AddrRangeMax
|
||||||
|
));
|
||||||
|
if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
|
||||||
|
DEBUG ((DEBUG_ERROR, " Granularity/SpecificFlag = %ld / %02x%s\n",
|
||||||
|
Descriptor->AddrSpaceGranularity, Descriptor->SpecificFlag,
|
||||||
|
((Descriptor->SpecificFlag &
|
||||||
|
EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE
|
||||||
|
) != 0) ? L" (Prefetchable)" : L""
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Skip the END descriptor for root bridge
|
||||||
|
//
|
||||||
|
ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR);
|
||||||
|
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)(
|
||||||
|
(EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
## @file
|
||||||
|
# Provide common utility functions to PciHostBridgeLib instances in
|
||||||
|
# ArmVirtPkg and OvmfPkg.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2016, Red Hat, Inc.
|
||||||
|
# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
|
# Copyright (c) 2020, Huawei Corporation. All rights reserved.<BR>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
#
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 1.29
|
||||||
|
BASE_NAME = PciHostBridgeUtilityLib
|
||||||
|
FILE_GUID = e3aa5932-527a-42e7-86f5-81b144c7e5f1
|
||||||
|
MODULE_TYPE = DXE_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
LIBRARY_CLASS = PciHostBridgeUtilityLib
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following information is for reference only and not required by the build
|
||||||
|
# tools.
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM
|
||||||
|
#
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
PciHostBridgeUtilityLib.c
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
OvmfPkg/OvmfPkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
DebugLib
|
|
@ -49,6 +49,10 @@
|
||||||
# access.
|
# access.
|
||||||
PciCapPciSegmentLib|Include/Library/PciCapPciSegmentLib.h
|
PciCapPciSegmentLib|Include/Library/PciCapPciSegmentLib.h
|
||||||
|
|
||||||
|
## @libraryclass Provide common utility functions to PciHostBridgeLib
|
||||||
|
# instances in ArmVirtPkg and OvmfPkg.
|
||||||
|
PciHostBridgeUtilityLib|Include/Library/PciHostBridgeUtilityLib.h
|
||||||
|
|
||||||
## @libraryclass Register a status code handler for printing the Boot
|
## @libraryclass Register a status code handler for printing the Boot
|
||||||
# Manager's LoadImage() and StartImage() preparations, and
|
# Manager's LoadImage() and StartImage() preparations, and
|
||||||
# return codes, to the UEFI console.
|
# return codes, to the UEFI console.
|
||||||
|
|
|
@ -750,6 +750,7 @@
|
||||||
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
||||||
<LibraryClasses>
|
<LibraryClasses>
|
||||||
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
||||||
|
PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
|
||||||
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
||||||
}
|
}
|
||||||
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
||||||
|
|
|
@ -764,6 +764,7 @@
|
||||||
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
||||||
<LibraryClasses>
|
<LibraryClasses>
|
||||||
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
||||||
|
PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
|
||||||
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
||||||
}
|
}
|
||||||
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
||||||
|
|
|
@ -762,6 +762,7 @@
|
||||||
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
||||||
<LibraryClasses>
|
<LibraryClasses>
|
||||||
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
||||||
|
PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
|
||||||
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
||||||
}
|
}
|
||||||
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
||||||
|
|
|
@ -556,6 +556,7 @@
|
||||||
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
|
||||||
<LibraryClasses>
|
<LibraryClasses>
|
||||||
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
|
||||||
|
PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
|
||||||
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf
|
||||||
}
|
}
|
||||||
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
|
||||||
|
|
Loading…
Reference in New Issue