MdeModulePkg/SdMmcPciHcDxe: Add SDMMC HC v4 and above Support.
Add SDMA, ADMA2 and 26b data length support. If V4 64 bit address mode is supported in capabilities register, program controller to enable V4 host mode and use appropriate SDMA registers supporting 64 bit addresses. If V4 64 bit address mode is supported in capabilities register, program controller to enable V4 host mode and use appropriate ADMA descriptors supporting 64 bit addresses. If host controller version is above V4.0, enable ADMA2 with 26b data length support for better performance. HC 2 register is configured to use 26 bit data lengths and ADMA2 descriptors are configured appropriately. REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1359 Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ashish Singhal <ashishsingha@nvidia.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com>
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
|
||||
It would expose EFI_SD_MMC_PASS_THRU_PROTOCOL for upper layer use.
|
||||
|
||||
Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -62,7 +63,9 @@ SD_MMC_HC_PRIVATE_DATA gSdMmcPciHcTemplate = {
|
||||
{ // MaxCurrent
|
||||
0,
|
||||
},
|
||||
0 // ControllerVersion
|
||||
{
|
||||
0 // ControllerVersion
|
||||
}
|
||||
};
|
||||
|
||||
SD_DEVICE_PATH mSdDpTemplate = {
|
||||
@@ -621,6 +624,14 @@ SdMmcPciHcDriverBindingStart (
|
||||
for (Slot = FirstBar; Slot < (FirstBar + SlotNum); Slot++) {
|
||||
Private->Slot[Slot].Enable = TRUE;
|
||||
|
||||
//
|
||||
// Get SD/MMC Pci Host Controller Version
|
||||
//
|
||||
Status = SdMmcHcGetControllerVersion (PciIo, Slot, &Private->ControllerVersion[Slot]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = SdMmcHcGetCapability (PciIo, Slot, &Private->Capability[Slot]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
@@ -649,7 +660,14 @@ SdMmcPciHcDriverBindingStart (
|
||||
Private->BaseClkFreq[Slot]
|
||||
));
|
||||
|
||||
Support64BitDma &= Private->Capability[Slot].SysBus64;
|
||||
//
|
||||
// If any of the slots does not support 64b system bus
|
||||
// do not enable 64b DMA in the PCI layer.
|
||||
//
|
||||
if (Private->Capability[Slot].SysBus64V3 == 0 &&
|
||||
Private->Capability[Slot].SysBus64V4 == 0) {
|
||||
Support64BitDma = FALSE;
|
||||
}
|
||||
|
||||
Status = SdMmcHcGetMaxCurrent (PciIo, Slot, &Private->MaxCurrent[Slot]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
Reference in New Issue
Block a user