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,49 +42,38 @@ 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; STATIC CONST EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR mMmio64Configuration = {
} MMIO64_PREFERENCE; ACPI_ADDRESS_SPACE_DESCRIPTOR, // Desc
#pragma pack () (UINT16)( // Len
STATIC CONST MMIO64_PREFERENCE mConfiguration = {
//
// AddressSpaceDesc
//
{
ACPI_ADDRESS_SPACE_DESCRIPTOR, // Desc
(UINT16)( // Len
sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) - sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) -
OFFSET_OF ( OFFSET_OF (
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR, EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR,
ResType ResType
) )
), ),
ACPI_ADDRESS_SPACE_TYPE_MEM, // ResType ACPI_ADDRESS_SPACE_TYPE_MEM, // ResType
0, // GenFlag 0, // GenFlag
0, // SpecificFlag 0, // SpecificFlag
64, // AddrSpaceGranularity: 64, // AddrSpaceGranularity:
// aperture selection hint // aperture selection hint
// for BAR allocation // for BAR allocation
0, // AddrRangeMin 0, // AddrRangeMin
0, // AddrRangeMax: 0, // AddrRangeMax:
// no special alignment // no special alignment
// for affected BARs // for affected BARs
MAX_UINT64, // AddrTranslationOffset: MAX_UINT64, // AddrTranslationOffset:
// hint covers all // hint covers all
// 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
{ 0 // Checksum: to be ignored
ACPI_END_TAG_DESCRIPTOR, // Desc
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;
} }