Re: [PATCH v2] MdeModulePkg: Enabling OS boot from SD card through UEFI payload


Aiman Rosli
 

Hi all,

Please review my patch, if there is no issue, can help to add push label.

Thank you.

Regards,
Aiman Rosli

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Aiman Rosli
Sent: Monday, 17 January, 2022 8:56 PM
To: devel@edk2.groups.io
Cc: Rosli, Muhammad Aiman <muhammad.aiman.rosli@...>
Subject: [edk2-devel] [PATCH v2] MdeModulePkg: Enabling OS boot from SD card through UEFI payload

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.

Signed-off-by: Aiman Rosli <muhammad.aiman.rosli@...>
---
MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c | 23 ++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c
index 662f9f483c..527fe7dc20 100644
--- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c
+++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c
@@ -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
//
@@ -1294,6 +1299,14 @@ SdCardIdentification (
return EFI_UNSUPPORTED;
}

+ //
+ // 1.8V had failed in the previous run, forcing a retry with 3.3V
+ instead // if (ForceVoltage33 == TRUE) {
+ S18r = FALSE;
+ ForceVoltage33 = FALSE;
+ }
+
//
// 5. Repeatly send Acmd41 with supply voltage window to the device.
// Note here we only support the cards complied with SD physical
@@ -1362,13 +1375,17 @@ SdCardIdentification (
goto Error;
}

- gBS->Stall (1000);
+ // Workaround to add a delay of 50 ms in order for clock to stabilize before turning on the SD card again.
+ 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));
- Status = EFI_DEVICE_ERROR;
- goto Error;
+ Status = SdMmcHcReset (Private, Slot);
+ Status = SdMmcHcInitHost (Private, Slot);
+ ForceVoltage33 = TRUE;
+ DEBUG ((DEBUG_ERROR, "SdCardIdentification: Switching to 1.8V had failed in the previous run, forcing a retry with 3.3V instead\n"));
+ goto Voltage33Retry;
}
}

--
2.34.1.windows.1

Join devel@edk2.groups.io to automatically receive all group messages.