Re: [PATCH v2 1/4] soc: Amlogic: Add secure monitor driver
From: Carlo Caione <hidden>
Date: 2016-05-23 11:43:58
Also in:
linux-amlogic, linux-arm-kernel
On 23/05/16 13:38, Matthias Brugger wrote:
[...]
quoted
+#include <stdarg.h> +#include <asm/cacheflush.h> +#include <asm/compiler.h> +#include <linux/arm-smccc.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/smp.h> + +#include <linux/soc/meson/meson_sm.h> + +#define SM_MEM_SIZE 0x1000 + +/* + * To read from / write to the secure monitor we use two bounce buffers. The + * physical addresses of the two buffers are obtained by querying the secure + * monitor itself. + */ + +static u32 sm_phy_in_base; +static u32 sm_phy_out_base;You can put this two variable in meson_sm_probe, right?
Yeah, actually no need to be there.
quoted
+ +static void __iomem *sm_sharemem_in_base; +static void __iomem *sm_sharemem_out_base; + +struct meson_sm_data { + u32 cmd; + u32 arg0; + u32 arg1; + u32 arg2; + u32 arg3; + u32 arg4; + u32 ret; +}; + +static void __meson_sm_call(void *info) +{ + struct meson_sm_data *data = info; + struct arm_smccc_res res; + + arm_smccc_smc(data->cmd, + data->arg0, data->arg1, data->arg2, + data->arg3, data->arg4, 0, 0, &res); + data->ret = res.a0; +} + +u32 meson_sm_call(u32 cmd, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4)Can the function be static or will it be called from another driver?
It _can_ be called from another driver. It depends on the SMC used, so better making it available.
quoted
+{ + struct meson_sm_data data; + + data.cmd = cmd; + data.arg0 = arg0; + data.arg1 = arg1; + data.arg2 = arg2; + data.arg3 = arg3; + data.arg4 = arg4; + data.ret = 0; + + __meson_sm_call(&data); + + return data.ret; +} + +u32 meson_sm_call_read(void *buffer, u32 cmd, u32 arg0, u32 arg1, + u32 arg2, u32 arg3, u32 arg4) +{ + u32 size; + + size = meson_sm_call(cmd, arg0, arg1, arg2, arg3, arg4); + + if (!size || size > SM_MEM_SIZE) + return -EINVAL; + + memcpy(buffer, sm_sharemem_out_base, size); + return size; +}This function will be needed to be exported to be callable from modules.
Fix in v3.
quoted
+ +u32 meson_sm_call_write(void *buffer, unsigned int b_size, u32 cmd, u32 arg0, + u32 arg1, u32 arg2, u32 arg3, u32 arg4) +{ + u32 size; + + if (b_size > SM_MEM_SIZE) + return -EINVAL; + + memcpy(sm_sharemem_in_base, buffer, b_size); + + size = meson_sm_call(cmd, arg0, arg1, arg2, arg3, arg4); + + if (!size) + return -EINVAL; + + return size; +} +Same here.
Thanks. Cheers, -- Carlo Caione -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html