OvmfPkg/IncompatiblePciDeviceSupportDxe: Refine the configuration

RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3429

MMIO64_PREFERENCE is a fixed length data structure which contains one
AddressSpaceDesc and one EndDesc. This patch removes MMIO64_PREFERENCE
and create AddressSpaceDesc and EndDesc respectively. This change
gives the chance to add more AddressSpaceDesc when CheckDevice is
called.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Signed-off-by: Min Xu <min.m.xu@intel.com>
This commit is contained in:
Min Xu
2022-02-24 21:49:41 +08:00
committed by mergify[bot]
parent f674fa9cde
commit 149ed8e421

View File

@@ -9,6 +9,8 @@
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <IndustryStandard/Acpi10.h> #include <IndustryStandard/Acpi10.h>
#include <IndustryStandard/Pci22.h> #include <IndustryStandard/Pci22.h>
@@ -40,18 +42,10 @@ STATIC EFI_INCOMPATIBLE_PCI_DEVICE_SUPPORT_PROTOCOL
// This structure is interpreted by the UpdatePciInfo() function in the edk2 // This structure is interpreted by the UpdatePciInfo() function in the edk2
// PCI Bus UEFI_DRIVER. // PCI Bus UEFI_DRIVER.
// //
#pragma pack (1) // This structure looks like:
typedef struct { // AddressDesc-1 + AddressDesc-2 + ... + AddressDesc-n + EndDesc
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR AddressSpaceDesc;
EFI_ACPI_END_TAG_DESCRIPTOR EndDesc;
} MMIO64_PREFERENCE;
#pragma pack ()
STATIC CONST MMIO64_PREFERENCE mConfiguration = {
// //
// AddressSpaceDesc STATIC CONST EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR mMmio64Configuration = {
//
{
ACPI_ADDRESS_SPACE_DESCRIPTOR, // Desc ACPI_ADDRESS_SPACE_DESCRIPTOR, // Desc
(UINT16)( // Len (UINT16)( // Len
sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) - sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) -
@@ -75,14 +69,11 @@ STATIC CONST MMIO64_PREFERENCE mConfiguration = {
// eligible BARs // eligible BARs
0 // AddrLen: 0 // AddrLen:
// use probed BAR size // use probed BAR size
}, };
//
// EndDesc STATIC CONST EFI_ACPI_END_TAG_DESCRIPTOR mEndDesc = {
//
{
ACPI_END_TAG_DESCRIPTOR, // Desc ACPI_END_TAG_DESCRIPTOR, // Desc
0 // Checksum: to be ignored 0 // Checksum: to be ignored
}
}; };
// //
@@ -203,6 +194,8 @@ CheckDevice (
) )
{ {
mCheckDeviceCalled = TRUE; mCheckDeviceCalled = TRUE;
UINTN Length;
UINT8 *Ptr;
// //
// Unlike the general description of this protocol member suggests, there is // Unlike the general description of this protocol member suggests, there is
@@ -232,7 +225,10 @@ CheckDevice (
// the edk2 PCI Bus UEFI_DRIVER actually handles error codes; see the // the edk2 PCI Bus UEFI_DRIVER actually handles error codes; see the
// UpdatePciInfo() function. // UpdatePciInfo() function.
// //
*Configuration = AllocateCopyPool (sizeof mConfiguration, &mConfiguration); Length = sizeof mMmio64Configuration + sizeof mEndDesc;
*Configuration = AllocateZeroPool (Length);
if (*Configuration == NULL) { if (*Configuration == NULL) {
DEBUG (( DEBUG ((
DEBUG_WARN, DEBUG_WARN,
@@ -245,6 +241,12 @@ CheckDevice (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Ptr = (UINT8 *)(UINTN)*Configuration;
CopyMem (Ptr, &mMmio64Configuration, sizeof mMmio64Configuration);
Length = sizeof mMmio64Configuration;
CopyMem (Ptr + Length, &mEndDesc, sizeof mEndDesc);
return EFI_SUCCESS; return EFI_SUCCESS;
} }