diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc
index a3beb4654072..fa2b547ac486 100644
--- a/ArmVirtPkg/ArmVirtQemu.dsc
+++ b/ArmVirtPkg/ArmVirtQemu.dsc
@@ -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.
diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc
index e0dcf4300338..d80079c45c28 100644
--- a/ArmVirtPkg/ArmVirtQemuKernel.dsc
+++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc
@@ -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.
diff --git a/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c b/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c
index ea27cda7b77c..ea35c6df2546 100644
--- a/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c
+++ b/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c
@@ -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);
     }
   }
 
diff --git a/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf b/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf
index cd138fa1aa6e..d29bcb0a801b 100644
--- a/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf
+++ b/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf
@@ -42,6 +42,7 @@ [Protocols]
 
 [Pcd]
   gArmTokenSpaceGuid.PcdPciIoTranslation                      ## PRODUCES
+  gArmTokenSpaceGuid.PcdPciMmio64Size                         ## PRODUCES
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress           ## PRODUCES
   gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration  ## PRODUCES
 
