#include "Mmc.h"\r
\r
typedef union {\r
- UINT32 Raw;\r
- OCR Ocr;\r
+ UINT32 Raw;\r
+ OCR Ocr;\r
} OCR_RESPONSE;\r
\r
-#define MAX_RETRY_COUNT 1000\r
-#define CMD_RETRY_COUNT 20\r
-#define RCA_SHIFT_OFFSET 16\r
-#define EMMC_CARD_SIZE 512\r
-#define EMMC_ECSD_SIZE_OFFSET 53\r
+#define MAX_RETRY_COUNT 1000\r
+#define CMD_RETRY_COUNT 20\r
+#define RCA_SHIFT_OFFSET 16\r
+#define EMMC_CARD_SIZE 512\r
+#define EMMC_ECSD_SIZE_OFFSET 53\r
\r
-#define EXTCSD_BUS_WIDTH 183\r
-#define EXTCSD_HS_TIMING 185\r
+#define EXTCSD_BUS_WIDTH 183\r
+#define EXTCSD_HS_TIMING 185\r
\r
-#define EMMC_TIMING_BACKWARD 0\r
-#define EMMC_TIMING_HS 1\r
-#define EMMC_TIMING_HS200 2\r
-#define EMMC_TIMING_HS400 3\r
+#define EMMC_TIMING_BACKWARD 0\r
+#define EMMC_TIMING_HS 1\r
+#define EMMC_TIMING_HS200 2\r
+#define EMMC_TIMING_HS400 3\r
\r
-#define EMMC_BUS_WIDTH_1BIT 0\r
-#define EMMC_BUS_WIDTH_4BIT 1\r
-#define EMMC_BUS_WIDTH_8BIT 2\r
-#define EMMC_BUS_WIDTH_DDR_4BIT 5\r
-#define EMMC_BUS_WIDTH_DDR_8BIT 6\r
+#define EMMC_BUS_WIDTH_1BIT 0\r
+#define EMMC_BUS_WIDTH_4BIT 1\r
+#define EMMC_BUS_WIDTH_8BIT 2\r
+#define EMMC_BUS_WIDTH_DDR_4BIT 5\r
+#define EMMC_BUS_WIDTH_DDR_8BIT 6\r
\r
-#define EMMC_SWITCH_ERROR (1 << 7)\r
+#define EMMC_SWITCH_ERROR (1 << 7)\r
\r
-#define SD_BUS_WIDTH_1BIT (1 << 0)\r
-#define SD_BUS_WIDTH_4BIT (1 << 2)\r
+#define SD_BUS_WIDTH_1BIT (1 << 0)\r
+#define SD_BUS_WIDTH_4BIT (1 << 2)\r
\r
-#define SD_CCC_SWITCH (1 << 10)\r
+#define SD_CCC_SWITCH (1 << 10)\r
\r
-#define DEVICE_STATE(x) (((x) >> 9) & 0xf)\r
+#define DEVICE_STATE(x) (((x) >> 9) & 0xf)\r
typedef enum _EMMC_DEVICE_STATE {\r
EMMC_IDLE_STATE = 0,\r
EMMC_READY_STATE,\r
EMMC_SLP_STATE\r
} EMMC_DEVICE_STATE;\r
\r
-UINT32 mEmmcRcaCount = 0;\r
+UINT32 mEmmcRcaCount = 0;\r
\r
STATIC\r
EFI_STATUS\r
EFIAPI\r
EmmcGetDeviceState (\r
- IN MMC_HOST_INSTANCE *MmcHostInstance,\r
- OUT EMMC_DEVICE_STATE *State\r
+ IN MMC_HOST_INSTANCE *MmcHostInstance,\r
+ OUT EMMC_DEVICE_STATE *State\r
)\r
{\r
- EFI_MMC_HOST_PROTOCOL *Host;\r
- EFI_STATUS Status;\r
- UINT32 Data, RCA;\r
+ EFI_MMC_HOST_PROTOCOL *Host;\r
+ EFI_STATUS Status;\r
+ UINT32 Data, RCA;\r
\r
if (State == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Host = MmcHostInstance->MmcHost;\r
- RCA = MmcHostInstance->CardInfo.RCA << RCA_SHIFT_OFFSET;\r
+ Host = MmcHostInstance->MmcHost;\r
+ RCA = MmcHostInstance->CardInfo.RCA << RCA_SHIFT_OFFSET;\r
Status = Host->SendCommand (Host, MMC_CMD13, RCA);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "EmmcGetDeviceState(): Failed to get card status, Status=%r.\n", Status));\r
return Status;\r
}\r
+\r
Status = Host->ReceiveResponse (Host, MMC_RESPONSE_TYPE_R1, &Data);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "EmmcGetDeviceState(): Failed to get response of CMD13, Status=%r.\n", Status));\r
return Status;\r
}\r
+\r
if (Data & EMMC_SWITCH_ERROR) {\r
DEBUG ((DEBUG_ERROR, "EmmcGetDeviceState(): Failed to switch expected mode, Status=%r.\n", Status));\r
return EFI_DEVICE_ERROR;\r
}\r
- *State = DEVICE_STATE(Data);\r
+\r
+ *State = DEVICE_STATE (Data);\r
return EFI_SUCCESS;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
EmmcSetEXTCSD (\r
- IN MMC_HOST_INSTANCE *MmcHostInstance,\r
- UINT32 ExtCmdIndex,\r
- UINT32 Value\r
+ IN MMC_HOST_INSTANCE *MmcHostInstance,\r
+ UINT32 ExtCmdIndex,\r
+ UINT32 Value\r
)\r
{\r
- EFI_MMC_HOST_PROTOCOL *Host;\r
- EMMC_DEVICE_STATE State;\r
- EFI_STATUS Status;\r
- UINT32 Argument;\r
-\r
- Host = MmcHostInstance->MmcHost;\r
- Argument = EMMC_CMD6_ARG_ACCESS(3) | EMMC_CMD6_ARG_INDEX(ExtCmdIndex) |\r
- EMMC_CMD6_ARG_VALUE(Value) | EMMC_CMD6_ARG_CMD_SET(1);\r
+ EFI_MMC_HOST_PROTOCOL *Host;\r
+ EMMC_DEVICE_STATE State;\r
+ EFI_STATUS Status;\r
+ UINT32 Argument;\r
+\r
+ Host = MmcHostInstance->MmcHost;\r
+ Argument = EMMC_CMD6_ARG_ACCESS (3) | EMMC_CMD6_ARG_INDEX (ExtCmdIndex) |\r
+ EMMC_CMD6_ARG_VALUE (Value) | EMMC_CMD6_ARG_CMD_SET (1);\r
Status = Host->SendCommand (Host, MMC_CMD6, Argument);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "EmmcSetEXTCSD(): Failed to send CMD6, Status=%r.\n", Status));\r
return Status;\r
}\r
+\r
// Make sure device exiting prog mode\r
do {\r
Status = EmmcGetDeviceState (MmcHostInstance, &State);\r
return Status;\r
}\r
} while (State == EMMC_PRG_STATE);\r
+\r
return EFI_SUCCESS;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
EmmcIdentificationMode (\r
- IN MMC_HOST_INSTANCE *MmcHostInstance,\r
- IN OCR_RESPONSE Response\r
+ IN MMC_HOST_INSTANCE *MmcHostInstance,\r
+ IN OCR_RESPONSE Response\r
)\r
{\r
- EFI_MMC_HOST_PROTOCOL *Host;\r
- EFI_BLOCK_IO_MEDIA *Media;\r
- EFI_STATUS Status;\r
- EMMC_DEVICE_STATE State;\r
- UINT32 RCA;\r
+ EFI_MMC_HOST_PROTOCOL *Host;\r
+ EFI_BLOCK_IO_MEDIA *Media;\r
+ EFI_STATUS Status;\r
+ EMMC_DEVICE_STATE State;\r
+ UINT32 RCA;\r
\r
Host = MmcHostInstance->MmcHost;\r
Media = MmcHostInstance->BlockIo.Media;\r
\r
// Assign a relative address value to the card\r
MmcHostInstance->CardInfo.RCA = ++mEmmcRcaCount; // TODO: might need a more sophisticated way of doing this\r
- RCA = MmcHostInstance->CardInfo.RCA << RCA_SHIFT_OFFSET;\r
- Status = Host->SendCommand (Host, MMC_CMD3, RCA);\r
+ RCA = MmcHostInstance->CardInfo.RCA << RCA_SHIFT_OFFSET;\r
+ Status = Host->SendCommand (Host, MMC_CMD3, RCA);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "EmmcIdentificationMode(): RCA set error, Status=%r.\n", Status));\r
return Status;\r
DEBUG ((DEBUG_ERROR, "EmmcIdentificationMode(): Card selection error, Status=%r.\n", Status));\r
}\r
\r
- if (MMC_HOST_HAS_SETIOS(Host)) {\r
+ if (MMC_HOST_HAS_SETIOS (Host)) {\r
// Set 1-bit bus width\r
Status = Host->SetIos (Host, 0, 1, EMMCBACKWARD);\r
if (EFI_ERROR (Status)) {\r
if (MmcHostInstance->CardInfo.ECSDData == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+\r
Status = Host->SendCommand (Host, MMC_CMD8, 0);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "EmmcIdentificationMode(): ECSD fetch error, Status=%r.\n", Status));\r
} while (State == EMMC_DATA_STATE);\r
\r
// Set up media\r
- Media->BlockSize = EMMC_CARD_SIZE; // 512-byte support is mandatory for eMMC cards\r
- Media->MediaId = MmcHostInstance->CardInfo.CIDData.PSN;\r
- Media->ReadOnly = MmcHostInstance->CardInfo.CSDData.PERM_WRITE_PROTECT;\r
+ Media->BlockSize = EMMC_CARD_SIZE; // 512-byte support is mandatory for eMMC cards\r
+ Media->MediaId = MmcHostInstance->CardInfo.CIDData.PSN;\r
+ Media->ReadOnly = MmcHostInstance->CardInfo.CSDData.PERM_WRITE_PROTECT;\r
Media->LogicalBlocksPerPhysicalBlock = 1;\r
- Media->IoAlign = 4;\r
+ Media->IoAlign = 4;\r
// Compute last block using bits [215:212] of the ECSD\r
Media->LastBlock = MmcHostInstance->CardInfo.ECSDData->SECTOR_COUNT - 1; // eMMC isn't supposed to report this for\r
// Cards <2GB in size, but the model does.\r
STATIC\r
EFI_STATUS\r
InitializeEmmcDevice (\r
- IN MMC_HOST_INSTANCE *MmcHostInstance\r
+ IN MMC_HOST_INSTANCE *MmcHostInstance\r
)\r
{\r
- EFI_MMC_HOST_PROTOCOL *Host;\r
- EFI_STATUS Status = EFI_SUCCESS;\r
- ECSD *ECSDData;\r
- UINT32 BusClockFreq, Idx, BusMode;\r
- UINT32 TimingMode[4] = {EMMCHS52DDR1V2, EMMCHS52DDR1V8, EMMCHS52, EMMCHS26};\r
+ EFI_MMC_HOST_PROTOCOL *Host;\r
+ EFI_STATUS Status = EFI_SUCCESS;\r
+ ECSD *ECSDData;\r
+ UINT32 BusClockFreq, Idx, BusMode;\r
+ UINT32 TimingMode[4] = { EMMCHS52DDR1V2, EMMCHS52DDR1V8, EMMCHS52, EMMCHS26 };\r
\r
- Host = MmcHostInstance->MmcHost;\r
+ Host = MmcHostInstance->MmcHost;\r
ECSDData = MmcHostInstance->CardInfo.ECSDData;\r
- if (ECSDData->DEVICE_TYPE == EMMCBACKWARD)\r
+ if (ECSDData->DEVICE_TYPE == EMMCBACKWARD) {\r
return EFI_SUCCESS;\r
+ }\r
\r
- if (!MMC_HOST_HAS_SETIOS(Host)) {\r
+ if (!MMC_HOST_HAS_SETIOS (Host)) {\r
return EFI_SUCCESS;\r
}\r
+\r
Status = EmmcSetEXTCSD (MmcHostInstance, EXTCSD_HS_TIMING, EMMC_TIMING_HS);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "InitializeEmmcDevice(): Failed to switch high speed mode, Status:%r.\n", Status));\r
\r
for (Idx = 0; Idx < 4; Idx++) {\r
switch (TimingMode[Idx]) {\r
- case EMMCHS52DDR1V2:\r
- case EMMCHS52DDR1V8:\r
- case EMMCHS52:\r
- BusClockFreq = 52000000;\r
- break;\r
- case EMMCHS26:\r
- BusClockFreq = 26000000;\r
- break;\r
- default:\r
- return EFI_UNSUPPORTED;\r
- }\r
- Status = Host->SetIos (Host, BusClockFreq, 8, TimingMode[Idx]);\r
- if (!EFI_ERROR (Status)) {\r
- switch (TimingMode[Idx]) {\r
case EMMCHS52DDR1V2:\r
case EMMCHS52DDR1V8:\r
- BusMode = EMMC_BUS_WIDTH_DDR_8BIT;\r
- break;\r
case EMMCHS52:\r
+ BusClockFreq = 52000000;\r
+ break;\r
case EMMCHS26:\r
- BusMode = EMMC_BUS_WIDTH_8BIT;\r
+ BusClockFreq = 26000000;\r
break;\r
default:\r
return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Status = Host->SetIos (Host, BusClockFreq, 8, TimingMode[Idx]);\r
+ if (!EFI_ERROR (Status)) {\r
+ switch (TimingMode[Idx]) {\r
+ case EMMCHS52DDR1V2:\r
+ case EMMCHS52DDR1V8:\r
+ BusMode = EMMC_BUS_WIDTH_DDR_8BIT;\r
+ break;\r
+ case EMMCHS52:\r
+ case EMMCHS26:\r
+ BusMode = EMMC_BUS_WIDTH_8BIT;\r
+ break;\r
+ default:\r
+ return EFI_UNSUPPORTED;\r
}\r
+\r
Status = EmmcSetEXTCSD (MmcHostInstance, EXTCSD_BUS_WIDTH, BusMode);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "InitializeEmmcDevice(): Failed to set EXTCSD bus width, Status:%r\n", Status));\r
}\r
+\r
return Status;\r
}\r
}\r
+\r
return Status;\r
}\r
\r
STATIC\r
UINT32\r
CreateSwitchCmdArgument (\r
- IN UINT32 Mode,\r
- IN UINT8 Group,\r
- IN UINT8 Value\r
+ IN UINT32 Mode,\r
+ IN UINT8 Group,\r
+ IN UINT8 Value\r
)\r
{\r
- UINT32 Argument;\r
+ UINT32 Argument;\r
\r
- Argument = Mode << 31 | 0x00FFFFFF;\r
+ Argument = Mode << 31 | 0x00FFFFFF;\r
Argument &= ~(0xF << (Group * 4));\r
Argument |= Value << (Group * 4);\r
\r
STATIC\r
EFI_STATUS\r
InitializeSdMmcDevice (\r
- IN MMC_HOST_INSTANCE *MmcHostInstance\r
+ IN MMC_HOST_INSTANCE *MmcHostInstance\r
)\r
{\r
- UINT32 CmdArg;\r
- UINT32 Response[4];\r
- UINT32 Buffer[128];\r
- UINT32 Speed;\r
- UINTN BlockSize;\r
- UINTN CardSize;\r
- UINTN NumBlocks;\r
- BOOLEAN CccSwitch;\r
- SCR Scr;\r
- EFI_STATUS Status;\r
- EFI_MMC_HOST_PROTOCOL *MmcHost;\r
-\r
- Speed = SD_DEFAULT_SPEED;\r
+ UINT32 CmdArg;\r
+ UINT32 Response[4];\r
+ UINT32 Buffer[128];\r
+ UINT32 Speed;\r
+ UINTN BlockSize;\r
+ UINTN CardSize;\r
+ UINTN NumBlocks;\r
+ BOOLEAN CccSwitch;\r
+ SCR Scr;\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
CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD9, CmdArg);\r
if (EFI_ERROR (Status)) {\r
- DEBUG((DEBUG_ERROR, "InitializeSdMmcDevice(MMC_CMD9): Error, Status=%r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "InitializeSdMmcDevice(MMC_CMD9): Error, Status=%r\n", Status));\r
return Status;\r
}\r
\r
// Read Response\r
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_CSD, Response);\r
if (EFI_ERROR (Status)) {\r
- DEBUG((DEBUG_ERROR, "InitializeSdMmcDevice(): Failed to receive CSD, Status=%r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "InitializeSdMmcDevice(): Failed to receive CSD, Status=%r\n", Status));\r
return Status;\r
}\r
+\r
PrintCSD (Response);\r
- if (MMC_CSD_GET_CCC(Response) & SD_CCC_SWITCH) {\r
+ if (MMC_CSD_GET_CCC (Response) & SD_CCC_SWITCH) {\r
CccSwitch = TRUE;\r
} else {\r
CccSwitch = FALSE;\r
}\r
\r
if (MmcHostInstance->CardInfo.CardType == SD_CARD_2_HIGH) {\r
- CardSize = HC_MMC_CSD_GET_DEVICESIZE (Response);\r
+ CardSize = HC_MMC_CSD_GET_DEVICESIZE (Response);\r
NumBlocks = ((CardSize + 1) * 1024);\r
BlockSize = 1 << MMC_CSD_GET_READBLLEN (Response);\r
} else {\r
- CardSize = MMC_CSD_GET_DEVICESIZE (Response);\r
+ CardSize = MMC_CSD_GET_DEVICESIZE (Response);\r
NumBlocks = (CardSize + 1) * (1 << (MMC_CSD_GET_DEVICESIZEMULT (Response) + 2));\r
BlockSize = 1 << MMC_CSD_GET_READBLLEN (Response);\r
}\r
CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD7, CmdArg);\r
if (EFI_ERROR (Status)) {\r
- DEBUG((DEBUG_ERROR, "InitializeSdMmcDevice(MMC_CMD7): Error and Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "InitializeSdMmcDevice(MMC_CMD7): Error and Status = %r\n", Status));\r
return Status;\r
}\r
\r
DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
+\r
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1, Response);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
+\r
if ((Response[0] & MMC_STATUS_APP_CMD) == 0) {\r
return EFI_SUCCESS;\r
}\r
DEBUG ((DEBUG_ERROR, "%a(MMC_ACMD51): ReadBlockData Error and Status = %r\n", __func__, Status));\r
return Status;\r
}\r
+\r
CopyMem (&Scr, Buffer, 8);\r
if (Scr.SD_SPEC == 2) {\r
if (Scr.SD_SPEC3 == 1) {\r
- if (Scr.SD_SPEC4 == 1) {\r
+ if (Scr.SD_SPEC4 == 1) {\r
DEBUG ((DEBUG_INFO, "Found SD Card for Spec Version 4.xx\n"));\r
- } else {\r
+ } else {\r
DEBUG ((DEBUG_INFO, "Found SD Card for Spec Version 3.0x\n"));\r
- }\r
+ }\r
} else {\r
- if (Scr.SD_SPEC4 == 0) {\r
+ if (Scr.SD_SPEC4 == 0) {\r
DEBUG ((DEBUG_INFO, "Found SD Card for Spec Version 2.0\n"));\r
- } else {\r
- DEBUG ((DEBUG_ERROR, "Found invalid SD Card\n"));\r
- }\r
+ } else {\r
+ DEBUG ((DEBUG_ERROR, "Found invalid SD Card\n"));\r
+ }\r
}\r
} else {\r
if ((Scr.SD_SPEC3 == 0) && (Scr.SD_SPEC4 == 0)) {\r
if (Scr.SD_SPEC == 1) {\r
- DEBUG ((DEBUG_INFO, "Found SD Card for Spec Version 1.10\n"));\r
- } else {\r
- DEBUG ((DEBUG_INFO, "Found SD Card for Spec Version 1.0\n"));\r
- }\r
+ DEBUG ((DEBUG_INFO, "Found SD Card for Spec Version 1.10\n"));\r
+ } else {\r
+ DEBUG ((DEBUG_INFO, "Found SD Card for Spec Version 1.0\n"));\r
+ }\r
} else {\r
DEBUG ((DEBUG_ERROR, "Found invalid SD Card\n"));\r
}\r
}\r
}\r
+\r
if (CccSwitch) {\r
/* SD Switch, Mode:0, Group:0, Value:0 */\r
- CmdArg = CreateSwitchCmdArgument(0, 0, 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
+ return Status;\r
} else {\r
Status = MmcHost->ReadBlockData (MmcHost, 0, SWITCH_CMD_DATA_LENGTH, Buffer);\r
if (EFI_ERROR (Status)) {\r
Speed = SD_HIGH_SPEED;\r
\r
/* SD Switch, Mode:1, Group:0, Value:1 */\r
- CmdArg = CreateSwitchCmdArgument(1, 0, 1);\r
+ CmdArg = CreateSwitchCmdArgument (1, 0, 1);\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
}\r
\r
if ((Buffer[4] & SWITCH_CMD_SUCCESS_MASK) != 0x01000000) {\r
- DEBUG((DEBUG_ERROR, "Problem switching SD card into high-speed mode\n"));\r
+ DEBUG ((DEBUG_ERROR, "Problem switching SD card into high-speed mode\n"));\r
return Status;\r
}\r
}\r
}\r
}\r
+\r
if (Scr.SD_BUS_WIDTHS & SD_BUS_WIDTH_4BIT) {\r
CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, CmdArg);\r
DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
+\r
/* Width: 4 */\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, 2);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
}\r
- if (MMC_HOST_HAS_SETIOS(MmcHost)) {\r
+\r
+ if (MMC_HOST_HAS_SETIOS (MmcHost)) {\r
Status = MmcHost->SetIos (MmcHost, Speed, BUSWIDTH_4, EMMCBACKWARD);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "%a (SetIos): Error and Status = %r\n", __FUNCTION__, Status));\r
return Status;\r
}\r
}\r
+\r
return EFI_SUCCESS;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
MmcIdentificationMode (\r
- IN MMC_HOST_INSTANCE *MmcHostInstance\r
+ IN MMC_HOST_INSTANCE *MmcHostInstance\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT32 Response[4];\r
- UINTN Timeout;\r
- UINTN CmdArg;\r
- BOOLEAN IsHCS;\r
- EFI_MMC_HOST_PROTOCOL *MmcHost;\r
- OCR_RESPONSE OcrResponse;\r
+ EFI_STATUS Status;\r
+ UINT32 Response[4];\r
+ UINTN Timeout;\r
+ UINTN CmdArg;\r
+ BOOLEAN IsHCS;\r
+ EFI_MMC_HOST_PROTOCOL *MmcHost;\r
+ OCR_RESPONSE OcrResponse;\r
\r
MmcHost = MmcHostInstance->MmcHost;\r
- CmdArg = 0;\r
- IsHCS = FALSE;\r
+ CmdArg = 0;\r
+ IsHCS = FALSE;\r
\r
if (MmcHost == NULL) {\r
return EFI_INVALID_PARAMETER;\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode(MMC_CMD0): Error, Status=%r.\n", Status));\r
return Status;\r
}\r
+\r
Status = MmcNotifyState (MmcHostInstance, MmcIdleState);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Error MmcIdleState, Status=%r.\n", Status));\r
Timeout = MAX_RETRY_COUNT;\r
do {\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD1, EMMC_CMD1_CAPACITY_GREATER_THAN_2GB);\r
- if (EFI_ERROR (Status))\r
+ if (EFI_ERROR (Status)) {\r
break;\r
+ }\r
+\r
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_OCR, (UINT32 *)&OcrResponse);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status));\r
return Status;\r
}\r
+\r
Timeout--;\r
} while (!OcrResponse.Ocr.PowerUp && (Timeout > 0));\r
+\r
if (Status == EFI_SUCCESS) {\r
if (!OcrResponse.Ocr.PowerUp) {\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode(MMC_CMD1): Card initialisation failure, Status=%r.\n", Status));\r
return EFI_DEVICE_ERROR;\r
}\r
+\r
OcrResponse.Ocr.PowerUp = 0;\r
if (OcrResponse.Raw == EMMC_CMD1_CAPACITY_GREATER_THAN_2GB) {\r
MmcHostInstance->CardInfo.OCRData.AccessMode = BIT1;\r
- }\r
- else {\r
+ } else {\r
MmcHostInstance->CardInfo.OCRData.AccessMode = 0x0;\r
}\r
+\r
// Check whether MMC or eMMC\r
- if (OcrResponse.Raw == EMMC_CMD1_CAPACITY_GREATER_THAN_2GB ||\r
- OcrResponse.Raw == EMMC_CMD1_CAPACITY_LESS_THAN_2GB) {\r
+ if ((OcrResponse.Raw == EMMC_CMD1_CAPACITY_GREATER_THAN_2GB) ||\r
+ (OcrResponse.Raw == EMMC_CMD1_CAPACITY_LESS_THAN_2GB))\r
+ {\r
return EmmcIdentificationMode (MmcHostInstance, OcrResponse);\r
}\r
}\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD8, CmdArg);\r
if (Status == EFI_SUCCESS) {\r
DEBUG ((DEBUG_ERROR, "Card is SD2.0 => Supports high capacity\n"));\r
- IsHCS = TRUE;\r
+ IsHCS = TRUE;\r
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R7, Response);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive response to CMD8, Status=%r.\n", Status));\r
return Status;\r
}\r
+\r
PrintResponseR1 (Response[0]);\r
// Check if it is valid response\r
if (Response[0] != CmdArg) {\r
}\r
\r
// Note: The first time CmdArg will be zero\r
- CmdArg = ((UINTN *) &(MmcHostInstance->CardInfo.OCRData))[0];\r
+ CmdArg = ((UINTN *)&(MmcHostInstance->CardInfo.OCRData))[0];\r
if (IsHCS) {\r
CmdArg |= BIT30;\r
}\r
+\r
Status = MmcHost->SendCommand (MmcHost, MMC_ACMD41, CmdArg);\r
if (!EFI_ERROR (Status)) {\r
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_OCR, Response);\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status));\r
return Status;\r
}\r
- ((UINT32 *) &(MmcHostInstance->CardInfo.OCRData))[0] = Response[0];\r
+\r
+ ((UINT32 *)&(MmcHostInstance->CardInfo.OCRData))[0] = Response[0];\r
}\r
} else {\r
DEBUG ((DEBUG_INFO, "Card should be MMC\n"));\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status));\r
return Status;\r
}\r
- ((UINT32 *) &(MmcHostInstance->CardInfo.OCRData))[0] = Response[0];\r
+\r
+ ((UINT32 *)&(MmcHostInstance->CardInfo.OCRData))[0] = Response[0];\r
}\r
}\r
\r
MmcHostInstance->CardInfo.CardType = SD_CARD_2_HIGH;\r
DEBUG ((DEBUG_ERROR, "High capacity card.\n"));\r
}\r
+\r
break; // The MMC/SD card is ready. Continue the Identification Mode\r
}\r
} else {\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode(MMC_CMD2): Error\n"));\r
return Status;\r
}\r
+\r
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_CID, Response);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive CID, Status=%r.\n", Status));\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive RCA, Status=%r.\n", Status));\r
return Status;\r
}\r
+\r
PrintRCA (Response[0]);\r
\r
// For MMC card, RCA is assigned by CMD3 while CMD3 dumps the RCA for SD card\r
} else {\r
MmcHostInstance->CardInfo.RCA = CmdArg;\r
}\r
+\r
Status = MmcNotifyState (MmcHostInstance, MmcStandByState);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Error MmcStandByState\n"));\r
\r
EFI_STATUS\r
InitializeMmcDevice (\r
- IN MMC_HOST_INSTANCE *MmcHostInstance\r
+ IN MMC_HOST_INSTANCE *MmcHostInstance\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_MMC_HOST_PROTOCOL *MmcHost;\r
- UINTN BlockCount;\r
+ EFI_STATUS Status;\r
+ EFI_MMC_HOST_PROTOCOL *MmcHost;\r
+ UINTN BlockCount;\r
\r
BlockCount = 1;\r
- MmcHost = MmcHostInstance->MmcHost;\r
+ MmcHost = MmcHostInstance->MmcHost;\r
\r
Status = MmcIdentificationMode (MmcHostInstance);\r
if (EFI_ERROR (Status)) {\r
- DEBUG((DEBUG_ERROR, "InitializeMmcDevice(): Error in Identification Mode, Status=%r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "InitializeMmcDevice(): Error in Identification Mode, Status=%r\n", Status));\r
return Status;\r
}\r
\r
Status = MmcNotifyState (MmcHostInstance, MmcTransferState);\r
if (EFI_ERROR (Status)) {\r
- DEBUG((DEBUG_ERROR, "InitializeMmcDevice(): Error MmcTransferState, Status=%r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "InitializeMmcDevice(): Error MmcTransferState, Status=%r\n", Status));\r
return Status;\r
}\r
\r
} else {\r
Status = InitializeEmmcDevice (MmcHostInstance);\r
}\r
+\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
// Set Block Length\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD16, MmcHostInstance->BlockIo.Media->BlockSize);\r
if (EFI_ERROR (Status)) {\r
- DEBUG((DEBUG_ERROR, "InitializeMmcDevice(MMC_CMD16): Error MmcHostInstance->BlockIo.Media->BlockSize: %d and Error = %r\n",\r
- MmcHostInstance->BlockIo.Media->BlockSize, Status));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "InitializeMmcDevice(MMC_CMD16): Error MmcHostInstance->BlockIo.Media->BlockSize: %d and Error = %r\n",\r
+ MmcHostInstance->BlockIo.Media->BlockSize,\r
+ Status\r
+ ));\r
return Status;\r
}\r
\r
if (MmcHostInstance->CardInfo.CardType == MMC_CARD) {\r
Status = MmcHost->SendCommand (MmcHost, MMC_CMD23, BlockCount);\r
if (EFI_ERROR (Status)) {\r
- DEBUG((DEBUG_ERROR, "InitializeMmcDevice(MMC_CMD23): Error, Status=%r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "InitializeMmcDevice(MMC_CMD23): Error, Status=%r\n", Status));\r
return Status;\r
}\r
}\r