* [PATCH] drivers/mmc/rpmb.c: Fix driver routing memory alignment with tmp buffer
@ 2021-06-15 7:29 ` Timothée Cercueil
2021-06-15 8:47 ` Jaehoon Chung
0 siblings, 1 reply; 2+ messages in thread
From: Timothée Cercueil @ 2021-06-15 7:29 UTC (permalink / raw)
To: u-boot; +Cc: Peng Fan, litchipi, Timothée Cercueil
From: litchipi <litchi.pi@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@st.com>
Signed-off-by: litchipi <litchi.pi@protonmail.com>
Change-Id: Iec7554cf6be1219e2d80eb7b45d8d60531c9a7d6
Signed-off-by: Timothée Cercueil <litchi.pi@protonmail.com>
---
drivers/mmc/rpmb.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] drivers/mmc/rpmb.c: Fix driver routing memory alignment with tmp buffer
2021-06-15 7:29 ` [PATCH] drivers/mmc/rpmb.c: Fix driver routing memory alignment with tmp buffer Timothée Cercueil
@ 2021-06-15 8:47 ` Jaehoon Chung
0 siblings, 0 replies; 2+ messages in thread
From: Jaehoon Chung @ 2021-06-15 8:47 UTC (permalink / raw)
To: Timothée Cercueil, u-boot; +Cc: Peng Fan, Timothée Cercueil
Hi Timorthee,
On 6/15/21 4:29 PM, Timothée Cercueil wrote:
> From: litchipi <litchi.pi@protonmail.com>
>
Could you change to subject as "mmc: rpmb: fix ...."?
> 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@st.com>
> Signed-off-by: litchipi <litchi.pi@protonmail.com>
> Change-Id: Iec7554cf6be1219e2d80eb7b45d8d60531c9a7d6
Remove Change-Id.
Best Regards,
Jaehoon Chung
> Signed-off-by: Timothée Cercueil <litchi.pi@protonmail.com>
> ---
> drivers/mmc/rpmb.c | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> 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
>
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-06-15 8:46 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <CGME20210615072930epcas1p413620362cc2fa456c2a183b41d493eef@epcas1p4.samsung.com>
2021-06-15 7:29 ` [PATCH] drivers/mmc/rpmb.c: Fix driver routing memory alignment with tmp buffer Timothée Cercueil
2021-06-15 8:47 ` Jaehoon Chung
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.