diff mbox series

[v2,08/21] arm: socfpga: Add SMC helper function for Intel SOCFPGA (64bits)

Message ID 1582115146-28658-9-git-send-email-chee.hong.ang@intel.com
State New
Headers show
Series Enable ARM Trusted Firmware for U-Boot | expand

Commit Message

Ang, Chee Hong Feb. 19, 2020, 12:25 p.m. UTC
From: Chee Hong Ang <chee.hong.ang at intel.com>

Allow U-Boot proper running in non-secure mode (EL2) to invoke
SMC call to ATF's PSCI runtime services such as System Manager's
registers access, 2nd phase bitstream FPGA reconfiguration,
Remote System Update (RSU) and etc.

Signed-off-by: Chee Hong Ang <chee.hong.ang at intel.com>
---
 arch/arm/mach-socfpga/include/mach/misc.h |  3 +++
 arch/arm/mach-socfpga/misc_s10.c          | 26 ++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

Comments

Marek Vasut Feb. 19, 2020, 5:15 p.m. UTC | #1
On 2/19/20 1:25 PM, chee.hong.ang at intel.com wrote:
[...]

> +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_ATF)
> +int invoke_smc(u32 func_id, u64 *args, int arg_len, u64 *ret_arg, int ret_len)
> +{
> +	int i;
> +	struct pt_regs regs;
> +
> +	memset(&regs, 0, sizeof(regs));
> +
> +	regs.regs[0] = func_id;
> +
> +	if (args) {
> +		for (i = 0; i < arg_len; i++)
> +			regs.regs[i + 1] = args[i];

Is this memcpy() ?

> +	}
> +
> +	smc_call(&regs);
> +
> +	if (ret_arg) {
> +		for (i = 0; i < ret_len; i++)
> +			ret_arg[i] = regs.regs[i + 1];

memcpy() ?
Ang, Chee Hong Feb. 20, 2020, 1:32 a.m. UTC | #2
> On 2/19/20 1:25 PM, chee.hong.ang at intel.com wrote:
> [...]
> 
> > +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_ATF) int
> > +invoke_smc(u32 func_id, u64 *args, int arg_len, u64 *ret_arg, int
> > +ret_len) {
> > +	int i;
> > +	struct pt_regs regs;
> > +
> > +	memset(&regs, 0, sizeof(regs));
> > +
> > +	regs.regs[0] = func_id;
> > +
> > +	if (args) {
> > +		for (i = 0; i < arg_len; i++)
> > +			regs.regs[i + 1] = args[i];
> 
> Is this memcpy() ?
Will change this.
> 
> > +	}
> > +
> > +	smc_call(&regs);
> > +
> > +	if (ret_arg) {
> > +		for (i = 0; i < ret_len; i++)
> > +			ret_arg[i] = regs.regs[i + 1];
> 
> memcpy() ?
Will change this too. Thanks.
diff mbox series

Patch

diff --git a/arch/arm/mach-socfpga/include/mach/misc.h b/arch/arm/mach-socfpga/include/mach/misc.h
index f6de1cc..b5625e1 100644
--- a/arch/arm/mach-socfpga/include/mach/misc.h
+++ b/arch/arm/mach-socfpga/include/mach/misc.h
@@ -43,4 +43,7 @@  void do_bridge_reset(int enable, unsigned int mask);
 void socfpga_pl310_clear(void);
 void socfpga_get_managers_addr(void);
 
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_ATF)
+int invoke_smc(u32 func_id, u64 *args, int arg_len, u64 *ret_arg, int ret_len);
+#endif
 #endif /* _SOCFPGA_MISC_H_ */
diff --git a/arch/arm/mach-socfpga/misc_s10.c b/arch/arm/mach-socfpga/misc_s10.c
index a3f5b43..25c3ff6 100644
--- a/arch/arm/mach-socfpga/misc_s10.c
+++ b/arch/arm/mach-socfpga/misc_s10.c
@@ -164,3 +164,29 @@  void do_bridge_reset(int enable, unsigned int mask)
 
 	socfpga_bridges_reset(enable);
 }
+
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_ATF)
+int invoke_smc(u32 func_id, u64 *args, int arg_len, u64 *ret_arg, int ret_len)
+{
+	int i;
+	struct pt_regs regs;
+
+	memset(&regs, 0, sizeof(regs));
+
+	regs.regs[0] = func_id;
+
+	if (args) {
+		for (i = 0; i < arg_len; i++)
+			regs.regs[i + 1] = args[i];
+	}
+
+	smc_call(&regs);
+
+	if (ret_arg) {
+		for (i = 0; i < ret_len; i++)
+			ret_arg[i] = regs.regs[i + 1];
+	}
+
+	return regs.regs[0];
+}
+#endif