[PATCH] mmc: rpmb: Fix driver routing memory alignment with tmp buffer

Jaehoon Chung jh80.chung at samsung.com
Tue Jun 22 09:51:20 CEST 2021


Hi,

On 6/22/21 4:24 PM, litchi.pi wrote:
> Hello,
> Does anyone have a feedback on that fix ?
> I think the location of the fix is important to be discussed too as it needs to be generic but not overlap with existing checks.
> Have a nice day,

Reviewed-by: Jaehoon Chung <jh80.chung at samsung.com>

Best Regards,
Jaehoon Chung

> Timothée Cercueil
> 
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> 
> On Tuesday, June 15th, 2021 at 10:53 AM, Timothée Cercueil <litchi.pi at protonmail.com> wrote:
> 
>> From: litchipi litchi.pi at protonmail.com
>>
>> Fix mmc_rpmb_route_frames() implementation to comply with most MMC
>>
>> drivers that expect some alignment of MMC data frames in memory.
>>
>> When called from drivers/tee/optee/rpmb.c, the address passed is not
>>
>> aligned properly. OP-TEE OS inserts a 6-byte header before a raw RPMB
>>
>> frame which makes RPMB data buffer not 32bit aligned. To prevent breaking
>>
>> ABI with OPTEE-OS RPC memrefs, allocate a temporary buffer to copy the
>>
>> data into an aligned memory.
>>
>> Many RPMB drivers implicitly expect 32bit alignment of the eMMC frame
>>
>> including arm_pl180_mmci.c, sandbox_mmc.c and stm32_sdmmc2.c
>>
>> Signed-off-by: Timothée Cercueil timothee.cercueil at st.com
>>
>> Signed-off-by: Timothée Cercueil litchi.pi at protonmail.com
>>
>> drivers/mmc/rpmb.c | 18 ++++++++++++++++--
>>
>> 1 file changed, 16 insertions(+), 2 deletions(-)
>>
>> Changes since v1:
>>
>> - Fixed the Signed-off-by errors from previous patch.
>>
>> - This patch follows the subject discussed at: https://protect2.fireeye.com/v1/url?k=f4826206-ab195acc-f483e949-0cc47a31bee8-fbfde87d1c121f8b&q=1&e=4fb97df5-13bf-4f21-9dd7-ad6f5a6ed028&u=https%3A%2F%2Flists.denx.de%2Fpipermail%2Fu-boot%2F2021-June%2F451687.html
>>
>> - Changed the commit log 1st line
>>
>> diff --git a/drivers/mmc/rpmb.c b/drivers/mmc/rpmb.c
>>
>> index ea7e506666..b68d98573c 100644
>>
>> --- a/drivers/mmc/rpmb.c
>>
>> +++ b/drivers/mmc/rpmb.c
>>
>> @@ -480,10 +480,24 @@ int mmc_rpmb_route_frames(struct mmc *mmc, void *req, unsigned long reqlen,
>>
>> * and possibly just delay an eventual error which will be harder
>>
>> * to track down.
>>
>> */
>>
>> -   void *rpmb_data = NULL;
>> -   int ret;
>>
>>     if (reqlen % sizeof(struct s_rpmb) || rsplen % sizeof(struct s_rpmb))
>>
>>     return -EINVAL;
>>
>> -   return rpmb_route_frames(mmc, req, reqlen / sizeof(struct s_rpmb),
>> -         		 rsp, rsplen / sizeof(struct s_rpmb));
>>
>>
>>
>> -   if (!IS_ALIGNED((uintptr_t)req, ARCH_DMA_MINALIGN)) {
>> -         /* Memory alignment is required by MMC driver */
>>
>>
>> -         rpmb_data = malloc(reqlen);
>>
>>
>> -         if (!rpmb_data)
>>
>>
>> -         	return -ENOMEM;
>>
>>
>>
>> -         memcpy(rpmb_data, req, reqlen);
>>
>>
>> -         req = rpmb_data;
>>
>>
>> -   }
>>
>> -   ret = rpmb_route_frames(mmc, req, reqlen / sizeof(struct s_rpmb),
>> -         		rsp, rsplen / sizeof(struct s_rpmb));
>>
>>
>> -   free(rpmb_data);
>> -   return ret;
>>
>>     }
>>
>>     --
>>
>>     2.17.1
> 



More information about the U-Boot mailing list