* [RFC PATCH 0/4] fix FF-A call failed with pKVM when ff-a driver is built-in
@ 2026-04-17 17:57 Yeoreum Yun
2026-04-17 17:57 ` [RFC PATCH 1/4] security: ima: move ima_init into late_initcall_sync Yeoreum Yun
` (3 more replies)
0 siblings, 4 replies; 24+ messages in thread
From: Yeoreum Yun @ 2026-04-17 17:57 UTC (permalink / raw)
To: linux-security-module, linux-kernel, linux-integrity,
linux-arm-kernel, kvmarm
Cc: paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin,
eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton,
joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will,
Yeoreum Yun
commit 0e0546eabcd6 ("firmware: arm_ffa: Change initcall level of ffa_init() to rootfs_initcall")
changed the initcall level of ffa_init() to rootfs_initcall to address
an issue where IMA could not properly recognize the TPM device
when FF-A driver is built as built-in.
However, this introduces another problem: pKVM fails to handle FF-A calls
because it cannot trap the FFA_VERSION call invoked by ffa_init().
To ensure the TPM device is recognized when present in the system,
it is preferable to invoke ima_init() at a later stage.
Deferred probing is resolved by deferred_probe_initcall(),
which runs at the late_initcall level.
Therefore, introduce an LSM initcall at late_initcall_sync and
move ima_init() to this level.
With this change, revert the initcall level of ffa_init() back to
device_initcall. Additionally, to handle the case where ffa_init() runs
before kvm_init(), check whether pKVM has been initialized during ffa_init().
If not, defer initialization to prevent failures of FF-A calls
due to the inability to trap FFA_VERSION and FFA_RXTX_MAP in pKVM.
This patch is based on v7.0
Yeoreum Yun (4):
security: ima: move ima_init into late_initcall_sync
tpm: tpm_crb_ffa: revert defered_probed when tpm_crb_ffa is built-in
firmware: arm_ffa: revert ffa_init() initcall level to device_initcall
firmware: arm_ffa: check pkvm initailised when initailise ffa driver
arch/arm64/kvm/arm.c | 1 +
drivers/char/tpm/tpm_crb_ffa.c | 18 +++---------------
drivers/firmware/arm_ffa/driver.c | 14 +++++++++++++-
include/linux/lsm_hooks.h | 2 ++
security/integrity/ima/ima_main.c | 2 +-
security/lsm_init.c | 13 +++++++++++--
6 files changed, 31 insertions(+), 19 deletions(-)
base-commit: 028ef9c96e96197026887c0f092424679298aae8
--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
^ permalink raw reply [flat|nested] 24+ messages in thread* [RFC PATCH 1/4] security: ima: move ima_init into late_initcall_sync 2026-04-17 17:57 [RFC PATCH 0/4] fix FF-A call failed with pKVM when ff-a driver is built-in Yeoreum Yun @ 2026-04-17 17:57 ` Yeoreum Yun 2026-04-20 10:32 ` Jonathan McDowell 2026-04-17 17:57 ` [RFC PATCH 2/4] tpm: tpm_crb_ffa: revert defered_probed when tpm_crb_ffa is built-in Yeoreum Yun ` (2 subsequent siblings) 3 siblings, 1 reply; 24+ messages in thread From: Yeoreum Yun @ 2026-04-17 17:57 UTC (permalink / raw) To: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm Cc: paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will, Yeoreum Yun To generate the boot_aggregate log in the IMA subsystem with TPM PCR values, the TPM driver must be built as built-in and must be probed before the IMA subsystem is initialized. However, when the TPM device operates over the FF-A protocol using the CRB interface, probing fails and returns -EPROBE_DEFER if the tpm_crb_ffa device — an FF-A device that provides the communication interface to the tpm_crb driver — has not yet been probed. To ensure the TPM device operating over the FF-A protocol with the CRB interface is probed before IMA initialization, the following conditions must be met: 1. The corresponding ffa_device must be registered, which is done via ffa_init(). 2. The tpm_crb_driver must successfully probe this device via tpm_crb_ffa_init(). 3. The tpm_crb driver using CRB over FF-A can then be probed successfully. (See crb_acpi_add() and tpm_crb_ffa_init() for reference.) Unfortunately, ffa_init(), tpm_crb_ffa_init(), and crb_acpi_driver_init() are all registered with device_initcall, which means crb_acpi_driver_init() may be invoked before ffa_init() and tpm_crb_ffa_init() are completed. When this occurs, probing the TPM device is deferred. However, the deferred probe can happen after the IMA subsystem has already been initialized, since IMA initialization is performed during late_initcall, and deferred_probe_initcall() is performed at the same level. To resolve this, move ima_init() into late_inicall_sync level so that let IMA not miss TPM PCR value when generating boot_aggregate log though TPM device presents in the system. Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> --- include/linux/lsm_hooks.h | 2 ++ security/integrity/ima/ima_main.c | 2 +- security/lsm_init.c | 13 +++++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index d48bf0ad26f4..88fe105b7f00 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -166,6 +166,7 @@ enum lsm_order { * @initcall_fs: LSM callback for fs_initcall setup, optional * @initcall_device: LSM callback for device_initcall() setup, optional * @initcall_late: LSM callback for late_initcall() setup, optional + * @initcall_late_sync: LSM callback for late_initcall_sync() setup, optional */ struct lsm_info { const struct lsm_id *id; @@ -181,6 +182,7 @@ struct lsm_info { int (*initcall_fs)(void); int (*initcall_device)(void); int (*initcall_late)(void); + int (*initcall_late_sync)(void); }; #define DEFINE_LSM(lsm) \ diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index 1d6229b156fb..ace280fa3212 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -1320,5 +1320,5 @@ DEFINE_LSM(ima) = { .order = LSM_ORDER_LAST, .blobs = &ima_blob_sizes, /* Start IMA after the TPM is available */ - .initcall_late = init_ima, + .initcall_late_sync = init_ima, }; diff --git a/security/lsm_init.c b/security/lsm_init.c index 573e2a7250c4..4e5c59beb82a 100644 --- a/security/lsm_init.c +++ b/security/lsm_init.c @@ -547,13 +547,22 @@ device_initcall(security_initcall_device); * security_initcall_late - Run the LSM late initcalls */ static int __init security_initcall_late(void) +{ + return lsm_initcall(late); +} +late_initcall(security_initcall_late); + +/** + * security_initcall_late_sync - Run the LSM late initcalls sync + */ +static int __init security_initcall_late_sync(void) { int rc; - rc = lsm_initcall(late); + rc = lsm_initcall(late_sync); lsm_pr_dbg("all enabled LSMs fully activated\n"); call_blocking_lsm_notifier(LSM_STARTED_ALL, NULL); return rc; } -late_initcall(security_initcall_late); +late_initcall_sync(security_initcall_late_sync); -- LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} ^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 1/4] security: ima: move ima_init into late_initcall_sync 2026-04-17 17:57 ` [RFC PATCH 1/4] security: ima: move ima_init into late_initcall_sync Yeoreum Yun @ 2026-04-20 10:32 ` Jonathan McDowell 0 siblings, 0 replies; 24+ messages in thread From: Jonathan McDowell @ 2026-04-20 10:32 UTC (permalink / raw) To: Yeoreum Yun Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Fri, Apr 17, 2026 at 06:57:56PM +0100, Yeoreum Yun wrote: >To generate the boot_aggregate log in the IMA subsystem with TPM PCR values, >the TPM driver must be built as built-in and >must be probed before the IMA subsystem is initialized. > >However, when the TPM device operates over the FF-A protocol using >the CRB interface, probing fails and returns -EPROBE_DEFER if >the tpm_crb_ffa device — an FF-A device that provides the communication >interface to the tpm_crb driver — has not yet been probed. > >To ensure the TPM device operating over the FF-A protocol with >the CRB interface is probed before IMA initialization, >the following conditions must be met: > > 1. The corresponding ffa_device must be registered, > which is done via ffa_init(). > > 2. The tpm_crb_driver must successfully probe this device via > tpm_crb_ffa_init(). > > 3. The tpm_crb driver using CRB over FF-A can then > be probed successfully. (See crb_acpi_add() and > tpm_crb_ffa_init() for reference.) > >Unfortunately, ffa_init(), tpm_crb_ffa_init(), and crb_acpi_driver_init() are >all registered with device_initcall, which means crb_acpi_driver_init() may >be invoked before ffa_init() and tpm_crb_ffa_init() are completed. > >When this occurs, probing the TPM device is deferred. >However, the deferred probe can happen after the IMA subsystem >has already been initialized, since IMA initialization is performed >during late_initcall, and deferred_probe_initcall() is performed >at the same level. > >To resolve this, move ima_init() into late_inicall_sync level >so that let IMA not miss TPM PCR value when generating boot_aggregate >log though TPM device presents in the system. > >Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> Awesome. This fixes the problems I saw with an SPI TPM on an NVIDIA GB200 system and reported in https://lore.kernel.org/linux-integrity/aYXEepLhUouN5f99@earth.li/ Reviewed-by: Jonathan McDowell <noodles@meta.com> Tested-by: Jonathan McDowell <noodles@meta.com> >--- > include/linux/lsm_hooks.h | 2 ++ > security/integrity/ima/ima_main.c | 2 +- > security/lsm_init.c | 13 +++++++++++-- > 3 files changed, 14 insertions(+), 3 deletions(-) > >diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h >index d48bf0ad26f4..88fe105b7f00 100644 >--- a/include/linux/lsm_hooks.h >+++ b/include/linux/lsm_hooks.h >@@ -166,6 +166,7 @@ enum lsm_order { > * @initcall_fs: LSM callback for fs_initcall setup, optional > * @initcall_device: LSM callback for device_initcall() setup, optional > * @initcall_late: LSM callback for late_initcall() setup, optional >+ * @initcall_late_sync: LSM callback for late_initcall_sync() setup, optional > */ > struct lsm_info { > const struct lsm_id *id; >@@ -181,6 +182,7 @@ struct lsm_info { > int (*initcall_fs)(void); > int (*initcall_device)(void); > int (*initcall_late)(void); >+ int (*initcall_late_sync)(void); > }; > > #define DEFINE_LSM(lsm) \ >diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c >index 1d6229b156fb..ace280fa3212 100644 >--- a/security/integrity/ima/ima_main.c >+++ b/security/integrity/ima/ima_main.c >@@ -1320,5 +1320,5 @@ DEFINE_LSM(ima) = { > .order = LSM_ORDER_LAST, > .blobs = &ima_blob_sizes, > /* Start IMA after the TPM is available */ >- .initcall_late = init_ima, >+ .initcall_late_sync = init_ima, > }; >diff --git a/security/lsm_init.c b/security/lsm_init.c >index 573e2a7250c4..4e5c59beb82a 100644 >--- a/security/lsm_init.c >+++ b/security/lsm_init.c >@@ -547,13 +547,22 @@ device_initcall(security_initcall_device); > * security_initcall_late - Run the LSM late initcalls > */ > static int __init security_initcall_late(void) >+{ >+ return lsm_initcall(late); >+} >+late_initcall(security_initcall_late); >+ >+/** >+ * security_initcall_late_sync - Run the LSM late initcalls sync >+ */ >+static int __init security_initcall_late_sync(void) > { > int rc; > >- rc = lsm_initcall(late); >+ rc = lsm_initcall(late_sync); > lsm_pr_dbg("all enabled LSMs fully activated\n"); > call_blocking_lsm_notifier(LSM_STARTED_ALL, NULL); > > return rc; > } >-late_initcall(security_initcall_late); >+late_initcall_sync(security_initcall_late_sync); >-- >LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} > > J. -- ] https://www.earth.li/~noodles/ [] "Do I scare you?" "No." "Do you [ ] PGP/GPG Key @ the.earth.li [] want me to?" -- Wayne's World. [ ] via keyserver, web or email. [] [ ] RSA: 4096/0x94FA372B2DA8B985 [] [ ^ permalink raw reply [flat|nested] 24+ messages in thread
* [RFC PATCH 2/4] tpm: tpm_crb_ffa: revert defered_probed when tpm_crb_ffa is built-in 2026-04-17 17:57 [RFC PATCH 0/4] fix FF-A call failed with pKVM when ff-a driver is built-in Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 1/4] security: ima: move ima_init into late_initcall_sync Yeoreum Yun @ 2026-04-17 17:57 ` Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 3/4] firmware: arm_ffa: revert ffa_init() initcall level to device_initcall Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver Yeoreum Yun 3 siblings, 0 replies; 24+ messages in thread From: Yeoreum Yun @ 2026-04-17 17:57 UTC (permalink / raw) To: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm Cc: paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will, Yeoreum Yun commit 746d9e9f62a6 ("tpm: tpm_crb_ffa: try to probe tpm_crb_ffa when it's build_in") probe tpm_crb_ffa forcefully when it's built-in to integrate with IMA. However, as IMA init function is changed to late_initcall_sync level. So, this change isn't required anymore. Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> --- drivers/char/tpm/tpm_crb_ffa.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/drivers/char/tpm/tpm_crb_ffa.c b/drivers/char/tpm/tpm_crb_ffa.c index 99f1c1e5644b..025c4d4b17ca 100644 --- a/drivers/char/tpm/tpm_crb_ffa.c +++ b/drivers/char/tpm/tpm_crb_ffa.c @@ -177,23 +177,13 @@ static int tpm_crb_ffa_to_linux_errno(int errno) */ int tpm_crb_ffa_init(void) { - int ret = 0; - - if (!IS_MODULE(CONFIG_TCG_ARM_CRB_FFA)) { - ret = ffa_register(&tpm_crb_ffa_driver); - if (ret) { - tpm_crb_ffa = ERR_PTR(-ENODEV); - return ret; - } - } - if (!tpm_crb_ffa) - ret = -ENOENT; + return -ENOENT; if (IS_ERR_VALUE(tpm_crb_ffa)) - ret = -ENODEV; + return -ENODEV; - return ret; + return 0; } EXPORT_SYMBOL_GPL(tpm_crb_ffa_init); @@ -405,9 +395,7 @@ static struct ffa_driver tpm_crb_ffa_driver = { .id_table = tpm_crb_ffa_device_id, }; -#ifdef MODULE module_ffa_driver(tpm_crb_ffa_driver); -#endif MODULE_AUTHOR("Arm"); MODULE_DESCRIPTION("TPM CRB FFA driver"); -- LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [RFC PATCH 3/4] firmware: arm_ffa: revert ffa_init() initcall level to device_initcall 2026-04-17 17:57 [RFC PATCH 0/4] fix FF-A call failed with pKVM when ff-a driver is built-in Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 1/4] security: ima: move ima_init into late_initcall_sync Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 2/4] tpm: tpm_crb_ffa: revert defered_probed when tpm_crb_ffa is built-in Yeoreum Yun @ 2026-04-17 17:57 ` Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver Yeoreum Yun 3 siblings, 0 replies; 24+ messages in thread From: Yeoreum Yun @ 2026-04-17 17:57 UTC (permalink / raw) To: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm Cc: paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will, Yeoreum Yun commit 0e0546eabcd6 ("firmware: arm_ffa: Change initcall level of ffa_init() to rootfs_initcall") changed the initcall level of ffa_init() to rootfs_initcall to address an issue where IMA could not properly recognize the TPM device. However, this introduces a problem: pKVM fails to handle any FF-A calls because it cannot trap the FFA_VERSION call invoked by ffa_init(). Since the IMA init function level has been changed to late_initcall_sync, there is no longer a need to keep ffa_init() at rootfs_initcall. Revert it back to device_initcall. Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> --- drivers/firmware/arm_ffa/driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index f2f94d4d533e..02c76ac1570b 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -2106,7 +2106,7 @@ static int __init ffa_init(void) kfree(drv_info); return ret; } -rootfs_initcall(ffa_init); +device_initcall(ffa_init); static void __exit ffa_exit(void) { -- LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-17 17:57 [RFC PATCH 0/4] fix FF-A call failed with pKVM when ff-a driver is built-in Yeoreum Yun ` (2 preceding siblings ...) 2026-04-17 17:57 ` [RFC PATCH 3/4] firmware: arm_ffa: revert ffa_init() initcall level to device_initcall Yeoreum Yun @ 2026-04-17 17:57 ` Yeoreum Yun 2026-04-18 9:24 ` Marc Zyngier 2026-04-20 12:32 ` Sebastian Ene 3 siblings, 2 replies; 24+ messages in thread From: Yeoreum Yun @ 2026-04-17 17:57 UTC (permalink / raw) To: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm Cc: paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will, Yeoreum Yun When pKVM is enabled, the FF-A driver must be initialized after pKVM. Otherwise, pKVM cannot negotiate the FF-A version or obtain RX/TX buffer information, leading to failures in FF-A calls. During FF-A driver initialization, check whether pKVM has been initialized. If not, defer probing of the FF-A driver. Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> --- arch/arm64/kvm/arm.c | 1 + drivers/firmware/arm_ffa/driver.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 410ffd41fd73..0f517b1c05cd 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -119,6 +119,7 @@ bool is_kvm_arm_initialised(void) { return kvm_arm_initialised; } +EXPORT_SYMBOL(is_kvm_arm_initialised); int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) { diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 02c76ac1570b..2647d6554afd 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -42,6 +42,8 @@ #include <linux/uuid.h> #include <linux/xarray.h> +#include <asm/virt.h> + #include "common.h" #define FFA_DRIVER_VERSION FFA_VERSION_1_2 @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) u32 buf_sz; size_t rxtx_bufsz = SZ_4K; + /* + * When pKVM is enabled, the FF-A driver must be initialized + * after pKVM initialization. Otherwise, pKVM cannot negotiate + * the FF-A version or obtain RX/TX buffer information, + * which leads to failures in FF-A calls. + */ + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && + !is_kvm_arm_initialised()) + return -EPROBE_DEFER; + ret = ffa_transport_init(&invoke_ffa_fn); if (ret) return ret; -- LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} ^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-17 17:57 ` [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver Yeoreum Yun @ 2026-04-18 9:24 ` Marc Zyngier 2026-04-18 10:34 ` Yeoreum Yun 2026-04-20 12:32 ` Sebastian Ene 1 sibling, 1 reply; 24+ messages in thread From: Marc Zyngier @ 2026-04-18 9:24 UTC (permalink / raw) To: Yeoreum Yun Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Fri, 17 Apr 2026 18:57:59 +0100, Yeoreum Yun <yeoreum.yun@arm.com> wrote: > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > Otherwise, pKVM cannot negotiate the FF-A version or > obtain RX/TX buffer information, leading to failures in FF-A calls. > > During FF-A driver initialization, check whether pKVM has been initialized. > If not, defer probing of the FF-A driver. > > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > --- > arch/arm64/kvm/arm.c | 1 + > drivers/firmware/arm_ffa/driver.c | 12 ++++++++++++ > 2 files changed, 13 insertions(+) > > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c > index 410ffd41fd73..0f517b1c05cd 100644 > --- a/arch/arm64/kvm/arm.c > +++ b/arch/arm64/kvm/arm.c > @@ -119,6 +119,7 @@ bool is_kvm_arm_initialised(void) > { > return kvm_arm_initialised; > } > +EXPORT_SYMBOL(is_kvm_arm_initialised); EXPORT_SYMBOL_GPL(), please. > > int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) > { > diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c > index 02c76ac1570b..2647d6554afd 100644 > --- a/drivers/firmware/arm_ffa/driver.c > +++ b/drivers/firmware/arm_ffa/driver.c > @@ -42,6 +42,8 @@ > #include <linux/uuid.h> > #include <linux/xarray.h> > > +#include <asm/virt.h> > + > #include "common.h" > > #define FFA_DRIVER_VERSION FFA_VERSION_1_2 > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > u32 buf_sz; > size_t rxtx_bufsz = SZ_4K; > > + /* > + * When pKVM is enabled, the FF-A driver must be initialized > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > + * the FF-A version or obtain RX/TX buffer information, > + * which leads to failures in FF-A calls. > + */ > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > + !is_kvm_arm_initialised()) > + return -EPROBE_DEFER; > + That's still fundamentally wrong: pkvm is not ready until finalize_pkvm() has finished, and that's not indicated by is_kvm_arm_initialised(). M. -- Jazz isn't dead. It just smells funny. ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-18 9:24 ` Marc Zyngier @ 2026-04-18 10:34 ` Yeoreum Yun 2026-04-19 10:41 ` Marc Zyngier 0 siblings, 1 reply; 24+ messages in thread From: Yeoreum Yun @ 2026-04-18 10:34 UTC (permalink / raw) To: Marc Zyngier Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will Hi Marc, > On Fri, 17 Apr 2026 18:57:59 +0100, > Yeoreum Yun <yeoreum.yun@arm.com> wrote: > > > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > > Otherwise, pKVM cannot negotiate the FF-A version or > > obtain RX/TX buffer information, leading to failures in FF-A calls. > > > > During FF-A driver initialization, check whether pKVM has been initialized. > > If not, defer probing of the FF-A driver. > > > > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > > --- > > arch/arm64/kvm/arm.c | 1 + > > drivers/firmware/arm_ffa/driver.c | 12 ++++++++++++ > > 2 files changed, 13 insertions(+) > > > > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c > > index 410ffd41fd73..0f517b1c05cd 100644 > > --- a/arch/arm64/kvm/arm.c > > +++ b/arch/arm64/kvm/arm.c > > @@ -119,6 +119,7 @@ bool is_kvm_arm_initialised(void) > > { > > return kvm_arm_initialised; > > } > > +EXPORT_SYMBOL(is_kvm_arm_initialised); > > EXPORT_SYMBOL_GPL(), please. Okay. > > > > > int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) > > { > > diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c > > index 02c76ac1570b..2647d6554afd 100644 > > --- a/drivers/firmware/arm_ffa/driver.c > > +++ b/drivers/firmware/arm_ffa/driver.c > > @@ -42,6 +42,8 @@ > > #include <linux/uuid.h> > > #include <linux/xarray.h> > > > > +#include <asm/virt.h> > > + > > #include "common.h" > > > > #define FFA_DRIVER_VERSION FFA_VERSION_1_2 > > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > > u32 buf_sz; > > size_t rxtx_bufsz = SZ_4K; > > > > + /* > > + * When pKVM is enabled, the FF-A driver must be initialized > > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > > + * the FF-A version or obtain RX/TX buffer information, > > + * which leads to failures in FF-A calls. > > + */ > > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > > + !is_kvm_arm_initialised()) > > + return -EPROBE_DEFER; > > + > > That's still fundamentally wrong: pkvm is not ready until > finalize_pkvm() has finished, and that's not indicated by > is_kvm_arm_initialised(). Thanks. I miss the TSC bit set in here. IMHO, I'd like to make an new state check function -- is_pkvm_arm_initialised() so that ff-a driver to know whether pkvm is initialised. or any other suggestion? Thanks. -- Sincerely, Yeoreum Yun ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-18 10:34 ` Yeoreum Yun @ 2026-04-19 10:41 ` Marc Zyngier 2026-04-19 11:12 ` Yeoreum Yun 0 siblings, 1 reply; 24+ messages in thread From: Marc Zyngier @ 2026-04-19 10:41 UTC (permalink / raw) To: Yeoreum Yun Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Sat, 18 Apr 2026 11:34:30 +0100, Yeoreum Yun <yeoreum.yun@arm.com> wrote: > > > > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > > > u32 buf_sz; > > > size_t rxtx_bufsz = SZ_4K; > > > > > > + /* > > > + * When pKVM is enabled, the FF-A driver must be initialized > > > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > > > + * the FF-A version or obtain RX/TX buffer information, > > > + * which leads to failures in FF-A calls. > > > + */ > > > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > > > + !is_kvm_arm_initialised()) > > > + return -EPROBE_DEFER; > > > + > > > > That's still fundamentally wrong: pkvm is not ready until > > finalize_pkvm() has finished, and that's not indicated by > > is_kvm_arm_initialised(). > > Thanks. I miss the TSC bit set in here. That's the least of the problems. None of the infrastructure is in place at this stage... > IMHO, I'd like to make an new state check function -- > is_pkvm_arm_initialised() so that ff-a driver to know whether > pkvm is initialised. Doesn't sound great, TBH. > or any other suggestion? Instead of adding more esoteric predicates, I'd rather you build on an existing infrastructure. You have a dependency on KVM, use something that is designed to enforce dependencies. Device links spring to mind as something designed for that. Can you look into enabling this for KVM? If that's possible, then it should be easy enough to delay the actual KVM registration after pKVM is finalised. Thanks, M. -- Jazz isn't dead. It just smells funny. ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-19 10:41 ` Marc Zyngier @ 2026-04-19 11:12 ` Yeoreum Yun 2026-04-20 8:55 ` Will Deacon 0 siblings, 1 reply; 24+ messages in thread From: Yeoreum Yun @ 2026-04-19 11:12 UTC (permalink / raw) To: Marc Zyngier Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will Hi Marc, > On Sat, 18 Apr 2026 11:34:30 +0100, > Yeoreum Yun <yeoreum.yun@arm.com> wrote: > > > > > > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > > > > u32 buf_sz; > > > > size_t rxtx_bufsz = SZ_4K; > > > > > > > > + /* > > > > + * When pKVM is enabled, the FF-A driver must be initialized > > > > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > > > > + * the FF-A version or obtain RX/TX buffer information, > > > > + * which leads to failures in FF-A calls. > > > > + */ > > > > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > > > > + !is_kvm_arm_initialised()) > > > > + return -EPROBE_DEFER; > > > > + > > > > > > That's still fundamentally wrong: pkvm is not ready until > > > finalize_pkvm() has finished, and that's not indicated by > > > is_kvm_arm_initialised(). > > > > Thanks. I miss the TSC bit set in here. > > That's the least of the problems. None of the infrastructure is in > place at this stage... > > > IMHO, I'd like to make an new state check function -- > > is_pkvm_arm_initialised() so that ff-a driver to know whether > > pkvm is initialised. > > Doesn't sound great, TBH. > > > or any other suggestion? > > Instead of adding more esoteric predicates, I'd rather you build on an > existing infrastructure. You have a dependency on KVM, use something > that is designed to enforce dependencies. Device links spring to mind > as something designed for that. > > Can you look into enabling this for KVM? If that's possible, then it > should be easy enough to delay the actual KVM registration after pKVM > is finalised. or what about some event notifier? Just like: ----------&<----------- diff --git a/arch/arm64/include/asm/virt.h b/arch/arm64/include/asm/virt.h index b51ab6840f9c..ad038a3b8727 100644 --- a/arch/arm64/include/asm/virt.h +++ b/arch/arm64/include/asm/virt.h @@ -68,6 +68,8 @@ #include <asm/sysreg.h> #include <asm/cpufeature.h> +struct notifier_block; + /* * __boot_cpu_mode records what mode CPUs were booted in. * A correctly-implemented bootloader must start all CPUs in the same mode: @@ -166,6 +168,15 @@ static inline bool is_hyp_nvhe(void) return is_hyp_mode_available() && !is_kernel_in_hyp_mode(); } +enum kvm_arm_event { + PKVM_INITIALISED, + KVM_ARM_EVENT_MAX, +}; + +extern int kvm_arm_event_notifier_call_chain(enum kvm_arm_event event, void *data); +extern int kvm_arm_event_notifier_register(struct notifier_block *nb); +extern int kvm_arm_event_notifier_unregister(struct notifier_block *nb); + #endif /* __ASSEMBLER__ */ #endif /* ! __ASM__VIRT_H */ diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 410ffd41fd73..8da10049ab65 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -14,6 +14,7 @@ #include <linux/vmalloc.h> #include <linux/fs.h> #include <linux/mman.h> +#include <linux/notifier.h> #include <linux/sched.h> #include <linux/kvm.h> #include <linux/kvm_irqfd.h> @@ -111,6 +112,8 @@ DECLARE_KVM_NVHE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params); DECLARE_KVM_NVHE_PER_CPU(struct kvm_cpu_context, kvm_hyp_ctxt); +BLOCKING_NOTIFIER_HEAD(kvm_arm_event_notifier_head); + static bool vgic_present, kvm_arm_initialised; static DEFINE_PER_CPU(unsigned char, kvm_hyp_initialized); @@ -3064,4 +3067,22 @@ enum kvm_mode kvm_get_mode(void) return kvm_mode; } +int kvm_arm_event_notifier_call_chain(enum kvm_arm_event event, void *data) +{ + return blocking_notifier_call_chain(&kvm_arm_event_notifier_head, + event, data); +} + +int kvm_arm_event_notifier_register(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&kvm_arm_event_notifier_head, nb); +} +EXPORT_SYMBOL_GPL(kvm_arm_event_notifier_register); + +int kvm_arm_event_notifier_unregister(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&kvm_arm_event_notifier_head, nb); +} +EXPORT_SYMBOL_GPL(kvm_arm_event_notifier_unregister); + module_init(kvm_arm_init); diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c index d7a0f69a9982..e76562b0a45a 100644 --- a/arch/arm64/kvm/pkvm.c +++ b/arch/arm64/kvm/pkvm.c @@ -280,6 +280,8 @@ static int __init finalize_pkvm(void) ret = pkvm_drop_host_privileges(); if (ret) pr_err("Failed to finalize Hyp protection: %d\n", ret); + else + kvm_arm_event_notifier_call_chain(PKVM_INITIALISED, NULL); return ret; } diff --git a/drivers/firmware/arm_ffa/common.h b/drivers/firmware/arm_ffa/common.h index 9c6425a81d0d..5cdf4bd222c6 100644 --- a/drivers/firmware/arm_ffa/common.h +++ b/drivers/firmware/arm_ffa/common.h @@ -18,9 +18,9 @@ bool ffa_device_is_valid(struct ffa_device *ffa_dev); void ffa_device_match_uuid(struct ffa_device *ffa_dev, const uuid_t *uuid); #ifdef CONFIG_ARM_FFA_SMCCC -int __init ffa_transport_init(ffa_fn **invoke_ffa_fn); +int ffa_transport_init(ffa_fn **invoke_ffa_fn); #else -static inline int __init ffa_transport_init(ffa_fn **invoke_ffa_fn) +static inline int ffa_transport_init(ffa_fn **invoke_ffa_fn) { return -EOPNOTSUPP; } diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 02c76ac1570b..67df053e65b8 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -35,6 +35,7 @@ #include <linux/module.h> #include <linux/mm.h> #include <linux/mutex.h> +#include <linux/notifier.h> #include <linux/of_irq.h> #include <linux/scatterlist.h> #include <linux/slab.h> @@ -42,6 +43,8 @@ #include <linux/uuid.h> #include <linux/xarray.h> +#include <asm/virt.h> + #include "common.h" #define FFA_DRIVER_VERSION FFA_VERSION_1_2 @@ -2029,7 +2032,7 @@ static void ffa_notifications_setup(void) ffa_notifications_cleanup(); } -static int __init ffa_init(void) +static int __ffa_init(void) { int ret; u32 buf_sz; @@ -2105,11 +2108,42 @@ static int __init ffa_init(void) free_drv_info: kfree(drv_info); return ret; + +} + +static int ffa_kvm_arm_event_handler(struct notifier_block *nb, + unsigned long event, void *unused) +{ + if (event == PKVM_INITIALISED) + __ffa_init(); + + return NOTIFY_DONE; +} + +static struct notifier_block ffa_kvm_arm_event_notifier = { + .notifier_call = ffa_kvm_arm_event_handler, +}; + +static int __init ffa_init(void) +{ + /* + * When pKVM is enabled, the FF-A driver must be initialized + * after pKVM initialization. Otherwise, pKVM cannot negotiate + * the FF-A version or obtain RX/TX buffer information, + * which leads to failures in FF-A calls. + */ + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && + !is_pkvm_initialized()) + return kvm_arm_event_notifier_register(&ffa_kvm_arm_event_notifier); + + return __ffa_init(); } device_initcall(ffa_init); static void __exit ffa_exit(void) { + if (IS_ENABLED(CONFIG_KVM)) + kvm_arm_event_notifier_unregister(&ffa_kvm_arm_event_notifier); ffa_notifications_cleanup(); ffa_partitions_cleanup(); ffa_rxtx_unmap(); diff --git a/drivers/firmware/arm_ffa/smccc.c b/drivers/firmware/arm_ffa/smccc.c index 4d85bfff0a4e..e6125dd9f58f 100644 --- a/drivers/firmware/arm_ffa/smccc.c +++ b/drivers/firmware/arm_ffa/smccc.c @@ -17,7 +17,7 @@ static void __arm_ffa_fn_hvc(ffa_value_t args, ffa_value_t *res) arm_smccc_1_2_hvc(&args, res); } -int __init ffa_transport_init(ffa_fn **invoke_ffa_fn) +int ffa_transport_init(ffa_fn **invoke_ffa_fn) { enum arm_smccc_conduit conduit; > -- > Jazz isn't dead. It just smells funny. -- Sincerely, Yeoreum Yun ^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-19 11:12 ` Yeoreum Yun @ 2026-04-20 8:55 ` Will Deacon 2026-04-20 9:25 ` Yeoreum Yun 0 siblings, 1 reply; 24+ messages in thread From: Will Deacon @ 2026-04-20 8:55 UTC (permalink / raw) To: Yeoreum Yun Cc: Marc Zyngier, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas On Sun, Apr 19, 2026 at 12:12:44PM +0100, Yeoreum Yun wrote: > Hi Marc, > > > On Sat, 18 Apr 2026 11:34:30 +0100, > > Yeoreum Yun <yeoreum.yun@arm.com> wrote: > > > > > > > > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > > > > > u32 buf_sz; > > > > > size_t rxtx_bufsz = SZ_4K; > > > > > > > > > > + /* > > > > > + * When pKVM is enabled, the FF-A driver must be initialized > > > > > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > > > > > + * the FF-A version or obtain RX/TX buffer information, > > > > > + * which leads to failures in FF-A calls. > > > > > + */ > > > > > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > > > > > + !is_kvm_arm_initialised()) > > > > > + return -EPROBE_DEFER; > > > > > + > > > > > > > > That's still fundamentally wrong: pkvm is not ready until > > > > finalize_pkvm() has finished, and that's not indicated by > > > > is_kvm_arm_initialised(). > > > > > > Thanks. I miss the TSC bit set in here. > > > > That's the least of the problems. None of the infrastructure is in > > place at this stage... > > > > > IMHO, I'd like to make an new state check function -- > > > is_pkvm_arm_initialised() so that ff-a driver to know whether > > > pkvm is initialised. > > > > Doesn't sound great, TBH. > > > > > or any other suggestion? > > > > Instead of adding more esoteric predicates, I'd rather you build on an > > existing infrastructure. You have a dependency on KVM, use something > > that is designed to enforce dependencies. Device links spring to mind > > as something designed for that. > > > > Can you look into enabling this for KVM? If that's possible, then it > > should be easy enough to delay the actual KVM registration after pKVM > > is finalised. > > or what about some event notifier? Just like: This seems a bit over-engineered to me. Why don't you just split the FF-A initialisation into two steps: an early part which does the version negotiation and then a later part which can fit in with whatever dependencies you have on the TPM? Will ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 8:55 ` Will Deacon @ 2026-04-20 9:25 ` Yeoreum Yun 2026-04-20 10:42 ` Will Deacon 0 siblings, 1 reply; 24+ messages in thread From: Yeoreum Yun @ 2026-04-20 9:25 UTC (permalink / raw) To: Will Deacon Cc: Marc Zyngier, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas Hi Will, > On Sun, Apr 19, 2026 at 12:12:44PM +0100, Yeoreum Yun wrote: > > Hi Marc, > > > > > On Sat, 18 Apr 2026 11:34:30 +0100, > > > Yeoreum Yun <yeoreum.yun@arm.com> wrote: > > > > > > > > > > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > > > > > > u32 buf_sz; > > > > > > size_t rxtx_bufsz = SZ_4K; > > > > > > > > > > > > + /* > > > > > > + * When pKVM is enabled, the FF-A driver must be initialized > > > > > > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > > > > > > + * the FF-A version or obtain RX/TX buffer information, > > > > > > + * which leads to failures in FF-A calls. > > > > > > + */ > > > > > > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > > > > > > + !is_kvm_arm_initialised()) > > > > > > + return -EPROBE_DEFER; > > > > > > + > > > > > > > > > > That's still fundamentally wrong: pkvm is not ready until > > > > > finalize_pkvm() has finished, and that's not indicated by > > > > > is_kvm_arm_initialised(). > > > > > > > > Thanks. I miss the TSC bit set in here. > > > > > > That's the least of the problems. None of the infrastructure is in > > > place at this stage... > > > > > > > IMHO, I'd like to make an new state check function -- > > > > is_pkvm_arm_initialised() so that ff-a driver to know whether > > > > pkvm is initialised. > > > > > > Doesn't sound great, TBH. > > > > > > > or any other suggestion? > > > > > > Instead of adding more esoteric predicates, I'd rather you build on an > > > existing infrastructure. You have a dependency on KVM, use something > > > that is designed to enforce dependencies. Device links spring to mind > > > as something designed for that. > > > > > > Can you look into enabling this for KVM? If that's possible, then it > > > should be easy enough to delay the actual KVM registration after pKVM > > > is finalised. > > > > or what about some event notifier? Just like: > > This seems a bit over-engineered to me. Why don't you just split the > FF-A initialisation into two steps: an early part which does the version > negotiation and then a later part which can fit in with whatever > dependencies you have on the TPM? Sorry, I may have misunderstood your suggestion and I might be in missing your point. But, The issue here is that FFA_VERSION, FFA_RXTX_MAP, and FFA_PARTITION_INFO_GET, which are invoked from ffa_init() as part of early initialisation, must be trapped by pKVM. In other words, even the early part of the initialization, including version negotiation, needs to happen after pKVM is initialized. Because of this dependency, simply splitting the FF-A initialization into two phases within the driver does not seem sufficient, as it still requires knowing when pKVM has been initialized. Am I missing something? -- Sincerely, Yeoreum Yun ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 9:25 ` Yeoreum Yun @ 2026-04-20 10:42 ` Will Deacon 2026-04-20 10:56 ` Yeoreum Yun 0 siblings, 1 reply; 24+ messages in thread From: Will Deacon @ 2026-04-20 10:42 UTC (permalink / raw) To: Yeoreum Yun Cc: Marc Zyngier, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, sebastianene [+Seb for the pKVM FFA bits] On Mon, Apr 20, 2026 at 10:25:29AM +0100, Yeoreum Yun wrote: > > On Sun, Apr 19, 2026 at 12:12:44PM +0100, Yeoreum Yun wrote: > > > > On Sat, 18 Apr 2026 11:34:30 +0100, > > > > Yeoreum Yun <yeoreum.yun@arm.com> wrote: > > > > > > > > > > > > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > > > > > > > u32 buf_sz; > > > > > > > size_t rxtx_bufsz = SZ_4K; > > > > > > > > > > > > > > + /* > > > > > > > + * When pKVM is enabled, the FF-A driver must be initialized > > > > > > > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > > > > > > > + * the FF-A version or obtain RX/TX buffer information, > > > > > > > + * which leads to failures in FF-A calls. > > > > > > > + */ > > > > > > > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > > > > > > > + !is_kvm_arm_initialised()) > > > > > > > + return -EPROBE_DEFER; > > > > > > > + > > > > > > > > > > > > That's still fundamentally wrong: pkvm is not ready until > > > > > > finalize_pkvm() has finished, and that's not indicated by > > > > > > is_kvm_arm_initialised(). > > > > > > > > > > Thanks. I miss the TSC bit set in here. > > > > > > > > That's the least of the problems. None of the infrastructure is in > > > > place at this stage... > > > > > > > > > IMHO, I'd like to make an new state check function -- > > > > > is_pkvm_arm_initialised() so that ff-a driver to know whether > > > > > pkvm is initialised. > > > > > > > > Doesn't sound great, TBH. > > > > > > > > > or any other suggestion? > > > > > > > > Instead of adding more esoteric predicates, I'd rather you build on an > > > > existing infrastructure. You have a dependency on KVM, use something > > > > that is designed to enforce dependencies. Device links spring to mind > > > > as something designed for that. > > > > > > > > Can you look into enabling this for KVM? If that's possible, then it > > > > should be easy enough to delay the actual KVM registration after pKVM > > > > is finalised. > > > > > > or what about some event notifier? Just like: > > > > This seems a bit over-engineered to me. Why don't you just split the > > FF-A initialisation into two steps: an early part which does the version > > negotiation and then a later part which can fit in with whatever > > dependencies you have on the TPM? > > Sorry, I may have misunderstood your suggestion and > I might be in missing your point. > > But, The issue here is that FFA_VERSION, FFA_RXTX_MAP, and > FFA_PARTITION_INFO_GET, which are invoked from ffa_init() > as part of early initialisation, must be trapped by pKVM. > > In other words, even the early part of the initialization, > including version negotiation, needs to happen after pKVM > is initialized. > > Because of this dependency, simply splitting the FF-A > initialization into two phases within the driver does not > seem sufficient, as it still requires knowing when pKVM > has been initialized. > > Am I missing something? Ah sorry, I mixed up the ordering of 'module_init' vs 'rootfs_initcall' and thought you wanted to probe the version earlier. But then I'm still confused because, prior to 0e0546eabcd6 ("firmware: arm_ffa: Change initcall level of ffa_init() to rootfs_initcall"), ffa_init() was a 'device_initcall' which is still called earlier than finalize_pkvm(). Will ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 10:42 ` Will Deacon @ 2026-04-20 10:56 ` Yeoreum Yun 2026-04-20 15:47 ` Sudeep Holla 0 siblings, 1 reply; 24+ messages in thread From: Yeoreum Yun @ 2026-04-20 10:56 UTC (permalink / raw) To: Will Deacon Cc: Marc Zyngier, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, sebastianene Hi Will, > [+Seb for the pKVM FFA bits] > > On Mon, Apr 20, 2026 at 10:25:29AM +0100, Yeoreum Yun wrote: > > > On Sun, Apr 19, 2026 at 12:12:44PM +0100, Yeoreum Yun wrote: > > > > > On Sat, 18 Apr 2026 11:34:30 +0100, > > > > > Yeoreum Yun <yeoreum.yun@arm.com> wrote: > > > > > > > > > > > > > > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > > > > > > > > u32 buf_sz; > > > > > > > > size_t rxtx_bufsz = SZ_4K; > > > > > > > > > > > > > > > > + /* > > > > > > > > + * When pKVM is enabled, the FF-A driver must be initialized > > > > > > > > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > > > > > > > > + * the FF-A version or obtain RX/TX buffer information, > > > > > > > > + * which leads to failures in FF-A calls. > > > > > > > > + */ > > > > > > > > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > > > > > > > > + !is_kvm_arm_initialised()) > > > > > > > > + return -EPROBE_DEFER; > > > > > > > > + > > > > > > > > > > > > > > That's still fundamentally wrong: pkvm is not ready until > > > > > > > finalize_pkvm() has finished, and that's not indicated by > > > > > > > is_kvm_arm_initialised(). > > > > > > > > > > > > Thanks. I miss the TSC bit set in here. > > > > > > > > > > That's the least of the problems. None of the infrastructure is in > > > > > place at this stage... > > > > > > > > > > > IMHO, I'd like to make an new state check function -- > > > > > > is_pkvm_arm_initialised() so that ff-a driver to know whether > > > > > > pkvm is initialised. > > > > > > > > > > Doesn't sound great, TBH. > > > > > > > > > > > or any other suggestion? > > > > > > > > > > Instead of adding more esoteric predicates, I'd rather you build on an > > > > > existing infrastructure. You have a dependency on KVM, use something > > > > > that is designed to enforce dependencies. Device links spring to mind > > > > > as something designed for that. > > > > > > > > > > Can you look into enabling this for KVM? If that's possible, then it > > > > > should be easy enough to delay the actual KVM registration after pKVM > > > > > is finalised. > > > > > > > > or what about some event notifier? Just like: > > > > > > This seems a bit over-engineered to me. Why don't you just split the > > > FF-A initialisation into two steps: an early part which does the version > > > negotiation and then a later part which can fit in with whatever > > > dependencies you have on the TPM? > > > > Sorry, I may have misunderstood your suggestion and > > I might be in missing your point. > > > > But, The issue here is that FFA_VERSION, FFA_RXTX_MAP, and > > FFA_PARTITION_INFO_GET, which are invoked from ffa_init() > > as part of early initialisation, must be trapped by pKVM. > > > > In other words, even the early part of the initialization, > > including version negotiation, needs to happen after pKVM > > is initialized. > > > > Because of this dependency, simply splitting the FF-A > > initialization into two phases within the driver does not > > seem sufficient, as it still requires knowing when pKVM > > has been initialized. > > > > Am I missing something? > > Ah sorry, I mixed up the ordering of 'module_init' vs 'rootfs_initcall' > and thought you wanted to probe the version earlier. But then I'm still > confused because, prior to 0e0546eabcd6 ("firmware: arm_ffa: Change > initcall level of ffa_init() to rootfs_initcall"), ffa_init() was a > 'device_initcall' which is still called earlier than finalize_pkvm(). Right, and this is what I missed when writing patch 0e0546eabcd6 ("firmware: arm_ffa: Change initcall level of ffa_init() to rootfs_initcall"). and it still exists even if it's device call. However, rather than changing ffa_init to rootfs_initcall, moving ima_init to late_initcall_sync is a better approach, as it also addresses similar issues for TPM devices that do not use FF-A. For this reason, the FF-A-related changes were reverted. As a result, patch 4/4 addresses an issue that existed independently of 0e0546eabcd6, as you pointed out. -- Sincerely, Yeoreum Yun ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 10:56 ` Yeoreum Yun @ 2026-04-20 15:47 ` Sudeep Holla 2026-04-20 17:04 ` Yeoreum Yun 0 siblings, 1 reply; 24+ messages in thread From: Sudeep Holla @ 2026-04-20 15:47 UTC (permalink / raw) To: Yeoreum Yun Cc: Will Deacon, Marc Zyngier, linux-security-module, linux-kernel, Sudeep Holla, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, sebastianene On Mon, Apr 20, 2026 at 11:56:58AM +0100, Yeoreum Yun wrote: > Hi Will, > > > [+Seb for the pKVM FFA bits] > > > > Ah sorry, I mixed up the ordering of 'module_init' vs 'rootfs_initcall' > > and thought you wanted to probe the version earlier. But then I'm still > > confused because, prior to 0e0546eabcd6 ("firmware: arm_ffa: Change > > initcall level of ffa_init() to rootfs_initcall"), ffa_init() was a > > 'device_initcall' which is still called earlier than finalize_pkvm(). > > Right, and this is what I missed when writing patch > 0e0546eabcd6 ("firmware: arm_ffa: Change initcall level of ffa_init() to rootfs_initcall"). > and it still exists even if it's device call. > > However, rather than changing ffa_init to rootfs_initcall, moving ima_init > to late_initcall_sync is a better approach, as it also addresses similar > issues for TPM devices that do not use FF-A. For this reason, > the FF-A-related changes were reverted. > > As a result, patch 4/4 addresses an issue that existed independently of > 0e0546eabcd6, as you pointed out. > I was not fully convinced by commit 0e0546eabcd6 ("firmware: arm_ffa: Change initcall level of ffa_init() to rootfs_initcall"), and I had raised this concern at the time. However, in the absence of a better alternative, we proceeded with merging it. My concern remains essentially the same. That change moved the initcall one stage earlier, and now, by introducing `late_initcall_sync()`, we are effectively shifting the dependency issue one stage later instead of resolving it in a more fundamental way. From my perspective, this still relies on adjusting initcall ordering as the primary means of making the dependency work. I do not think that is a robust or sustainable approach. Tweaking initcall levels tends to be inherently fragile because it addresses the symptom through sequencing rather than establishing a clear and explicit dependency model. I also recall that `finalise_pkvm()` is itself at `device_initcall` level. If that is correct, would this not introduce another ordering issue or at least leave us exposed to similar dependency problems? That is exactly why I remain uneasy about solving this by continuing to move initcalls backward or forward. More broadly, the fact that we are revisiting the same class of issue again after such a short time reinforces my concern that this direction is not sufficiently stable. We may revisit it soon after we merge this approach. -- Regards, Sudeep ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 15:47 ` Sudeep Holla @ 2026-04-20 17:04 ` Yeoreum Yun 0 siblings, 0 replies; 24+ messages in thread From: Yeoreum Yun @ 2026-04-20 17:04 UTC (permalink / raw) To: Sudeep Holla Cc: Will Deacon, Marc Zyngier, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, sebastianene > On Mon, Apr 20, 2026 at 11:56:58AM +0100, Yeoreum Yun wrote: > > Hi Will, > > > > > [+Seb for the pKVM FFA bits] > > > > > > Ah sorry, I mixed up the ordering of 'module_init' vs 'rootfs_initcall' > > > and thought you wanted to probe the version earlier. But then I'm still > > > confused because, prior to 0e0546eabcd6 ("firmware: arm_ffa: Change > > > initcall level of ffa_init() to rootfs_initcall"), ffa_init() was a > > > 'device_initcall' which is still called earlier than finalize_pkvm(). > > > > Right, and this is what I missed when writing patch > > 0e0546eabcd6 ("firmware: arm_ffa: Change initcall level of ffa_init() to rootfs_initcall"). > > and it still exists even if it's device call. > > > > However, rather than changing ffa_init to rootfs_initcall, moving ima_init > > to late_initcall_sync is a better approach, as it also addresses similar > > issues for TPM devices that do not use FF-A. For this reason, > > the FF-A-related changes were reverted. > > > > As a result, patch 4/4 addresses an issue that existed independently of > > 0e0546eabcd6, as you pointed out. > > > > I was not fully convinced by commit 0e0546eabcd6 ("firmware: arm_ffa: Change > initcall level of ffa_init() to rootfs_initcall"), and I had raised this > concern at the time. However, in the absence of a better alternative, we > proceeded with merging it. > > My concern remains essentially the same. That change moved the initcall one > stage earlier, and now, by introducing `late_initcall_sync()`, we are > effectively shifting the dependency issue one stage later instead of resolving > it in a more fundamental way. From my perspective, this still relies on > adjusting initcall ordering as the primary means of making the dependency > work. > > I do not think that is a robust or sustainable approach. Tweaking initcall > levels tends to be inherently fragile because it addresses the symptom through > sequencing rather than establishing a clear and explicit dependency model. > > I also recall that `finalise_pkvm()` is itself at `device_initcall` level. If > that is correct, would this not introduce another ordering issue or at least > leave us exposed to similar dependency problems? That is exactly why I remain > uneasy about solving this by continuing to move initcalls backward or forward. > > More broadly, the fact that we are revisiting the same class of issue again > after such a short time reinforces my concern that this direction is not > sufficiently stable. We may revisit it soon after we merge this approach. I understand your concern about relying on initcall ordering. However, I think there is an important difference in scope in this case. This change primarily affects the IMA subsystem, and the impact is largely confined to IMA (at least based on my current understanding). Also, this is not just about FF-A. The issue arises when TPM devices are deferred, and IMA does not handle such cases properly. From that perspective, moving ima_init() to a later stage is not simply about adjusting ordering, but about ensuring that IMA correctly handles its dependency on TPM devices. In other words, the goal here is not to align dependencies indirectly via initcall levels, but to ensure that IMA is initialized only after its required dependencies are ready. Regarding pKVM, finalise_pkvm() runs at the device_initcall_sync level. Because of this, the FF-A driver needs a reliable way to determine when pKVM initialization has completed, rather than relying purely on initcall ordering. -- Sincerely, Yeoreum Yun ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-17 17:57 ` [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver Yeoreum Yun 2026-04-18 9:24 ` Marc Zyngier @ 2026-04-20 12:32 ` Sebastian Ene 2026-04-20 12:46 ` Marc Zyngier 2026-04-20 13:00 ` Yeoreum Yun 1 sibling, 2 replies; 24+ messages in thread From: Sebastian Ene @ 2026-04-20 12:32 UTC (permalink / raw) To: Yeoreum Yun Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Fri, Apr 17, 2026 at 06:57:59PM +0100, Yeoreum Yun wrote: Hello Yeoreum, > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > Otherwise, pKVM cannot negotiate the FF-A version or > obtain RX/TX buffer information, leading to failures in FF-A calls. At the moment this already happens after you move back ffa_init() to device_initcall(). > > During FF-A driver initialization, check whether pKVM has been initialized. > If not, defer probing of the FF-A driver. > I don't think you need to add this dependency. pKVM is installed through KVM's module_init() which ends up calling hyp_ffa_init() to do the proxy initialization. The ARM-FFA driver comes after it (since pKVM is arch specific code). We don't have to call finalize_pkvm(..) to be able to handle smc(FF-A) calls in the hyp-proxy. > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > --- > arch/arm64/kvm/arm.c | 1 + > drivers/firmware/arm_ffa/driver.c | 12 ++++++++++++ > 2 files changed, 13 insertions(+) > > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c > index 410ffd41fd73..0f517b1c05cd 100644 > --- a/arch/arm64/kvm/arm.c > +++ b/arch/arm64/kvm/arm.c > @@ -119,6 +119,7 @@ bool is_kvm_arm_initialised(void) > { > return kvm_arm_initialised; > } > +EXPORT_SYMBOL(is_kvm_arm_initialised); > > int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) > { > diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c > index 02c76ac1570b..2647d6554afd 100644 > --- a/drivers/firmware/arm_ffa/driver.c > +++ b/drivers/firmware/arm_ffa/driver.c > @@ -42,6 +42,8 @@ > #include <linux/uuid.h> > #include <linux/xarray.h> > > +#include <asm/virt.h> > + > #include "common.h" > > #define FFA_DRIVER_VERSION FFA_VERSION_1_2 > @@ -2035,6 +2037,16 @@ static int __init ffa_init(void) > u32 buf_sz; > size_t rxtx_bufsz = SZ_4K; > > + /* > + * When pKVM is enabled, the FF-A driver must be initialized > + * after pKVM initialization. Otherwise, pKVM cannot negotiate > + * the FF-A version or obtain RX/TX buffer information, > + * which leads to failures in FF-A calls. > + */ > + if (IS_ENABLED(CONFIG_KVM) && is_protected_kvm_enabled() && > + !is_kvm_arm_initialised()) > + return -EPROBE_DEFER; > + > ret = ffa_transport_init(&invoke_ffa_fn); > if (ret) > return ret; > -- > LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} > Thanks, Sebastian ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 12:32 ` Sebastian Ene @ 2026-04-20 12:46 ` Marc Zyngier 2026-04-20 14:20 ` Sebastian Ene 2026-04-20 13:00 ` Yeoreum Yun 1 sibling, 1 reply; 24+ messages in thread From: Marc Zyngier @ 2026-04-20 12:46 UTC (permalink / raw) To: Sebastian Ene Cc: Yeoreum Yun, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Mon, 20 Apr 2026 13:32:32 +0100, Sebastian Ene <sebastianene@google.com> wrote: > > On Fri, Apr 17, 2026 at 06:57:59PM +0100, Yeoreum Yun wrote: > > Hello Yeoreum, > > > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > > Otherwise, pKVM cannot negotiate the FF-A version or > > obtain RX/TX buffer information, leading to failures in FF-A calls. > > At the moment this already happens after you move back ffa_init() to > device_initcall(). But relying on this sort of ordering is just making things more fragile. > > > > > During FF-A driver initialization, check whether pKVM has been initialized. > > If not, defer probing of the FF-A driver. > > > > I don't think you need to add this dependency. pKVM is > installed through KVM's module_init() which ends up calling hyp_ffa_init() to > do the proxy initialization. The ARM-FFA driver comes after it (since > pKVM is arch specific code). We don't have to call finalize_pkvm(..) to > be able to handle smc(FF-A) calls in the hyp-proxy. You do. Without the finalisation, SMCs are not trapped by EL2. And even if it did, relying on such hack is just wrong. M. -- Without deviation from the norm, progress is not possible. ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 12:46 ` Marc Zyngier @ 2026-04-20 14:20 ` Sebastian Ene 2026-04-20 15:04 ` Yeoreum Yun 2026-04-20 16:50 ` Sudeep Holla 0 siblings, 2 replies; 24+ messages in thread From: Sebastian Ene @ 2026-04-20 14:20 UTC (permalink / raw) To: Marc Zyngier Cc: Yeoreum Yun, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Mon, Apr 20, 2026 at 01:46:47PM +0100, Marc Zyngier wrote: > On Mon, 20 Apr 2026 13:32:32 +0100, > Sebastian Ene <sebastianene@google.com> wrote: > > > > On Fri, Apr 17, 2026 at 06:57:59PM +0100, Yeoreum Yun wrote: > > > > Hello Yeoreum, > > > > > > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > > > Otherwise, pKVM cannot negotiate the FF-A version or > > > obtain RX/TX buffer information, leading to failures in FF-A calls. > > > > At the moment this already happens after you move back ffa_init() to > > device_initcall(). > > But relying on this sort of ordering is just making things more > fragile. > Thanks for letting me know. Since this is not a solid construct we will have to change the driver init code to come after pKVM in this case. > > > > > > > > During FF-A driver initialization, check whether pKVM has been initialized. > > > If not, defer probing of the FF-A driver. > > > > > > > I don't think you need to add this dependency. pKVM is > > installed through KVM's module_init() which ends up calling hyp_ffa_init() to > > do the proxy initialization. The ARM-FFA driver comes after it (since > > pKVM is arch specific code). We don't have to call finalize_pkvm(..) to > > be able to handle smc(FF-A) calls in the hyp-proxy. > > You do. Without the finalisation, SMCs are not trapped by EL2. > > And even if it did, relying on such hack is just wrong. > That makes it an even stronger argument to move the driver init at a later stage. I was relying on this to trap early ff-a when the ARM FF-A driver was used. > M. > > -- > Without deviation from the norm, progress is not possible. Thanks, Sebastian ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 14:20 ` Sebastian Ene @ 2026-04-20 15:04 ` Yeoreum Yun 2026-04-20 16:50 ` Sudeep Holla 1 sibling, 0 replies; 24+ messages in thread From: Yeoreum Yun @ 2026-04-20 15:04 UTC (permalink / raw) To: Sebastian Ene Cc: Marc Zyngier, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Mon, Apr 20, 2026 at 02:20:35PM +0000, Sebastian Ene wrote: > On Mon, Apr 20, 2026 at 01:46:47PM +0100, Marc Zyngier wrote: > > On Mon, 20 Apr 2026 13:32:32 +0100, > > Sebastian Ene <sebastianene@google.com> wrote: > > > > > > On Fri, Apr 17, 2026 at 06:57:59PM +0100, Yeoreum Yun wrote: > > > > > > Hello Yeoreum, > > > > > > > > > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > > > > Otherwise, pKVM cannot negotiate the FF-A version or > > > > obtain RX/TX buffer information, leading to failures in FF-A calls. > > > > > > At the moment this already happens after you move back ffa_init() to > > > device_initcall(). > > > > But relying on this sort of ordering is just making things more > > fragile. > > > > Thanks for letting me know. Since this is not a solid construct we will have > to change the driver init code to come after pKVM in this case. > > > > > > > > > > > > During FF-A driver initialization, check whether pKVM has been initialized. > > > > If not, defer probing of the FF-A driver. > > > > > > > > > > I don't think you need to add this dependency. pKVM is > > > installed through KVM's module_init() which ends up calling hyp_ffa_init() to > > > do the proxy initialization. The ARM-FFA driver comes after it (since > > > pKVM is arch specific code). We don't have to call finalize_pkvm(..) to > > > be able to handle smc(FF-A) calls in the hyp-proxy. > > > > You do. Without the finalisation, SMCs are not trapped by EL2. > > > > And even if it did, relying on such hack is just wrong. > > > > That makes it an even stronger argument to move the driver init at a > later stage. I was relying on this to trap early ff-a when the > ARM FF-A driver was used. I don’t think moving the FF-A driver initialization to a later stage is a viable solution. For example, even if it is moved to device_initcall_sync, it still relies on fragile ordering. Similarly, moving it to late_initcall is problematic. Since deferred_probe_initcall() runs at the same level, if it is invoked first, devices that depend on FF-A (e.g. tpm_ffa_crb) may not be probed correctly, leading to deferred devices not being handled properly. Therefore, the FF-A driver should be able to detect when pKVM has been initialized and perform its initialization accordingly otherwise, just relying on the trap after kvm_arm_initialised. -- Sincerely, Yeoreum Yun ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 14:20 ` Sebastian Ene 2026-04-20 15:04 ` Yeoreum Yun @ 2026-04-20 16:50 ` Sudeep Holla 1 sibling, 0 replies; 24+ messages in thread From: Sudeep Holla @ 2026-04-20 16:50 UTC (permalink / raw) To: Sebastian Ene, Yeoreum Yun Cc: Marc Zyngier, Sudeep Holla, linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Mon, Apr 20, 2026 at 02:20:35PM +0000, Sebastian Ene wrote: > On Mon, Apr 20, 2026 at 01:46:47PM +0100, Marc Zyngier wrote: > > On Mon, 20 Apr 2026 13:32:32 +0100, > > Sebastian Ene <sebastianene@google.com> wrote: > > > > > > On Fri, Apr 17, 2026 at 06:57:59PM +0100, Yeoreum Yun wrote: > > > > > > Hello Yeoreum, > > > > > > > > > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > > > > Otherwise, pKVM cannot negotiate the FF-A version or > > > > obtain RX/TX buffer information, leading to failures in FF-A calls. > > > > > > At the moment this already happens after you move back ffa_init() to > > > device_initcall(). > > > > But relying on this sort of ordering is just making things more > > fragile. > > > > Thanks for letting me know. Since this is not a solid construct we will have > to change the driver init code to come after pKVM in this case. > > > > > > > > > > > > During FF-A driver initialization, check whether pKVM has been initialized. > > > > If not, defer probing of the FF-A driver. > > > > > > > > > > I don't think you need to add this dependency. pKVM is > > > installed through KVM's module_init() which ends up calling hyp_ffa_init() to > > > do the proxy initialization. The ARM-FFA driver comes after it (since > > > pKVM is arch specific code). We don't have to call finalize_pkvm(..) to > > > be able to handle smc(FF-A) calls in the hyp-proxy. > > > > You do. Without the finalisation, SMCs are not trapped by EL2. > > > > And even if it did, relying on such hack is just wrong. > > > > That makes it an even stronger argument to move the driver init at a > later stage. I was relying on this to trap early ff-a when the > ARM FF-A driver was used. > Indeed, if both are at `device_initcall` level, then correct behaviour is effectively left to link order. That makes the outcome depend on build-time ordering rather than on an explicit and well-defined dependency, which is quite fragile and difficult to justify as a reliable fix. That is precisely the kind of arrangement I am worried about here. Even if it happens to work today, it is not guaranteed in any robust sense and can easily break as the code evolves or as unrelated changes affect the link order. In other words, it may appear functional, but it still lacks a proper dependency model and remains vulnerable to subtle regressions. -- Regards, Sudeep ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 12:32 ` Sebastian Ene 2026-04-20 12:46 ` Marc Zyngier @ 2026-04-20 13:00 ` Yeoreum Yun 2026-04-20 14:05 ` Sebastian Ene 1 sibling, 1 reply; 24+ messages in thread From: Yeoreum Yun @ 2026-04-20 13:00 UTC (permalink / raw) To: Sebastian Ene Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will Hi Sebastian, > On Fri, Apr 17, 2026 at 06:57:59PM +0100, Yeoreum Yun wrote: > > Hello Yeoreum, > > > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > > Otherwise, pKVM cannot negotiate the FF-A version or > > obtain RX/TX buffer information, leading to failures in FF-A calls. > > At the moment this already happens after you move back ffa_init() to > device_initcall(). How? the kvm_arm_init() is device_initcall() if both built as built-in. > > > > > During FF-A driver initialization, check whether pKVM has been initialized. > > If not, defer probing of the FF-A driver. > > > > I don't think you need to add this dependency. pKVM is > installed through KVM's module_init() which ends up calling hyp_ffa_init() to > do the proxy initialization. The ARM-FFA driver comes after it (since > pKVM is arch specific code). We don't have to call finalize_pkvm(..) to > be able to handle smc(FF-A) calls in the hyp-proxy. > As Marc said, the before finalised_pkvm(), smc wouldn't be trapped to pKVM. IOW, in case when both built as built-in, if ffa_init() is called before finalised_pkvm(), it couldn't proxy the FFA_VERSION, FFA_RXTX_MAP and FFA_PARTITION_INFO_GET called by ffa_init(). How can you gurantee hyp_ffa_init() which is called by kvm_arm_init() comes first even kvm_arm_init() and ffa_init() are on device_initcall? [...] Thanks -- Sincerely, Yeoreum Yun ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 13:00 ` Yeoreum Yun @ 2026-04-20 14:05 ` Sebastian Ene 2026-04-20 14:47 ` Yeoreum Yun 0 siblings, 1 reply; 24+ messages in thread From: Sebastian Ene @ 2026-04-20 14:05 UTC (permalink / raw) To: Yeoreum Yun Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will On Mon, Apr 20, 2026 at 02:00:57PM +0100, Yeoreum Yun wrote: Hi, > > Hi Sebastian, > > On Fri, Apr 17, 2026 at 06:57:59PM +0100, Yeoreum Yun wrote: > > > > Hello Yeoreum, > > > > > > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > > > Otherwise, pKVM cannot negotiate the FF-A version or > > > obtain RX/TX buffer information, leading to failures in FF-A calls. > > > > At the moment this already happens after you move back ffa_init() to > > device_initcall(). > > How? the kvm_arm_init() is device_initcall() if both built as built-in. > > > > > > > > > During FF-A driver initialization, check whether pKVM has been initialized. > > > If not, defer probing of the FF-A driver. > > > > > > > I don't think you need to add this dependency. pKVM is > > installed through KVM's module_init() which ends up calling hyp_ffa_init() to > > do the proxy initialization. The ARM-FFA driver comes after it (since > > pKVM is arch specific code). We don't have to call finalize_pkvm(..) to > > be able to handle smc(FF-A) calls in the hyp-proxy. > > > > As Marc said, the before finalised_pkvm(), smc wouldn't be trapped > to pKVM. IOW, in case when both built as built-in, They are, I tested before replying to this thread. The HCR_EL2 is 0x480080000 so HCR_EL2 TSC bit is set so SMC/FF-A and trapping is enabled. In __pkvm_prot_finalize it sets the HCR_VM bit which enables stage-2 and then write the HCR_EL2 from params->hcr_el2. However I wasn't sure that this is seen as a 'hack' and not expected to work. > if ffa_init() is called before finalised_pkvm(), > it couldn't proxy the FFA_VERSION, FFA_RXTX_MAP and FFA_PARTITION_INFO_GET > called by ffa_init(). > > How can you gurantee hyp_ffa_init() which is called by kvm_arm_init() > comes first even kvm_arm_init() and ffa_init() are on device_initcall? > While they are both on device_initcall, the only difference is that kvm_arm_init is arch code which appears before the driver/ code in the linker. That's why Marc said it is not a solid construct to rely on this. Thanks, Sebastian > [...] > > Thanks > > > -- > Sincerely, > Yeoreum Yun ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver 2026-04-20 14:05 ` Sebastian Ene @ 2026-04-20 14:47 ` Yeoreum Yun 0 siblings, 0 replies; 24+ messages in thread From: Yeoreum Yun @ 2026-04-20 14:47 UTC (permalink / raw) To: Sebastian Ene Cc: linux-security-module, linux-kernel, linux-integrity, linux-arm-kernel, kvmarm, paul, jmorris, serge, zohar, roberto.sassu, dmitry.kasatkin, eric.snowberg, peterhuewe, jarkko, jgg, sudeep.holla, maz, oupton, joey.gouly, suzuki.poulose, yuzenghui, catalin.marinas, will Hi Sebastian, > On Mon, Apr 20, 2026 at 02:00:57PM +0100, Yeoreum Yun wrote: > > Hi, > > > > > Hi Sebastian, > > > On Fri, Apr 17, 2026 at 06:57:59PM +0100, Yeoreum Yun wrote: > > > > > > Hello Yeoreum, > > > > > > > > > > When pKVM is enabled, the FF-A driver must be initialized after pKVM. > > > > Otherwise, pKVM cannot negotiate the FF-A version or > > > > obtain RX/TX buffer information, leading to failures in FF-A calls. > > > > > > At the moment this already happens after you move back ffa_init() to > > > device_initcall(). > > > > How? the kvm_arm_init() is device_initcall() if both built as built-in. > > > > > > > > > > > > > During FF-A driver initialization, check whether pKVM has been initialized. > > > > If not, defer probing of the FF-A driver. > > > > > > > > > > I don't think you need to add this dependency. pKVM is > > > installed through KVM's module_init() which ends up calling hyp_ffa_init() to > > > do the proxy initialization. The ARM-FFA driver comes after it (since > > > pKVM is arch specific code). We don't have to call finalize_pkvm(..) to > > > be able to handle smc(FF-A) calls in the hyp-proxy. > > > > > > > As Marc said, the before finalised_pkvm(), smc wouldn't be trapped > > to pKVM. IOW, in case when both built as built-in, > > They are, I tested before replying to this thread. The HCR_EL2 is > 0x480080000 so HCR_EL2 TSC bit is set so SMC/FF-A and trapping is enabled. Oh. I've missed cpu_init_hyp_mode() sets up HCR_EL2. So you're right. Thanks to correct me ;) > > In __pkvm_prot_finalize it sets the HCR_VM bit which enables stage-2 and > then write the HCR_EL2 from params->hcr_el2. However I wasn't sure that > this is seen as a 'hack' and not expected to work. > > > if ffa_init() is called before finalised_pkvm(), > > it couldn't proxy the FFA_VERSION, FFA_RXTX_MAP and FFA_PARTITION_INFO_GET > > called by ffa_init(). > > > > How can you gurantee hyp_ffa_init() which is called by kvm_arm_init() > > comes first even kvm_arm_init() and ffa_init() are on device_initcall? > > > > While they are both on device_initcall, the only difference is that > kvm_arm_init is arch code which appears before the driver/ code in the > linker. That's why Marc said it is not a solid construct to rely on > this. Then I think the origin one -- just check kvm_arm_initialised is enough to check in ffa_driver. since I misunderstood TSC bit is setup after finalised_pkvm(). or Am I missing something? Thanks. -- Sincerely, Yeoreum Yun ^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2026-04-20 17:04 UTC | newest] Thread overview: 24+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-04-17 17:57 [RFC PATCH 0/4] fix FF-A call failed with pKVM when ff-a driver is built-in Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 1/4] security: ima: move ima_init into late_initcall_sync Yeoreum Yun 2026-04-20 10:32 ` Jonathan McDowell 2026-04-17 17:57 ` [RFC PATCH 2/4] tpm: tpm_crb_ffa: revert defered_probed when tpm_crb_ffa is built-in Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 3/4] firmware: arm_ffa: revert ffa_init() initcall level to device_initcall Yeoreum Yun 2026-04-17 17:57 ` [RFC PATCH 4/4] firmware: arm_ffa: check pkvm initailised when initailise ffa driver Yeoreum Yun 2026-04-18 9:24 ` Marc Zyngier 2026-04-18 10:34 ` Yeoreum Yun 2026-04-19 10:41 ` Marc Zyngier 2026-04-19 11:12 ` Yeoreum Yun 2026-04-20 8:55 ` Will Deacon 2026-04-20 9:25 ` Yeoreum Yun 2026-04-20 10:42 ` Will Deacon 2026-04-20 10:56 ` Yeoreum Yun 2026-04-20 15:47 ` Sudeep Holla 2026-04-20 17:04 ` Yeoreum Yun 2026-04-20 12:32 ` Sebastian Ene 2026-04-20 12:46 ` Marc Zyngier 2026-04-20 14:20 ` Sebastian Ene 2026-04-20 15:04 ` Yeoreum Yun 2026-04-20 16:50 ` Sudeep Holla 2026-04-20 13:00 ` Yeoreum Yun 2026-04-20 14:05 ` Sebastian Ene 2026-04-20 14:47 ` Yeoreum Yun
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox