Skip to content

Commit

Permalink
MdeModulePkg/SdMmcPciHcDxe: Robust improvements for SD card 1.8V switch
Browse files Browse the repository at this point in the history
This changes is by adding 50ms delay during voltage switching from 3.3V to
1.8V, plus adding a goto Voltage33Retry for 3.3V checking and retrying.

Change is for Enabling OS boot from SD card through UEFI payload.

Signed-off-by: Aiman Rosli <muhammad.aiman.rosli@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
  • Loading branch information
aimanrosli23 authored and mergify[bot] committed Jan 24, 2022
1 parent 21320ef commit 7e5c603
Showing 1 changed file with 36 additions and 3 deletions.
39 changes: 36 additions & 3 deletions MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c
Original file line number Diff line number Diff line change
Expand Up @@ -1213,9 +1213,14 @@ SdCardIdentification (
UINT32 PresentState;
UINT8 HostCtrl2;
UINTN Retry;
BOOLEAN ForceVoltage33;

ForceVoltage33 = FALSE;

PciIo = Private->PciIo;
PassThru = &Private->PassThru;

Voltage33Retry:
//
// 1. Send Cmd0 to the device
//
Expand Down Expand Up @@ -1294,6 +1299,13 @@ SdCardIdentification (
return EFI_UNSUPPORTED;
}

//
// 1.8V had failed in the previous run, forcing a retry with 3.3V instead
//
if (ForceVoltage33 == TRUE) {
S18r = FALSE;
}

//
// 5. Repeatly send Acmd41 with supply voltage window to the device.
// Note here we only support the cards complied with SD physical
Expand Down Expand Up @@ -1366,9 +1378,30 @@ SdCardIdentification (

SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_PRESENT_STATE, TRUE, sizeof (PresentState), &PresentState);
if (((PresentState >> 20) & 0xF) != 0xF) {
DEBUG ((DEBUG_ERROR, "SdCardIdentification: SwitchVoltage fails with PresentState = 0x%x, It should be 0xF\n", PresentState));
Status = EFI_DEVICE_ERROR;
goto Error;
//
// Delay 50 milliseconds in order for clock to stabilize, retry reading the SD_MMC_HC_PRESENT_STATE
//
gBS->Stall (50000);
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_PRESENT_STATE, TRUE, sizeof (PresentState), &PresentState);
if (((PresentState >> 20) & 0xF) != 0xF) {
DEBUG ((DEBUG_ERROR, "SdCardIdentification: SwitchVoltage fails with PresentState = 0x%x, It should be 0xF\n", PresentState));
//
// Reset and reinitialize the slot before the 3.3V retry.
//
Status = SdMmcHcReset (Private, Slot);
if (EFI_ERROR (Status)) {
goto Error;
}

Status = SdMmcHcInitHost (Private, Slot);
if (EFI_ERROR (Status)) {
goto Error;
}

DEBUG ((DEBUG_ERROR, "SdCardIdentification: Switching to 1.8V failed, forcing a retry with 3.3V instead\n"));
ForceVoltage33 = TRUE;
goto Voltage33Retry;
}
}
}

Expand Down

0 comments on commit 7e5c603

Please sign in to comment.