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 <[email protected]> --- 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}

