diff --git a/drivers/misc/optee.c b/drivers/misc/optee.c index f3e52310bd7..665bc282091 100644 --- a/drivers/misc/optee.c +++ b/drivers/misc/optee.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -345,6 +346,10 @@ optee_shm_to_page_list(FAR struct optee_shm *shm, FAR uintptr_t *list_pa) *list_pa = optee_va_to_pa(list) | pgoff; } +#ifndef CONFIG_ARCH_USE_MMU + up_clean_dcache((uintptr_t)list, (uintptr_t)list + list_size); +#endif + return list; } @@ -609,6 +614,10 @@ static int optee_memref_to_msg_param(FAR struct optee_priv_data *priv, mp->u.tmem.size = shm->length; } +#ifndef CONFIG_ARCH_USE_MMU + up_clean_dcache(shm->addr, shm->addr + shm->length); +#endif + return 0; } @@ -671,7 +680,7 @@ static int optee_from_msg_param(FAR struct tee_ioctl_param *params, { FAR const struct optee_msg_param *mp = mparams + n; FAR struct tee_ioctl_param *p = params + n; - FAR struct optee_shm *shm; + FAR struct optee_shm *shm = NULL; switch (mp->attr & OPTEE_MSG_ATTR_TYPE_MASK) { @@ -710,10 +719,18 @@ static int optee_from_msg_param(FAR struct tee_ioctl_param *params, p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT + mp->attr - OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; p->b = mp->u.rmem.size; + shm = (FAR struct optee_shm *)(uintptr_t)mp->u.tmem.shm_ref; break; default: return -EINVAL; } + +#ifndef CONFIG_ARCH_USE_MMU + if (shm) + { + up_invalidate_dcache(shm->addr, shm->addr + shm->length); + } +#endif } return 0; diff --git a/drivers/misc/optee_smc.c b/drivers/misc/optee_smc.c index 7be22dee5bc..9672f269ac6 100644 --- a/drivers/misc/optee_smc.c +++ b/drivers/misc/optee_smc.c @@ -24,6 +24,7 @@ * Included Files ****************************************************************************/ +#include #include #include #include @@ -314,11 +315,17 @@ int optee_transport_call(FAR struct optee_priv_data *priv_, smccc_res_t res; smccc_res_t par; uintptr_t arg_pa; +#ifndef CONFIG_ARCH_USE_MMU + size_t arg_size = OPTEE_MSG_GET_ARG_SIZE(arg->num_params); + + up_clean_dcache((uintptr_t)arg, (uintptr_t)arg + arg_size); +#endif memset(&par, 0, sizeof(smccc_res_t)); par.a0 = OPTEE_SMC_CALL_WITH_ARG; arg_pa = optee_va_to_pa(arg); + reg_pair_from_64(arg_pa, &par.a1, &par.a2); for (; ; ) @@ -335,6 +342,9 @@ int optee_transport_call(FAR struct optee_priv_data *priv_, } else { +#ifndef CONFIG_ARCH_USE_MMU + up_invalidate_dcache((uintptr_t)arg, (uintptr_t)arg + arg_size); +#endif return (int)res.a0; } }