diff mbox series

ARM: OMAP2+: Fix compile if CONFIG_HAVE_ARM_SMCCC is not set

Message ID 20200221180901.15812-1-tony@atomide.com (mailing list archive)
State New, archived
Headers show
Series ARM: OMAP2+: Fix compile if CONFIG_HAVE_ARM_SMCCC is not set | expand

Commit Message

Tony Lindgren Feb. 21, 2020, 6:09 p.m. UTC
Recent omap changes added runtime checks to use omap_smccc_smc()
when optee is configured in dts. As the omap-secure code can be
built for ARMv6 only without ARMv7 and use custom smc calls, we
now get a build error:

omap-secure.c:(.text+0x94): undefined reference to `__arm_smccc_smc'

Let's just ifdef out omap_smccc_smc() unless the CPU has selected
CONFIG_HAVE_ARM_SMCCC. The other option discussed was to add an
inline function to arm-smccc.h, but we'd still also have to add
ifdef around omap_smccc_smc() to avoid a warning for uninitialized
value for struct arm_smccc_res in omap_smccc_smc(). And we probably
should not start initializing values in arm-smccc.h if disabled.

Let's also warn on trying to use omap_smccc_smc() if disabled as
suggested by Andrew F. Davis <afd@ti.com>.

Fixes: 48840e16c299 ("ARM: OMAP2+: Use ARM SMC Calling Convention when OP-TEE is available")
Reported-by: kbuild test robot <lkp@intel.com>
Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
Cc: Andrew F. Davis <afd@ti.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Rob Herring <robh@kernel.org>
Cc: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Steven Price <steven.price@arm.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Tony Lindgren <tony@atomide.com>
---
 arch/arm/mach-omap2/omap-secure.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Andrew Davis Feb. 21, 2020, 6:23 p.m. UTC | #1
On 2/21/20 1:09 PM, Tony Lindgren wrote:
> Recent omap changes added runtime checks to use omap_smccc_smc()
> when optee is configured in dts. As the omap-secure code can be
> built for ARMv6 only without ARMv7 and use custom smc calls, we
> now get a build error:
> 
> omap-secure.c:(.text+0x94): undefined reference to `__arm_smccc_smc'
> 
> Let's just ifdef out omap_smccc_smc() unless the CPU has selected
> CONFIG_HAVE_ARM_SMCCC. The other option discussed was to add an
> inline function to arm-smccc.h, but we'd still also have to add
> ifdef around omap_smccc_smc() to avoid a warning for uninitialized
> value for struct arm_smccc_res in omap_smccc_smc(). And we probably
> should not start initializing values in arm-smccc.h if disabled.
> 
> Let's also warn on trying to use omap_smccc_smc() if disabled as
> suggested by Andrew F. Davis <afd@ti.com>.
> 
> Fixes: 48840e16c299 ("ARM: OMAP2+: Use ARM SMC Calling Convention when OP-TEE is available")
> Reported-by: kbuild test robot <lkp@intel.com>
> Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
> Cc: Andrew F. Davis <afd@ti.com>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Marc Zyngier <maz@kernel.org>
> Cc: Rob Herring <robh@kernel.org>
> Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> Cc: Steven Price <steven.price@arm.com>
> Cc: Will Deacon <will@kernel.org>
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---


Looks good to me,

Acked-by: Andrew F. Davis <afd@ti.com>


>  arch/arm/mach-omap2/omap-secure.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c
> --- a/arch/arm/mach-omap2/omap-secure.c
> +++ b/arch/arm/mach-omap2/omap-secure.c
> @@ -77,6 +77,7 @@ u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2,
>  	return ret;
>  }
>  
> +#ifdef CONFIG_HAVE_ARM_SMCCC
>  void omap_smccc_smc(u32 fn, u32 arg)
>  {
>  	struct arm_smccc_res res;
> @@ -85,6 +86,12 @@ void omap_smccc_smc(u32 fn, u32 arg)
>  		      0, 0, 0, 0, 0, 0, &res);
>  	WARN(res.a0, "Secure function call 0x%08x failed\n", fn);
>  }
> +#else
> +void omap_smccc_smc(u32 fn, u32 arg)
> +{
> +	WARN_ONCE(1, "smccc is disabled\n");
> +}
> +#endif
>  
>  void omap_smc1(u32 fn, u32 arg)
>  {
>
Arnd Bergmann Feb. 21, 2020, 8:05 p.m. UTC | #2
On Fri, Feb 21, 2020 at 7:09 PM Tony Lindgren <tony@atomide.com> wrote:
>
> Recent omap changes added runtime checks to use omap_smccc_smc()
> when optee is configured in dts. As the omap-secure code can be
> built for ARMv6 only without ARMv7 and use custom smc calls, we
> now get a build error:
>
> omap-secure.c:(.text+0x94): undefined reference to `__arm_smccc_smc'
>
> Let's just ifdef out omap_smccc_smc() unless the CPU has selected
> CONFIG_HAVE_ARM_SMCCC. The other option discussed was to add an
> inline function to arm-smccc.h, but we'd still also have to add
> ifdef around omap_smccc_smc() to avoid a warning for uninitialized
> value for struct arm_smccc_res in omap_smccc_smc(). And we probably
> should not start initializing values in arm-smccc.h if disabled.
>
> Let's also warn on trying to use omap_smccc_smc() if disabled as
> suggested by Andrew F. Davis <afd@ti.com>.
>
> +#ifdef CONFIG_HAVE_ARM_SMCCC
>  void omap_smccc_smc(u32 fn, u32 arg)
>  {
>         struct arm_smccc_res res;
> @@ -85,6 +86,12 @@ void omap_smccc_smc(u32 fn, u32 arg)
>                       0, 0, 0, 0, 0, 0, &res);
>         WARN(res.a0, "Secure function call 0x%08x failed\n", fn);
>  }
> +#else

Looking through the callers again, this can and is only called
for ARMv7 CPUs, so can't you just avoid the #else path and
turn it into a link error if we ever get callers on ARMv6-only builds?

      Arnd
Tony Lindgren Feb. 21, 2020, 8:15 p.m. UTC | #3
* Arnd Bergmann <arnd@arndb.de> [200221 20:06]:
> On Fri, Feb 21, 2020 at 7:09 PM Tony Lindgren <tony@atomide.com> wrote:
> >
> > Recent omap changes added runtime checks to use omap_smccc_smc()
> > when optee is configured in dts. As the omap-secure code can be
> > built for ARMv6 only without ARMv7 and use custom smc calls, we
> > now get a build error:
> >
> > omap-secure.c:(.text+0x94): undefined reference to `__arm_smccc_smc'
> >
> > Let's just ifdef out omap_smccc_smc() unless the CPU has selected
> > CONFIG_HAVE_ARM_SMCCC. The other option discussed was to add an
> > inline function to arm-smccc.h, but we'd still also have to add
> > ifdef around omap_smccc_smc() to avoid a warning for uninitialized
> > value for struct arm_smccc_res in omap_smccc_smc(). And we probably
> > should not start initializing values in arm-smccc.h if disabled.
> >
> > Let's also warn on trying to use omap_smccc_smc() if disabled as
> > suggested by Andrew F. Davis <afd@ti.com>.
> >
> > +#ifdef CONFIG_HAVE_ARM_SMCCC
> >  void omap_smccc_smc(u32 fn, u32 arg)
> >  {
> >         struct arm_smccc_res res;
> > @@ -85,6 +86,12 @@ void omap_smccc_smc(u32 fn, u32 arg)
> >                       0, 0, 0, 0, 0, 0, &res);
> >         WARN(res.a0, "Secure function call 0x%08x failed\n", fn);
> >  }
> > +#else
> 
> Looking through the callers again, this can and is only called
> for ARMv7 CPUs, so can't you just avoid the #else path and
> turn it into a link error if we ever get callers on ARMv6-only builds?

Hmm yeah maybe. If ARMv6 machines (basically n8x0) is not using
omap-smc.S at all, it's unlike it would need omap-secure.c either.

Regards,

Tony
Tony Lindgren Feb. 26, 2020, 3:57 p.m. UTC | #4
* Tony Lindgren <tony@atomide.com> [200221 20:16]:
> * Arnd Bergmann <arnd@arndb.de> [200221 20:06]:
> > On Fri, Feb 21, 2020 at 7:09 PM Tony Lindgren <tony@atomide.com> wrote:
> > >
> > > Recent omap changes added runtime checks to use omap_smccc_smc()
> > > when optee is configured in dts. As the omap-secure code can be
> > > built for ARMv6 only without ARMv7 and use custom smc calls, we
> > > now get a build error:
> > >
> > > omap-secure.c:(.text+0x94): undefined reference to `__arm_smccc_smc'
> > >
> > > Let's just ifdef out omap_smccc_smc() unless the CPU has selected
> > > CONFIG_HAVE_ARM_SMCCC. The other option discussed was to add an
> > > inline function to arm-smccc.h, but we'd still also have to add
> > > ifdef around omap_smccc_smc() to avoid a warning for uninitialized
> > > value for struct arm_smccc_res in omap_smccc_smc(). And we probably
> > > should not start initializing values in arm-smccc.h if disabled.
> > >
> > > Let's also warn on trying to use omap_smccc_smc() if disabled as
> > > suggested by Andrew F. Davis <afd@ti.com>.
> > >
> > > +#ifdef CONFIG_HAVE_ARM_SMCCC
> > >  void omap_smccc_smc(u32 fn, u32 arg)
> > >  {
> > >         struct arm_smccc_res res;
> > > @@ -85,6 +86,12 @@ void omap_smccc_smc(u32 fn, u32 arg)
> > >                       0, 0, 0, 0, 0, 0, &res);
> > >         WARN(res.a0, "Secure function call 0x%08x failed\n", fn);
> > >  }
> > > +#else
> > 
> > Looking through the callers again, this can and is only called
> > for ARMv7 CPUs, so can't you just avoid the #else path and
> > turn it into a link error if we ever get callers on ARMv6-only builds?
> 
> Hmm yeah maybe. If ARMv6 machines (basically n8x0) is not using
> omap-smc.S at all, it's unlike it would need omap-secure.c either.

Yeah we never built secure-common for omap2 earlier, this got
recently added. My guess is that n8x0 only has a signed bootloader
and no smc calls at all, or at least we don't use any smc calls
for n8x0 in the kernel.

I'll send out v2 of the patch.

Regards,

Tony
diff mbox series

Patch

diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c
--- a/arch/arm/mach-omap2/omap-secure.c
+++ b/arch/arm/mach-omap2/omap-secure.c
@@ -77,6 +77,7 @@  u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2,
 	return ret;
 }
 
+#ifdef CONFIG_HAVE_ARM_SMCCC
 void omap_smccc_smc(u32 fn, u32 arg)
 {
 	struct arm_smccc_res res;
@@ -85,6 +86,12 @@  void omap_smccc_smc(u32 fn, u32 arg)
 		      0, 0, 0, 0, 0, 0, &res);
 	WARN(res.a0, "Secure function call 0x%08x failed\n", fn);
 }
+#else
+void omap_smccc_smc(u32 fn, u32 arg)
+{
+	WARN_ONCE(1, "smccc is disabled\n");
+}
+#endif
 
 void omap_smc1(u32 fn, u32 arg)
 {