MdeModulePkg/XhciDxe: enable 64-bit PCI DMA

PCI controller drivers must set the EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE
attribute if the controller supports 64-bit DMA addressing.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Feng Tian <feng.tian@Intel.com>
This commit is contained in:
Ard Biesheuvel 2016-09-05 09:52:10 +01:00
parent df0a0e4b6f
commit 5c1b371a88
2 changed files with 23 additions and 1 deletions

View File

@ -125,7 +125,7 @@ XhcGetCapability (
Xhc = XHC_FROM_THIS (This); Xhc = XHC_FROM_THIS (This);
*MaxSpeed = EFI_USB_SPEED_SUPER; *MaxSpeed = EFI_USB_SPEED_SUPER;
*PortNumber = (UINT8) (Xhc->HcSParams1.Data.MaxPorts); *PortNumber = (UINT8) (Xhc->HcSParams1.Data.MaxPorts);
*Is64BitCapable = (UINT8) (Xhc->HcCParams.Data.Ac64); *Is64BitCapable = (UINT8) Xhc->Support64BitDma;
DEBUG ((EFI_D_INFO, "XhcGetCapability: %d ports, 64 bit %d\n", *PortNumber, *Is64BitCapable)); DEBUG ((EFI_D_INFO, "XhcGetCapability: %d ports, 64 bit %d\n", *PortNumber, *Is64BitCapable));
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
@ -2020,6 +2020,26 @@ XhcDriverBindingStart (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
//
// Enable 64-bit DMA support in the PCI layer if this controller
// supports it.
//
if (Xhc->HcCParams.Data.Ac64 != 0) {
Status = PciIo->Attributes (
PciIo,
EfiPciIoAttributeOperationEnable,
EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE,
NULL
);
if (!EFI_ERROR (Status)) {
Xhc->Support64BitDma = TRUE;
} else {
DEBUG ((EFI_D_WARN,
"%a: failed to enable 64-bit DMA on 64-bit capable controller @ %p (%r)\n",
__FUNCTION__, Controller, Status));
}
}
XhcSetBiosOwnership (Xhc); XhcSetBiosOwnership (Xhc);
XhcResetHC (Xhc, XHC_RESET_TIMEOUT); XhcResetHC (Xhc, XHC_RESET_TIMEOUT);

View File

@ -256,6 +256,8 @@ struct _USB_XHCI_INSTANCE {
// The array supports up to 255 devices, entry 0 is reserved and should not be used. // The array supports up to 255 devices, entry 0 is reserved and should not be used.
// //
USB_DEV_CONTEXT UsbDevContext[256]; USB_DEV_CONTEXT UsbDevContext[256];
BOOLEAN Support64BitDma; // Whether 64 bit DMA may be used with this device
}; };