Hi Leif, I agree to contribute under TianoCore Contribution Agreement 1.1
Thanks, Meenakshi > -----Original Message----- > From: Leif Lindholm [mailto:leif.lindh...@linaro.org] > Sent: Thursday, September 07, 2017 8:05 PM > To: Meenakshi Aggarwal <meenakshi.aggar...@nxp.com> > Cc: jun....@linaro.org; haojian.zhu...@linaro.org; edk2-devel@lists.01.org > Subject: Re: [PATCH v3 2/2] SD : Updated CMD 6 implememtation. > > On Thu, Sep 07, 2017 at 07:47:53PM +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 > > Ok, I would say this one is good to go, but can you please confirm if you are > happy to contribute under TianoCore Contribution Agreement 1.1, which is > the version currently described in Contributions.txt? > > If so, I can fold in this change and push. > > Oh, you also appear to have left out edk2-devel@lists.01.org in this > submission (added). > > Best Regards, > > Leif > > > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggar...@nxp.com> > > --- > > EmbeddedPkg/Universal/MmcDxe/Mmc.h | 8 ++++ > > EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c | 53 > > +++++++++++++++++++++--- > > 2 files changed, 56 insertions(+), 5 deletions(-) mode change 100644 > > => 100755 EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c > > > > 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 > > old mode 100644 > > new mode 100755 > > index 27e4444..f661a0c > > --- 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,20 +458,44 @@ > > InitializeSdMmcDevice ( > > } > > } > > if (CccSwitch) { > > + /* 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 ((DEBUG_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 ((DEBUG_ERROR, "%a (MMC_CMD6): ReadBlockData Error > and Status = %r\n", __FUNCTION__, Status)); > > + return Status; > > + } > > + } > > + > > + if (!(Buffer[3] & SD_HIGH_SPEED_SUPPORTED)) { > > + DEBUG ((DEBUG_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 = 1 << 31 | 0x00FFFFFF; > > - CmdArg &= ~(0xF << (0 * 4)); > > - CmdArg |= 1 << (0 * 4); > > + CmdArg = CreateSwitchCmdArgument(1, 0, 1); > > Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, CmdArg); > > if (EFI_ERROR (Status)) { > > DEBUG ((DEBUG_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 ((DEBUG_ERROR, "%a (MMC_CMD6): ReadBlockData Error and > Status = %r\n", __FUNCTION__, Status)); > > return Status; > > } > > + > > + if ((Buffer[4] & SWITCH_CMD_SUCCESS_MASK) != 0x01000000) { > > + DEBUG((DEBUG_ERROR, "Problem switching SD card into high-speed > mode\n")); > > + return Status; > > + } > > } > > } > > if (Scr.SD_BUS_WIDTHS & SD_BUS_WIDTH_4BIT) { @@ -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 ((DEBUG_ERROR, "%a (SetIos): Error and Status = %r\n", > __FUNCTION__, Status)); > > return Status; > > -- > > 1.9.1 > > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel