* [PATCH v4] tee: optee: build the Arm-specific code only on Arm
@ 2026-09-24 10:51 marouene.boubakri
2026-09-25 11:40 ` Jens Wiklander
2026-10-01 20:27 ` Amirreza Zarrabi
0 siblings, 2 replies; 4+ messages in thread
From: marouene.boubakri @ 2026-09-24 10:51 UTC (permalink / raw)
To: jenswi
Cc: sumit.garg, op-tee, linux-kernel, linux-riscv, amirreza.zarrabi,
peter.lin, Marouene Boubakri
From: Marouene Boubakri <marouene.boubakri@oss.nxp.com>
The OP-TEE driver reaches OP-TEE through the SMC ABI or the FF-A ABI,
both specific to Arm, yet builds both unconditionally together with the
SMC Calling Convention definitions they rely on: ffa_abi.c is always
compiled and only its registration is conditioned on
IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT), and optee_private.h includes
<linux/arm-smccc.h> and defines the SMC and FF-A specific types for
every file of the driver. This is fine as long as the driver depends on
HAVE_ARM_SMCCC, but it keeps the driver from being built for an
architecture without SMCCC, such as RISC-V.
Build smc_abi.c only when HAVE_ARM_SMCCC is set and ffa_abi.c only when
the FF-A transport is enabled, and provide stubs for their registration
otherwise, so that it fails with -EOPNOTSUPP as the FF-A ABI already
does when the FF-A transport is not reachable. Keep the SMCCC header,
the SMC invoke function type, the SMC and FF-A specific structures and
the SMC RPC register parameters in optee_private.h under the same
conditions, and drop the unused <linux/arm-smccc.h> include from
notif.c.
Make OPTEE depend on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT, as it
already does for RPMB, so that the driver is limited to a module when
the FF-A transport is one, rather than built in without FF-A support.
ffa_abi.c is thus built exactly when the FF-A transport is reachable
from the driver, and the IS_REACHABLE() checks in
optee_ffa_abi_register() and optee_ffa_abi_unregister() are always
true, so drop them.
OPTEE still depends on HAVE_ARM_SMCCC, so smc_abi.c is still always
built. The only visible change is that OPTEE=y can no longer be
combined with ARM_FFA_TRANSPORT=m: such a configuration now resolves to
OPTEE=m, with the FF-A ABI available.
Signed-off-by: Marouene Boubakri <marouene.boubakri@oss.nxp.com>
---
Changes in v4:
- Make OPTEE depend on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT so that
the driver is limited to =m when the FF-A transport is =m (Jens).
- Update the commit message accordingly.
v3: https://lore.kernel.org/all/20260922131735.524635-1-marouene.boubakri@oss.nxp.com/
Changes in v3:
- Dropped the RPMI ABI placeholder and the RISC-V enablement patches,
this is now a single patch (Jens).
- Key the FF-A parts of optee_private.h on IS_REACHABLE() instead of
IS_ENABLED(): with OPTEE=y and ARM_FFA_TRANSPORT=m kbuild drops
ffa_abi.o from the built-in optee.o while optee_ffa_abi_register()
was still declared, which does not link.
- Drop the now always true IS_REACHABLE() checks in
optee_ffa_abi_register() and optee_ffa_abi_unregister().
- Describe the current FF-A conditional compilation accurately in the
commit message.
- Posted as a new thread with a proper subject prefix.
v2: https://lore.kernel.org/op-tee/20260915020235.507302-2-marouene.boubakri@oss.nxp.com/
Changes in v2:
- No code change, the testing section of the cover letter was completed.
v1: https://lore.kernel.org/op-tee/20260914175435.118303-2-marouene.boubakri@oss.nxp.com/
drivers/tee/optee/Kconfig | 1 +
drivers/tee/optee/Makefile | 4 ++--
drivers/tee/optee/ffa_abi.c | 8 ++-----
drivers/tee/optee/notif.c | 1 -
drivers/tee/optee/optee_private.h | 39 ++++++++++++++++++++++++++++++-
5 files changed, 43 insertions(+), 10 deletions(-)
diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig
index 50d2051..891dac6 100644
--- a/drivers/tee/optee/Kconfig
+++ b/drivers/tee/optee/Kconfig
@@ -5,6 +5,7 @@ config OPTEE
depends on HAVE_ARM_SMCCC
depends on MMU
depends on RPMB || !RPMB
+ depends on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT
help
This implements the OP-TEE Trusted Execution Environment (TEE)
driver.
diff --git a/drivers/tee/optee/Makefile b/drivers/tee/optee/Makefile
index ad7049c..183cdde 100644
--- a/drivers/tee/optee/Makefile
+++ b/drivers/tee/optee/Makefile
@@ -7,8 +7,8 @@ optee-objs += rpc.o
optee-objs += protmem.o
optee-objs += supp.o
optee-objs += device.o
-optee-objs += smc_abi.o
-optee-objs += ffa_abi.o
+optee-$(CONFIG_HAVE_ARM_SMCCC) += smc_abi.o
+optee-$(CONFIG_ARM_FFA_TRANSPORT) += ffa_abi.o
# for tracing framework to find optee_trace.h
CFLAGS_smc_abi.o := -I$(src)
diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c
index 633715b..08236d8 100644
--- a/drivers/tee/optee/ffa_abi.c
+++ b/drivers/tee/optee/ffa_abi.c
@@ -1212,14 +1212,10 @@ static struct ffa_driver optee_ffa_driver = {
int optee_ffa_abi_register(void)
{
- if (IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT))
- return ffa_register(&optee_ffa_driver);
- else
- return -EOPNOTSUPP;
+ return ffa_register(&optee_ffa_driver);
}
void optee_ffa_abi_unregister(void)
{
- if (IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT))
- ffa_unregister(&optee_ffa_driver);
+ ffa_unregister(&optee_ffa_driver);
}
diff --git a/drivers/tee/optee/notif.c b/drivers/tee/optee/notif.c
index 6e85f2f..6801422 100644
--- a/drivers/tee/optee/notif.c
+++ b/drivers/tee/optee/notif.c
@@ -5,7 +5,6 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-#include <linux/arm-smccc.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h
index aefe1e6..02d6f79 100644
--- a/drivers/tee/optee/optee_private.h
+++ b/drivers/tee/optee/optee_private.h
@@ -6,7 +6,6 @@
#ifndef OPTEE_PRIVATE_H
#define OPTEE_PRIVATE_H
-#include <linux/arm-smccc.h>
#include <linux/notifier.h>
#include <linux/rhashtable.h>
#include <linux/rpmb.h>
@@ -15,6 +14,10 @@
#include <linux/types.h>
#include "optee_msg.h"
+#ifdef CONFIG_HAVE_ARM_SMCCC
+#include <linux/arm-smccc.h>
+#endif
+
#define DRIVER_NAME "optee"
#define OPTEE_MAX_ARG_SIZE 1024
@@ -42,10 +45,12 @@
*/
#define OPTEE_DEFAULT_MAX_NOTIF_VALUE 255
+#ifdef CONFIG_HAVE_ARM_SMCCC
typedef void (optee_invoke_fn)(unsigned long, unsigned long, unsigned long,
unsigned long, unsigned long, unsigned long,
unsigned long, unsigned long,
struct arm_smccc_res *);
+#endif
/**
* struct optee_call_waiter - TEE entry may need to wait for a free TEE thread
@@ -119,6 +124,7 @@ struct optee_supp {
struct completion reqs_c;
};
+#ifdef CONFIG_HAVE_ARM_SMCCC
/**
* struct optee_pcpu - per cpu notif private struct passed to work functions
* @optee: optee device reference
@@ -149,7 +155,9 @@ struct optee_smc {
struct work_struct notif_pcpu_work;
unsigned int notif_cpuhp_state;
};
+#endif
+#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
/**
* struct optee_ffa - FFA communication struct
* @ffa_dev: FFA device, contains the destination id, the id of
@@ -170,6 +178,7 @@ struct optee_ffa {
struct workqueue_struct *notif_wq;
struct work_struct notif_work;
};
+#endif
struct optee;
@@ -257,8 +266,12 @@ struct optee {
const struct optee_ops *ops;
struct tee_context *ctx;
union {
+#ifdef CONFIG_HAVE_ARM_SMCCC
struct optee_smc smc;
+#endif
+#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
struct optee_ffa ffa;
+#endif
};
struct optee_shm_arg_cache shm_arg_cache;
struct optee_call_queue call_queue;
@@ -290,6 +303,7 @@ struct optee_context_data {
struct list_head sess_list;
};
+#ifdef CONFIG_HAVE_ARM_SMCCC
struct optee_rpc_param {
u32 a0;
u32 a1;
@@ -300,6 +314,7 @@ struct optee_rpc_param {
u32 a6;
u32 a7;
};
+#endif
/* Holds context that is preserved during one STD call */
struct optee_call_ctx {
@@ -422,9 +437,31 @@ static inline void reg_pair_from_64(u32 *reg0, u32 *reg1, u64 val)
}
/* Registration of the ABIs */
+#ifdef CONFIG_HAVE_ARM_SMCCC
int optee_smc_abi_register(void);
void optee_smc_abi_unregister(void);
+#else
+static inline int optee_smc_abi_register(void)
+{
+ return -EOPNOTSUPP;
+}
+
+static inline void optee_smc_abi_unregister(void)
+{
+}
+#endif
+#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
int optee_ffa_abi_register(void);
void optee_ffa_abi_unregister(void);
+#else
+static inline int optee_ffa_abi_register(void)
+{
+ return -EOPNOTSUPP;
+}
+
+static inline void optee_ffa_abi_unregister(void)
+{
+}
+#endif
#endif /*OPTEE_PRIVATE_H*/
base-commit: 827751b699b79a6e569983359c02dce67f81b94c
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4] tee: optee: build the Arm-specific code only on Arm
2026-09-24 10:51 [PATCH v4] tee: optee: build the Arm-specific code only on Arm marouene.boubakri
@ 2026-09-25 11:40 ` Jens Wiklander
2026-10-01 20:27 ` Amirreza Zarrabi
1 sibling, 0 replies; 4+ messages in thread
From: Jens Wiklander @ 2026-09-25 11:40 UTC (permalink / raw)
To: marouene.boubakri
Cc: jenswi, sumit.garg, op-tee, linux-kernel, linux-riscv,
amirreza.zarrabi, peter.lin
Hi,
On Thu, Sep 24, 2026 at 12:37 PM <marouene.boubakri@oss.nxp.com> wrote:
>
> From: Marouene Boubakri <marouene.boubakri@oss.nxp.com>
>
> The OP-TEE driver reaches OP-TEE through the SMC ABI or the FF-A ABI,
> both specific to Arm, yet builds both unconditionally together with the
> SMC Calling Convention definitions they rely on: ffa_abi.c is always
> compiled and only its registration is conditioned on
> IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT), and optee_private.h includes
> <linux/arm-smccc.h> and defines the SMC and FF-A specific types for
> every file of the driver. This is fine as long as the driver depends on
> HAVE_ARM_SMCCC, but it keeps the driver from being built for an
> architecture without SMCCC, such as RISC-V.
>
> Build smc_abi.c only when HAVE_ARM_SMCCC is set and ffa_abi.c only when
> the FF-A transport is enabled, and provide stubs for their registration
> otherwise, so that it fails with -EOPNOTSUPP as the FF-A ABI already
> does when the FF-A transport is not reachable. Keep the SMCCC header,
> the SMC invoke function type, the SMC and FF-A specific structures and
> the SMC RPC register parameters in optee_private.h under the same
> conditions, and drop the unused <linux/arm-smccc.h> include from
> notif.c.
>
> Make OPTEE depend on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT, as it
> already does for RPMB, so that the driver is limited to a module when
> the FF-A transport is one, rather than built in without FF-A support.
> ffa_abi.c is thus built exactly when the FF-A transport is reachable
> from the driver, and the IS_REACHABLE() checks in
> optee_ffa_abi_register() and optee_ffa_abi_unregister() are always
> true, so drop them.
>
> OPTEE still depends on HAVE_ARM_SMCCC, so smc_abi.c is still always
> built. The only visible change is that OPTEE=y can no longer be
> combined with ARM_FFA_TRANSPORT=m: such a configuration now resolves to
> OPTEE=m, with the FF-A ABI available.
>
> Signed-off-by: Marouene Boubakri <marouene.boubakri@oss.nxp.com>
> ---
> Changes in v4:
> - Make OPTEE depend on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT so that
> the driver is limited to =m when the FF-A transport is =m (Jens).
> - Update the commit message accordingly.
> v3: https://lore.kernel.org/all/20260922131735.524635-1-marouene.boubakri@oss.nxp.com/
>
> Changes in v3:
> - Dropped the RPMI ABI placeholder and the RISC-V enablement patches,
> this is now a single patch (Jens).
> - Key the FF-A parts of optee_private.h on IS_REACHABLE() instead of
> IS_ENABLED(): with OPTEE=y and ARM_FFA_TRANSPORT=m kbuild drops
> ffa_abi.o from the built-in optee.o while optee_ffa_abi_register()
> was still declared, which does not link.
> - Drop the now always true IS_REACHABLE() checks in
> optee_ffa_abi_register() and optee_ffa_abi_unregister().
> - Describe the current FF-A conditional compilation accurately in the
> commit message.
> - Posted as a new thread with a proper subject prefix.
> v2: https://lore.kernel.org/op-tee/20260915020235.507302-2-marouene.boubakri@oss.nxp.com/
>
> Changes in v2:
> - No code change, the testing section of the cover letter was completed.
> v1: https://lore.kernel.org/op-tee/20260914175435.118303-2-marouene.boubakri@oss.nxp.com/
> drivers/tee/optee/Kconfig | 1 +
> drivers/tee/optee/Makefile | 4 ++--
> drivers/tee/optee/ffa_abi.c | 8 ++-----
> drivers/tee/optee/notif.c | 1 -
> drivers/tee/optee/optee_private.h | 39 ++++++++++++++++++++++++++++++-
> 5 files changed, 43 insertions(+), 10 deletions(-)
Looks good, I'm picking this up.
Cheers,
Jens
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4] tee: optee: build the Arm-specific code only on Arm
2026-09-24 10:51 [PATCH v4] tee: optee: build the Arm-specific code only on Arm marouene.boubakri
2026-09-25 11:40 ` Jens Wiklander
@ 2026-10-01 20:27 ` Amirreza Zarrabi
2026-10-01 23:31 ` Amirreza Zarrabi
1 sibling, 1 reply; 4+ messages in thread
From: Amirreza Zarrabi @ 2026-10-01 20:27 UTC (permalink / raw)
To: marouene.boubakri, jenswi
Cc: sumit.garg, op-tee, linux-kernel, linux-riscv, peter.lin
Hi Marouene,
On 9/24/2026 8:51 PM, marouene.boubakri@oss.nxp.com wrote:
> From: Marouene Boubakri <marouene.boubakri@oss.nxp.com>
>
> The OP-TEE driver reaches OP-TEE through the SMC ABI or the FF-A ABI,
> both specific to Arm, yet builds both unconditionally together with the
> SMC Calling Convention definitions they rely on: ffa_abi.c is always
> compiled and only its registration is conditioned on
> IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT), and optee_private.h includes
> <linux/arm-smccc.h> and defines the SMC and FF-A specific types for
> every file of the driver. This is fine as long as the driver depends on
> HAVE_ARM_SMCCC, but it keeps the driver from being built for an
> architecture without SMCCC, such as RISC-V.
>
> Build smc_abi.c only when HAVE_ARM_SMCCC is set and ffa_abi.c only when
> the FF-A transport is enabled, and provide stubs for their registration
> otherwise, so that it fails with -EOPNOTSUPP as the FF-A ABI already
> does when the FF-A transport is not reachable. Keep the SMCCC header,
> the SMC invoke function type, the SMC and FF-A specific structures and
> the SMC RPC register parameters in optee_private.h under the same
> conditions, and drop the unused <linux/arm-smccc.h> include from
> notif.c.
>
> Make OPTEE depend on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT, as it
> already does for RPMB, so that the driver is limited to a module when
> the FF-A transport is one, rather than built in without FF-A support.
> ffa_abi.c is thus built exactly when the FF-A transport is reachable
> from the driver, and the IS_REACHABLE() checks in
> optee_ffa_abi_register() and optee_ffa_abi_unregister() are always
> true, so drop them.
>
> OPTEE still depends on HAVE_ARM_SMCCC, so smc_abi.c is still always
> built. The only visible change is that OPTEE=y can no longer be
> combined with ARM_FFA_TRANSPORT=m: such a configuration now resolves to
> OPTEE=m, with the FF-A ABI available.
>
> Signed-off-by: Marouene Boubakri <marouene.boubakri@oss.nxp.com>
> ---
> Changes in v4:
> - Make OPTEE depend on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT so that
> the driver is limited to =m when the FF-A transport is =m (Jens).
> - Update the commit message accordingly.
> v3: https://lore.kernel.org/all/20260922131735.524635-1-marouene.boubakri@oss.nxp.com/
>
> Changes in v3:
> - Dropped the RPMI ABI placeholder and the RISC-V enablement patches,
> this is now a single patch (Jens).
> - Key the FF-A parts of optee_private.h on IS_REACHABLE() instead of
> IS_ENABLED(): with OPTEE=y and ARM_FFA_TRANSPORT=m kbuild drops
> ffa_abi.o from the built-in optee.o while optee_ffa_abi_register()
> was still declared, which does not link.
> - Drop the now always true IS_REACHABLE() checks in
> optee_ffa_abi_register() and optee_ffa_abi_unregister().
> - Describe the current FF-A conditional compilation accurately in the
> commit message.
> - Posted as a new thread with a proper subject prefix.
> v2: https://lore.kernel.org/op-tee/20260915020235.507302-2-marouene.boubakri@oss.nxp.com/
>
> Changes in v2:
> - No code change, the testing section of the cover letter was completed.
> v1: https://lore.kernel.org/op-tee/20260914175435.118303-2-marouene.boubakri@oss.nxp.com/
> drivers/tee/optee/Kconfig | 1 +
> drivers/tee/optee/Makefile | 4 ++--
> drivers/tee/optee/ffa_abi.c | 8 ++-----
> drivers/tee/optee/notif.c | 1 -
> drivers/tee/optee/optee_private.h | 39 ++++++++++++++++++++++++++++++-
> 5 files changed, 43 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig
> index 50d2051..891dac6 100644
> --- a/drivers/tee/optee/Kconfig
> +++ b/drivers/tee/optee/Kconfig
> @@ -5,6 +5,7 @@ config OPTEE
> depends on HAVE_ARM_SMCCC
> depends on MMU
> depends on RPMB || !RPMB
> + depends on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT
> help
> This implements the OP-TEE Trusted Execution Environment (TEE)
> driver.
> diff --git a/drivers/tee/optee/Makefile b/drivers/tee/optee/Makefile
> index ad7049c..183cdde 100644
> --- a/drivers/tee/optee/Makefile
> +++ b/drivers/tee/optee/Makefile
> @@ -7,8 +7,8 @@ optee-objs += rpc.o
> optee-objs += protmem.o
> optee-objs += supp.o
> optee-objs += device.o
> -optee-objs += smc_abi.o
> -optee-objs += ffa_abi.o
> +optee-$(CONFIG_HAVE_ARM_SMCCC) += smc_abi.o
> +optee-$(CONFIG_ARM_FFA_TRANSPORT) += ffa_abi.o
>
> # for tracing framework to find optee_trace.h
> CFLAGS_smc_abi.o := -I$(src)
> diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c
> index 633715b..08236d8 100644
> --- a/drivers/tee/optee/ffa_abi.c
> +++ b/drivers/tee/optee/ffa_abi.c
> @@ -1212,14 +1212,10 @@ static struct ffa_driver optee_ffa_driver = {
>
> int optee_ffa_abi_register(void)
> {
> - if (IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT))
> - return ffa_register(&optee_ffa_driver);
> - else
> - return -EOPNOTSUPP;
> + return ffa_register(&optee_ffa_driver);
> }
>
> void optee_ffa_abi_unregister(void)
> {
> - if (IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT))
> - ffa_unregister(&optee_ffa_driver);
> + ffa_unregister(&optee_ffa_driver);
> }
> diff --git a/drivers/tee/optee/notif.c b/drivers/tee/optee/notif.c
> index 6e85f2f..6801422 100644
> --- a/drivers/tee/optee/notif.c
> +++ b/drivers/tee/optee/notif.c
> @@ -5,7 +5,6 @@
>
> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>
> -#include <linux/arm-smccc.h>
> #include <linux/errno.h>
> #include <linux/slab.h>
> #include <linux/spinlock.h>
> diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h
> index aefe1e6..02d6f79 100644
> --- a/drivers/tee/optee/optee_private.h
> +++ b/drivers/tee/optee/optee_private.h
> @@ -6,7 +6,6 @@
> #ifndef OPTEE_PRIVATE_H
> #define OPTEE_PRIVATE_H
>
> -#include <linux/arm-smccc.h>
> #include <linux/notifier.h>
> #include <linux/rhashtable.h>
> #include <linux/rpmb.h>
> @@ -15,6 +14,10 @@
> #include <linux/types.h>
> #include "optee_msg.h"
>
> +#ifdef CONFIG_HAVE_ARM_SMCCC
> +#include <linux/arm-smccc.h>
> +#endif
> +
> #define DRIVER_NAME "optee"
>
> #define OPTEE_MAX_ARG_SIZE 1024
> @@ -42,10 +45,12 @@
> */
> #define OPTEE_DEFAULT_MAX_NOTIF_VALUE 255
>
> +#ifdef CONFIG_HAVE_ARM_SMCCC
> typedef void (optee_invoke_fn)(unsigned long, unsigned long, unsigned long,
> unsigned long, unsigned long, unsigned long,
> unsigned long, unsigned long,
> struct arm_smccc_res *);
> +#endif
>
> /**
> * struct optee_call_waiter - TEE entry may need to wait for a free TEE thread
> @@ -119,6 +124,7 @@ struct optee_supp {
> struct completion reqs_c;
> };
>
> +#ifdef CONFIG_HAVE_ARM_SMCCC
> /**
> * struct optee_pcpu - per cpu notif private struct passed to work functions
> * @optee: optee device reference
> @@ -149,7 +155,9 @@ struct optee_smc {
> struct work_struct notif_pcpu_work;
> unsigned int notif_cpuhp_state;
> };
> +#endif
>
> +#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
> /**
> * struct optee_ffa - FFA communication struct
> * @ffa_dev: FFA device, contains the destination id, the id of
> @@ -170,6 +178,7 @@ struct optee_ffa {
> struct workqueue_struct *notif_wq;
> struct work_struct notif_work;
> };
> +#endif
>
> struct optee;
>
> @@ -257,8 +266,12 @@ struct optee {
> const struct optee_ops *ops;
> struct tee_context *ctx;
> union {
> +#ifdef CONFIG_HAVE_ARM_SMCCC
> struct optee_smc smc;
> +#endif
> +#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
> struct optee_ffa ffa;
> +#endif
Does this need to be a union if we filter the members?
Best Regards,
Amir
> };
> struct optee_shm_arg_cache shm_arg_cache;
> struct optee_call_queue call_queue;
> @@ -290,6 +303,7 @@ struct optee_context_data {
> struct list_head sess_list;
> };
>
> +#ifdef CONFIG_HAVE_ARM_SMCCC
> struct optee_rpc_param {
> u32 a0;
> u32 a1;
> @@ -300,6 +314,7 @@ struct optee_rpc_param {
> u32 a6;
> u32 a7;
> };
> +#endif
>
> /* Holds context that is preserved during one STD call */
> struct optee_call_ctx {
> @@ -422,9 +437,31 @@ static inline void reg_pair_from_64(u32 *reg0, u32 *reg1, u64 val)
> }
>
> /* Registration of the ABIs */
> +#ifdef CONFIG_HAVE_ARM_SMCCC
> int optee_smc_abi_register(void);
> void optee_smc_abi_unregister(void);
> +#else
> +static inline int optee_smc_abi_register(void)
> +{
> + return -EOPNOTSUPP;
> +}
> +
> +static inline void optee_smc_abi_unregister(void)
> +{
> +}
> +#endif
> +#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
> int optee_ffa_abi_register(void);
> void optee_ffa_abi_unregister(void);
> +#else
> +static inline int optee_ffa_abi_register(void)
> +{
> + return -EOPNOTSUPP;
> +}
> +
> +static inline void optee_ffa_abi_unregister(void)
> +{
> +}
> +#endif
>
> #endif /*OPTEE_PRIVATE_H*/
>
> base-commit: 827751b699b79a6e569983359c02dce67f81b94c
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4] tee: optee: build the Arm-specific code only on Arm
2026-10-01 20:27 ` Amirreza Zarrabi
@ 2026-10-01 23:31 ` Amirreza Zarrabi
0 siblings, 0 replies; 4+ messages in thread
From: Amirreza Zarrabi @ 2026-10-01 23:31 UTC (permalink / raw)
To: marouene.boubakri, jenswi
Cc: sumit.garg, op-tee, linux-kernel, linux-riscv, peter.lin
On 10/2/2026 6:27 AM, Amirreza Zarrabi wrote:
> Hi Marouene,
>
> On 9/24/2026 8:51 PM, marouene.boubakri@oss.nxp.com wrote:
>> From: Marouene Boubakri <marouene.boubakri@oss.nxp.com>
>>
>> The OP-TEE driver reaches OP-TEE through the SMC ABI or the FF-A ABI,
>> both specific to Arm, yet builds both unconditionally together with the
>> SMC Calling Convention definitions they rely on: ffa_abi.c is always
>> compiled and only its registration is conditioned on
>> IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT), and optee_private.h includes
>> <linux/arm-smccc.h> and defines the SMC and FF-A specific types for
>> every file of the driver. This is fine as long as the driver depends on
>> HAVE_ARM_SMCCC, but it keeps the driver from being built for an
>> architecture without SMCCC, such as RISC-V.
>>
>> Build smc_abi.c only when HAVE_ARM_SMCCC is set and ffa_abi.c only when
>> the FF-A transport is enabled, and provide stubs for their registration
>> otherwise, so that it fails with -EOPNOTSUPP as the FF-A ABI already
>> does when the FF-A transport is not reachable. Keep the SMCCC header,
>> the SMC invoke function type, the SMC and FF-A specific structures and
>> the SMC RPC register parameters in optee_private.h under the same
>> conditions, and drop the unused <linux/arm-smccc.h> include from
>> notif.c.
>>
>> Make OPTEE depend on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT, as it
>> already does for RPMB, so that the driver is limited to a module when
>> the FF-A transport is one, rather than built in without FF-A support.
>> ffa_abi.c is thus built exactly when the FF-A transport is reachable
>> from the driver, and the IS_REACHABLE() checks in
>> optee_ffa_abi_register() and optee_ffa_abi_unregister() are always
>> true, so drop them.
>>
>> OPTEE still depends on HAVE_ARM_SMCCC, so smc_abi.c is still always
>> built. The only visible change is that OPTEE=y can no longer be
>> combined with ARM_FFA_TRANSPORT=m: such a configuration now resolves to
>> OPTEE=m, with the FF-A ABI available.
>>
>> Signed-off-by: Marouene Boubakri <marouene.boubakri@oss.nxp.com>
>> ---
>> Changes in v4:
>> - Make OPTEE depend on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT so that
>> the driver is limited to =m when the FF-A transport is =m (Jens).
>> - Update the commit message accordingly.
>> v3: https://lore.kernel.org/all/20260922131735.524635-1-marouene.boubakri@oss.nxp.com/
>>
>> Changes in v3:
>> - Dropped the RPMI ABI placeholder and the RISC-V enablement patches,
>> this is now a single patch (Jens).
>> - Key the FF-A parts of optee_private.h on IS_REACHABLE() instead of
>> IS_ENABLED(): with OPTEE=y and ARM_FFA_TRANSPORT=m kbuild drops
>> ffa_abi.o from the built-in optee.o while optee_ffa_abi_register()
>> was still declared, which does not link.
>> - Drop the now always true IS_REACHABLE() checks in
>> optee_ffa_abi_register() and optee_ffa_abi_unregister().
>> - Describe the current FF-A conditional compilation accurately in the
>> commit message.
>> - Posted as a new thread with a proper subject prefix.
>> v2: https://lore.kernel.org/op-tee/20260915020235.507302-2-marouene.boubakri@oss.nxp.com/
>>
>> Changes in v2:
>> - No code change, the testing section of the cover letter was completed.
>> v1: https://lore.kernel.org/op-tee/20260914175435.118303-2-marouene.boubakri@oss.nxp.com/
>> drivers/tee/optee/Kconfig | 1 +
>> drivers/tee/optee/Makefile | 4 ++--
>> drivers/tee/optee/ffa_abi.c | 8 ++-----
>> drivers/tee/optee/notif.c | 1 -
>> drivers/tee/optee/optee_private.h | 39 ++++++++++++++++++++++++++++++-
>> 5 files changed, 43 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig
>> index 50d2051..891dac6 100644
>> --- a/drivers/tee/optee/Kconfig
>> +++ b/drivers/tee/optee/Kconfig
>> @@ -5,6 +5,7 @@ config OPTEE
>> depends on HAVE_ARM_SMCCC
>> depends on MMU
>> depends on RPMB || !RPMB
>> + depends on ARM_FFA_TRANSPORT || !ARM_FFA_TRANSPORT
>> help
>> This implements the OP-TEE Trusted Execution Environment (TEE)
>> driver.
>> diff --git a/drivers/tee/optee/Makefile b/drivers/tee/optee/Makefile
>> index ad7049c..183cdde 100644
>> --- a/drivers/tee/optee/Makefile
>> +++ b/drivers/tee/optee/Makefile
>> @@ -7,8 +7,8 @@ optee-objs += rpc.o
>> optee-objs += protmem.o
>> optee-objs += supp.o
>> optee-objs += device.o
>> -optee-objs += smc_abi.o
>> -optee-objs += ffa_abi.o
>> +optee-$(CONFIG_HAVE_ARM_SMCCC) += smc_abi.o
>> +optee-$(CONFIG_ARM_FFA_TRANSPORT) += ffa_abi.o
>>
>> # for tracing framework to find optee_trace.h
>> CFLAGS_smc_abi.o := -I$(src)
>> diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c
>> index 633715b..08236d8 100644
>> --- a/drivers/tee/optee/ffa_abi.c
>> +++ b/drivers/tee/optee/ffa_abi.c
>> @@ -1212,14 +1212,10 @@ static struct ffa_driver optee_ffa_driver = {
>>
>> int optee_ffa_abi_register(void)
>> {
>> - if (IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT))
>> - return ffa_register(&optee_ffa_driver);
>> - else
>> - return -EOPNOTSUPP;
>> + return ffa_register(&optee_ffa_driver);
>> }
>>
>> void optee_ffa_abi_unregister(void)
>> {
>> - if (IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT))
>> - ffa_unregister(&optee_ffa_driver);
>> + ffa_unregister(&optee_ffa_driver);
>> }
>> diff --git a/drivers/tee/optee/notif.c b/drivers/tee/optee/notif.c
>> index 6e85f2f..6801422 100644
>> --- a/drivers/tee/optee/notif.c
>> +++ b/drivers/tee/optee/notif.c
>> @@ -5,7 +5,6 @@
>>
>> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>>
>> -#include <linux/arm-smccc.h>
>> #include <linux/errno.h>
>> #include <linux/slab.h>
>> #include <linux/spinlock.h>
>> diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h
>> index aefe1e6..02d6f79 100644
>> --- a/drivers/tee/optee/optee_private.h
>> +++ b/drivers/tee/optee/optee_private.h
>> @@ -6,7 +6,6 @@
>> #ifndef OPTEE_PRIVATE_H
>> #define OPTEE_PRIVATE_H
>>
>> -#include <linux/arm-smccc.h>
>> #include <linux/notifier.h>
>> #include <linux/rhashtable.h>
>> #include <linux/rpmb.h>
>> @@ -15,6 +14,10 @@
>> #include <linux/types.h>
>> #include "optee_msg.h"
>>
>> +#ifdef CONFIG_HAVE_ARM_SMCCC
>> +#include <linux/arm-smccc.h>
>> +#endif
>> +
>> #define DRIVER_NAME "optee"
>>
>> #define OPTEE_MAX_ARG_SIZE 1024
>> @@ -42,10 +45,12 @@
>> */
>> #define OPTEE_DEFAULT_MAX_NOTIF_VALUE 255
>>
>> +#ifdef CONFIG_HAVE_ARM_SMCCC
>> typedef void (optee_invoke_fn)(unsigned long, unsigned long, unsigned long,
>> unsigned long, unsigned long, unsigned long,
>> unsigned long, unsigned long,
>> struct arm_smccc_res *);
>> +#endif
>>
>> /**
>> * struct optee_call_waiter - TEE entry may need to wait for a free TEE thread
>> @@ -119,6 +124,7 @@ struct optee_supp {
>> struct completion reqs_c;
>> };
>>
>> +#ifdef CONFIG_HAVE_ARM_SMCCC
>> /**
>> * struct optee_pcpu - per cpu notif private struct passed to work functions
>> * @optee: optee device reference
>> @@ -149,7 +155,9 @@ struct optee_smc {
>> struct work_struct notif_pcpu_work;
>> unsigned int notif_cpuhp_state;
>> };
>> +#endif
>>
>> +#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
>> /**
>> * struct optee_ffa - FFA communication struct
>> * @ffa_dev: FFA device, contains the destination id, the id of
>> @@ -170,6 +178,7 @@ struct optee_ffa {
>> struct workqueue_struct *notif_wq;
>> struct work_struct notif_work;
>> };
>> +#endif
>>
>> struct optee;
>>
>> @@ -257,8 +266,12 @@ struct optee {
>> const struct optee_ops *ops;
>> struct tee_context *ctx;
>> union {
>> +#ifdef CONFIG_HAVE_ARM_SMCCC
>> struct optee_smc smc;
>> +#endif
>> +#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
>> struct optee_ffa ffa;
>> +#endif
>
> Does this need to be a union if we filter the members?
>
> Best Regards,
> Amir
>
Ok, got my answer. We need both support in the binary, like before.
Thanks,
- Amir
>> };
>> struct optee_shm_arg_cache shm_arg_cache;
>> struct optee_call_queue call_queue;
>> @@ -290,6 +303,7 @@ struct optee_context_data {
>> struct list_head sess_list;
>> };
>>
>> +#ifdef CONFIG_HAVE_ARM_SMCCC
>> struct optee_rpc_param {
>> u32 a0;
>> u32 a1;
>> @@ -300,6 +314,7 @@ struct optee_rpc_param {
>> u32 a6;
>> u32 a7;
>> };
>> +#endif
>>
>> /* Holds context that is preserved during one STD call */
>> struct optee_call_ctx {
>> @@ -422,9 +437,31 @@ static inline void reg_pair_from_64(u32 *reg0, u32 *reg1, u64 val)
>> }
>>
>> /* Registration of the ABIs */
>> +#ifdef CONFIG_HAVE_ARM_SMCCC
>> int optee_smc_abi_register(void);
>> void optee_smc_abi_unregister(void);
>> +#else
>> +static inline int optee_smc_abi_register(void)
>> +{
>> + return -EOPNOTSUPP;
>> +}
>> +
>> +static inline void optee_smc_abi_unregister(void)
>> +{
>> +}
>> +#endif
>> +#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
>> int optee_ffa_abi_register(void);
>> void optee_ffa_abi_unregister(void);
>> +#else
>> +static inline int optee_ffa_abi_register(void)
>> +{
>> + return -EOPNOTSUPP;
>> +}
>> +
>> +static inline void optee_ffa_abi_unregister(void)
>> +{
>> +}
>> +#endif
>>
>> #endif /*OPTEE_PRIVATE_H*/
>>
>> base-commit: 827751b699b79a6e569983359c02dce67f81b94c
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-10-01 23:31 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-24 10:51 [PATCH v4] tee: optee: build the Arm-specific code only on Arm marouene.boubakri
2026-09-25 11:40 ` Jens Wiklander
2026-10-01 20:27 ` Amirreza Zarrabi
2026-10-01 23:31 ` Amirreza Zarrabi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®