return Status;\r
}\r
\r
+STATIC\r
+UINT32\r
+CreateSwitchCmdArgument (\r
+ IN UINT32 Mode,\r
+ IN UINT8 Group,\r
+ IN UINT8 Value\r
+ )\r
+{\r
+ UINT32 Argument;\r
+\r
+ Argument = Mode << 31 | 0x00FFFFFF;\r
+ Argument &= ~(0xF << (Group * 4));\r
+ Argument |= Value << (Group * 4);\r
+\r
+ return Argument;\r
+}\r
+\r
STATIC\r
EFI_STATUS\r
InitializeSdMmcDevice (\r
UINT32 CmdArg;\r
UINT32 Response[4];\r
UINT32 Buffer[128];\r
+ UINT32 Speed;\r
UINTN BlockSize;\r
UINTN CardSize;\r
UINTN NumBlocks;\r
EFI_STATUS Status;\r
EFI_MMC_HOST_PROTOCOL *MmcHost;\r
\r
+ Speed = SD_DEFAULT_SPEED;\r
MmcHost = MmcHostInstance->MmcHost;\r
\r
// Send a command to get Card specific data\r
\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, CmdArg);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1, Response);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
if ((Response[0] & MMC_STATUS_APP_CMD) == 0) {\r
}\r
}\r
if (CccSwitch) {\r
+ /* SD Switch, Mode:0, Group:0, Value:0 */\r
+ CmdArg = CreateSwitchCmdArgument(0, 0, 0);\r
+ Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, CmdArg);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): Error and Status = %r\n", __FUNCTION__, Status));\r
+ return Status;\r
+ } else {\r
+ Status = MmcHost->ReadBlockData (MmcHost, 0, SWITCH_CMD_DATA_LENGTH, Buffer);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): ReadBlockData Error and Status = %r\n", __FUNCTION__, Status));\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ if (!(Buffer[3] & SD_HIGH_SPEED_SUPPORTED)) {\r
+ DEBUG ((DEBUG_ERROR, "%a : High Speed not supported by Card %r\n", __FUNCTION__, Status));\r
+ return Status;\r
+ }\r
+\r
+ Speed = SD_HIGH_SPEED;\r
+\r
/* SD Switch, Mode:1, Group:0, Value:1 */\r
- CmdArg = 1 << 31 | 0x00FFFFFF;\r
- CmdArg &= ~(0xF << (0 * 4));\r
- CmdArg |= 1 << (0 * 4);\r
+ CmdArg = CreateSwitchCmdArgument(1, 0, 1);\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, CmdArg);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
} else {\r
- Status = MmcHost->ReadBlockData (MmcHost, 0, 64, Buffer);\r
+ Status = MmcHost->ReadBlockData (MmcHost, 0, SWITCH_CMD_DATA_LENGTH, Buffer);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): ReadBlockData Error and Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): ReadBlockData Error and Status = %r\n", __FUNCTION__, Status));\r
+ return Status;\r
+ }\r
+\r
+ if ((Buffer[4] & SWITCH_CMD_SUCCESS_MASK) != 0x01000000) {\r
+ DEBUG((DEBUG_ERROR, "Problem switching SD card into high-speed mode\n"));\r
return Status;\r
}\r
}\r
CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, CmdArg);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
/* Width: 4 */\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, 2);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
}\r
if (MMC_HOST_HAS_SETIOS(MmcHost)) {\r
- Status = MmcHost->SetIos (MmcHost, 26 * 1000 * 1000, 4, EMMCBACKWARD);\r
+ Status = MmcHost->SetIos (MmcHost, Speed, BUSWIDTH_4, EMMCBACKWARD);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a(SetIos): Error and Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "%a (SetIos): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
}\r