[PATCH v2] mmc: Remove alignment hole for cmdidx in struct mmc_cmd

The alignment hole caused by cmdidx in struct mmc_cmd cause strange issues together with the peephole2 optimization on Amlogic SoCs. Following was observed while working on SPL support for Amlogic SoCs.
sd_get_capabilities() normally issue a CMD55 followed by a CMD51. However, on at least Amlogic S905 (Cortex-A53) and S905X3 (Cortex-A55), CMD55 was instead followed by CMD8 (and a few reties) in SPL.
Code from the call site:
cmd.cmdidx = SD_CMD_APP_SEND_SCR; // 51 ... data.blocksize = 8; ... err = mmc_send_cmd_retry(mmc, &cmd, &data, 3);
Running the code with MMC_TRACE enabled shows:
CMD_SEND:55 ARG 0x50480000 MMC_RSP_R1,5,6,7 0x00000920 CMD_SEND:8 ARG 0x00000000 RET -110
Removing the alignment hole by changing cmdidx from ushort to uint or building with -fno-peephole2 flag seem to resolve this issue.
CMD_SEND:55 ARG 0x50480000 MMC_RSP_R1,5,6,7 0x00000920 CMD_SEND:51 ARG 0x00000000 MMC_RSP_R1,5,6,7 0x00000920
Same issue was observed building U-Boot with gcc 8 - 13.
Remove this alignment hole by changing cmdidx from ushort to uint.
Signed-off-by: Jonas Karlman jonas@kwiboo.se --- Changes in v2: - Drop use of -fno-peephole2 flag
Link to RFC: https://patchwork.ozlabs.org/patch/1841495/ --- include/mmc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/mmc.h b/include/mmc.h index 1022db3ffa7c..031ea0fb3545 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -413,7 +413,7 @@ struct mmc_cid { };
struct mmc_cmd { - ushort cmdidx; + uint cmdidx; uint resp_type; uint cmdarg; uint response[4];

Hi,
On 1/28/24 01:29, Jonas Karlman wrote:
The alignment hole caused by cmdidx in struct mmc_cmd cause strange issues together with the peephole2 optimization on Amlogic SoCs. Following was observed while working on SPL support for Amlogic SoCs.
sd_get_capabilities() normally issue a CMD55 followed by a CMD51. However, on at least Amlogic S905 (Cortex-A53) and S905X3 (Cortex-A55), CMD55 was instead followed by CMD8 (and a few reties) in SPL.
I read your RFC "https://patchwork.ozlabs.org/patch/1841495/".
First, I will retry to reproduce your case with other compiler. After that, I will inform again about this patch.
Best Regards, Jaehoon Chung
Code from the call site:
cmd.cmdidx = SD_CMD_APP_SEND_SCR; // 51 ... data.blocksize = 8; ... err = mmc_send_cmd_retry(mmc, &cmd, &data, 3);
Running the code with MMC_TRACE enabled shows:
CMD_SEND:55 ARG 0x50480000 MMC_RSP_R1,5,6,7 0x00000920 CMD_SEND:8 ARG 0x00000000 RET -110
Removing the alignment hole by changing cmdidx from ushort to uint or building with -fno-peephole2 flag seem to resolve this issue.
CMD_SEND:55 ARG 0x50480000 MMC_RSP_R1,5,6,7 0x00000920 CMD_SEND:51 ARG 0x00000000 MMC_RSP_R1,5,6,7 0x00000920
Same issue was observed building U-Boot with gcc 8 - 13.
Remove this alignment hole by changing cmdidx from ushort to uint.
Signed-off-by: Jonas Karlman jonas@kwiboo.se
Changes in v2:
- Drop use of -fno-peephole2 flag
Link to RFC: https://patchwork.ozlabs.org/patch/1841495/
include/mmc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/mmc.h b/include/mmc.h index 1022db3ffa7c..031ea0fb3545 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -413,7 +413,7 @@ struct mmc_cid { };
struct mmc_cmd {
- ushort cmdidx;
- uint cmdidx; uint resp_type; uint cmdarg; uint response[4];

Hi,
On 2024-04-03 02:00, Jaehoon Chung wrote:
Hi,
On 1/28/24 01:29, Jonas Karlman wrote:
The alignment hole caused by cmdidx in struct mmc_cmd cause strange issues together with the peephole2 optimization on Amlogic SoCs. Following was observed while working on SPL support for Amlogic SoCs.
sd_get_capabilities() normally issue a CMD55 followed by a CMD51. However, on at least Amlogic S905 (Cortex-A53) and S905X3 (Cortex-A55), CMD55 was instead followed by CMD8 (and a few reties) in SPL.
I read your RFC "https://patchwork.ozlabs.org/patch/1841495/
First, I will retry to reproduce your case with other compiler. After that, I will inform again about this patch.
Gentle ping, this patch has been on list for almost a year now.
Have you had any time to reproduce this or can this be merged as-is?
For some reason only Amlogic seem to be affected by this issue.
Regards, Jonas
Best Regards, Jaehoon Chung
Code from the call site:
cmd.cmdidx = SD_CMD_APP_SEND_SCR; // 51 ... data.blocksize = 8; ... err = mmc_send_cmd_retry(mmc, &cmd, &data, 3);
Running the code with MMC_TRACE enabled shows:
CMD_SEND:55 ARG 0x50480000 MMC_RSP_R1,5,6,7 0x00000920 CMD_SEND:8 ARG 0x00000000 RET -110
Removing the alignment hole by changing cmdidx from ushort to uint or building with -fno-peephole2 flag seem to resolve this issue.
CMD_SEND:55 ARG 0x50480000 MMC_RSP_R1,5,6,7 0x00000920 CMD_SEND:51 ARG 0x00000000 MMC_RSP_R1,5,6,7 0x00000920
Same issue was observed building U-Boot with gcc 8 - 13.
Remove this alignment hole by changing cmdidx from ushort to uint.
Signed-off-by: Jonas Karlman jonas@kwiboo.se
Changes in v2:
- Drop use of -fno-peephole2 flag
Link to RFC: https://patchwork.ozlabs.org/patch/1841495/
include/mmc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/mmc.h b/include/mmc.h index 1022db3ffa7c..031ea0fb3545 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -413,7 +413,7 @@ struct mmc_cid { };
struct mmc_cmd {
- ushort cmdidx;
- uint cmdidx; uint resp_type; uint cmdarg; uint response[4];

On Sun Jan 19, 2025 at 11:35 PM UTC, Jonas Karlman wrote:
<...> On 2024-04-03 02:00, Jaehoon Chung wrote: <...>
On 1/28/24 01:29, Jonas Karlman wrote:
The alignment hole caused by cmdidx in struct mmc_cmd cause strange issues together with the peephole2 optimization on Amlogic SoCs. Following was observed while working on SPL support for Amlogic SoCs.
sd_get_capabilities() normally issue a CMD55 followed by a CMD51. However, on at least Amlogic S905 (Cortex-A53) and S905X3 (Cortex-A55), CMD55 was instead followed by CMD8 (and a few reties) in SPL.
I read your RFC "https://patchwork.ozlabs.org/patch/1841495/
First, I will retry to reproduce your case with other compiler. After that, I will inform again about this patch.
Gentle ping, this patch has been on list for almost a year now.
Have you had any time to reproduce this or can this be merged as-is?
For some reason only Amlogic seem to be affected by this issue.
It is somewhat reproducible with gcc 14 on Amlogic S905X (Libre Computer lepotato), except instead of CMD55 followed by CMD8, I get CMD0 followed by CMD8 directly:
[...] <debug_uart>
U-Boot SPL 2025.01-00633-gf79293cffe53 (Jan 19 2025 - 14:59:34 +0000) Trying to boot from MMC1 CMD_SEND:0 ARG 0x00000000 MMC_RSP_NONE CMD_SEND:8 ARG 0x000001aa MMC_RSP_R1,5,6,7 0x000001aa CMD_SEND:0 ARG 0x00000000 RET -110 CMD_SEND:0 ARG 0x00000000 MMC_RSP_NONE CMD_SEND:0 ARG 0x00000000 RET -110 Card did not respond to voltage select! : -110 [...]
And the board refuses to boot afterwards. Changing cmdidx type to uint fixes my issue as well.

On Mon, Jan 20, 2025 at 12:35:26AM +0100, Jonas Karlman wrote:
Hi,
On 2024-04-03 02:00, Jaehoon Chung wrote:
Hi,
On 1/28/24 01:29, Jonas Karlman wrote:
The alignment hole caused by cmdidx in struct mmc_cmd cause strange issues together with the peephole2 optimization on Amlogic SoCs. Following was observed while working on SPL support for Amlogic SoCs.
sd_get_capabilities() normally issue a CMD55 followed by a CMD51. However, on at least Amlogic S905 (Cortex-A53) and S905X3 (Cortex-A55), CMD55 was instead followed by CMD8 (and a few reties) in SPL.
I read your RFC "https://patchwork.ozlabs.org/patch/1841495/
First, I will retry to reproduce your case with other compiler. After that, I will inform again about this patch.
Gentle ping, this patch has been on list for almost a year now.
Have you had any time to reproduce this or can this be merged as-is?
For some reason only Amlogic seem to be affected by this issue.
Poking around in Linux, it looks like this is equivalent to 'struct mmc_command' in include/linux/mmc/core.h and so this makes us equivalent.
Reviewed-by: Tom Rini trini@konsulko.com

On Sat, 27 Jan 2024 16:29:21 +0000, Jonas Karlman wrote:
The alignment hole caused by cmdidx in struct mmc_cmd cause strange issues together with the peephole2 optimization on Amlogic SoCs. Following was observed while working on SPL support for Amlogic SoCs.
sd_get_capabilities() normally issue a CMD55 followed by a CMD51. However, on at least Amlogic S905 (Cortex-A53) and S905X3 (Cortex-A55), CMD55 was instead followed by CMD8 (and a few reties) in SPL.
[...]
Applied to u-boot/master, thanks!
participants (4)
-
Ferass El Hafidi
-
Jaehoon Chung
-
Jonas Karlman
-
Tom Rini