On 5 April 2016 at 01:17, Ryan Harkin <ryan.har...@linaro.org> wrote:
> Hi Haojian,
>
> I've had time to investigate where TC2 is hanging with your patches
> applied and narrowed it down to the single line of code marked below.
>
> I'm going to read the code now and see if I can work out what it's
> trying to do, but I thought I'd tell you sooner because you might have
> a better idea.
>
> On 22 March 2016 at 12:48, Haojian Zhuang <haojian.zhu...@linaro.org> wrote:
>> Add more SD commands to support 4-bit bus width & iospeed. It's not
>> formal code. And it needs to be updated later.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Haojian Zhuang <haojian.zhu...@linaro.org>
>> ---
>>  EmbeddedPkg/Include/Protocol/MmcHost.h           |   3 +
>>  EmbeddedPkg/Universal/MmcDxe/Mmc.h               |  17 +++
>>  EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c | 138 
>> ++++++++++++++++++++---
>>  3 files changed, 142 insertions(+), 16 deletions(-)
>>
>> diff --git a/EmbeddedPkg/Include/Protocol/MmcHost.h 
>> b/EmbeddedPkg/Include/Protocol/MmcHost.h
>> index 5e3a2b7..e9a74f0 100644
>> --- a/EmbeddedPkg/Include/Protocol/MmcHost.h
>> +++ b/EmbeddedPkg/Include/Protocol/MmcHost.h
>> @@ -64,11 +64,14 @@ typedef UINT32 MMC_CMD;
>>  #define MMC_CMD24             (MMC_INDX(24) | MMC_CMD_WAIT_RESPONSE)
>>  #define MMC_CMD55             (MMC_INDX(55) | MMC_CMD_WAIT_RESPONSE)
>>  #define MMC_ACMD41            (MMC_INDX(41) | MMC_CMD_WAIT_RESPONSE | 
>> MMC_CMD_NO_CRC_RESPONSE)
>> +#define MMC_ACMD51            (MMC_INDX(51) | MMC_CMD_WAIT_RESPONSE)
>>
>>  // Valid responses for CMD1 in eMMC
>>  #define EMMC_CMD1_CAPACITY_LESS_THAN_2GB 0x00FF8080 // Capacity <= 2GB, 
>> byte addressing used
>>  #define EMMC_CMD1_CAPACITY_GREATER_THAN_2GB 0x40FF8080 // Capacity > 2GB, 
>> 512-byte sector addressing used
>>
>> +#define MMC_STATUS_APP_CMD    (1 << 5)
>> +
>>  typedef enum _MMC_STATE {
>>      MmcInvalidState = 0,
>>      MmcHwInitializationState,
>> diff --git a/EmbeddedPkg/Universal/MmcDxe/Mmc.h 
>> b/EmbeddedPkg/Universal/MmcDxe/Mmc.h
>> index 0ccbc80..a62ba32 100644
>> --- a/EmbeddedPkg/Universal/MmcDxe/Mmc.h
>> +++ b/EmbeddedPkg/Universal/MmcDxe/Mmc.h
>> @@ -75,6 +75,23 @@ typedef struct {
>>    UINT32  PowerUp:     1; // This bit is set to LOW if the card has not 
>> finished the power up routine
>>  } OCR;
>>
>> +/* For little endian CPU */
>> +typedef struct {
>> +  UINT8   SD_SPEC:               4; // SD Memory Card - Spec. Version 
>> [59:56]
>> +  UINT8   SCR_STRUCTURE:         4; // SCR Structure [63:60]
>> +  UINT8   SD_BUS_WIDTHS:         4; // DAT Bus widths supported [51:48]
>> +  UINT8   DATA_STAT_AFTER_ERASE: 1; // Data Status after erases [55]
>> +  UINT8   SD_SECURITY:           3; // CPRM Security Support [54:52]
>> +  UINT8   EX_SECURITY_1:         1; // Extended Security Support [43]
>> +  UINT8   SD_SPEC4:              1; // Spec. Version 4.00 or higher [42]
>> +  UINT8   RESERVED_1:            2; // Reserved [41:40]
>> +  UINT8   SD_SPEC3:              1; // Spec. Version 3.00 or higher [47]
>> +  UINT8   EX_SECURITY_2:         3; // Extended Security Support [46:44]
>> +  UINT8   CMD_SUPPORT:           4; // Command Support bits [35:32]
>> +  UINT8   RESERVED_2:            4; // Reserved [39:36]
>> +  UINT32  RESERVED_3;               // Manufacturer Usage [31:0]
>> +} SCR;
>> +
>>  typedef struct {
>>    UINT32  NOT_USED;   // 1 [0:0]
>>    UINT32  CRC;        // CRC7 checksum [7:1]
>> diff --git a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c 
>> b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
>> index f806bfc..125d3f9 100644
>> --- a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
>> +++ b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
>> @@ -12,6 +12,9 @@
>>  *
>>  **/
>>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/TimerLib.h>
>> +
>>  #include "Mmc.h"
>>
>>  typedef union {
>> @@ -41,6 +44,11 @@ typedef union {
>>
>>  #define EMMC_SWITCH_ERROR       (1 << 7)
>>
>> +#define SD_BUS_WIDTH_1BIT       (1 << 0)
>> +#define SD_BUS_WIDTH_4BIT       (1 << 2)
>> +
>> +#define SD_CCC_SWITCH           (1 << 10)
>> +
>>  #define DEVICE_STATE(x)         (((x) >> 9) & 0xf)
>>  typedef enum _EMMC_DEVICE_STATE {
>>    EMMC_IDLE_STATE = 0,
>> @@ -69,28 +77,30 @@ EmmcGetDeviceState (
>>  {
>>    EFI_MMC_HOST_PROTOCOL *Host;
>>    EFI_STATUS Status;
>> -  UINT32     Data, RCA;
>> +  UINT32     Rsp[4], RCA;
>>
>>    if (State == NULL)
>>      return EFI_INVALID_PARAMETER;
>>
>>    Host  = MmcHostInstance->MmcHost;
>>    RCA = MmcHostInstance->CardInfo.RCA << RCA_SHIFT_OFFSET;
>> -  Status = Host->SendCommand (Host, MMC_CMD13, RCA);
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to get card status, 
>> Status=%r.\n", Status));
>> -    return Status;
>> -  }
>> -  Status = Host->ReceiveResponse (Host, MMC_RESPONSE_TYPE_R1, &Data);
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to get response of 
>> CMD13, Status=%r.\n", Status));
>> -    return Status;
>> -  }
>> -  if (Data & EMMC_SWITCH_ERROR) {
>> -    DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to switch expected 
>> mode, Status=%r.\n", Status));
>> -    return EFI_DEVICE_ERROR;
>> -  }
>> -  *State = DEVICE_STATE(Data);
>> +  do {
>> +    Status = Host->SendCommand (Host, MMC_CMD13, RCA);
>> +    if (EFI_ERROR (Status)) {
>> +      DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to get card 
>> status, Status=%r.\n", Status));
>> +      return Status;
>> +    }
>> +    Status = Host->ReceiveResponse (Host, MMC_RESPONSE_TYPE_R1, Rsp);
>> +    if (EFI_ERROR (Status)) {
>> +      DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to get response of 
>> CMD13, Status=%r.\n", Status));
>> +      return Status;
>> +    }
>> +    if (Rsp[0] & EMMC_SWITCH_ERROR) {
>> +      DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to switch expected 
>> mode, Status=%r.\n", Status));
>> +      return EFI_DEVICE_ERROR;
>> +    }
>> +  } while (!(Rsp[0] & MMC_R0_READY_FOR_DATA));
>> +  *State = MMC_R0_CURRENTSTATE(Rsp);
>>    return EFI_SUCCESS;
>>  }
>>
>> @@ -305,9 +315,12 @@ InitializeSdMmcDevice (
>>  {
>>    UINT32        CmdArg;
>>    UINT32        Response[4];
>> +  UINT32        Buffer[128];
>>    UINTN         BlockSize;
>>    UINTN         CardSize;
>>    UINTN         NumBlocks;
>> +  BOOLEAN       CccSwitch;
>> +  SCR           Scr;
>>    EFI_STATUS    Status;
>>    EFI_MMC_HOST_PROTOCOL     *MmcHost;
>>
>> @@ -328,6 +341,10 @@ InitializeSdMmcDevice (
>>      return Status;
>>    }
>>    PrintCSD (Response);
>> +  if (MMC_CSD_GET_CCC(Response) & SD_CCC_SWITCH)
>> +    CccSwitch = TRUE;
>> +  else
>> +    CccSwitch = FALSE;
>>
>>    if (MmcHostInstance->CardInfo.CardType == SD_CARD_2_HIGH) {
>>      CardSize = HC_MMC_CSD_GET_DEVICESIZE (Response);
>> @@ -358,6 +375,95 @@ InitializeSdMmcDevice (
>>      return Status;
>>    }
>>
>> +  Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, CmdArg);
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = %r\n", Status));
>> +    return Status;
>> +  }
>> +  Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1, 
>> Response);
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = %r\n", Status));
>> +    return Status;
>> +  }
>> +  if ((Response[0] & MMC_STATUS_APP_CMD) == 0)
>> +    return EFI_SUCCESS;
>> +
>> +  /* SCR */
>> +  Status = MmcHost->SendCommand (MmcHost, MMC_ACMD51, 0);
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((EFI_D_ERROR, "%a(MMC_ACMD51): Error and Status = %r\n", 
>> __func__, Status));
>> +    return Status;
>> +  } else {
>> +    Status = MmcHost->ReadBlockData (MmcHost, 0, 8, Buffer);
>
> ^^ TC2 hangs at this line
>

Ryan,

Could you help to check where it hangs in
ArmPlatformPkg/Drivers/PL180MciDxe/PL180Mci.c?

I checked that PL180 supports SD v0.96. But I only found SD v1.10. In
SD v1.10, SCR (ACMD51)
is defined. So I also assume that SCR should be supported in PL180.

Best Regards
Haojian
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to