|
@@ -1,9 +1,10 @@
|
|
|
// SPDX-License-Identifier: GPL-2.0+
|
|
|
/*
|
|
|
- * Copyright (c) 2018 Linaro Limited
|
|
|
+ * Copyright (c) 2018-2020 Linaro Limited
|
|
|
*/
|
|
|
|
|
|
#include <common.h>
|
|
|
+#include <cpu_func.h>
|
|
|
#include <dm.h>
|
|
|
#include <dm/device_compat.h>
|
|
|
#include <log.h>
|
|
@@ -295,6 +296,16 @@ static u32 call_err_to_res(u32 call_err)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void flush_shm_dcache(struct udevice *dev, struct optee_msg_arg *arg)
|
|
|
+{
|
|
|
+ size_t sz = OPTEE_MSG_GET_ARG_SIZE(arg->num_params);
|
|
|
+
|
|
|
+ flush_dcache_range(rounddown((ulong)arg, CONFIG_SYS_CACHELINE_SIZE),
|
|
|
+ roundup((ulong)arg + sz, CONFIG_SYS_CACHELINE_SIZE));
|
|
|
+
|
|
|
+ tee_flush_all_shm_dcache(dev);
|
|
|
+}
|
|
|
+
|
|
|
static u32 do_call_with_arg(struct udevice *dev, struct optee_msg_arg *arg)
|
|
|
{
|
|
|
struct optee_pdata *pdata = dev_get_plat(dev);
|
|
@@ -305,9 +316,17 @@ static u32 do_call_with_arg(struct udevice *dev, struct optee_msg_arg *arg)
|
|
|
while (true) {
|
|
|
struct arm_smccc_res res;
|
|
|
|
|
|
+ /* If cache are off from U-Boot, sync the cache shared with OP-TEE */
|
|
|
+ if (!dcache_status())
|
|
|
+ flush_shm_dcache(dev, arg);
|
|
|
+
|
|
|
pdata->invoke_fn(param.a0, param.a1, param.a2, param.a3,
|
|
|
param.a4, param.a5, param.a6, param.a7, &res);
|
|
|
|
|
|
+ /* If cache are off from U-Boot, sync the cache shared with OP-TEE */
|
|
|
+ if (!dcache_status())
|
|
|
+ flush_shm_dcache(dev, arg);
|
|
|
+
|
|
|
free(page_list);
|
|
|
page_list = NULL;
|
|
|
|