@@ -206,6 +206,7 @@ [PcdsDynamicDefault.common]
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xFFFFFFFFFFFFFFFF
gArmTokenSpaceGuid.PcdPciIoTranslation|0x0
+ gArmTokenSpaceGuid.PcdPciMmio64Size|0x0
#
# Set video resolution for boot options and for text setup.
@@ -202,6 +202,7 @@ [PcdsDynamicDefault.common]
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xFFFFFFFFFFFFFFFF
gArmTokenSpaceGuid.PcdPciIoTranslation|0x0
+ gArmTokenSpaceGuid.PcdPciMmio64Size|0x0
#
# Set video resolution for boot options and for text setup.
@@ -44,11 +44,12 @@ typedef struct {
#define DTB_PCI_HOST_RANGE_TYPEMASK (BIT31 | BIT30 | BIT29 | BIT25 | BIT24)
STATIC
-RETURN_STATUS
-GetPciIoTranslation (
+VOID
+GetPciIoTranslationAndMmio64Size (
IN FDT_CLIENT_PROTOCOL *FdtClient,
IN INT32 Node,
- OUT UINT64 *IoTranslation
+ OUT UINT64 *IoTranslation,
+ OUT UINT64 *Mmio64Size
)
{
UINT32 RecordIdx;
@@ -64,24 +65,25 @@ GetPciIoTranslation (
if (EFI_ERROR (Status) || Len == 0 ||
Len % sizeof (DTB_PCI_HOST_RANGE_RECORD) != 0) {
DEBUG ((EFI_D_ERROR, "%a: 'ranges' not found or invalid\n", __FUNCTION__));
- return RETURN_PROTOCOL_ERROR;
+ return;
}
for (RecordIdx = 0; RecordIdx < Len / sizeof (DTB_PCI_HOST_RANGE_RECORD);
++RecordIdx) {
CONST DTB_PCI_HOST_RANGE_RECORD *Record;
- UINT32 Type;
Record = (CONST DTB_PCI_HOST_RANGE_RECORD *)Prop + RecordIdx;
- Type = SwapBytes32 (Record->Type) & DTB_PCI_HOST_RANGE_TYPEMASK;
- if (Type == DTB_PCI_HOST_RANGE_IO) {
+ switch (SwapBytes32 (Record->Type) & DTB_PCI_HOST_RANGE_TYPEMASK) {
+ case DTB_PCI_HOST_RANGE_IO:
IoBase = SwapBytes64 (Record->ChildBase);
*IoTranslation = SwapBytes64 (Record->CpuBase) - IoBase;
+ break;
- return RETURN_SUCCESS;
+ case DTB_PCI_HOST_RANGE_MMIO64:
+ *Mmio64Size = SwapBytes64 (Record->Size);
+ break;
}
}
- return RETURN_NOT_FOUND;
}
RETURN_STATUS
@@ -96,8 +98,8 @@ FdtPciPcdProducerLibConstructor (
UINT32 RegSize;
EFI_STATUS Status;
INT32 Node;
- RETURN_STATUS RetStatus;
UINT64 IoTranslation;
+ UINT64 Mmio64Size;
PciExpressBaseAddress = PcdGet64 (PcdPciExpressBaseAddress);
if (PciExpressBaseAddress != MAX_UINT64) {
@@ -128,9 +130,11 @@ FdtPciPcdProducerLibConstructor (
PcdSetBool (PcdPciDisableBusEnumeration, FALSE);
- IoTranslation = 0;
- RetStatus = GetPciIoTranslation (FdtClient, Node, &IoTranslation);
- if (!RETURN_ERROR (RetStatus)) {
+ IoTranslation = MAX_UINT64;
+ Mmio64Size = 0;
+ GetPciIoTranslationAndMmio64Size (FdtClient, Node, &IoTranslation,
+ &Mmio64Size);
+ if (IoTranslation != MAX_UINT64) {
PcdSet64 (PcdPciIoTranslation, IoTranslation);
} else {
//
@@ -142,6 +146,7 @@ FdtPciPcdProducerLibConstructor (
"%a: 'pci-host-ecam-generic' device encountered with no I/O range\n",
__FUNCTION__));
}
+ PcdSet64 (PcdPciMmio64Size, Mmio64Size);
}
}
@@ -42,6 +42,7 @@ [Protocols]
[Pcd]
gArmTokenSpaceGuid.PcdPciIoTranslation ## PRODUCES
+ gArmTokenSpaceGuid.PcdPciMmio64Size ## PRODUCES
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress ## PRODUCES
gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration ## PRODUCES
In preparation of adding IncompatibleDeviceSupportDxe to ArmVirtQemu, in order to lure the PCI code into allocating all 64-bit BARs in the 64-bit region, update FdtPciPcdProducerLib so it sets the PcdPciMmio64Size based on the DT description of the PCIe root complex. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- ArmVirtPkg/ArmVirtQemu.dsc | 1 + ArmVirtPkg/ArmVirtQemuKernel.dsc | 1 + ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c | 31 ++++++++++++-------- ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf | 1 + 4 files changed, 21 insertions(+), 13 deletions(-) -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel