]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
SD : Updated CMD 6 implememtation.
[mirror_edk2.git] / EmbeddedPkg / Universal / MmcDxe / MmcIdentification.c
old mode 100644 (file)
new mode 100755 (executable)
index 7f74c54..f661a0c
@@ -317,6 +317,23 @@ InitializeEmmcDevice (
   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
@@ -326,6 +343,7 @@ InitializeSdMmcDevice (
   UINT32        CmdArg;\r
   UINT32        Response[4];\r
   UINT32        Buffer[128];\r
+  UINT32        Speed;\r
   UINTN         BlockSize;\r
   UINTN         CardSize;\r
   UINTN         NumBlocks;\r
@@ -334,6 +352,7 @@ InitializeSdMmcDevice (
   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
@@ -388,12 +407,12 @@ InitializeSdMmcDevice (
 \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
@@ -439,18 +458,42 @@ InitializeSdMmcDevice (
     }\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
@@ -459,20 +502,20 @@ InitializeSdMmcDevice (
     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