[U-Boot] [MMC] RPMB: Transfer data timeout error

Bharat Gooty bharat.gooty at broadcom.com
Mon May 27 13:48:38 UTC 2019


Hello,



I am using Broadcom northstar2 platform, which uses Arasan eMMC 5.0
controller and micron 4.5.1 eMMC card.



Switched to “rpmb” partition using “mmc dev 0 3” command.



I am trying to use “mmc rpmb counter” command and results is “Transfer data
timeout”.



Further investigation, found, mmc_rpmb_get_counter () -à
mmc_rpmb_request(), which expects response type of MMC_RSP_R1b.

As part of the rpmb protocol, MMC_CMD_SET_BLOCK_COUNT (23) is set to #1 and
MMC_CMD_WRITE_MULTIPLE_BLOCK (25) is send. For multi block write command,
data is rpmb data.



As the expected response is set to MMC_RSP_R1b, in sdhci_send_command(),
data mask is or’ed with SDHCI_INT_DATA_END (mask |= SDHCI_INT_DATA_END).

After the sdhci_cmd_done() happens, data mask is written to
SDHCI_INT_STATUS. I guess this is sending STOP, because of
SDHCI_INT_DATA_END. As the actual rpmb data is transferred in
sdhci_transfer_data (), which will check for rdy (SDHCI_INT_SPACE_AVAIL|
SDHCI_INT_DATA_AVAIL). The SDHCI_INT_STATUS register read value will be
always 0x0 and causing for “Transfer data timeout”



Would like to know whether response type for mmc_rpmb_request() can be
changed to MMC_RSP_R1 (instead of MMC_RSP_R1b)



Or using SDHCI_QUIRK_BROKEN_R1B quirk in mmc_rpmb_request() like the
following or any other alternative ways, please suggest:

--- a/drivers/mmc/rpmb.c

+++ b/drivers/mmc/rpmb.c

@@ -91,6 +91,7 @@ static int mmc_rpmb_request(struct mmc *mmc, const struct
s_rpmb *s,

{

        struct mmc_cmd cmd = {0};

        struct mmc_data data;

+       struct sdhci_host *host = mmc->priv;

        int ret;



        ret = mmc_set_blockcount(mmc, count, is_rel_write);

@@ -105,6 +106,9 @@ static int mmc_rpmb_request(struct mmc *mmc, const
struct s_rpmb *s,

        cmd.cmdarg = 0;

        cmd.resp_type = MMC_RSP_R1b;



+       if (host->quirks & SDHCI_QUIRK_BROKEN_R1B)

+               cmd.resp_type = MMC_RSP_R1;

+

        data.src = (const char *)s;

        data.blocks = 1;

        data.blocksize = MMC_MAX_BLOCK_LEN;



Thanks,

-Bharat


More information about the U-Boot mailing list