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?
+ 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?
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?
+ 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".
Is there no struct available to access this information in more human
readable form?
And a #define for the 0x20000, please.
+ 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?
+
/* 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.
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[].
Is there no struct available to access this information in more human
readable form?
And a #define for both the magic values, please.
+ 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