After moving ArmVirtQemu to the generic PciHostBridgeDxe, we noticed that
setting DmaAbove4G resulted in problems with the emulated EHCI USB host
controller, which were caused by the fact that the PCI layer was providing
DMA buffers allocated above 4 GB while the emulated EHCI controller in QEMU
does not indicate support for 64-bit addressing.

As it turns out, the PCI drivers in MdeModulePkg *completely* ignore the
EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE attribute, and simply assume that no
PCI root bridge driver will produce mappings above 4 GB. On ARM, this is
problematic, since not all platforms have memory below 4 GB, and so having
full support for DMA above 4 GB is indispensable.

So first, make the various drivers under MdeModulePkg/Pci/Bus set the
EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE attributes for devices that can
support 64-bit DMA addressing (patches #1 - #5). Then, we can update the
host bridge driver to actually take these attributes into account, and only
create mappings above 4 GB for devices that have indicated support for it.

Finally, in patch #7 we can remove the 4 GB DMA limit from ArmVirtPkg.

Branch can be found here:
https://git.linaro.org/people/ard.biesheuvel/uefi-next.git/shortlog/refs/heads/pci-64bit-dma-fixes

Ard Biesheuvel (7):
  MdeModulePkg/AtaAtapiPassThru: enable 64-bit PCI DMA
  MdeModulePkg/EhciDxe: enable 64-bit PCI DMA
  MdeModulePkg/NvmExpressDxe: enable 64-bit PCI DMA
  MdeModulePkg/SdMmcPciHcDxe: enable 64-bit PCI DMA
  MdeModulePkg/XhciDxe: enable 64-bit PCI DMA
  MdeModulePkg/PciHostBridgeDxe: restrict 64-bit DMA to devices that
    support it
  ArmVirtPkg/FdtPciHostBridgeLib: enable 64-bit PCI DMA

 ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c |  2 +-
 MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c             | 20 
+++++++++++++++++-
 MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c                          | 22 
+++++++++++++++++++-
 MdeModulePkg/Bus/Pci/EhciDxe/Ehci.h                          |  2 ++
 MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c                     |  2 +-
 MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c           | 13 ++++++++++++
 MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c      | 14 +++++++++----
 MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c           | 20 
++++++++++++++++++
 MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c                          | 22 
+++++++++++++++++++-
 MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h                          |  2 ++
 10 files changed, 110 insertions(+), 9 deletions(-)

-- 
2.7.4

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to