Browse Source

sd debug: add sd cmd6 and endian process

sd cmd6 read block data while mmc cmd6 no.
hard to depart two cmds in dw mmc driver.
add tmp modification first.

Signed-off-by: minda.chen <minda.chen@starfivetech.com>
minda.chen 1 year ago
parent
commit
49b24a5f28

+ 2 - 0
EmbeddedPkg/Include/Protocol/MmcHost.h

@@ -34,6 +34,7 @@ typedef UINT32 MMC_CMD;
 #define MMC_CMD_WAIT_RESPONSE    (1 << 16)
 #define MMC_CMD_LONG_RESPONSE    (1 << 17)
 #define MMC_CMD_NO_CRC_RESPONSE  (1 << 18)
+#define SD_CMD  (1 << 31)
 
 #define MMC_INDX(Index)       ((Index) & 0xFFFF)
 #define MMC_GET_INDX(MmcCmd)  ((MmcCmd) & 0xFFFF)
@@ -44,6 +45,7 @@ typedef UINT32 MMC_CMD;
 #define MMC_CMD3    (MMC_INDX(3) | MMC_CMD_WAIT_RESPONSE)
 #define MMC_CMD5    (MMC_INDX(5) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE)
 #define MMC_CMD6    (MMC_INDX(6) | MMC_CMD_WAIT_RESPONSE)
+#define SD_CMD6     (MMC_INDX(6) | MMC_CMD_WAIT_RESPONSE | SD_CMD)
 #define MMC_CMD7    (MMC_INDX(7) | MMC_CMD_WAIT_RESPONSE)
 #define MMC_CMD8    (MMC_INDX(8) | MMC_CMD_WAIT_RESPONSE)
 #define MMC_CMD9    (MMC_INDX(9) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_LONG_RESPONSE)

+ 7 - 0
EmbeddedPkg/Universal/MmcDxe/Mmc.h

@@ -519,4 +519,11 @@ PrintCID (
   IN UINT32  *Cid
   );
 
+#define __be32_to_cpu(x) \
+((UINT32)( \
+	(((UINT32)(x) & (UINT32)0x000000ffUL) << 24) | \
+	(((UINT32)(x) & (UINT32)0x0000ff00UL) << 8) | \
+	(((UINT32)(x) & (UINT32)0x00ff0000UL) >> 8) | \
+	(((UINT32)(x) & (UINT32)0xff000000UL) >> 24) ))
+
 #endif

+ 8 - 8
EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c

@@ -471,37 +471,37 @@ InitializeSdMmcDevice (
   if (CccSwitch) {
     /* SD Switch, Mode:0, Group:0, Value:0 */
     CmdArg = CreateSwitchCmdArgument (0, 0, 0);
-    Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, CmdArg);
+    Status = MmcHost->SendCommand (MmcHost, SD_CMD6, CmdArg);
     if (EFI_ERROR (Status)) {
       DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): Error and Status = %r\n", __FUNCTION__, Status));
       return Status;
     } else {
       Status = MmcHost->ReadBlockData (MmcHost, 0, SWITCH_CMD_DATA_LENGTH, Buffer);
       if (EFI_ERROR (Status)) {
-        DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): ReadBlockData Error and Status = %r\n", __FUNCTION__, Status));
+        DEBUG ((DEBUG_ERROR, "%a (SD_CMD6): ReadBlockData Error and Status = %r\n", __FUNCTION__, Status));
         return Status;
       }
     }
 
-    if (!(Buffer[3] & SD_HIGH_SPEED_SUPPORTED)) {
-      DEBUG ((DEBUG_INFO, "%a : High Speed not supported by Card\n", __FUNCTION__));
+    if (!(__be32_to_cpu(Buffer[3]) & SD_HIGH_SPEED_SUPPORTED)) { /* todo fixme bigendian cpu is no op */
+      DEBUG ((DEBUG_INFO, "%a : High Speed not supported by Card %x\n", __FUNCTION__, Buffer[3]));
     } else {
       Speed = SD_HIGH_SPEED;
 
       /* SD Switch, Mode:1, Group:0, Value:1 */
       CmdArg = CreateSwitchCmdArgument (1, 0, 1);
-      Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, CmdArg);
+      Status = MmcHost->SendCommand (MmcHost, SD_CMD6, CmdArg);
       if (EFI_ERROR (Status)) {
-        DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): Error and Status = %r\n", __FUNCTION__, Status));
+        DEBUG ((DEBUG_ERROR, "%a (SD_CMD6): Error and Status = %r\n", __FUNCTION__, Status));
         return Status;
       } else {
         Status = MmcHost->ReadBlockData (MmcHost, 0, SWITCH_CMD_DATA_LENGTH, Buffer);
         if (EFI_ERROR (Status)) {
-          DEBUG ((DEBUG_ERROR, "%a (MMC_CMD6): ReadBlockData Error and Status = %r\n", __FUNCTION__, Status));
+          DEBUG ((DEBUG_ERROR, "%a (SD_CMD6): ReadBlockData Error and Status = %r\n", __FUNCTION__, Status));
           return Status;
         }
 
-        if ((Buffer[4] & SWITCH_CMD_SUCCESS_MASK) != 0x01000000) {
+        if ((__be32_to_cpu(Buffer[4]) & SWITCH_CMD_SUCCESS_MASK) != 0x01000000) {
           DEBUG ((DEBUG_ERROR, "Problem switching SD card into high-speed mode\n"));
           return Status;
         }