[edk2-devel] [edk2-platform][PATCH V3 1/1] MdeModulePkg: SdMmcPciHcDxe: Fix issue that SD1.0 cards can't be recognized
Wu, Hao A
hao.a.wu at intel.com
Thu Dec 8 03:14:11 UTC 2022
Reviewed-by: Hao A Wu <hao.a.wu at intel.com>
Will wait a couple of days before merging to see if comments from other reviewers.
Best Regards,
Hao Wu
> -----Original Message-----
> From: Chevron Li <chevron.li at bayhubtech.com>
> Sent: Wednesday, December 7, 2022 7:09 PM
> To: devel at edk2.groups.io
> Cc: Wu, Hao A <hao.a.wu at intel.com>; Ni, Ray <ray.ni at intel.com>; Wang,
> Jian J <jian.j.wang at intel.com>; Gao, Liming <gaoliming at byosoft.com.cn>;
> shirley.her at bayhubtech.com; shaper.liu at bayhubtech.com;
> xiaoguang.yu at bayhubtech.com; Chevron Li (WH)
> <chevron.li at bayhubtech.com>
> Subject: [edk2-platform][PATCH V3 1/1] MdeModulePkg: SdMmcPciHcDxe:
> Fix issue that SD1.0 cards can't be recognized
>
> From: "Chevron Li (WH)" <chevron.li at bayhubtech.com>
>
> SD1.0 cards don't support CMD8 and CMD6
> CMD8 result can be used to distinguish the card is SD1.0 or not.
> CMD8 result can be used to decide following CMD6 is sent or skip.
>
> Cc: Hao A Wu <hao.a.wu at intel.com>
> Cc: Ray Ni <ray.ni at intel.com>
> Cc: Jian J Wang <jian.j.wang at intel.com>
> Cc: Liming Gao <gaoliming at byosoft.com.cn>
> Signed-off-by: Chevron Li <chevron.li at bayhubtech.com>
> ---
> Changes in V2:
> 1.Update description comment for input parameter 'SdVersion1'.
> 2.Add variables initialize operation to avoid unexpected value.
> 3.Use TRUE replace with 1 to assign value for BOOLEAN variable.
>
> Changes in V3:
> 1.Update code format for CL test fail.
> 2.Fix memory out of bounds when initialize SwitchResp.
> ---
> MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c | 34 +++++++++++++--
> ----
> 1 file changed, 24 insertions(+), 10 deletions(-)
>
> diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c
> b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c
> index f5a3607e47..8bf452e9d0 100644
> --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c
> +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c
> @@ -1074,6 +1074,7 @@ SdGetTargetBusMode (
> @param[in] Slot The slot number of the SD card to send the
> command to.
>
> @param[in] Rca The relative device address to be assigned.
>
> @param[in] S18A The boolean to show if it's a UHS-I SD card.
>
> + @param[in] SdVersion1 The boolean to show if it's a Version 1 SD card.
>
>
>
> @retval EFI_SUCCESS The operation is done correctly.
>
> @retval Others The operation fails.
>
> @@ -1085,7 +1086,8 @@ SdCardSetBusMode (
> IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
>
> IN UINT8 Slot,
>
> IN UINT16 Rca,
>
> - IN BOOLEAN S18A
>
> + IN BOOLEAN S18A,
>
> + IN BOOLEAN SdVersion1
>
> )
>
> {
>
> EFI_STATUS Status;
>
> @@ -1095,6 +1097,8 @@ SdCardSetBusMode (
> SD_MMC_HC_PRIVATE_DATA *Private;
>
> SD_MMC_BUS_SETTINGS BusMode;
>
>
>
> + ZeroMem (SwitchResp, 64 * sizeof (UINT8));
>
> +
>
> Private = SD_MMC_HC_PRIVATE_FROM_THIS (PassThru);
>
>
>
> Capability = &Private->Capability[Slot];
>
> @@ -1117,10 +1121,13 @@ SdCardSetBusMode (
>
>
> //
>
> // Get the supported bus speed from SWITCH cmd return data group #1.
>
> + // SdVersion1 don't support the SWITCH cmd
>
> //
>
> - Status = SdCardSwitch (PassThru, Slot, 0xFF, 0xF, SdDriverStrengthIgnore,
> 0xF, FALSE, SwitchResp);
>
> - if (EFI_ERROR (Status)) {
>
> - return Status;
>
> + if (!SdVersion1) {
>
> + Status = SdCardSwitch (PassThru, Slot, 0xFF, 0xF, SdDriverStrengthIgnore,
> 0xF, FALSE, SwitchResp);
>
> + if (EFI_ERROR (Status)) {
>
> + return Status;
>
> + }
>
> }
>
>
>
> SdGetTargetBusMode (Private, Slot, SwitchResp, S18A, &BusMode);
>
> @@ -1141,9 +1148,14 @@ SdCardSetBusMode (
> }
>
> }
>
>
>
> - Status = SdCardSwitch (PassThru, Slot, BusMode.BusTiming, 0xF,
> BusMode.DriverStrength.Sd, 0xF, TRUE, SwitchResp);
>
> - if (EFI_ERROR (Status)) {
>
> - return Status;
>
> + //
>
> + // SdVersion1 don't support the SWITCH cmd
>
> + //
>
> + if (!SdVersion1) {
>
> + Status = SdCardSwitch (PassThru, Slot, BusMode.BusTiming, 0xF,
> BusMode.DriverStrength.Sd, 0xF, TRUE, SwitchResp);
>
> + if (EFI_ERROR (Status)) {
>
> + return Status;
>
> + }
>
> }
>
>
>
> Status = SdMmcSetDriverStrength (Private->PciIo, Slot,
> BusMode.DriverStrength.Sd);
>
> @@ -1214,8 +1226,10 @@ SdCardIdentification (
> UINT8 HostCtrl2;
>
> UINTN Retry;
>
> BOOLEAN ForceVoltage33;
>
> + BOOLEAN SdVersion1;
>
>
>
> ForceVoltage33 = FALSE;
>
> + SdVersion1 = FALSE;
>
>
>
> PciIo = Private->PciIo;
>
> PassThru = &Private->PassThru;
>
> @@ -1231,12 +1245,12 @@ Voltage33Retry:
> }
>
>
>
> //
>
> - // 2. Send Cmd8 to the device
>
> + // 2. Send Cmd8 to the device, the command will fail for SdVersion1
>
> //
>
> Status = SdCardVoltageCheck (PassThru, Slot, 0x1, 0xFF);
>
> if (EFI_ERROR (Status)) {
>
> + SdVersion1 = TRUE;
>
> DEBUG ((DEBUG_INFO, "SdCardIdentification: Executing Cmd8 fails
> with %r\n", Status));
>
> - return Status;
>
> }
>
>
>
> //
>
> @@ -1426,7 +1440,7 @@ Voltage33Retry:
> DEBUG ((DEBUG_INFO, "SdCardIdentification: Found a SD device at slot
> [%d]\n", Slot));
>
> Private->Slot[Slot].CardType = SdCardType;
>
>
>
> - Status = SdCardSetBusMode (PciIo, PassThru, Slot, Rca, ((Ocr & BIT24) !=
> 0));
>
> + Status = SdCardSetBusMode (PciIo, PassThru, Slot, Rca, ((Ocr & BIT24) != 0),
> SdVersion1);
>
>
>
> return Status;
>
>
>
>
> base-commit: 7bee2498910a9034faaf90802c49188afb7582dc
> --
> 2.18.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#97109): https://edk2.groups.io/g/devel/message/97109
Mute This Topic: https://groups.io/mt/95519549/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list