From: Marouene Boubakri marouene.boubakri@oss.nxp.com
On RISC-V there is no SMC Calling Convention: OP-TEE runs in a domain isolated by the M-mode firmware and is reached through the RISC-V Platform Management Interface (RPMI), carried on an SBI Message Proxy (MPXY) channel.
Add the skeleton of an RPMI ABI next to the SMC and FF-A ABIs so that the build plumbing is in place: an OPTEE_RPMI_ABI option, built when the MPXY mailbox driver is enabled, rpmi_abi.c and its registration from the driver core. The transport itself is not implemented yet, so optee_rpmi_abi_register() fails with -EOPNOTSUPP and the driver keeps probing through its other ABIs only.
Signed-off-by: Marouene Boubakri marouene.boubakri@oss.nxp.com --- drivers/tee/optee/Kconfig | 8 ++++++++ drivers/tee/optee/Makefile | 1 + drivers/tee/optee/core.c | 8 ++++++-- drivers/tee/optee/optee_private.h | 13 +++++++++++++ drivers/tee/optee/rpmi_abi.c | 23 +++++++++++++++++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 drivers/tee/optee/rpmi_abi.c
diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig index 50d2051f7f20..0eaedb34673d 100644 --- a/drivers/tee/optee/Kconfig +++ b/drivers/tee/optee/Kconfig @@ -9,6 +9,14 @@ config OPTEE This implements the OP-TEE Trusted Execution Environment (TEE) driver.
+config OPTEE_RPMI_ABI + bool + depends on OPTEE && RISCV_SBI_MPXY_MBOX + default y + help + Reach OP-TEE through the RISC-V Platform Management Interface + (RPMI) carried on an SBI Message Proxy (MPXY) channel. + config OPTEE_INSECURE_LOAD_IMAGE bool "Load OP-TEE image as firmware" default n diff --git a/drivers/tee/optee/Makefile b/drivers/tee/optee/Makefile index 183cdde1ac04..a588f6f4cb2f 100644 --- a/drivers/tee/optee/Makefile +++ b/drivers/tee/optee/Makefile @@ -9,6 +9,7 @@ optee-objs += supp.o optee-objs += device.o optee-$(CONFIG_HAVE_ARM_SMCCC) += smc_abi.o optee-$(CONFIG_ARM_FFA_TRANSPORT) += ffa_abi.o +optee-$(CONFIG_OPTEE_RPMI_ABI) += rpmi_abi.o
# for tracing framework to find optee_trace.h CFLAGS_smc_abi.o := -I$(src) diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index a52c1f498b99..42a8bcab0cb8 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -220,6 +220,7 @@ void optee_remove_common(struct optee *optee)
static int smc_abi_rc; static int ffa_abi_rc; +static int rpmi_abi_rc; static bool intf_is_regged;
static int __init optee_core_init(void) @@ -245,9 +246,10 @@ static int __init optee_core_init(void)
smc_abi_rc = optee_smc_abi_register(); ffa_abi_rc = optee_ffa_abi_register(); + rpmi_abi_rc = optee_rpmi_abi_register();
- /* If both failed there's no point with this module */ - if (smc_abi_rc && ffa_abi_rc) { + /* If all failed there's no point with this module */ + if (smc_abi_rc && ffa_abi_rc && rpmi_abi_rc) { if (IS_REACHABLE(CONFIG_RPMB)) { rpmb_interface_unregister(&rpmb_class_intf); intf_is_regged = false; @@ -268,6 +270,8 @@ static void __exit optee_core_exit(void)
if (!smc_abi_rc) optee_smc_abi_unregister(); + if (!rpmi_abi_rc) + optee_rpmi_abi_unregister(); if (!ffa_abi_rc) optee_ffa_abi_unregister(); } diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index 94a4f251f5cf..5b57d69f1f34 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -463,5 +463,18 @@ static inline void optee_ffa_abi_unregister(void) { } #endif +#if IS_ENABLED(CONFIG_OPTEE_RPMI_ABI) +int optee_rpmi_abi_register(void); +void optee_rpmi_abi_unregister(void); +#else +static inline int optee_rpmi_abi_register(void) +{ + return -EOPNOTSUPP; +} + +static inline void optee_rpmi_abi_unregister(void) +{ +} +#endif
#endif /*OPTEE_PRIVATE_H*/ diff --git a/drivers/tee/optee/rpmi_abi.c b/drivers/tee/optee/rpmi_abi.c new file mode 100644 index 000000000000..01d08892eb55 --- /dev/null +++ b/drivers/tee/optee/rpmi_abi.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2026 NXP + * + * OP-TEE ABI over the RISC-V Platform Management Interface (RPMI), + * carried on an SBI Message Proxy (MPXY) channel. + * + * This is a placeholder: the transport is not implemented yet, so the + * ABI never registers and the driver only probes through its other ABIs. + */ + +#include <linux/errno.h> + +#include "optee_private.h" + +int optee_rpmi_abi_register(void) +{ + return -EOPNOTSUPP; +} + +void optee_rpmi_abi_unregister(void) +{ +}