From nobody Thu Oct 9 06:53:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46B2A28368B; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; cv=none; b=pkc/6tQGCjIHgDHSM5XhHG9un6idrFhj9J/9hr4y9OzSH4er/RUB55xxY//R2Hj2wbtDEJMdbEpmLTEAX4XMIWBjjePLC4J3EVgFKauCWSaDZ8i4I8nOQ0Ip1GQqlY8upmW1JhsO3EAGc8Mf34nWfKzMpYbucaq4+AURYmBnNEU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; c=relaxed/simple; bh=MRrvGml0U3t0XqSQRSoIEJmoyHlE+TFSPmmooSVffjM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FtdOsId3VvEpDuxN5r2oXiyChKt7Oycfp9nHwME6ARW6MO0estP7SJUYLRgaR6ogG1n3AJN8FYhRurcusl6V0OVrYd1sh6VDBsWMZNpqbU8wZ/ekoiN5AABdBTYrOQSIrPUIng6MBki7ERKIGp7G0sa53jjVU4CpgvKGi/mR0U0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k7vxbIJ4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="k7vxbIJ4" Received: by smtp.kernel.org (Postfix) with ESMTPS id 23D7DC4CEED; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1750323808; bh=MRrvGml0U3t0XqSQRSoIEJmoyHlE+TFSPmmooSVffjM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=k7vxbIJ4TYkmeqHSu7NLCO5x0f9uOP5g/B+hsHPD2VicHIN4hCu+9mFIfHwwVdtD3 S1AzYLk55a2oTmlCBFKk7DzbsS+20zlzhduKw6mfNDHIF85E9Hu64wpQtsC5Mr1aG7 GzqfU9AaCsEQsaOjC9wy8sW4OXkIMH1oKXKefLuqQ8sU1OO4ljdSPHf2uLl6NP0x4H 9nBBh5cJaJCfHwfhwu/SWN2qbOiQ1gZokwf4S9MtrQPIyjxYsJYxoO3OmJHAZ9HMID 2BYqbzxOah1Ho6z6UhRTvPTxh6r93qj5Q7xEmtOiTBS0xHrFprd4n/7nF/ypxMSKZn E9ZpUi7/Yh7eQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1516EC73C66; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) From: Per Larsen via B4 Relay Date: Thu, 19 Jun 2025 09:02:54 +0000 Subject: [PATCH v5 1/6] KVM: arm64: Correct return value on host version downgrade attempt Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250619-virtio-msg-ffa-v5-1-412c98558807@google.com> References: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> In-Reply-To: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Sudeep Holla Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, Per Larsen X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1750323807; l=1403; i=perlarsen@google.com; s=20250508; h=from:subject:message-id; bh=XSNMzgDeYfF9zx6xj7IDlykSvrb/Zm2zMMm5Su7+ZNY=; b=vlLo26EbZC8FlbIqebYBm1ZZsgH5/RuDe1guOfj7370nOJkDx7S6jtysbV6fKvz683m6mjMjB EC6NUJwWZxLDVoQlxmJK+NRSelxnFVBcoGKoIaMOO1R50OI4FW4YQ3f X-Developer-Key: i=perlarsen@google.com; a=ed25519; pk=jjc/Ta4VmrLRmMoahP6d1mBcKzvWU+nsmdtYe2oS2kQ= X-Endpoint-Received: by B4 Relay for perlarsen@google.com/20250508 with auth_id=402 X-Original-From: Per Larsen Reply-To: perlarsen@google.com From: Per Larsen Once the hypervisor negotiates the FF-A version with the host, it should remain locked-in. However, it is possible to load FF-A as a module first supporting version 1.1 and then 1.0. Without this patch, the FF-A 1.0 driver will use 1.0 data structures to make calls which the hypervisor will incorrectly interpret as 1.1 data structures. With this patch, negotiation will fail. This patch does not change existing functionality in the case where a FF-A 1.2 driver is loaded after a 1.1 driver; the 1.2 driver will need to use 1.1 in order to proceed. Acked-by: Will Deacon Signed-off-by: Per Larsen --- arch/arm64/kvm/hyp/nvhe/ffa.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 3369dd0c4009f84ad3cf9481c747bdc57a162370..2c199d40811efb5bfae199c4a67= d8ae3d9307357 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -712,7 +712,10 @@ static void do_ffa_version(struct arm_smccc_res *res, =20 hyp_spin_lock(&version_lock); if (has_version_negotiated) { - res->a0 =3D hyp_ffa_version; + if (FFA_MINOR_VERSION(ffa_req_version) < FFA_MINOR_VERSION(hyp_ffa_versi= on)) + res->a0 =3D FFA_RET_NOT_SUPPORTED; + else + res->a0 =3D hyp_ffa_version; goto unlock; } =20 --=20 2.50.0.rc2.701.gf1e915cc24-goog From nobody Thu Oct 9 06:53:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 54BD52836A2; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; cv=none; b=Z7QqR2Ruvg9BXEDV8W9TCTi/Iw6b6NjC1kutQHWKrMc47HQCeLEuiait2MyQNKtDhS86Q4XslDXsGEb/Mb2YglUrafQmUVakO1tjr1W9HaTHvofY/2SgqacPz49inPJ0Hma+2KsK/N3pGtvrikuHpJkyjBzhR7OiqYKffbXx34M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; c=relaxed/simple; bh=g7HbEMSGC7lValARRez43Mn+S/OKci/SL+Q0rQG8aK4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RTzYW6FSPNyJpD3Q8z0pokPaZtXaLZP6pkML3vk+3RabYjhFS/vbUlu0Gkn7cLgfo7ZEFnd3T86z7OCX3WzM/Zlfiwaxj3lYcBkYmpzgK7YfSfhqkh04BQDoO8DAs3t7mOHFLr/y9VxZQlFFCisAAbIJxKuEDgE5FDYa4NyOPR8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nuFbpL6R; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nuFbpL6R" Received: by smtp.kernel.org (Postfix) with ESMTPS id 2F467C4CEEF; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1750323808; bh=g7HbEMSGC7lValARRez43Mn+S/OKci/SL+Q0rQG8aK4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=nuFbpL6Rirc8bxX5o3c+T0kadHRpuu1p28lL3aYG6WxxTPOZAPEKim1Fxsmb4iCep H1MeLBDynHn+101dTIabq8K/cur45ragSvjKYn0Whg7kzXJDktjw+4xaIaN/k5vjxr syb9y8FkwHAlMHmiH9z+JpmdqZd9SF1T7DQ4/UtKuaqcRVK9ISYmOQz6OG7x9q/yMY tbbCJQ1VJdcJ2KTft004ofGAcCHaAUDht9JBuFh7nniYrn5CTMWVBP5HL4jEKD424J FCq5MToo99O5zviEqSwGzh8/AWst958dWxkN1T8M53k5zfSx3w9WEe1kkVcAKUOSCM 6wdpO2hqYPezg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 22F8AC7115B; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) From: Per Larsen via B4 Relay Date: Thu, 19 Jun 2025 09:02:55 +0000 Subject: [PATCH v5 2/6] KVM: arm64: Use SMCCC 1.2 in hyp_ffa_{init,post_init} Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250619-virtio-msg-ffa-v5-2-412c98558807@google.com> References: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> In-Reply-To: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Sudeep Holla Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, Per Larsen X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1750323807; l=3417; i=perlarsen@google.com; s=20250508; h=from:subject:message-id; bh=ITbJy+U88TKFuEMoRcW/LDBaFV7Te3dLSP/C39fWi6U=; b=a8Q66bWbjAHiQ8So3UnvJcSeMp19/fIenT+YRS/1O5zV5OnYaPiSu2af0Z4rlfF2M6oWkHJWh vTfvBA8/qEqDtKNd7cF0z5mfSYGrlPmEZDS9nSQBUlMO+JpUrfd9bew X-Developer-Key: i=perlarsen@google.com; a=ed25519; pk=jjc/Ta4VmrLRmMoahP6d1mBcKzvWU+nsmdtYe2oS2kQ= X-Endpoint-Received: by B4 Relay for perlarsen@google.com/20250508 with auth_id=402 X-Original-From: Per Larsen Reply-To: perlarsen@google.com From: Per Larsen FF-A is based on SMCCC 1.2. Move the FF-A initialization code to SMCCC 1.2 as it simplifies later changes in this patchset. Signed-off-by: Per Larsen --- arch/arm64/kvm/hyp/nvhe/Makefile | 1 + arch/arm64/kvm/hyp/nvhe/ffa.c | 37 +++++++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/Makefile b/arch/arm64/kvm/hyp/nvhe/Mak= efile index a76522d63c3e630795db5972a99abc3d24bc5e26..f859a8fb41a25effea1edd977be= f889423153399 100644 --- a/arch/arm64/kvm/hyp/nvhe/Makefile +++ b/arch/arm64/kvm/hyp/nvhe/Makefile @@ -27,6 +27,7 @@ hyp-obj-y :=3D timer-sr.o sysreg-sr.o debug-sr.o switch.o= tlb.o hyp-init.o host.o cache.o setup.o mm.o mem_protect.o sys_regs.o pkvm.o stacktrace.o ffa.o hyp-obj-y +=3D ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../en= try.o \ ../fpsimd.o ../hyp-entry.o ../exception.o ../pgtable.o +hyp-obj-y +=3D ../../../kernel/smccc-call.o hyp-obj-$(CONFIG_LIST_HARDENED) +=3D list_debug.o hyp-obj-y +=3D $(lib-objs) =20 diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 2c199d40811efb5bfae199c4a67d8ae3d9307357..51bbe8f9c94584e9001ee769cbf= d608d930ff723 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -666,21 +666,26 @@ static bool do_ffa_features(struct arm_smccc_res *res, static int hyp_ffa_post_init(void) { size_t min_rxtx_sz; - struct arm_smccc_res res; + struct arm_smccc_1_2_regs regs =3D { + .a0 =3D FFA_ID_GET, + }; =20 - arm_smccc_1_1_smc(FFA_ID_GET, 0, 0, 0, 0, 0, 0, 0, &res); - if (res.a0 !=3D FFA_SUCCESS) + arm_smccc_1_2_smc(®s, ®s); + if (regs.a0 !=3D FFA_SUCCESS) return -EOPNOTSUPP; =20 - if (res.a2 !=3D HOST_FFA_ID) + if (regs.a2 !=3D HOST_FFA_ID) return -EINVAL; =20 - arm_smccc_1_1_smc(FFA_FEATURES, FFA_FN64_RXTX_MAP, - 0, 0, 0, 0, 0, 0, &res); - if (res.a0 !=3D FFA_SUCCESS) + regs =3D (struct arm_smccc_1_2_regs){ + .a0 =3D FFA_FEATURES, + .a1 =3D FFA_FN64_RXTX_MAP, + }; + arm_smccc_1_2_smc(®s, ®s); + if (regs.a0 !=3D FFA_SUCCESS) return -EOPNOTSUPP; =20 - switch (res.a2) { + switch (regs.a2) { case FFA_FEAT_RXTX_MIN_SZ_4K: min_rxtx_sz =3D SZ_4K; break; @@ -863,14 +868,18 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *hos= t_ctxt, u32 func_id) =20 int hyp_ffa_init(void *pages) { - struct arm_smccc_res res; + struct arm_smccc_1_2_regs regs; void *tx, *rx; =20 if (kvm_host_psci_config.smccc_version < ARM_SMCCC_VERSION_1_2) return 0; =20 - arm_smccc_1_1_smc(FFA_VERSION, FFA_VERSION_1_1, 0, 0, 0, 0, 0, 0, &res); - if (res.a0 =3D=3D FFA_RET_NOT_SUPPORTED) + regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_VERSION, + .a1 =3D FFA_VERSION_1_1, + }; + arm_smccc_1_2_smc(®s, ®s); + if (regs.a0 =3D=3D FFA_RET_NOT_SUPPORTED) return 0; =20 /* @@ -886,11 +895,11 @@ int hyp_ffa_init(void *pages) * ABI return NOT_SUPPORTED rather than a version number, according to * DEN0077A v1.1 REL0 18.6.4. */ - if (FFA_MAJOR_VERSION(res.a0) !=3D 1) + if (FFA_MAJOR_VERSION(regs.a0) !=3D 1) return -EOPNOTSUPP; =20 - if (FFA_MINOR_VERSION(res.a0) < FFA_MINOR_VERSION(FFA_VERSION_1_1)) - hyp_ffa_version =3D res.a0; + if (FFA_MINOR_VERSION(regs.a0) < FFA_MINOR_VERSION(FFA_VERSION_1_1)) + hyp_ffa_version =3D regs.a0; else hyp_ffa_version =3D FFA_VERSION_1_1; =20 --=20 2.50.0.rc2.701.gf1e915cc24-goog From nobody Thu Oct 9 06:53:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6EDC283FCC; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; cv=none; b=CovHhYroEV3y/MTzH7pfpp2uM40NdA0X82/iwCI7AYErKGxD3S4MQ6pg2IWe6fAwrQ5iUdjydGfaxloJnW66nrJv47ns22ZZg4GugATGX/nsxBEf/WQfjFW+29SMUpKaBD06C2ZW+pG8hV46+qxOUr4MsaPra71zI9csGYRGRFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; c=relaxed/simple; bh=q5smj9dJ2ojmuDOu9e1R/kHO9Eyf1R9MXmqkoet8u6c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JPYa+bJb1dMeKRmcRzQ6O8IKPljTeEKW20HfV6I9YA93xwZr+VuVNMTeziH4wuDxgic7uZeZEV1mHzqB205mgVFLbCuG/o99UwvFMLY8cKZ37Z7WQ1eDbIHLoDjN/4bcq7WckjtajE/52bt1uwbrdBcCjDkQ8j+Q2jrCV0GeLDA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=n0CGeEYh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="n0CGeEYh" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3D387C4AF0B; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1750323808; bh=q5smj9dJ2ojmuDOu9e1R/kHO9Eyf1R9MXmqkoet8u6c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=n0CGeEYhJy3FroFWdav46mFc+LHhlv54PEktmb06lS4ry9T+RtCg+Wmy6l5WorsEs 5/Ac7iGCK60Q3hO328m7u4TQGTWj6avgaSy2SWojeav9buRG6YnacY4pkZbWI2bM59 m7Tpryzz2VG9Vk+EFxKIfur5BEavh2XopwGWSoTLb3xxU8iSkvA9UALNOIfKGMa/w/ Fq0glNaXTpwrTjHeKIvPj0GI4/OSgJzMwIPGUMzrpYecPRkMdLkZSl4N5qk6j/XCqw m0Y9Ztl+UD0E3WAGKhm0FT4QxnsBFoWNmmnsUzM8O1NIaAXCwRk8EfgTqBvvZ8gsFk mZJ3xzJhcpnAA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3200CC77B7A; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) From: Per Larsen via B4 Relay Date: Thu, 19 Jun 2025 09:02:56 +0000 Subject: [PATCH v5 3/6] KVM: arm64: Use SMCCC 1.2 in host FF-A handler Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250619-virtio-msg-ffa-v5-3-412c98558807@google.com> References: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> In-Reply-To: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Sudeep Holla Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, Per Larsen X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1750323807; l=19023; i=perlarsen@google.com; s=20250508; h=from:subject:message-id; bh=00kEKcyG22cmXQ8SuPQG3HoX0UoAL0AI9XTekw8ywlE=; b=IOtd+Bpx0yIbc6yH4khFTR2FF+R9eb7iyGg1Ojn4RamnCyEwJLwWx6sZApJfjkXWfm6yddjkV M4rBKRDPiF7AFxyeqQZmQFEEj2JkDUgFqOr87xnRtmgPK7wZW8n/dHA X-Developer-Key: i=perlarsen@google.com; a=ed25519; pk=jjc/Ta4VmrLRmMoahP6d1mBcKzvWU+nsmdtYe2oS2kQ= X-Endpoint-Received: by B4 Relay for perlarsen@google.com/20250508 with auth_id=402 X-Original-From: Per Larsen Reply-To: perlarsen@google.com From: Per Larsen SMCCC 1.1 and prior allows four registers to be sent back as a result of an FF-A interface. SMCCC 1.2 increases the number of results that can (and often must) be sent back to 8 and 16 for 32-bit and 64-bit SMC/HVCs respectively. FF-A 1.0 references SMCCC 1.2 (reference [4] on page xi) and FF-A 1.2 explicitly requires SMCCC 1.2 so it should be safe to use this version unconditionally. Moreover, it is simpler to implement FF-A features without having to worry about compatibility with SMCCC 1.1 and older. Add SMCCC 1.2 helper routines and use this version unconditionally. Signed-off-by: Per Larsen --- arch/arm64/kvm/hyp/nvhe/ffa.c | 297 ++++++++++++++++++++++++--------------= ---- 1 file changed, 173 insertions(+), 124 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 51bbe8f9c94584e9001ee769cbfd608d930ff723..23b75b9f0bcc62724f0d0d185ac= 2ed2526375da4 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -71,36 +71,55 @@ static u32 hyp_ffa_version; static bool has_version_negotiated; static hyp_spinlock_t version_lock; =20 -static void ffa_to_smccc_error(struct arm_smccc_res *res, u64 ffa_errno) +static void ffa_to_smccc_1_2_error(struct arm_smccc_1_2_regs *regs, u64 ff= a_errno) { - *res =3D (struct arm_smccc_res) { + *regs =3D (struct arm_smccc_1_2_regs) { .a0 =3D FFA_ERROR, .a2 =3D ffa_errno, }; } =20 -static void ffa_to_smccc_res_prop(struct arm_smccc_res *res, int ret, u64 = prop) +static void ffa_to_smccc_regs_prop(struct arm_smccc_1_2_regs *regs, int re= t, + u64 prop) { if (ret =3D=3D FFA_RET_SUCCESS) { - *res =3D (struct arm_smccc_res) { .a0 =3D FFA_SUCCESS, - .a2 =3D prop }; + *regs =3D (struct arm_smccc_1_2_regs) { .a0 =3D FFA_SUCCESS, + .a2 =3D prop }; } else { - ffa_to_smccc_error(res, ret); + ffa_to_smccc_1_2_error(regs, ret); } } =20 -static void ffa_to_smccc_res(struct arm_smccc_res *res, int ret) +static void ffa_to_smccc_regs(struct arm_smccc_1_2_regs *regs, int ret) { - ffa_to_smccc_res_prop(res, ret, 0); + ffa_to_smccc_regs_prop(regs, ret, 0); } =20 static void ffa_set_retval(struct kvm_cpu_context *ctxt, - struct arm_smccc_res *res) + struct arm_smccc_1_2_regs *regs) { - cpu_reg(ctxt, 0) =3D res->a0; - cpu_reg(ctxt, 1) =3D res->a1; - cpu_reg(ctxt, 2) =3D res->a2; - cpu_reg(ctxt, 3) =3D res->a3; + cpu_reg(ctxt, 0) =3D regs->a0; + cpu_reg(ctxt, 1) =3D regs->a1; + cpu_reg(ctxt, 2) =3D regs->a2; + cpu_reg(ctxt, 3) =3D regs->a3; + cpu_reg(ctxt, 4) =3D regs->a4; + cpu_reg(ctxt, 5) =3D regs->a5; + cpu_reg(ctxt, 6) =3D regs->a6; + cpu_reg(ctxt, 7) =3D regs->a7; + + /* DEN0028C 2.6: SMC32/HVC32 call from aarch64 must preserve x8-x30 */ + if (ARM_SMCCC_IS_64(regs->a0)) { + cpu_reg(ctxt, 8) =3D regs->a8; + cpu_reg(ctxt, 9) =3D regs->a9; + cpu_reg(ctxt, 10) =3D regs->a10; + cpu_reg(ctxt, 11) =3D regs->a11; + cpu_reg(ctxt, 12) =3D regs->a12; + cpu_reg(ctxt, 13) =3D regs->a13; + cpu_reg(ctxt, 14) =3D regs->a14; + cpu_reg(ctxt, 15) =3D regs->a15; + cpu_reg(ctxt, 16) =3D regs->a16; + cpu_reg(ctxt, 17) =3D regs->a17; + } } =20 static bool is_ffa_call(u64 func_id) @@ -113,82 +132,104 @@ static bool is_ffa_call(u64 func_id) =20 static int ffa_map_hyp_buffers(u64 ffa_page_count) { - struct arm_smccc_res res; + struct arm_smccc_1_2_regs regs; =20 - arm_smccc_1_1_smc(FFA_FN64_RXTX_MAP, - hyp_virt_to_phys(hyp_buffers.tx), - hyp_virt_to_phys(hyp_buffers.rx), - ffa_page_count, - 0, 0, 0, 0, - &res); + regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_FN64_RXTX_MAP, + .a1 =3D hyp_virt_to_phys(hyp_buffers.tx), + .a2 =3D hyp_virt_to_phys(hyp_buffers.rx), + .a3 =3D ffa_page_count, + }; + arm_smccc_1_2_smc(®s, ®s); + if (regs.a0 !=3D FFA_SUCCESS) + return regs.a2; =20 - return res.a0 =3D=3D FFA_SUCCESS ? FFA_RET_SUCCESS : res.a2; + return regs.a0 =3D=3D FFA_SUCCESS ? FFA_RET_SUCCESS : regs.a2; } =20 static int ffa_unmap_hyp_buffers(void) { - struct arm_smccc_res res; + struct arm_smccc_1_2_regs regs; =20 - arm_smccc_1_1_smc(FFA_RXTX_UNMAP, - HOST_FFA_ID, - 0, 0, 0, 0, 0, 0, - &res); + regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_RXTX_UNMAP, + .a1 =3D HOST_FFA_ID, + }; + arm_smccc_1_2_smc(®s, ®s); + if (regs.a0 !=3D FFA_SUCCESS) + return regs.a2; =20 - return res.a0 =3D=3D FFA_SUCCESS ? FFA_RET_SUCCESS : res.a2; + return regs.a0 =3D=3D FFA_SUCCESS ? FFA_RET_SUCCESS : regs.a2; } =20 -static void ffa_mem_frag_tx(struct arm_smccc_res *res, u32 handle_lo, +static void ffa_mem_frag_tx(struct arm_smccc_1_2_regs *regs, u32 handle_lo, u32 handle_hi, u32 fraglen, u32 endpoint_id) { - arm_smccc_1_1_smc(FFA_MEM_FRAG_TX, - handle_lo, handle_hi, fraglen, endpoint_id, - 0, 0, 0, - res); + *regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_MEM_FRAG_TX, + .a1 =3D handle_lo, + .a2 =3D handle_hi, + .a3 =3D fraglen, + .a4 =3D endpoint_id, + }; + arm_smccc_1_2_smc(regs, regs); } =20 -static void ffa_mem_frag_rx(struct arm_smccc_res *res, u32 handle_lo, +static void ffa_mem_frag_rx(struct arm_smccc_1_2_regs *regs, u32 handle_lo, u32 handle_hi, u32 fragoff) { - arm_smccc_1_1_smc(FFA_MEM_FRAG_RX, - handle_lo, handle_hi, fragoff, HOST_FFA_ID, - 0, 0, 0, - res); + *regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_MEM_FRAG_RX, + .a1 =3D handle_lo, + .a2 =3D handle_hi, + .a3 =3D fragoff, + .a4 =3D HOST_FFA_ID, + }; + arm_smccc_1_2_smc(regs, regs); } =20 -static void ffa_mem_xfer(struct arm_smccc_res *res, u64 func_id, u32 len, +static void ffa_mem_xfer(struct arm_smccc_1_2_regs *regs, u64 func_id, u32= len, u32 fraglen) { - arm_smccc_1_1_smc(func_id, len, fraglen, - 0, 0, 0, 0, 0, - res); + *regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D func_id, + .a1 =3D len, + .a2 =3D fraglen, + }; + arm_smccc_1_2_smc(regs, regs); } =20 -static void ffa_mem_reclaim(struct arm_smccc_res *res, u32 handle_lo, +static void ffa_mem_reclaim(struct arm_smccc_1_2_regs *regs, u32 handle_lo, u32 handle_hi, u32 flags) { - arm_smccc_1_1_smc(FFA_MEM_RECLAIM, - handle_lo, handle_hi, flags, - 0, 0, 0, 0, - res); + *regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_MEM_RECLAIM, + .a1 =3D handle_lo, + .a2 =3D handle_hi, + .a3 =3D flags, + }; + arm_smccc_1_2_smc(regs, regs); } =20 -static void ffa_retrieve_req(struct arm_smccc_res *res, u32 len) +static void ffa_retrieve_req(struct arm_smccc_1_2_regs *regs, u32 len) { - arm_smccc_1_1_smc(FFA_FN64_MEM_RETRIEVE_REQ, - len, len, - 0, 0, 0, 0, 0, - res); + *regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_FN64_MEM_RETRIEVE_REQ, + .a1 =3D len, + .a2 =3D len, + }; + arm_smccc_1_2_smc(regs, regs); } =20 -static void ffa_rx_release(struct arm_smccc_res *res) +static void ffa_rx_release(struct arm_smccc_1_2_regs *regs) { - arm_smccc_1_1_smc(FFA_RX_RELEASE, - 0, 0, - 0, 0, 0, 0, 0, - res); + *regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_RX_RELEASE, + }; + arm_smccc_1_2_smc(regs, regs); } =20 -static void do_ffa_rxtx_map(struct arm_smccc_res *res, +static void do_ffa_rxtx_map(struct arm_smccc_1_2_regs *regs, struct kvm_cpu_context *ctxt) { DECLARE_REG(phys_addr_t, tx, ctxt, 1); @@ -253,7 +294,7 @@ static void do_ffa_rxtx_map(struct arm_smccc_res *res, out_unlock: hyp_spin_unlock(&host_buffers.lock); out: - ffa_to_smccc_res(res, ret); + ffa_to_smccc_regs(regs, ret); return; =20 err_unpin_tx: @@ -267,7 +308,7 @@ static void do_ffa_rxtx_map(struct arm_smccc_res *res, goto out_unlock; } =20 -static void do_ffa_rxtx_unmap(struct arm_smccc_res *res, +static void do_ffa_rxtx_unmap(struct arm_smccc_1_2_regs *regs, struct kvm_cpu_context *ctxt) { DECLARE_REG(u32, id, ctxt, 1); @@ -297,7 +338,7 @@ static void do_ffa_rxtx_unmap(struct arm_smccc_res *res, out_unlock: hyp_spin_unlock(&host_buffers.lock); out: - ffa_to_smccc_res(res, ret); + ffa_to_smccc_regs(regs, ret); } =20 static u32 __ffa_host_share_ranges(struct ffa_mem_region_addr_range *range= s, @@ -368,7 +409,7 @@ static int ffa_host_unshare_ranges(struct ffa_mem_regio= n_addr_range *ranges, return ret; } =20 -static void do_ffa_mem_frag_tx(struct arm_smccc_res *res, +static void do_ffa_mem_frag_tx(struct arm_smccc_1_2_regs *regs, struct kvm_cpu_context *ctxt) { DECLARE_REG(u32, handle_lo, ctxt, 1); @@ -400,20 +441,20 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *= res, * to restore the global state back to what it was prior to * transmission of the first fragment. */ - ffa_mem_reclaim(res, handle_lo, handle_hi, 0); - WARN_ON(res->a0 !=3D FFA_SUCCESS); + ffa_mem_reclaim(regs, handle_lo, handle_hi, 0); + WARN_ON(regs->a0 !=3D FFA_SUCCESS); goto out_unlock; } =20 - ffa_mem_frag_tx(res, handle_lo, handle_hi, fraglen, endpoint_id); - if (res->a0 !=3D FFA_SUCCESS && res->a0 !=3D FFA_MEM_FRAG_RX) + ffa_mem_frag_tx(regs, handle_lo, handle_hi, fraglen, endpoint_id); + if (regs->a0 !=3D FFA_SUCCESS && regs->a0 !=3D FFA_MEM_FRAG_RX) WARN_ON(ffa_host_unshare_ranges(buf, nr_ranges)); =20 out_unlock: hyp_spin_unlock(&host_buffers.lock); out: if (ret) - ffa_to_smccc_res(res, ret); + ffa_to_smccc_regs(regs, ret); =20 /* * If for any reason this did not succeed, we're in trouble as we have @@ -427,7 +468,7 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *re= s, } =20 static void __do_ffa_mem_xfer(const u64 func_id, - struct arm_smccc_res *res, + struct arm_smccc_1_2_regs *regs, struct kvm_cpu_context *ctxt) { DECLARE_REG(u32, len, ctxt, 1); @@ -491,14 +532,14 @@ static void __do_ffa_mem_xfer(const u64 func_id, if (ret) goto out_unlock; =20 - ffa_mem_xfer(res, func_id, len, fraglen); + ffa_mem_xfer(regs, func_id, len, fraglen); if (fraglen !=3D len) { - if (res->a0 !=3D FFA_MEM_FRAG_RX) + if (regs->a0 !=3D FFA_MEM_FRAG_RX) goto err_unshare; =20 - if (res->a3 !=3D fraglen) + if (regs->a3 !=3D fraglen) goto err_unshare; - } else if (res->a0 !=3D FFA_SUCCESS) { + } else if (regs->a0 !=3D FFA_SUCCESS) { goto err_unshare; } =20 @@ -506,7 +547,7 @@ static void __do_ffa_mem_xfer(const u64 func_id, hyp_spin_unlock(&host_buffers.lock); out: if (ret) - ffa_to_smccc_res(res, ret); + ffa_to_smccc_regs(regs, ret); return; =20 err_unshare: @@ -514,14 +555,14 @@ static void __do_ffa_mem_xfer(const u64 func_id, goto out_unlock; } =20 -#define do_ffa_mem_xfer(fid, res, ctxt) \ +#define do_ffa_mem_xfer(fid, regs, ctxt) \ do { \ BUILD_BUG_ON((fid) !=3D FFA_FN64_MEM_SHARE && \ (fid) !=3D FFA_FN64_MEM_LEND); \ - __do_ffa_mem_xfer((fid), (res), (ctxt)); \ - } while (0); + __do_ffa_mem_xfer((fid), (regs), (ctxt)); \ + } while (0) =20 -static void do_ffa_mem_reclaim(struct arm_smccc_res *res, +static void do_ffa_mem_reclaim(struct arm_smccc_1_2_regs *regs, struct kvm_cpu_context *ctxt) { DECLARE_REG(u32, handle_lo, ctxt, 1); @@ -544,13 +585,13 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *= res, .handle =3D handle, }; =20 - ffa_retrieve_req(res, sizeof(*buf)); + ffa_retrieve_req(regs, sizeof(*buf)); buf =3D hyp_buffers.rx; - if (res->a0 !=3D FFA_MEM_RETRIEVE_RESP) + if (regs->a0 !=3D FFA_MEM_RETRIEVE_RESP) goto out_unlock; =20 - len =3D res->a1; - fraglen =3D res->a2; + len =3D regs->a1; + fraglen =3D regs->a2; =20 ep_mem_access =3D (void *)buf + ffa_mem_desc_offset(buf, 0, hyp_ffa_version); @@ -563,34 +604,34 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *= res, if (WARN_ON(offset > len || fraglen > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE)) { ret =3D FFA_RET_ABORTED; - ffa_rx_release(res); + ffa_rx_release(regs); goto out_unlock; } =20 if (len > ffa_desc_buf.len) { ret =3D FFA_RET_NO_MEMORY; - ffa_rx_release(res); + ffa_rx_release(regs); goto out_unlock; } =20 buf =3D ffa_desc_buf.buf; memcpy(buf, hyp_buffers.rx, fraglen); - ffa_rx_release(res); + ffa_rx_release(regs); =20 for (fragoff =3D fraglen; fragoff < len; fragoff +=3D fraglen) { - ffa_mem_frag_rx(res, handle_lo, handle_hi, fragoff); - if (res->a0 !=3D FFA_MEM_FRAG_TX) { + ffa_mem_frag_rx(regs, handle_lo, handle_hi, fragoff); + if (regs->a0 !=3D FFA_MEM_FRAG_TX) { ret =3D FFA_RET_INVALID_PARAMETERS; goto out_unlock; } =20 - fraglen =3D res->a3; + fraglen =3D regs->a3; memcpy((void *)buf + fragoff, hyp_buffers.rx, fraglen); - ffa_rx_release(res); + ffa_rx_release(regs); } =20 - ffa_mem_reclaim(res, handle_lo, handle_hi, flags); - if (res->a0 !=3D FFA_SUCCESS) + ffa_mem_reclaim(regs, handle_lo, handle_hi, flags); + if (regs->a0 !=3D FFA_SUCCESS) goto out_unlock; =20 reg =3D (void *)buf + offset; @@ -601,7 +642,7 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *re= s, hyp_spin_unlock(&host_buffers.lock); =20 if (ret) - ffa_to_smccc_res(res, ret); + ffa_to_smccc_regs(regs, ret); } =20 /* @@ -634,7 +675,7 @@ static bool ffa_call_supported(u64 func_id) return true; } =20 -static bool do_ffa_features(struct arm_smccc_res *res, +static bool do_ffa_features(struct arm_smccc_1_2_regs *regs, struct kvm_cpu_context *ctxt) { DECLARE_REG(u32, id, ctxt, 1); @@ -659,7 +700,7 @@ static bool do_ffa_features(struct arm_smccc_res *res, } =20 out_handled: - ffa_to_smccc_res_prop(res, ret, prop); + ffa_to_smccc_regs_prop(regs, ret, prop); return true; } =20 @@ -705,22 +746,22 @@ static int hyp_ffa_post_init(void) return 0; } =20 -static void do_ffa_version(struct arm_smccc_res *res, +static void do_ffa_version(struct arm_smccc_1_2_regs *regs, struct kvm_cpu_context *ctxt) { DECLARE_REG(u32, ffa_req_version, ctxt, 1); =20 if (FFA_MAJOR_VERSION(ffa_req_version) !=3D 1) { - res->a0 =3D FFA_RET_NOT_SUPPORTED; + regs->a0 =3D FFA_RET_NOT_SUPPORTED; return; } =20 hyp_spin_lock(&version_lock); if (has_version_negotiated) { if (FFA_MINOR_VERSION(ffa_req_version) < FFA_MINOR_VERSION(hyp_ffa_versi= on)) - res->a0 =3D FFA_RET_NOT_SUPPORTED; + regs->a0 =3D FFA_RET_NOT_SUPPORTED; else - res->a0 =3D hyp_ffa_version; + regs->a0 =3D hyp_ffa_version; goto unlock; } =20 @@ -729,26 +770,28 @@ static void do_ffa_version(struct arm_smccc_res *res, * first if TEE supports it. */ if (FFA_MINOR_VERSION(ffa_req_version) < FFA_MINOR_VERSION(hyp_ffa_versio= n)) { - arm_smccc_1_1_smc(FFA_VERSION, ffa_req_version, 0, - 0, 0, 0, 0, 0, - res); - if (res->a0 =3D=3D FFA_RET_NOT_SUPPORTED) + *regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_VERSION, + .a1 =3D ffa_req_version, + }; + arm_smccc_1_2_smc(regs, regs); + if (regs->a0 =3D=3D FFA_RET_NOT_SUPPORTED) goto unlock; =20 hyp_ffa_version =3D ffa_req_version; } =20 if (hyp_ffa_post_init()) { - res->a0 =3D FFA_RET_NOT_SUPPORTED; + regs->a0 =3D FFA_RET_NOT_SUPPORTED; } else { smp_store_release(&has_version_negotiated, true); - res->a0 =3D hyp_ffa_version; + regs->a0 =3D hyp_ffa_version; } unlock: hyp_spin_unlock(&version_lock); } =20 -static void do_ffa_part_get(struct arm_smccc_res *res, +static void do_ffa_part_get(struct arm_smccc_1_2_regs *regs, struct kvm_cpu_context *ctxt) { DECLARE_REG(u32, uuid0, ctxt, 1); @@ -760,18 +803,24 @@ static void do_ffa_part_get(struct arm_smccc_res *res, =20 hyp_spin_lock(&host_buffers.lock); if (!host_buffers.rx) { - ffa_to_smccc_res(res, FFA_RET_BUSY); + ffa_to_smccc_regs(regs, FFA_RET_BUSY); goto out_unlock; } =20 - arm_smccc_1_1_smc(FFA_PARTITION_INFO_GET, uuid0, uuid1, - uuid2, uuid3, flags, 0, 0, - res); + *regs =3D (struct arm_smccc_1_2_regs) { + .a0 =3D FFA_PARTITION_INFO_GET, + .a1 =3D uuid0, + .a2 =3D uuid1, + .a3 =3D uuid2, + .a4 =3D uuid3, + .a5 =3D flags, + }; + arm_smccc_1_2_smc(regs, regs); =20 - if (res->a0 !=3D FFA_SUCCESS) + if (regs->a0 !=3D FFA_SUCCESS) goto out_unlock; =20 - count =3D res->a2; + count =3D regs->a2; if (!count) goto out_unlock; =20 @@ -780,7 +829,7 @@ static void do_ffa_part_get(struct arm_smccc_res *res, if (flags & 0x1) goto out_unlock; =20 - partition_sz =3D res->a3; + partition_sz =3D regs->a3; } else { /* FFA_VERSION_1_0 lacks the size in the response */ partition_sz =3D FFA_1_0_PARTITON_INFO_SZ; @@ -788,7 +837,7 @@ static void do_ffa_part_get(struct arm_smccc_res *res, =20 copy_sz =3D partition_sz * count; if (copy_sz > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE) { - ffa_to_smccc_res(res, FFA_RET_ABORTED); + ffa_to_smccc_regs(regs, FFA_RET_ABORTED); goto out_unlock; } =20 @@ -799,7 +848,7 @@ static void do_ffa_part_get(struct arm_smccc_res *res, =20 bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id) { - struct arm_smccc_res res; + struct arm_smccc_1_2_regs regs; =20 /* * There's no way we can tell what a non-standard SMC call might @@ -819,50 +868,50 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *hos= t_ctxt, u32 func_id) =20 if (func_id !=3D FFA_VERSION && !smp_load_acquire(&has_version_negotiated)) { - ffa_to_smccc_error(&res, FFA_RET_INVALID_PARAMETERS); + ffa_to_smccc_1_2_error(®s, FFA_RET_INVALID_PARAMETERS); goto out_handled; } =20 switch (func_id) { case FFA_FEATURES: - if (!do_ffa_features(&res, host_ctxt)) + if (!do_ffa_features(®s, host_ctxt)) return false; goto out_handled; /* Memory management */ case FFA_FN64_RXTX_MAP: - do_ffa_rxtx_map(&res, host_ctxt); + do_ffa_rxtx_map(®s, host_ctxt); goto out_handled; case FFA_RXTX_UNMAP: - do_ffa_rxtx_unmap(&res, host_ctxt); + do_ffa_rxtx_unmap(®s, host_ctxt); goto out_handled; case FFA_MEM_SHARE: case FFA_FN64_MEM_SHARE: - do_ffa_mem_xfer(FFA_FN64_MEM_SHARE, &res, host_ctxt); + do_ffa_mem_xfer(FFA_FN64_MEM_SHARE, ®s, host_ctxt); goto out_handled; case FFA_MEM_RECLAIM: - do_ffa_mem_reclaim(&res, host_ctxt); + do_ffa_mem_reclaim(®s, host_ctxt); goto out_handled; case FFA_MEM_LEND: case FFA_FN64_MEM_LEND: - do_ffa_mem_xfer(FFA_FN64_MEM_LEND, &res, host_ctxt); + do_ffa_mem_xfer(FFA_FN64_MEM_LEND, ®s, host_ctxt); goto out_handled; case FFA_MEM_FRAG_TX: - do_ffa_mem_frag_tx(&res, host_ctxt); + do_ffa_mem_frag_tx(®s, host_ctxt); goto out_handled; case FFA_VERSION: - do_ffa_version(&res, host_ctxt); + do_ffa_version(®s, host_ctxt); goto out_handled; case FFA_PARTITION_INFO_GET: - do_ffa_part_get(&res, host_ctxt); + do_ffa_part_get(®s, host_ctxt); goto out_handled; } =20 if (ffa_call_supported(func_id)) return false; /* Pass through */ =20 - ffa_to_smccc_error(&res, FFA_RET_NOT_SUPPORTED); + ffa_to_smccc_1_2_error(®s, FFA_RET_NOT_SUPPORTED); out_handled: - ffa_set_retval(host_ctxt, &res); + ffa_set_retval(host_ctxt, ®s); return true; } =20 --=20 2.50.0.rc2.701.gf1e915cc24-goog From nobody Thu Oct 9 06:53:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7C9EB283C92; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; cv=none; b=Kx6KhgH67OQkDFJrJ/7zuU3mZVbBwOmAsPYfUBfFrVsznTkDs/iKJDiW5B61aO56kSJyz5UpVsXfKflEnIto6WfS1/bE2g2UNu/Qxi9Mvx0MSLwwqF4JCjf8L6rDuE1qPOuFVjBL+Oc1+LapPfocGqhKf/FV1buc1n6gB0vhx4s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; c=relaxed/simple; bh=TQleIpVqxX9w9y+oNAtop5bLIFbXUlUOvBs+KyP0ZR8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=i5Tw/AiJxQTESITbbaVh0WOKiP2RkJcCno86wosqWP/a6HRyS4MHibV5NBBvDOlXF9mAJ7JO+4BhpknKGKCCXc6LVtOwzqkqUGwVgTyojo6WzjrohgjrV+5C3zDf2yxBfR57uoSjFTLbPBn4gsQLXe5pT0XPO+JbOZKNmM3VRZ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=o7L8NF9N; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="o7L8NF9N" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4AE19C4CEF0; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1750323808; bh=TQleIpVqxX9w9y+oNAtop5bLIFbXUlUOvBs+KyP0ZR8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=o7L8NF9NOcsympMD72nGSsnIOax9GF/SqHr4lHLcDv6e+/q3kXvV/jAQdq2QJcYuS G/TocW/Ge14Hkzo0GKxK+MUXEagYH71pSQnmNXPkMdKN6BoWYmR7br/NPVnyDEcVxv YwUBCfqSfYoGXBy7wsKavCtrVO9ulVgotcsa1AK8TY3djtW8kk/m0vw+3I9g1uhr3F ZkLlcpqpCjs8VbeRP/q6k1Ue7pe2kIpSsFi81Z20qe+1lFxxnp5kc0IAyf3kj3D6MM wUc27fqxsETtuHHwBzKWSYQ4kuvTh44yFOJfILWhDqh8zdrirCq2uR0TIAl5M7iccV eX67FLeGyIDog== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 414A9C7115A; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) From: Per Larsen via B4 Relay Date: Thu, 19 Jun 2025 09:02:57 +0000 Subject: [PATCH v5 4/6] KVM: arm64: Mark FFA_NOTIFICATION_* calls as unsupported Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250619-virtio-msg-ffa-v5-4-412c98558807@google.com> References: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> In-Reply-To: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Sudeep Holla Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, Per Larsen X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1750323807; l=1012; i=perlarsen@google.com; s=20250508; h=from:subject:message-id; bh=Qis+O0P+EgX/jX8E8VR0D/SyhX2jCqrXBKwBh6kK8LA=; b=owTK3dNtjpqdVYFwLQpJgygVZi0v1UFmK/ckwYhyoMUDJT3aHG0J9frH7mg1/ZBvkhych1K8x I8eWPG0jIqrCiQGY9atRRA7H998+kDveRDiZd7m9NaPUXVb0z549ydB X-Developer-Key: i=perlarsen@google.com; a=ed25519; pk=jjc/Ta4VmrLRmMoahP6d1mBcKzvWU+nsmdtYe2oS2kQ= X-Endpoint-Received: by B4 Relay for perlarsen@google.com/20250508 with auth_id=402 X-Original-From: Per Larsen Reply-To: perlarsen@google.com From: Per Larsen Prevent FFA_NOTIFICATION_* interfaces from being passed through to TZ. Acked-by: Will Deacon Signed-off-by: Per Larsen --- arch/arm64/kvm/hyp/nvhe/ffa.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 23b75b9f0bcc62724f0d0d185ac2ed2526375da4..6965aa947fb4529c35872ee3976= ab8d0b02becca 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -669,6 +669,14 @@ static bool ffa_call_supported(u64 func_id) case FFA_RXTX_MAP: case FFA_MEM_DONATE: case FFA_MEM_RETRIEVE_REQ: + /* Optional notification interfaces added in FF-A 1.1 */ + case FFA_NOTIFICATION_BITMAP_CREATE: + case FFA_NOTIFICATION_BITMAP_DESTROY: + case FFA_NOTIFICATION_BIND: + case FFA_NOTIFICATION_UNBIND: + case FFA_NOTIFICATION_SET: + case FFA_NOTIFICATION_GET: + case FFA_NOTIFICATION_INFO_GET: return false; } =20 --=20 2.50.0.rc2.701.gf1e915cc24-goog From nobody Thu Oct 9 06:53:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7C101283C8D; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; cv=none; b=WPXW3u1THikzu0U3xVKJWsP8r3lp6RIv1cr96Zh2pf8yql1UUgCvuLSYT7sZAj1WJCokIOrR9kPJzNAc9iYkjhF1LLCPiG9d9SSeYRj63zaBs1CbHhI3GGCTDu3RKQ8man6SidGaBne9AQWLKfyzEXdtCx+/hPH5Ame5mj1OdM8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; c=relaxed/simple; bh=KV8R0/QEn6g2ep7ALMFbJDB+CZVez+rknXrVOIag/1o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GgyrCV0i6cyiPmllnWFQR3bQtCIXvalmDVNCr7mTpJCFQKw5p9+yQVcBFfVrhti7mNwGlarkmr7nW7ZhcYl5aITgEINi1yyVKHe3h5Nf85tDcDK/yvPpDk/3QABUBBoQfJHZMA4AuPY5W2YC35kF8m/7wxbDBMaHyaAjkbfV1N4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ciuGSV4F; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ciuGSV4F" Received: by smtp.kernel.org (Postfix) with ESMTPS id 57C54C4CEF8; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1750323808; bh=KV8R0/QEn6g2ep7ALMFbJDB+CZVez+rknXrVOIag/1o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=ciuGSV4FFn9j7Vu0f/6GjGsvMlYID+PmLSv4P2o3D3s0gSZZpnhU44u1yAcEiS4rn 1O6w3fpmukAQR6m9HNreg59k143ObCx51qHhrhdqpXgDN+9JNHBMebH1cZFAh2dSg3 C0RcJRkXnyYK0Rouy86JlWkxjYyJZCMLZ1vo/ufH1nI3+VyJlpMJIuN/V4iCByiPhi B3iSEadzIyN9rWYOHNzKrG3aSapf1+O+IRd3+pNnMaREGJiKGlcRi/M8LOBYGGRUz3 dcGJo/6L5fkBUi1shUNVbVgYPtqZsBPNNBGSqtv7C3OVybXHKIH9XU6Qwt5Pp/hMe/ 3m36h13UOUiDg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4F786C77B7C; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) From: Per Larsen via B4 Relay Date: Thu, 19 Jun 2025 09:02:58 +0000 Subject: [PATCH v5 5/6] KVM: arm64: Bump the supported version of FF-A to 1.2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250619-virtio-msg-ffa-v5-5-412c98558807@google.com> References: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> In-Reply-To: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Sudeep Holla Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, Ayrton Munoz , Per Larsen X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1750323807; l=2922; i=perlarsen@google.com; s=20250508; h=from:subject:message-id; bh=FWsM9cwpDtQRn26k1vqArnhcGBTBM4Gr3l2A+zKhWqA=; b=xKbIaeh0Ao2PAFj3bfDz6jesWsBv+WwmJNQ732uSf7QXPWRDCk6XboOcFJb6704n1VDjaO3c8 Qwou+1cKSBlCvSH2UVdzBY81BmeQyBfH1/dzYLEa6zJp43/mG+8b2GX X-Developer-Key: i=perlarsen@google.com; a=ed25519; pk=jjc/Ta4VmrLRmMoahP6d1mBcKzvWU+nsmdtYe2oS2kQ= X-Endpoint-Received: by B4 Relay for perlarsen@google.com/20250508 with auth_id=402 X-Original-From: Per Larsen Reply-To: perlarsen@google.com From: Per Larsen FF-A version 1.2 introduces the DIRECT_REQ2 ABI. Bump the FF-A version preferred by the hypervisor as a precursor to implementing the 1.2-only FFA_MSG_SEND_DIRECT_REQ2 and FFA_MSG_SEND_RESP2 messaging interfaces. We must also use SMCCC 1.2 for 64-bit SMCs if hypervisor negotiated FF-A 1.2, so ffa_set_retval is updated and a new function to call 64-bit smcs using SMCCC 1.2 with fallback to SMCCC 1.1 is introduced. Update ffa_call_supported to mark FF-A 1.2 interfaces as unsupported lest they get forwarded. Co-developed-by: Ayrton Munoz Signed-off-by: Ayrton Munoz Signed-off-by: Per Larsen --- arch/arm64/kvm/hyp/nvhe/ffa.c | 14 ++++++++++---- include/linux/arm_ffa.h | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 6965aa947fb4529c35872ee3976ab8d0b02becca..7b43279aded7d7ef4cce2c294d2= 08c5a66b684e3 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -677,6 +677,12 @@ static bool ffa_call_supported(u64 func_id) case FFA_NOTIFICATION_SET: case FFA_NOTIFICATION_GET: case FFA_NOTIFICATION_INFO_GET: + /* Unimplemented interfaces added in FF-A 1.2 */ + case FFA_MSG_SEND_DIRECT_REQ2: + case FFA_MSG_SEND_DIRECT_RESP2: + case FFA_CONSOLE_LOG: + case FFA_PARTITION_INFO_GET_REGS: + case FFA_EL3_INTR_HANDLE: return false; } =20 @@ -734,7 +740,7 @@ static int hyp_ffa_post_init(void) if (regs.a0 !=3D FFA_SUCCESS) return -EOPNOTSUPP; =20 - switch (regs.a2) { + switch (regs.a2 & FFA_FEAT_RXTX_MIN_SZ_MASK) { case FFA_FEAT_RXTX_MIN_SZ_4K: min_rxtx_sz =3D SZ_4K; break; @@ -933,7 +939,7 @@ int hyp_ffa_init(void *pages) =20 regs =3D (struct arm_smccc_1_2_regs) { .a0 =3D FFA_VERSION, - .a1 =3D FFA_VERSION_1_1, + .a1 =3D FFA_VERSION_1_2, }; arm_smccc_1_2_smc(®s, ®s); if (regs.a0 =3D=3D FFA_RET_NOT_SUPPORTED) @@ -955,10 +961,10 @@ int hyp_ffa_init(void *pages) if (FFA_MAJOR_VERSION(regs.a0) !=3D 1) return -EOPNOTSUPP; =20 - if (FFA_MINOR_VERSION(regs.a0) < FFA_MINOR_VERSION(FFA_VERSION_1_1)) + if (FFA_MINOR_VERSION(regs.a0) < FFA_MINOR_VERSION(FFA_VERSION_1_2)) hyp_ffa_version =3D regs.a0; else - hyp_ffa_version =3D FFA_VERSION_1_1; + hyp_ffa_version =3D FFA_VERSION_1_2; =20 tx =3D pages; pages +=3D KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE; diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h index 5bded24dc24fea8cdcbe42bf79c7c025c3fa5f4b..c0dd6183d956043192114a522b7= eef465e7078ac 100644 --- a/include/linux/arm_ffa.h +++ b/include/linux/arm_ffa.h @@ -128,6 +128,7 @@ #define FFA_FEAT_RXTX_MIN_SZ_4K 0 #define FFA_FEAT_RXTX_MIN_SZ_64K 1 #define FFA_FEAT_RXTX_MIN_SZ_16K 2 +#define FFA_FEAT_RXTX_MIN_SZ_MASK 3 =20 /* FFA Bus/Device/Driver related */ struct ffa_device { --=20 2.50.0.rc2.701.gf1e915cc24-goog From nobody Thu Oct 9 06:53:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC9FF283FD2; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; cv=none; b=miaIPDqBSnbj0UvHKJonZxgjszjbIlwIAAfxQvLPgc/j+vr6FBcMxennmG3z9eRyjDZJ2O/5PXH5dfA8XlnLc1dRJfBr3ooqO9K5fUqovnVKBAoJDW+ETgkFWSVUsggEoErvVElMuDfN3wUi2sY/8YxV0GoR1UC8EUrvA4G5nSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750323808; c=relaxed/simple; bh=pIXnl8l/FgoZHAvcr8LQug4Br32QI31DC1e/7I5KSL0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p4pKdAjlPVMUpZmUQjM+U65VelHi9pGy5FXnMfevF30/YvcnhYq2XTbIkdFUvmHMSD1k4vcj4d26wjKcCP/+2l1gL7rLkSjMUNtkwuyMYquj2uMsw3bQgFNnp0wXwHPsgbnLPGG32uAVuvYQKyCcek6E0CZowIXMzUJlPBQTAl8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WlFosQNB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WlFosQNB" Received: by smtp.kernel.org (Postfix) with ESMTPS id 66E23C4CEEA; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1750323808; bh=pIXnl8l/FgoZHAvcr8LQug4Br32QI31DC1e/7I5KSL0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=WlFosQNBz3XNNWyKm9duD7v81Epf+5l0GKlsnVbO7w2LRc9QH0WwCprdv2tAO/a+x Ds/mZyu/cJgj4zvAJSuScSusyElyDqxdNpG6FkOSUvQHAv2eQ+AlzG4snEOJ0HuVOe UZUdovvOfNVeO8tze1h9ANBg3NABQ8q0PDFnPqjiBXcWYhfMai9HgG2T0KG8sM2K3a LvV8ZgNSoU00mvWJK9E/O5w83SW1nu3Lm+MzVo8Sh9CkpTiz3yUka0CbMOCyhjBZlw /FhQYy7lYHIAoCLb8jTC7wP8SjGlngPb+36efGBZ0qLeX0kfLTMJ8nh0cXGmNvuzzK 6kPNaqDXCEWkQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5DD55C73C66; Thu, 19 Jun 2025 09:03:28 +0000 (UTC) From: Per Larsen via B4 Relay Date: Thu, 19 Jun 2025 09:02:59 +0000 Subject: [PATCH v5 6/6] KVM: arm64: Support FFA_MSG_SEND_DIRECT_REQ2 in host handler Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250619-virtio-msg-ffa-v5-6-412c98558807@google.com> References: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> In-Reply-To: <20250619-virtio-msg-ffa-v5-0-412c98558807@google.com> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Sudeep Holla Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, Per Larsen X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1750323807; l=3017; i=perlarsen@google.com; s=20250508; h=from:subject:message-id; bh=HXzQ4CaUHWWMpyY/fRFoKzEJfIwG9a4ZofQnutHpvGA=; b=4cj1xT/yvSKWn7LH3R9ElZpkJgBallN/yBzIeSNnFooAZVK25CJMAYj3iNIJ1vblefywm3rUG 1uW6+sSeE/fAVFFOyGEV6zZm3fRb5LwJFN+Oap1ucWCpT739fTzT6sK X-Developer-Key: i=perlarsen@google.com; a=ed25519; pk=jjc/Ta4VmrLRmMoahP6d1mBcKzvWU+nsmdtYe2oS2kQ= X-Endpoint-Received: by B4 Relay for perlarsen@google.com/20250508 with auth_id=402 X-Original-From: Per Larsen Reply-To: perlarsen@google.com From: Per Larsen FF-A 1.2 adds the DIRECT_REQ2 messaging interface which is similar to the existing FFA_MSG_SEND_DIRECT_{REQ,RESP} functions except that it uses the SMC calling convention v1.2 which allows calls to use x4-x17 as argument and return registers. Add support for FFA_MSG_SEND_DIRECT_REQ2 in the host ffa handler. Signed-off-by: Per Larsen --- arch/arm64/kvm/hyp/nvhe/ffa.c | 24 +++++++++++++++++++++++- include/linux/arm_ffa.h | 2 ++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 7b43279aded7d7ef4cce2c294d208c5a66b684e3..37bde2ea2219e37ea68f859e6f2= 11c868585285d 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -678,7 +678,6 @@ static bool ffa_call_supported(u64 func_id) case FFA_NOTIFICATION_GET: case FFA_NOTIFICATION_INFO_GET: /* Unimplemented interfaces added in FF-A 1.2 */ - case FFA_MSG_SEND_DIRECT_REQ2: case FFA_MSG_SEND_DIRECT_RESP2: case FFA_CONSOLE_LOG: case FFA_PARTITION_INFO_GET_REGS: @@ -860,6 +859,22 @@ static void do_ffa_part_get(struct arm_smccc_1_2_regs = *regs, hyp_spin_unlock(&host_buffers.lock); } =20 +static void do_ffa_direct_msg2(struct arm_smccc_1_2_regs *regs, + struct kvm_cpu_context *ctxt, + u64 vm_handle) +{ + DECLARE_REG(u32, endp, ctxt, 1); + + struct arm_smccc_1_2_regs *args =3D (void *)&ctxt->regs.regs[0]; + + if (FIELD_GET(FFA_SRC_ENDPOINT_MASK, endp) !=3D vm_handle) { + ffa_to_smccc_1_2_error(regs, FFA_RET_INVALID_PARAMETERS); + return; + } + + arm_smccc_1_2_smc(args, regs); +} + bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id) { struct arm_smccc_1_2_regs regs; @@ -918,11 +933,18 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *hos= t_ctxt, u32 func_id) case FFA_PARTITION_INFO_GET: do_ffa_part_get(®s, host_ctxt); goto out_handled; + case FFA_MSG_SEND_DIRECT_REQ2: + if (hyp_ffa_version >=3D FFA_VERSION_1_2) { + do_ffa_direct_msg2(®s, host_ctxt, HOST_FFA_ID); + goto out_handled; + } + goto out_not_supported; } =20 if (ffa_call_supported(func_id)) return false; /* Pass through */ =20 +out_not_supported: ffa_to_smccc_1_2_error(®s, FFA_RET_NOT_SUPPORTED); out_handled: ffa_set_retval(host_ctxt, ®s); diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h index c0dd6183d956043192114a522b7eef465e7078ac..82a35a3b22de426f7e9a8894e76= fdf1e933b3d6b 100644 --- a/include/linux/arm_ffa.h +++ b/include/linux/arm_ffa.h @@ -269,6 +269,8 @@ bool ffa_partition_check_property(struct ffa_device *de= v, u32 property) (ffa_partition_check_property(dev, FFA_PARTITION_DIRECT_REQ2_RECV) && \ !dev->mode_32bit) =20 +#define FFA_SRC_ENDPOINT_MASK GENMASK(31, 16) + /* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP} which pass data via registe= rs */ struct ffa_send_direct_data { unsigned long data0; /* w3/x3 */ --=20 2.50.0.rc2.701.gf1e915cc24-goog