Hi Jun,
I checked my host controller driver and i am taking care of its endianness in host controller driver itself. I researched further on the bit number I am checking for High speed in CMD6 data. I tried to find out in SD specs if response for CMD 6 comes it LE or BE format. I didn't find out anything mentioned directly for CMD6 but yes for ACMD51 (SCR command), it follows BE. We are reading only 8 bytes in SCR register to get SD version, while SD version comes in bit 59:56: SD Memory Card - Spec. Version SD_SPEC [59:56] I think similar stands true for CMD6 as well. Bit 512 is coming first on DATA line. So I am checking correct bits in patch. I have refer linux code also, there also they are considering bit 512 is coming first. Please comment. Thanks, Meenakshi > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of > Meenakshi Aggarwal > Sent: Friday, September 01, 2017 3:03 PM > To: Jun Nie <jun....@linaro.org>; Leif Lindholm <leif.lindh...@linaro.org> > Cc: edk2-devel@lists.01.org; Haojian Zhuang <haojian.zhu...@linaro.org> > Subject: Re: [edk2] [PATCH 2/2] SD : Updated CMD 6 implememtation. > > [This sender failed our fraud detection checks and may not be who they > appear to be. Learn about spoofing at http://aka.ms/LearnAboutSpoofing] > > Hi Leif and Jun, > > > Thanks for your review. > > > My comments are inlined. > > Regards, > Meenakshi > > > -----Original Message----- > > From: Jun Nie [mailto:jun....@linaro.org] > > Sent: Thursday, August 31, 2017 8:13 PM > > To: Leif Lindholm <leif.lindh...@linaro.org>; Meenakshi Aggarwal > > <meenakshi.aggar...@nxp.com> > > Cc: edk2-devel@lists.01.org; Haojian Zhuang > > <haojian.zhu...@linaro.org> > > Subject: Re: [edk2] [PATCH 2/2] SD : Updated CMD 6 implememtation. > > > > On 2017年08月31日 20:06, Leif Lindholm wrote: > > > On Wed, Aug 30, 2017 at 07:50:59PM +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. > > > > Good catch, check should be done before setting function. And the > > setting result should be checked before return. Logic is correct in this > > patch. > > > > > > > > Same as previous one: Jun, Haojian? > > > > > > I do have a couple of style comments below. > > > > > >> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggar...@nxp.com> > > >> --- > > >> EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c | 64 > > ++++++++++++++++++++---- > > >> 1 file changed, 55 insertions(+), 9 deletions(-) > > >> > > >> diff --git a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c > > >> b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c > > >> index 7f74c54..3071b3b 100644 > > >> --- a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c > > >> +++ b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c > > >> @@ -317,6 +317,24 @@ InitializeEmmcDevice ( > > >> return Status; > > >> } > > >> > > >> + > > >> +STATIC > > >> +UINT32 > > >> +CreateSwitchCmdArgument ( > > > > > > This helper function is a good addition, thanks. > > > > > >> + IN UINT8 Mode, > > >> + IN UINT8 Group, > > >> + IN UINT8 Value > > >> + ) > > >> +{ > > >> + UINT32 Argument; > > >> + > > >> + Argument = Mode << 31 | 0x00FFFFFF; > > > > > > Just because I hate implicit type promotion, could you make Mode > > > UINT32 in the input, please? > > > > I will surely do this. > > > >> + Argument &= ~(0xF << (Group * 4)); Argument |= Value << (Group > > >> + * 4); > > >> + > > >> + return Argument; > > >> +} > > >> + > > >> STATIC > > >> EFI_STATUS > > >> InitializeSdMmcDevice ( > > >> @@ -326,6 +344,7 @@ InitializeSdMmcDevice ( > > >> UINT32 CmdArg; > > >> UINT32 Response[4]; > > >> UINT32 Buffer[128]; > > >> + UINT32 Speed; > > >> UINTN BlockSize; > > >> UINTN CardSize; > > >> UINTN NumBlocks; > > >> @@ -334,6 +353,7 @@ InitializeSdMmcDevice ( > > >> EFI_STATUS Status; > > >> EFI_MMC_HOST_PROTOCOL *MmcHost; > > >> > > >> + Speed = 25000000; > > > > > > Could this be given a #define with a descriptive name, in Mmc.h? > > > > ok > > >> MmcHost = MmcHostInstance->MmcHost; > > >> > > >> // Send a command to get Card specific data @@ -439,43 +459,69 > > >> @@ InitializeSdMmcDevice ( > > >> } > > >> } > > >> if (CccSwitch) { > > >> + /* SD Switch, Mode:0, Group:0, Value:0 */ > > >> + CmdArg = CreateSwitchCmdArgument(0, 0, 0); > > > > A SD_MODE_CHECK/GET macro is clearer than 0 and 1 value for Mode. > > > > >> + Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, > > CmdArg); > > >> + if (EFI_ERROR (Status)) { > > >> + DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Failed with Status = > > %r\n", __func__, Status)); > > >> + return Status; > > >> + } else { > > >> + Status = MmcHost->ReadBlockData (MmcHost, 0, 64, Buffer); > > > > > > What are 0 and 64? > > > I guess 64 is a size? > > > Is there a #define or a sizeof() that could make it more descriptive? > > > > Yes 64 is the number of bytes we want to read, and 0 is the block offset. > I will add a macro for size. > > > >> + if (EFI_ERROR (Status)) { > > >> + DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): ReadBlockData Failed > > with Status = %r\n", __func__, Status)); > > >> + return Status; > > >> + } > > >> + } > > >> + > > >> + if (!(Buffer[3] & 0x20000)) { > > > > Bit 401 is HS support status. So bit in Buffer[12] should be tested. > > Or I miss anything? I am checking "SD Specifications Part 1 Physical > > Layer Specification Version 2.00". > > > Ah... You are correct, my SD host controller is Big Endian and so is the > difference, I will update the patch and soon send V2. > > > > > > Is there no struct available to access this information in more > > > human readable form? > > > > No ☹ > > > > And a #define for the 0x20000, please. > > > > For sure > > > >> + DEBUG ((EFI_D_ERROR, "%aHigh Speed not supported by Card > > >> + %r\n", > > __func__, Status)); > > >> + return Status; > > >> + } > > >> + > > >> + Speed = 50000000; //High Speed for SD card is 50 MHZ > > > > > > Could this be given a #define with a descriptive name, in Mmc.h? > > > > Ok > > > >> + > > >> /* 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 ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = > %r\n", > > Status)); > > >> + DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = > > >> + %r\n", __func__, Status)); > > > > > > This looks like an unrelated bugfix? It is good, and thank you, but > > > could you break it out into its own patch please? > > > Also, __FUNCTION__ matches the coding style better (I know we have > > > both, but __func__ appears to be losing, and I would like to keep > > > that momentum up. > > > > Ok... will send a separate patch > > > >> return Status; > > >> } else { > > >> Status = MmcHost->ReadBlockData (MmcHost, 0, 64, Buffer); > > >> if (EFI_ERROR (Status)) { > > >> - DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): ReadBlockData Error > and > > Status = %r\n", Status)); > > >> + DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): ReadBlockData Error > > >> + and Status = %r\n",__func__, Status)); > > > > > > Unrelated bugfix (same as comment above, and same patch please). > > > > > >> + return Status; > > >> + } > > >> + > > >> + if ((Buffer[4] & 0x0f000000) != 0x01000000) { > > > > HS function busy status is bit 287:272 in response, bit 273 actually. > > Bit 379:376 is error status or function number if no error. So I guess > > you should test bit in other two elements of Buffer[]. > > > Again... You are correct, I will update the patch and send V2 soon. > > > > > > Is there no struct available to access this information in more > > > human readable form? > > > > No > > > And a #define for both the magic values, please. > > > > Ok > > > >> + 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; > > >> Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, > > CmdArg); > > >> if (EFI_ERROR (Status)) { > > >> - DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = > %r\n", > > Status)); > > >> + DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = > > %r\n", > > >> + __func__, Status)); > > > > > > Unrelated bugfix (same as comment above, and same patch please). > > > > > >> return Status; > > >> } > > >> /* Width: 4 */ > > >> Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, 2); > > >> if (EFI_ERROR (Status)) { > > >> - DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = > %r\n", > > Status)); > > >> + DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = > > >> + %r\n", __func__, Status)); > > > > > > Unrelated bugfix (same as comment above, and same patch please). > > > > > >> return Status; > > >> } > > >> } > > >> if (MMC_HOST_HAS_SETIOS(MmcHost)) { > > >> - Status = MmcHost->SetIos (MmcHost, 26 * 1000 * 1000, 4, > > EMMCBACKWARD); > > >> + Status = MmcHost->SetIos (MmcHost, Speed, 4, EMMCBACKWARD); > > >> if (EFI_ERROR (Status)) { > > >> - DEBUG ((EFI_D_ERROR, "%a(SetIos): Error and Status = %r\n", > > Status)); > > >> + DEBUG ((EFI_D_ERROR, "%a(SetIos): Error and Status = %r\n", > > >> + __func__, Status)); > > > > > > Unrelated bugfix (same as comment above, and same patch please). > > > > > > / > > > Leif > > > > > >> return Status; > > >> } > > >> } > > >> + > > >> return EFI_SUCCESS; > > >> } > > >> > > >> -- > > >> 1.9.1 > > >> > > >> _______________________________________________ > > >> edk2-devel mailing list > > >> edk2-devel@lists.01.org > > >> https://lists.01.org/mailman/listinfo/edk2-devel > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel