From patchwork Thu Jun 13 13:20:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13696794 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AFFF1C27C4F for ; Thu, 13 Jun 2024 13:21:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=sESXJ6lTpXS1Uiyd1DMUTJSwf8gpaqDrOmX2O7P+Tt8=; b=mAY2h8kLLytUswPODFWvxlNSVB +vmucDQk4cSa20+kJcTc5W1Rzvralux2x95TCxTIRB5qMDWQknk9StKAPVFzffbY0/T3SmuiCj5GH raEk4jw25ILYKj9zGSE5L0y78ppwQsoFhjg/vHHuqgjfjr8g2au42XwYy8X/2KO8760p4W6+bQIMP X+zZf0yX8oV0cqXp0ocfa8g1KCoxKvLjuDwlRXfeyM0GeJ5vRSR2UPuaCNCZuKJPazMMjrzag9qSe WE/zMn9KqqN7miiG0dY1MnV6MmkHrSfSVBssUADL3+CtYEWwLXpB03HAlNzgU4OQJV9KPkWZxRghI gFyOaYVg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sHkNz-0000000GgTE-2Oxj; Thu, 13 Jun 2024 13:21:03 +0000 Received: from mail-wr1-x44a.google.com ([2a00:1450:4864:20::44a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sHkNv-0000000GgQg-1tHm for linux-arm-kernel@lists.infradead.org; Thu, 13 Jun 2024 13:21:01 +0000 Received: by mail-wr1-x44a.google.com with SMTP id ffacd0b85a97d-35f06558bc3so703857f8f.1 for ; Thu, 13 Jun 2024 06:20:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718284855; x=1718889655; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=sESXJ6lTpXS1Uiyd1DMUTJSwf8gpaqDrOmX2O7P+Tt8=; b=mGo6M/4SBuggue8pbB8211o18KzlMxtW2RCx9s4olBp8QpQQjZMMFEOdHsbFTcasS4 Pt2u92sP9Z8RvafL+e6F3HH/H0CjJqaD1zzRJa98VFAOIc58H6yzJjrjkGSx+5Fv0+0J PKPVJ5anhKG/eOTOcUAZt0dgv9p5RI55gOvpBDjtyAYFCrS8vozzuZX1ZDwpVcXmyNfZ RUSvGXd0HWIbS8JsG9mmEqZAmTPoG9BparMQcnZif+Am/VlP+EQUojVinDl/HJmVII6s 8gGEo2SKqzXHDQNDvRsrfpKfkEsyuiCKIV24EFtrJEPM1E/TAjQAJk005jsHASdASz+E 2EOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718284855; x=1718889655; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=sESXJ6lTpXS1Uiyd1DMUTJSwf8gpaqDrOmX2O7P+Tt8=; b=v5P2+X1yLGBQs/AZqBpvtMLdg9dhF1t8cBmR7hd9lcMin/B2xs6l2NVGHO9L34TT1w TS/xjKDKotohUrT0JAzw5klT4O9+TOrj3xaSkY/CRNQ5zox5pTpvUB8uyGRqgml+VPuk GGe6SgYEIApx6l5Lqf3AzR+Zyk8nA9CZegLrU+MrhDuNx+gwR7QTTH1oYaggq1lSvRT/ 0113Wqg5S9yVfXF1in48ptcBGpKGlYQyA74GX/tnDEUdE4j+2zDOySxqDzPLwbTHInlv eO9+kMgIfv/dMqawSPS8MFs55PjfCMIDjk920Xx4qtDb7apY0mEDtLxWB4OUnPoBfGe4 RLuA== X-Forwarded-Encrypted: i=1; AJvYcCX8f6pbDyfnBgBrzyJ9LS+V+LOS02oe1G/U8KfQrIBcwB3aMCgQ9seKwnpOab+1G4kuKy1hQgJ1lp0CJalgkbPEZkH3TMssxYJejrWZtkyy+0jqNVs= X-Gm-Message-State: AOJu0YwTeweo3PMQdgcfsCiPqzRpw6GBCEsdSi404oVlq3vh9+Ko1x2v wpsWE1Ltj/Zk8tBO35y5ab5s9es3Us3gR9OnCdO98dp4VCjcjLgcBWQj6oVZ6Qp1/VTiNWbt3c5 af4281noGosnhKij9Ma3SlK4VVw== X-Google-Smtp-Source: AGHT+IEuL/StGDQdidgafs+3ZU4qfQosVRrlPI2JL8IIcAF+ju+qgsK/HapKvJnwS4cSax/FEowSz1v2ebxWWLTYgbE= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a5d:6405:0:b0:35f:2e9c:3295 with SMTP id ffacd0b85a97d-35fdf7aad26mr10867f8f.4.1718284854455; Thu, 13 Jun 2024 06:20:54 -0700 (PDT) Date: Thu, 13 Jun 2024 13:20:32 +0000 In-Reply-To: <20240613132035.1070360-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240613132035.1070360-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.505.gda0bf45e8d-goog Message-ID: <20240613132035.1070360-2-sebastianene@google.com> Subject: [PATCH v3 1/4] KVM: arm64: Trap FFA_VERSION host call in pKVM From: Sebastian Ene To: catalin.marinas@arm.com, james.morse@arm.com, jean-philippe@linaro.org, maz@kernel.org, oliver.upton@linux.dev, qperret@google.com, qwandor@google.com, sudeep.holla@arm.com, suzuki.poulose@arm.com, tabba@google.com, will@kernel.org, yuzenghui@huawei.com, lpieralisi@kernel.org Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com, Sebastian Ene X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240613_062059_532581_67F3C33A X-CRM114-Status: GOOD ( 19.72 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The pKVM hypervisor initializes with FF-A version 1.0. The spec requires that no other FF-A calls to be issued before the version negotiation phase is complete. Split the hypervisor proxy initialization code in two parts so that we can move the later one after the host negotiates its version. Without trapping the call, the host drivers can negotiate a higher version number with TEE which can result in a different memory layout described during the memory sharing calls. Signed-off-by: Sebastian Ene Reviewed-by: Sudeep Holla Tested-by: Sudeep Holla --- arch/arm64/kvm/hyp/nvhe/ffa.c | 120 +++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 30 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 02746f9d0980..c8ab51c331f0 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -67,6 +67,9 @@ struct kvm_ffa_buffers { */ static struct kvm_ffa_buffers hyp_buffers; static struct kvm_ffa_buffers host_buffers; +static u32 hyp_ffa_version; +static bool has_version_negotiated; +static hyp_spinlock_t version_lock; static void ffa_to_smccc_error(struct arm_smccc_res *res, u64 ffa_errno) { @@ -639,6 +642,83 @@ static bool do_ffa_features(struct arm_smccc_res *res, return true; } +static int hyp_ffa_post_init(void) +{ + size_t min_rxtx_sz; + struct arm_smccc_res res; + + arm_smccc_1_1_smc(FFA_ID_GET, 0, 0, 0, 0, 0, 0, 0, &res); + if (res.a0 != FFA_SUCCESS) + return -EOPNOTSUPP; + + if (res.a2 != HOST_FFA_ID) + return -EINVAL; + + arm_smccc_1_1_smc(FFA_FEATURES, FFA_FN64_RXTX_MAP, + 0, 0, 0, 0, 0, 0, &res); + if (res.a0 != FFA_SUCCESS) + return -EOPNOTSUPP; + + switch (res.a2) { + case FFA_FEAT_RXTX_MIN_SZ_4K: + min_rxtx_sz = SZ_4K; + break; + case FFA_FEAT_RXTX_MIN_SZ_16K: + min_rxtx_sz = SZ_16K; + break; + case FFA_FEAT_RXTX_MIN_SZ_64K: + min_rxtx_sz = SZ_64K; + break; + default: + return -EINVAL; + } + + if (min_rxtx_sz > PAGE_SIZE) + return -EOPNOTSUPP; + + return 0; +} + +static void do_ffa_version(struct arm_smccc_res *res, + struct kvm_cpu_context *ctxt) +{ + DECLARE_REG(u32, ffa_req_version, ctxt, 1); + + if (FFA_MAJOR_VERSION(ffa_req_version) != 1) { + res->a0 = FFA_RET_NOT_SUPPORTED; + return; + } + + hyp_spin_lock(&version_lock); + if (has_version_negotiated) { + res->a0 = hyp_ffa_version; + goto unlock; + } + + /* + * If the client driver tries to downgrade the version, we need to ask + * first if TEE supports it. + */ + if (FFA_MINOR_VERSION(ffa_req_version) < FFA_MINOR_VERSION(hyp_ffa_version)) { + arm_smccc_1_1_smc(FFA_VERSION, ffa_req_version, 0, + 0, 0, 0, 0, 0, + res); + if (res->a0 == FFA_RET_NOT_SUPPORTED) + goto unlock; + + hyp_ffa_version = ffa_req_version; + } + + if (hyp_ffa_post_init()) + res->a0 = FFA_RET_NOT_SUPPORTED; + else { + has_version_negotiated = true; + res->a0 = hyp_ffa_version; + } +unlock: + hyp_spin_unlock(&version_lock); +} + bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id) { struct arm_smccc_res res; @@ -659,6 +739,11 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id) if (!is_ffa_call(func_id)) return false; + if (!has_version_negotiated && func_id != FFA_VERSION) { + ffa_to_smccc_error(&res, FFA_RET_INVALID_PARAMETERS); + goto out_handled; + } + switch (func_id) { case FFA_FEATURES: if (!do_ffa_features(&res, host_ctxt)) @@ -685,6 +770,9 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id) case FFA_MEM_FRAG_TX: do_ffa_mem_frag_tx(&res, host_ctxt); goto out_handled; + case FFA_VERSION: + do_ffa_version(&res, host_ctxt); + goto out_handled; } if (ffa_call_supported(func_id)) @@ -699,7 +787,6 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id) int hyp_ffa_init(void *pages) { struct arm_smccc_res res; - size_t min_rxtx_sz; void *tx, *rx; if (kvm_host_psci_config.smccc_version < ARM_SMCCC_VERSION_1_2) @@ -725,35 +812,7 @@ int hyp_ffa_init(void *pages) if (FFA_MAJOR_VERSION(res.a0) != 1) return -EOPNOTSUPP; - arm_smccc_1_1_smc(FFA_ID_GET, 0, 0, 0, 0, 0, 0, 0, &res); - if (res.a0 != FFA_SUCCESS) - return -EOPNOTSUPP; - - if (res.a2 != HOST_FFA_ID) - return -EINVAL; - - arm_smccc_1_1_smc(FFA_FEATURES, FFA_FN64_RXTX_MAP, - 0, 0, 0, 0, 0, 0, &res); - if (res.a0 != FFA_SUCCESS) - return -EOPNOTSUPP; - - switch (res.a2) { - case FFA_FEAT_RXTX_MIN_SZ_4K: - min_rxtx_sz = SZ_4K; - break; - case FFA_FEAT_RXTX_MIN_SZ_16K: - min_rxtx_sz = SZ_16K; - break; - case FFA_FEAT_RXTX_MIN_SZ_64K: - min_rxtx_sz = SZ_64K; - break; - default: - return -EINVAL; - } - - if (min_rxtx_sz > PAGE_SIZE) - return -EOPNOTSUPP; - + hyp_ffa_version = FFA_VERSION_1_0; tx = pages; pages += KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE; rx = pages; @@ -775,5 +834,6 @@ int hyp_ffa_init(void *pages) .lock = __HYP_SPIN_LOCK_UNLOCKED, }; + version_lock = __HYP_SPIN_LOCK_UNLOCKED; return 0; } From patchwork Thu Jun 13 13:20:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13696796 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3B617C27C78 for ; Thu, 13 Jun 2024 13:21:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=k2687N4QagcW+pS81LF/2jVULFoFlDTqmG4f02lwQvU=; b=zOz8tu1m8LJmJd5TInOmCr5MMx 8P1jMgwskKLVK6488YgIQ3eo9SfM+sx3M+4hi2fBYPBWdGlyJbJesgwk8Irx/BdhGwjSfChaWe0MR Aslssx2kQ9fGxumkh32wV4R0yd1Xrk9BzwIBjx2IamN8rAmlhbeEG3wIBgc3naH+Zeh41fhBotO/r h5qvZAcRYfOIUqORla7WCdlvdmmqcJFuO/bFQvspJreXDQlCA6dwf3POsf5b8kK2CXu71o8Yc+jTm u4MK7LNwIkTUNYIyUjlbvurGzPmRQ/nn31QNVN+3/H9LV4ugpuP/hPWfUxyhdDN1mb4UDT6beoM4H qzx/u1EA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sHkO6-0000000GgXx-25eQ; Thu, 13 Jun 2024 13:21:10 +0000 Received: from mail-wr1-x449.google.com ([2a00:1450:4864:20::449]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sHkNx-0000000GgRF-1oJE for linux-arm-kernel@lists.infradead.org; Thu, 13 Jun 2024 13:21:02 +0000 Received: by mail-wr1-x449.google.com with SMTP id ffacd0b85a97d-358f9dffbedso625177f8f.3 for ; Thu, 13 Jun 2024 06:20:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718284857; x=1718889657; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=k2687N4QagcW+pS81LF/2jVULFoFlDTqmG4f02lwQvU=; b=m5pdvrQRQgEbHKX1JUch0+x3VoTjT/eCE1hr6A57lOUZF1mDKEO5oB9pN4cJCDesYB 6CpApg2OKZmHc+JaCJb7w/+EpiKPFs3oLWUSdZ0jP3pTWRD2LfYdNS82JUn4jBV3F7Zq LvepPLGCvB+VwSPF5qKHSJtYzHtDUynSrQzYM6L9lOEqPuFrtXo9yzAJkxInQDH26DDx ZRZ5thy0h9Heyf4xBQmak+9utmYL5Cl89eF8Ttu8SiGzsv2fvNjIaH4k7ZJ6gT4PNcgF mfmrmy10ZsTQ3P+U1eJj4x3XIZGYBtJdDIgxpZoNssx2YXgM+3+ikkXWVI6l9SpgBBAu aWWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718284857; x=1718889657; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=k2687N4QagcW+pS81LF/2jVULFoFlDTqmG4f02lwQvU=; b=XDOQgsD5IquflRQ50k7kNLsYObvlKu+TH2EvMNOyUIsyHRIC6MoMjJeBYAPhVTASnU uy12++5OwXOKvQOp4LeHTf6hoezH4AB5o0QBTz8BXsvRQiw/WnAcWhEu7BxtcQcsyYFG aFN+IZd3yiDUZW2TNFi/d8qFXR1CKA8xohkrweJx5EKWePpTK5yG2a3E7qgFr1B0xOob XcuiiuWIBJoGp92HIqp4VgNBCNxAnCC3lZuK7AS8y0gjntDh0mRU7Cs+b5C6OO9WUtM0 R40HxA0+r/TmNQGpLS4HCvu4JANc5vDYlaAWrYqeQuZSYVEuEDAYujxcJsGAj91v8qwo TlYA== X-Forwarded-Encrypted: i=1; AJvYcCUE5His+tRnTifcxSsO8U/RkG/dXvp1Xg3ueVg6aeV07RvGQsvDuISl7theIqyt6xMPdoBOBsUHRroL4mguiLQ5UwRaU56Q1Xo9RJz6OlfGLDKu2oM= X-Gm-Message-State: AOJu0YwLADIZSCayVUG/FwJVz365ViDYyKPpgRiaLIkIBC3LzuqtgWAI JlDDjT1eBu6sjUOfLcz9TlfSqEGgQBTTs0Y0nHFnqhZ/JNPUhGTCfcz58BLQmexpnGwmsz4xhRK sKBjrO78xa00ynCGhf1Cmih9cjQ== X-Google-Smtp-Source: AGHT+IGQhQ+fUdEpXPrfB7jjNHTVpmKDUpNbwNUPEJVt9Lbm8XyWi+3c3WFMeVAAl0KV4ewCMNJr1OmROkbzIeA/6/Q= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a5d:522d:0:b0:360:791c:afee with SMTP id ffacd0b85a97d-360791cb125mr1885f8f.3.1718284857386; Thu, 13 Jun 2024 06:20:57 -0700 (PDT) Date: Thu, 13 Jun 2024 13:20:33 +0000 In-Reply-To: <20240613132035.1070360-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240613132035.1070360-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.505.gda0bf45e8d-goog Message-ID: <20240613132035.1070360-3-sebastianene@google.com> Subject: [PATCH v3 2/4] KVM: arm64: Add support for FFA_PARTITION_INFO_GET From: Sebastian Ene To: catalin.marinas@arm.com, james.morse@arm.com, jean-philippe@linaro.org, maz@kernel.org, oliver.upton@linux.dev, qperret@google.com, qwandor@google.com, sudeep.holla@arm.com, suzuki.poulose@arm.com, tabba@google.com, will@kernel.org, yuzenghui@huawei.com, lpieralisi@kernel.org Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com, Sebastian Ene X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240613_062101_607780_530C7F00 X-CRM114-Status: GOOD ( 14.56 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Handle the FFA_PARTITION_INFO_GET host call inside the pKVM hypervisor and copy the response message back to the host buffers. Signed-off-by: Sebastian Ene Reviewed-by: Sudeep Holla Tested-by: Sudeep Holla --- arch/arm64/kvm/hyp/nvhe/ffa.c | 52 +++++++++++++++++++++++++++++++++++ include/linux/arm_ffa.h | 3 ++ 2 files changed, 55 insertions(+) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index c8ab51c331f0..4eaef673e98d 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -719,6 +719,55 @@ static void do_ffa_version(struct arm_smccc_res *res, hyp_spin_unlock(&version_lock); } +static void do_ffa_part_get(struct arm_smccc_res *res, + struct kvm_cpu_context *ctxt) +{ + DECLARE_REG(u32, uuid0, ctxt, 1); + DECLARE_REG(u32, uuid1, ctxt, 2); + DECLARE_REG(u32, uuid2, ctxt, 3); + DECLARE_REG(u32, uuid3, ctxt, 4); + DECLARE_REG(u32, flags, ctxt, 5); + u32 count, partition_sz, copy_sz; + + hyp_spin_lock(&host_buffers.lock); + if (!host_buffers.rx) { + ffa_to_smccc_res(res, FFA_RET_BUSY); + goto out_unlock; + } + + arm_smccc_1_1_smc(FFA_PARTITION_INFO_GET, uuid0, uuid1, + uuid2, uuid3, flags, 0, 0, + res); + + if (res->a0 != FFA_SUCCESS) + goto out_unlock; + + count = res->a2; + if (!count) + goto out_unlock; + + if (hyp_ffa_version > FFA_VERSION_1_0) { + /* Get the number of partitions deployed in the system */ + if (flags & 0x1) + goto out_unlock; + + partition_sz = res->a3; + } else { + /* FFA_VERSION_1_0 lacks the size in the response */ + partition_sz = FFA_1_0_PARTITON_INFO_SZ; + } + + copy_sz = partition_sz * count; + if (copy_sz > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE) { + ffa_to_smccc_res(res, FFA_RET_ABORTED); + goto out_unlock; + } + + memcpy(host_buffers.rx, hyp_buffers.rx, copy_sz); +out_unlock: + hyp_spin_unlock(&host_buffers.lock); +} + bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id) { struct arm_smccc_res res; @@ -773,6 +822,9 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id) case FFA_VERSION: do_ffa_version(&res, host_ctxt); goto out_handled; + case FFA_PARTITION_INFO_GET: + do_ffa_part_get(&res, host_ctxt); + goto out_handled; } if (ffa_call_supported(func_id)) diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h index c82d56768101..c6d18f50f671 100644 --- a/include/linux/arm_ffa.h +++ b/include/linux/arm_ffa.h @@ -212,6 +212,9 @@ bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; } extern const struct bus_type ffa_bus_type; +/* The FF-A 1.0 partition structure lacks the uuid[4] */ +#define FFA_1_0_PARTITON_INFO_SZ (8) + /* FFA transport related */ struct ffa_partition_info { u16 id; From patchwork Thu Jun 13 13:20:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13696795 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A0D8EC27C6E for ; Thu, 13 Jun 2024 13:21:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=u0OhOvlObTYcevtXo8Z7p/mIFsLXq1uqkU+zyx3S4LA=; b=Z5654dtOh4c8mMq8k9D4QesQ6S Cl0li33n7ET4eFAt3uz4XlcFseaNdQN9nDJa2r7gOvD9axNQI5AnaZyYkN8uD2TMaLVUcYkscwjW4 yjTTbPQQIdUSaSrjwycyIoW4L2vc4Qyo4ZF3azPZUk6iu4jjdpKEKFioI60WeElzq3F4H0qtvrOJ4 yNTaXW0wSU3JpQ5K12pgfVQnyWR6B37o9GGZOyhdvEo4XwF0ab2knvZHgIwLT9kz9s/fnALMZV9Fl TLytOc1Gj2p1cRh3mcJUOrGXCxQ7JCBlV3NVVuWPTUI6hfqrGT5bAdG0U6P8uEu7z3KCHuN/wCW5e GmNzXZcg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sHkO7-0000000GgYR-2VOm; Thu, 13 Jun 2024 13:21:11 +0000 Received: from mail-yb1-xb4a.google.com ([2607:f8b0:4864:20::b4a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sHkNz-0000000GgS9-3Jka for linux-arm-kernel@lists.infradead.org; Thu, 13 Jun 2024 13:21:05 +0000 Received: by mail-yb1-xb4a.google.com with SMTP id 3f1490d57ef6-dfdddb9b425so1987169276.2 for ; Thu, 13 Jun 2024 06:21:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718284860; x=1718889660; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=u0OhOvlObTYcevtXo8Z7p/mIFsLXq1uqkU+zyx3S4LA=; b=udhiOAS0o3uSyhcukRxnmRoYIyMVevBZmpDQUqek2wjbPM9kHIhiJno9i3RZJ9Wyi/ xDPGyLGH3hOA193knXp9tOj7wAKBy60GlBfR/n0Y+Rvb2UZwfAeZgueo9CvyIQ+vA0M2 XzudJD8h/zoofty+/v3hVC/60ZLVRU8n/ooPgYrJK8v61rW28cAU6Dfkau0vMac9M/mf BwerSp4AMrCWswkjP1Bt03K0EzTacpLx8rSRJBX4nT9IEQ23AUhS8naizRej1Q5qgBpx yFkdgNlKe/hxEw/H/FjVGPtonpVFFdgc98zQs3gSC4iweckEtIoPA+mr/MjwwLyvtGgY MLdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718284860; x=1718889660; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=u0OhOvlObTYcevtXo8Z7p/mIFsLXq1uqkU+zyx3S4LA=; b=hK5UKHFsKpGE4QUYmEkCrsQmDJu1D9KiypL4HdywI7kgTeKZv1UPgwWKpeQfEZooCw NWOGsr5aUMJSr+Ls6KX/s8XI2naNUfnFfXuwutfVR19siNJicryo1gVkJfQ7GyU6RdU/ eAd2kili0QElvJxpYDwfcT077SVeliQwkLyyTJqI9brZzxBTb0UNzw1OY3eh1o3I+tCy jKoaVGi8MR6ILKnZKeCOwwX8fERWvIeCCyxv4l1SIk+gNjNqt0pbAHfW7896spgMquxs mukVS8Kr2een7jr/rpMnWpY8J6UukdjT41QmZGz6Q5RVOZSZbNYy0SD8Gp9fo6S5AtIo Z4Bw== X-Forwarded-Encrypted: i=1; AJvYcCV5Mqv0YxeEXKOrdM69HmH74LGBNYl2EWLaF98VBWYqLnfy29FembNwPwIvxvixJ7ZkSwqhI+KrBUueUgaslrElUe3XIJ3w6aEccIIHhEYUlXTdyJI= X-Gm-Message-State: AOJu0YxdYJzZVAODW2jT92rGfDqEUINIIXdQBW0mkcFGuLkaM/Rva8+d BJ2p6tPfc1LIoVzaPXjKWsuytD8I99tUFUFMAXvncvDEIt8GnGxbSitKRxNZGNtvX6BQaCHWcTy cxKQ/PiZ0huovb2wO8vQgt8FraQ== X-Google-Smtp-Source: AGHT+IFmR5E42s+BCdl2zDYX/0jaaUeTAn+ERNofvz51IQhPRv6eG1U8A9CWU+hty3Xq9QgQmwvTlYwuQ2lHK/2XOVM= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a05:6902:723:b0:dff:ee8:14d6 with SMTP id 3f1490d57ef6-dff0ee81893mr156506276.10.1718284859883; Thu, 13 Jun 2024 06:20:59 -0700 (PDT) Date: Thu, 13 Jun 2024 13:20:34 +0000 In-Reply-To: <20240613132035.1070360-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240613132035.1070360-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.505.gda0bf45e8d-goog Message-ID: <20240613132035.1070360-4-sebastianene@google.com> Subject: [PATCH v3 3/4] KVM: arm64: Update the identification range for the FF-A smcs From: Sebastian Ene To: catalin.marinas@arm.com, james.morse@arm.com, jean-philippe@linaro.org, maz@kernel.org, oliver.upton@linux.dev, qperret@google.com, qwandor@google.com, sudeep.holla@arm.com, suzuki.poulose@arm.com, tabba@google.com, will@kernel.org, yuzenghui@huawei.com, lpieralisi@kernel.org Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com, Sebastian Ene X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240613_062103_884353_CF6A0858 X-CRM114-Status: GOOD ( 11.74 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The FF-A spec 1.2 reserves the following ranges for identifying FF-A calls: 0x84000060-0x840000FF: FF-A 32-bit calls 0xC4000060-0xC40000FF: FF-A 64-bit calls. Use the range identification according to the spec and allow calls that are currently out of the range(eg. FFA_MSG_SEND_DIRECT_REQ2) to be identified correctly. Acked-by: Will Deacon Signed-off-by: Sebastian Ene Reviewed-by: Sudeep Holla Tested-by: Sudeep Holla --- arch/arm64/kvm/hyp/include/nvhe/ffa.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/include/nvhe/ffa.h b/arch/arm64/kvm/hyp/include/nvhe/ffa.h index d9fd5e6c7d3c..146e0aebfa1c 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/ffa.h +++ b/arch/arm64/kvm/hyp/include/nvhe/ffa.h @@ -9,7 +9,7 @@ #include #define FFA_MIN_FUNC_NUM 0x60 -#define FFA_MAX_FUNC_NUM 0x7F +#define FFA_MAX_FUNC_NUM 0xFF int hyp_ffa_init(void *pages); bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id); From patchwork Thu Jun 13 13:20:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13696797 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CA929C27C4F for ; Thu, 13 Jun 2024 13:21:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=85ojJxkNYXxh97Mo9k1gfrYfK0JeNvYJnaS4+QvvHCA=; b=sksaWmyemLbPt0YETBVTg/UAVF JgEKuWGgyybmv7M03Fw5TH5h7lTgfyUhLyPyaUOcryR0MM7MLrPbdom2yfxElcf+DM87TYaEAuDvq zh4vDVU45pmdlwfrX3JMuqjMgChwe4ifcHubB91QvtENJ2Nf47hufPO5ehRVP0inFgAFLRz9j3aeU 0sztxAHOJXGU2L0f/Y8OACiajI7f2qUbw28qy1+LEmhCQ0MsdEvVosCrpKFnsuVLEbPrfawnNePc4 KxFxoVyR/jZ2Q4OrNGyikH4A6NiAJANz4d21wiQx5TCsoekaYVYBZ37IWhzQHPxUUxno02CGwpWEo S06b9gYQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sHkO8-0000000GgZ4-1NfA; Thu, 13 Jun 2024 13:21:12 +0000 Received: from mail-wm1-x34a.google.com ([2a00:1450:4864:20::34a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sHkO3-0000000GgTB-0i2t for linux-arm-kernel@lists.infradead.org; Thu, 13 Jun 2024 13:21:08 +0000 Received: by mail-wm1-x34a.google.com with SMTP id 5b1f17b1804b1-421f3b7b27eso9478455e9.1 for ; Thu, 13 Jun 2024 06:21:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718284862; x=1718889662; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=85ojJxkNYXxh97Mo9k1gfrYfK0JeNvYJnaS4+QvvHCA=; b=D6oJKZs/ijUdV6ImAib6HCiu/AZtVTtdtyoOIX/F+ReYM+K9t71XqREYgGIloHblAF Ww7+0/htAfq2XHjZC06RVSY+0x5eWxOvwKumOD9DYJZVz4Jou7ROQ4QMxgC/Eo8duGR7 smX59ePKRbQ0RqF3RYRw1aj1H+u8h0vA3QAy7gsdNBT6UOYFEtgGYpMCysSrxzuz+InN OtG9x7inae9+R4FRcFQLWDs5rMxZRd2RyxzVzQn1gssNQfhDb1Qj3GAQGFBBNsnn/MaC RfS/VtgBFRfU2rKTHSw5EMcXooaORPYfzIsNgVYVuCwFfRxerOpThax0yLKgWTgJ2s9R 9Pcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718284862; x=1718889662; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=85ojJxkNYXxh97Mo9k1gfrYfK0JeNvYJnaS4+QvvHCA=; b=J2Bm6CikLD2dptCiGmZan2vwgazyf+zIQoh2a6NkD2jHOcxiB8RTsFLssgnI1y/D4W DvB0bn3GlXYt/bUpOOH1t2QZgs/96G3RaokQLp1WlLfhORWf9IR1f7xCFNKw8AeVj5Hp ZLLj5BJsOU0nxVKSfmd7jGRGYdOLT6BAD+WJ/DPAYA53imahJHNQpW9rDjOj0Amqvn29 ddXVPI+BPTlTdulwkdyl00yv4FinX30RE0kKG6LMp8AkXmiokza3oRfJdmsPAeTMyawa 7HpHgdbGFGs2vXpQF2NWjteCwrBaYJwPq+TMpqk+gpwmHKd37DvVHNUSql/UbxngtcY6 e4TQ== X-Forwarded-Encrypted: i=1; AJvYcCU1zBTk7f2uqHZ8uavrSPIGnRb3F0g157dKTn3ZQeiSQf2DfMedkeQXKfINz9TifSWMQ4Vu1uZJsEA1g5fMckWN/521v/yr8qVwdA+JENso3hNBq3o= X-Gm-Message-State: AOJu0YyiBv8vVY2Q60HYfmWxnLqzl/NRDN12J4OVf0WEZ6pmMydKVZnD zxFuFT+5pXbLhnLuQCJnIMju/I3gV8E4mPBfo8v3rIqMsVCQ9US1xcCJcEICWEhA73yypyMmxf1 k+2bVTDxM7MA7foKxqCFRAdRxdg== X-Google-Smtp-Source: AGHT+IEGmcAxjB2wRcZVPwbydQye9U+Lfxf52+t870ONm/t/2enRlN5yWNU9fxSxYfGOvDAZatwr0XKHsQNvtwSMq2I= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a5d:4e09:0:b0:354:f4a4:6d35 with SMTP id ffacd0b85a97d-35fe8928988mr10512f8f.13.1718284862437; Thu, 13 Jun 2024 06:21:02 -0700 (PDT) Date: Thu, 13 Jun 2024 13:20:35 +0000 In-Reply-To: <20240613132035.1070360-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240613132035.1070360-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.505.gda0bf45e8d-goog Message-ID: <20240613132035.1070360-5-sebastianene@google.com> Subject: [PATCH v3 4/4] KVM: arm64: Use FF-A 1.1 with pKVM From: Sebastian Ene To: catalin.marinas@arm.com, james.morse@arm.com, jean-philippe@linaro.org, maz@kernel.org, oliver.upton@linux.dev, qperret@google.com, qwandor@google.com, sudeep.holla@arm.com, suzuki.poulose@arm.com, tabba@google.com, will@kernel.org, yuzenghui@huawei.com, lpieralisi@kernel.org Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com, Sebastian Ene X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240613_062107_242321_2E641286 X-CRM114-Status: GOOD ( 15.11 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Now that the layout of the structures is compatible with 1.1 it is time to probe the 1.1 version of the FF-A protocol inside the hypervisor. If the TEE doesn't support it, it should return the minimum supported version. Signed-off-by: Sebastian Ene Reviewed-by: Sudeep Holla Tested-by: Sudeep Holla --- arch/arm64/kvm/hyp/nvhe/ffa.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 4eaef673e98d..fdb63b7857ec 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -457,7 +457,7 @@ static __always_inline void do_ffa_mem_xfer(const u64 func_id, memcpy(buf, host_buffers.tx, fraglen); ep_mem_access = (void *)buf + - ffa_mem_desc_offset(buf, 0, FFA_VERSION_1_0); + ffa_mem_desc_offset(buf, 0, hyp_ffa_version); offset = ep_mem_access->composite_off; if (!offset || buf->ep_count != 1 || buf->sender_id != HOST_FFA_ID) { ret = FFA_RET_INVALID_PARAMETERS; @@ -536,7 +536,7 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *res, fraglen = res->a2; ep_mem_access = (void *)buf + - ffa_mem_desc_offset(buf, 0, FFA_VERSION_1_0); + ffa_mem_desc_offset(buf, 0, hyp_ffa_version); offset = ep_mem_access->composite_off; /* * We can trust the SPMD to get this right, but let's at least @@ -844,7 +844,7 @@ int hyp_ffa_init(void *pages) if (kvm_host_psci_config.smccc_version < ARM_SMCCC_VERSION_1_2) return 0; - arm_smccc_1_1_smc(FFA_VERSION, FFA_VERSION_1_0, 0, 0, 0, 0, 0, 0, &res); + arm_smccc_1_1_smc(FFA_VERSION, FFA_VERSION_1_1, 0, 0, 0, 0, 0, 0, &res); if (res.a0 == FFA_RET_NOT_SUPPORTED) return 0; @@ -864,7 +864,11 @@ int hyp_ffa_init(void *pages) if (FFA_MAJOR_VERSION(res.a0) != 1) return -EOPNOTSUPP; - hyp_ffa_version = FFA_VERSION_1_0; + if (FFA_MINOR_VERSION(res.a0) < FFA_MINOR_VERSION(FFA_VERSION_1_1)) + hyp_ffa_version = res.a0; + else + hyp_ffa_version = FFA_VERSION_1_1; + tx = pages; pages += KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE; rx = pages;