[PATCH v2] mmc: Remove alignment hole for cmdidx in struct mmc_cmd
Jonas Karlman
jonas at kwiboo.se
Mon Jan 20 00:35:26 CET 2025
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 at 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];
>
More information about the U-Boot
mailing list