On Wed, Sep 06, 2017 at 04:25:10PM +0530, Meenakshi Aggarwal wrote:
> For setting high speed in SD card,
> First CMD 6 (Switch) is send to check if card supports High Speed and
> Second command is send to switch card to high speed mode.
> 
> In current inplementation, CMD 6 was sent only once to switch the
> card into HS mode without checking if card supports HS or not, which is
> not as per specification and also we are not setting the HS i.e. 50000000
> but directly asking the card to switch to 26000000 which is incorrect as
> SD card supports either 25000000 or 50000000.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Meenakshi Aggarwal <[email protected]>

Same comment as for 1/2: please address PatchCheck.py feedback:
* EFI_D_ERROR was used, but DEBUG_ERROR is now recommended

Other than that, looks good to me.
Jun, anything further?

/
    Leif

> ---
>  EmbeddedPkg/Universal/MmcDxe/Mmc.h               |  8 ++++
>  EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c | 55 
> +++++++++++++++++++++---
>  2 files changed, 57 insertions(+), 6 deletions(-)
> 
> diff --git a/EmbeddedPkg/Universal/MmcDxe/Mmc.h 
> b/EmbeddedPkg/Universal/MmcDxe/Mmc.h
> index f3e56ff..a77ba41 100644
> --- a/EmbeddedPkg/Universal/MmcDxe/Mmc.h
> +++ b/EmbeddedPkg/Universal/MmcDxe/Mmc.h
> @@ -64,6 +64,14 @@
>  #define EMMC_CMD6_ARG_VALUE(x)              (((x) & 0xFF) << 8)
>  #define EMMC_CMD6_ARG_CMD_SET(x)            (((x) & 0x7) << 0)
>  
> +#define SWITCH_CMD_DATA_LENGTH              64
> +#define SD_HIGH_SPEED_SUPPORTED             0x20000
> +#define SD_DEFAULT_SPEED                    25000000
> +#define SD_HIGH_SPEED                       50000000
> +#define SWITCH_CMD_SUCCESS_MASK             0x0f000000
> +
> +#define BUSWIDTH_4                          4
> +
>  typedef enum {
>    UNKNOWN_CARD,
>    MMC_CARD,              //MMC card
> diff --git a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c 
> b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
> index 8010dea..e60d8b0 100644
> --- a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
> +++ b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
> @@ -318,6 +318,23 @@ InitializeEmmcDevice (
>  }
>  
>  STATIC
> +UINT32
> +CreateSwitchCmdArgument (
> +  IN  UINT32 Mode,
> +  IN  UINT8  Group,
> +  IN  UINT8  Value
> +  )
> +{
> +  UINT32 Argument;
> +
> +  Argument = Mode << 31 | 0x00FFFFFF;
> +  Argument &= ~(0xF << (Group * 4));
> +  Argument |= Value << (Group * 4);
> +
> +  return Argument;
> +}
> +
> +STATIC
>  EFI_STATUS
>  InitializeSdMmcDevice (
>    IN  MMC_HOST_INSTANCE   *MmcHostInstance
> @@ -326,6 +343,7 @@ InitializeSdMmcDevice (
>    UINT32        CmdArg;
>    UINT32        Response[4];
>    UINT32        Buffer[128];
> +  UINT32        Speed;
>    UINTN         BlockSize;
>    UINTN         CardSize;
>    UINTN         NumBlocks;
> @@ -334,6 +352,7 @@ InitializeSdMmcDevice (
>    EFI_STATUS    Status;
>    EFI_MMC_HOST_PROTOCOL     *MmcHost;
>  
> +  Speed = SD_DEFAULT_SPEED;
>    MmcHost = MmcHostInstance->MmcHost;
>  
>    // Send a command to get Card specific data
> @@ -439,21 +458,45 @@ InitializeSdMmcDevice (
>      }
>    }
>    if (CccSwitch) {
> -    /* SD Switch, Mode:1, Group:0, Value:1 */
> -    CmdArg = 1 << 31 | 0x00FFFFFF;
> -    CmdArg &= ~(0xF << (0 * 4));
> -    CmdArg |= 1 << (0 * 4);
> +    /* SD Switch, Mode:0, Group:0, Value:0 */
> +    CmdArg = CreateSwitchCmdArgument(0, 0, 0);
>      Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, CmdArg);
>      if (EFI_ERROR (Status)) {
>        DEBUG ((EFI_D_ERROR, "%a (MMC_CMD6): Error and Status = %r\n", 
> __FUNCTION__, Status));
>         return Status;
>      } else {
> -      Status = MmcHost->ReadBlockData (MmcHost, 0, 64, Buffer);
> +      Status = MmcHost->ReadBlockData (MmcHost, 0, SWITCH_CMD_DATA_LENGTH, 
> Buffer);
>        if (EFI_ERROR (Status)) {
>          DEBUG ((EFI_D_ERROR, "%a (MMC_CMD6): ReadBlockData Error and Status 
> = %r\n", __FUNCTION__, Status));
>          return Status;
>        }
>      }
> +
> +    if (!(Buffer[3] & SD_HIGH_SPEED_SUPPORTED)) {
> +      DEBUG ((EFI_D_ERROR, "%a : High Speed not supported by Card %r\n", 
> __FUNCTION__, Status));
> +      return Status;
> +    }
> +
> +    Speed = SD_HIGH_SPEED;
> +
> +    /* SD Switch, Mode:1, Group:0, Value:1 */
> +    CmdArg = CreateSwitchCmdArgument(1, 0, 1);
> +    Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, CmdArg);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((EFI_D_ERROR, "%a (MMC_CMD6): Error and Status = %r\n", 
> __FUNCTION__, Status));
> +       return Status;
> +    } else {
> +      Status = MmcHost->ReadBlockData (MmcHost, 0, SWITCH_CMD_DATA_LENGTH, 
> Buffer);
> +      if (EFI_ERROR (Status)) {
> +        DEBUG ((EFI_D_ERROR, "%a (MMC_CMD6): ReadBlockData Error and Status 
> = %r\n",__FUNCTION__, Status));
> +        return Status;
> +      }
> +
> +      if ((Buffer[4] & SWITCH_CMD_SUCCESS_MASK) != 0x01000000) {
> +        DEBUG((EFI_D_ERROR, "Problem switching SD card into high-speed 
> mode\n"));
> +        return Status;
> +      }
> +    }
>    }
>    if (Scr.SD_BUS_WIDTHS & SD_BUS_WIDTH_4BIT) {
>      CmdArg = MmcHostInstance->CardInfo.RCA << 16;
> @@ -470,7 +513,7 @@ InitializeSdMmcDevice (
>      }
>    }
>    if (MMC_HOST_HAS_SETIOS(MmcHost)) {
> -    Status = MmcHost->SetIos (MmcHost, 26 * 1000 * 1000, 4, EMMCBACKWARD);
> +    Status = MmcHost->SetIos (MmcHost, Speed, BUSWIDTH_4, EMMCBACKWARD);
>      if (EFI_ERROR (Status)) {
>        DEBUG ((EFI_D_ERROR, "%a (SetIos): Error and Status = %r\n", 
> __FUNCTION__, Status));
>        return Status;
> -- 
> 1.9.1
> 
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to