[U-Boot] HS200 for SDHCI is broken

Hi Siva, Michal.
I noticed drivers/mmc/sdhci-cadence.c not working for my boards.
git-bisect points the following commit:
commit 434f9d454eb1a17bb7f5cdb21167ccbe7e41da39 Author: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com Date: Tue May 29 20:03:10 2018 +0530
mmc: sdhci: Update sdhci_send_command() to handle HS200
This patch updates sdhci_send_command() to handle MMC HS200 tuning command.
Signed-off-by: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com
By reverting it, I can get the MMC on my boards working again.
Any idea to fix it?

2018-06-12 14:26 GMT+09:00 Masahiro Yamada yamada.masahiro@socionext.com:
Hi Siva, Michal.
I noticed drivers/mmc/sdhci-cadence.c not working for my boards.
git-bisect points the following commit:
commit 434f9d454eb1a17bb7f5cdb21167ccbe7e41da39 Author: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com Date: Tue May 29 20:03:10 2018 +0530
mmc: sdhci: Update sdhci_send_command() to handle HS200 This patch updates sdhci_send_command() to handle MMC HS200 tuning command. Signed-off-by: Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
By reverting it, I can get the MMC on my boards working again.
Any idea to fix it?
BTW, 'mmc info' looks like follows on the bad commit:
U-Boot 2018.05-00471-g434f9d4 (Jun 12 2018 - 14:08:39 +0900)
SoC: LD20 (model 1, revision 1) Model: UniPhier LD20 Reference Board DRAM: 3 GiB SC: Micro Support Card (CPLD version 3.6) NAND: 0 MiB MMC: sdhc@5a000000: 0 In: serial@54006800 Out: serial@54006800 Err: serial@54006800 MODE: NOR Boot (STM: OFF) Net: smc911x-0 Warning: smc911x-0 (eth0) using random MAC address - fe:7e:f8:eb:45:1d
Hit any key to stop autoboot: 0 => mmc info sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! no tuning point found sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! no tuning point found Device: sdhc@5a000000 Manufacturer ID: 11 OEM: 100 Name: 004G6 Bus Speed: 52000000 Mode : MMC DDR52 (52MHz) Rd Block Len: 512 MMC version 5.0 High Capacity: Yes Capacity: 3.7 GiB Bus Width: 8-bit DDR Erase Group Size: 512 KiB HC WP Group Size: 4 MiB User Capacity: 3.7 GiB WRREL Boot Capacity: 2 MiB ENH RPMB Capacity: 512 KiB ENH

On 12.6.2018 07:31, Masahiro Yamada wrote:
2018-06-12 14:26 GMT+09:00 Masahiro Yamada yamada.masahiro@socionext.com:
Hi Siva, Michal.
I noticed drivers/mmc/sdhci-cadence.c not working for my boards.
git-bisect points the following commit:
commit 434f9d454eb1a17bb7f5cdb21167ccbe7e41da39 Author: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com Date: Tue May 29 20:03:10 2018 +0530
mmc: sdhci: Update sdhci_send_command() to handle HS200 This patch updates sdhci_send_command() to handle MMC HS200 tuning command. Signed-off-by: Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
By reverting it, I can get the MMC on my boards working again.
Any idea to fix it?
BTW, 'mmc info' looks like follows on the bad commit:
U-Boot 2018.05-00471-g434f9d4 (Jun 12 2018 - 14:08:39 +0900)
SoC: LD20 (model 1, revision 1) Model: UniPhier LD20 Reference Board DRAM: 3 GiB SC: Micro Support Card (CPLD version 3.6) NAND: 0 MiB MMC: sdhc@5a000000: 0 In: serial@54006800 Out: serial@54006800 Err: serial@54006800 MODE: NOR Boot (STM: OFF) Net: smc911x-0 Warning: smc911x-0 (eth0) using random MAC address - fe:7e:f8:eb:45:1d
Hit any key to stop autoboot: 0 => mmc info sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! no tuning point found sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! no tuning point found Device: sdhc@5a000000 Manufacturer ID: 11 OEM: 100 Name: 004G6 Bus Speed: 52000000 Mode : MMC DDR52 (52MHz) Rd Block Len: 512 MMC version 5.0 High Capacity: Yes Capacity: 3.7 GiB Bus Width: 8-bit DDR Erase Group Size: 512 KiB HC WP Group Size: 4 MiB User Capacity: 3.7 GiB WRREL Boot Capacity: 2 MiB ENH RPMB Capacity: 512 KiB ENH
DP: Please look at it ASAP.
Thanks, Michal

Hi Masahiro,
Can you please try with this below change and let me know if it works. In our case, we don’t want to read tuning pattern, instead it waits for TUNED_CLK bit to be set in host ctrl2 register. But, in your case, you want to read back the pattern data and compare it.
--- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -161,8 +161,8 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, /* We shouldn't wait for data inihibit for stop commands, even though they might use busy signaling */ if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION || - cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK || - cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200) + ((cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK || + cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200) && !data)) mask &= ~SDHCI_DATA_INHIBIT;
while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) { @@ -184,8 +184,8 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, sdhci_writel(host, SDHCI_INT_ALL_MASK, SDHCI_INT_STATUS);
mask = SDHCI_INT_RESPONSE; - if (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK || - cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200) + if ((cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK || + cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200) && !data) mask = SDHCI_INT_DATA_AVAIL;
if (!(cmd->resp_type & MMC_RSP_PRESENT))
Thanks, Siva
-----Original Message----- From: Michal Simek [mailto:michal.simek@xilinx.com] Sent: Tuesday, June 12, 2018 2:34 PM To: Masahiro Yamada yamada.masahiro@socionext.com; Siva Durga Prasad Paladugu sivadur@xilinx.com; Michal Simek michal.simek@xilinx.com; U-Boot Mailing List u-boot@lists.denx.de Cc: Jaehoon Chung jh80.chung@samsung.com; Tom Rini trini@konsulko.com Subject: Re: HS200 for SDHCI is broken
On 12.6.2018 07:31, Masahiro Yamada wrote:
2018-06-12 14:26 GMT+09:00 Masahiro Yamada
yamada.masahiro@socionext.com:
Hi Siva, Michal.
I noticed drivers/mmc/sdhci-cadence.c not working for my boards.
git-bisect points the following commit:
commit 434f9d454eb1a17bb7f5cdb21167ccbe7e41da39 Author: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com Date: Tue May 29 20:03:10 2018 +0530
mmc: sdhci: Update sdhci_send_command() to handle HS200 This patch updates sdhci_send_command() to handle MMC HS200 tuning command. Signed-off-by: Siva Durga Prasad Paladugu
siva.durga.paladugu@xilinx.com
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
By reverting it, I can get the MMC on my boards working again.
Any idea to fix it?
BTW, 'mmc info' looks like follows on the bad commit:
U-Boot 2018.05-00471-g434f9d4 (Jun 12 2018 - 14:08:39 +0900)
SoC: LD20 (model 1, revision 1) Model: UniPhier LD20 Reference Board DRAM: 3 GiB SC: Micro Support Card (CPLD version 3.6) NAND: 0 MiB MMC: sdhc@5a000000: 0 In: serial@54006800 Out: serial@54006800 Err: serial@54006800 MODE: NOR Boot (STM: OFF) Net: smc911x-0 Warning: smc911x-0 (eth0) using random MAC address -
fe:7e:f8:eb:45:1d
Hit any key to stop autoboot: 0 => mmc info sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! no tuning point found sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! sdhci_send_command: Timeout for status update! no tuning point found Device: sdhc@5a000000 Manufacturer ID: 11 OEM: 100 Name: 004G6 Bus Speed: 52000000 Mode : MMC DDR52 (52MHz) Rd Block Len: 512 MMC version 5.0 High Capacity: Yes Capacity: 3.7 GiB Bus Width: 8-bit DDR Erase Group Size: 512 KiB HC WP Group Size: 4 MiB User Capacity: 3.7 GiB WRREL Boot Capacity: 2 MiB ENH RPMB Capacity: 512 KiB ENH
DP: Please look at it ASAP.
Thanks, Michal

Hi Siva,
2018-06-12 18:44 GMT+09:00 Siva Durga Prasad Paladugu sivadur@xilinx.com:
Hi Masahiro,
Can you please try with this below change and let me know if it works. In our case, we don’t want to read tuning pattern, instead it waits for TUNED_CLK bit to be set in host ctrl2 register. But, in your case, you want to read back the pattern data and compare it.
--- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -161,8 +161,8 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, /* We shouldn't wait for data inihibit for stop commands, even though they might use busy signaling */ if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION ||
cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK ||
cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200)
((cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK ||
cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200) && !data)) mask &= ~SDHCI_DATA_INHIBIT; while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) {
@@ -184,8 +184,8 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, sdhci_writel(host, SDHCI_INT_ALL_MASK, SDHCI_INT_STATUS);
mask = SDHCI_INT_RESPONSE;
if (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK ||
cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200)
if ((cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK ||
cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200) && !data) mask = SDHCI_INT_DATA_AVAIL; if (!(cmd->resp_type & MMC_RSP_PRESENT))
Yes, it works. Thanks!
participants (3)
-
Masahiro Yamada
-
Michal Simek
-
Siva Durga Prasad Paladugu