kvmarm.lists.cs.columbia.edu archive mirror
 help / color / mirror / Atom feed
From: Marc Zyngier <marc.zyngier@arm.com>
To: "Paolo Bonzini" <pbonzini@redhat.com>,
	"Radim Krčmář" <rkrcmar@redhat.com>
Cc: kvm@vger.kernel.org, Will Deacon <will.deacon@arm.com>,
	Kristina Martsenko <kristina.martsenko@arm.com>,
	"zhang . lei" <zhang.lei@jp.fujitsu.com>,
	Julien Grall <julien.grall@arm.com>,
	kvmarm@lists.cs.columbia.edu,
	Amit Daniel Kachhap <amit.kachhap@arm.com>,
	Dave Martin <Dave.Martin@arm.com>,
	linux-arm-kernel@lists.infradead.org
Subject: [PATCH 20/56] arm64/sve: In-kernel vector length availability query interface
Date: Fri,  3 May 2019 13:43:51 +0100	[thread overview]
Message-ID: <20190503124427.190206-21-marc.zyngier@arm.com> (raw)
In-Reply-To: <20190503124427.190206-1-marc.zyngier@arm.com>

From: Dave Martin <Dave.Martin@arm.com>

KVM will need to interrogate the set of SVE vector lengths
available on the system.

This patch exposes the relevant bits to the kernel, along with a
sve_vq_available() helper to check whether a particular vector
length is supported.

__vq_to_bit() and __bit_to_vq() are not intended for use outside
these functions: now that these are exposed outside fpsimd.c, they
are prefixed with __ in order to provide an extra hint that they
are not intended for general-purpose use.

Signed-off-by: Dave Martin <Dave.Martin@arm.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: zhang.lei <zhang.lei@jp.fujitsu.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm64/include/asm/fpsimd.h | 29 +++++++++++++++++++++++++++
 arch/arm64/kernel/fpsimd.c      | 35 ++++++++-------------------------
 2 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h
index df7a14305222..ad6d2e41eb37 100644
--- a/arch/arm64/include/asm/fpsimd.h
+++ b/arch/arm64/include/asm/fpsimd.h
@@ -24,10 +24,13 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/bitmap.h>
 #include <linux/build_bug.h>
+#include <linux/bug.h>
 #include <linux/cache.h>
 #include <linux/init.h>
 #include <linux/stddef.h>
+#include <linux/types.h>
 
 #if defined(__KERNEL__) && defined(CONFIG_COMPAT)
 /* Masks for extracting the FPSR and FPCR from the FPSCR */
@@ -89,6 +92,32 @@ extern u64 read_zcr_features(void);
 
 extern int __ro_after_init sve_max_vl;
 extern int __ro_after_init sve_max_virtualisable_vl;
+/* Set of available vector lengths, as vq_to_bit(vq): */
+extern __ro_after_init DECLARE_BITMAP(sve_vq_map, SVE_VQ_MAX);
+
+/*
+ * Helpers to translate bit indices in sve_vq_map to VQ values (and
+ * vice versa).  This allows find_next_bit() to be used to find the
+ * _maximum_ VQ not exceeding a certain value.
+ */
+static inline unsigned int __vq_to_bit(unsigned int vq)
+{
+	return SVE_VQ_MAX - vq;
+}
+
+static inline unsigned int __bit_to_vq(unsigned int bit)
+{
+	if (WARN_ON(bit >= SVE_VQ_MAX))
+		bit = SVE_VQ_MAX - 1;
+
+	return SVE_VQ_MAX - bit;
+}
+
+/* Ensure vq >= SVE_VQ_MIN && vq <= SVE_VQ_MAX before calling this function */
+static inline bool sve_vq_available(unsigned int vq)
+{
+	return test_bit(__vq_to_bit(vq), sve_vq_map);
+}
 
 #ifdef CONFIG_ARM64_SVE
 
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 8a93afa78600..577296bba730 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -136,7 +136,7 @@ static int sve_default_vl = -1;
 int __ro_after_init sve_max_vl = SVE_VL_MIN;
 int __ro_after_init sve_max_virtualisable_vl = SVE_VL_MIN;
 /* Set of available vector lengths, as vq_to_bit(vq): */
-static __ro_after_init DECLARE_BITMAP(sve_vq_map, SVE_VQ_MAX);
+__ro_after_init DECLARE_BITMAP(sve_vq_map, SVE_VQ_MAX);
 /* Set of vector lengths present on at least one cpu: */
 static __ro_after_init DECLARE_BITMAP(sve_vq_partial_map, SVE_VQ_MAX);
 static void __percpu *efi_sve_state;
@@ -269,25 +269,6 @@ void fpsimd_save(void)
 	}
 }
 
-/*
- * Helpers to translate bit indices in sve_vq_map to VQ values (and
- * vice versa).  This allows find_next_bit() to be used to find the
- * _maximum_ VQ not exceeding a certain value.
- */
-
-static unsigned int vq_to_bit(unsigned int vq)
-{
-	return SVE_VQ_MAX - vq;
-}
-
-static unsigned int bit_to_vq(unsigned int bit)
-{
-	if (WARN_ON(bit >= SVE_VQ_MAX))
-		bit = SVE_VQ_MAX - 1;
-
-	return SVE_VQ_MAX - bit;
-}
-
 /*
  * All vector length selection from userspace comes through here.
  * We're on a slow path, so some sanity-checks are included.
@@ -309,8 +290,8 @@ static unsigned int find_supported_vector_length(unsigned int vl)
 		vl = max_vl;
 
 	bit = find_next_bit(sve_vq_map, SVE_VQ_MAX,
-			    vq_to_bit(sve_vq_from_vl(vl)));
-	return sve_vl_from_vq(bit_to_vq(bit));
+			    __vq_to_bit(sve_vq_from_vl(vl)));
+	return sve_vl_from_vq(__bit_to_vq(bit));
 }
 
 #ifdef CONFIG_SYSCTL
@@ -648,7 +629,7 @@ static void sve_probe_vqs(DECLARE_BITMAP(map, SVE_VQ_MAX))
 		write_sysreg_s(zcr | (vq - 1), SYS_ZCR_EL1); /* self-syncing */
 		vl = sve_get_vl();
 		vq = sve_vq_from_vl(vl); /* skip intervening lengths */
-		set_bit(vq_to_bit(vq), map);
+		set_bit(__vq_to_bit(vq), map);
 	}
 }
 
@@ -717,7 +698,7 @@ int sve_verify_vq_map(void)
 	 * Mismatches above sve_max_virtualisable_vl are fine, since
 	 * no guest is allowed to configure ZCR_EL2.LEN to exceed this:
 	 */
-	if (sve_vl_from_vq(bit_to_vq(b)) <= sve_max_virtualisable_vl) {
+	if (sve_vl_from_vq(__bit_to_vq(b)) <= sve_max_virtualisable_vl) {
 		pr_warn("SVE: cpu%d: Unsupported vector length(s) present\n",
 			smp_processor_id());
 		return -EINVAL;
@@ -801,8 +782,8 @@ void __init sve_setup(void)
 	 * so sve_vq_map must have at least SVE_VQ_MIN set.
 	 * If something went wrong, at least try to patch it up:
 	 */
-	if (WARN_ON(!test_bit(vq_to_bit(SVE_VQ_MIN), sve_vq_map)))
-		set_bit(vq_to_bit(SVE_VQ_MIN), sve_vq_map);
+	if (WARN_ON(!test_bit(__vq_to_bit(SVE_VQ_MIN), sve_vq_map)))
+		set_bit(__vq_to_bit(SVE_VQ_MIN), sve_vq_map);
 
 	zcr = read_sanitised_ftr_reg(SYS_ZCR_EL1);
 	sve_max_vl = sve_vl_from_vq((zcr & ZCR_ELx_LEN_MASK) + 1);
@@ -831,7 +812,7 @@ void __init sve_setup(void)
 		/* No virtualisable VLs?  This is architecturally forbidden. */
 		sve_max_virtualisable_vl = SVE_VQ_MIN;
 	else /* b + 1 < SVE_VQ_MAX */
-		sve_max_virtualisable_vl = sve_vl_from_vq(bit_to_vq(b + 1));
+		sve_max_virtualisable_vl = sve_vl_from_vq(__bit_to_vq(b + 1));
 
 	if (sve_max_virtualisable_vl > sve_max_vl)
 		sve_max_virtualisable_vl = sve_max_vl;
-- 
2.20.1

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

  parent reply	other threads:[~2019-05-03 12:45 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-03 12:43 [GIT PULL] KVM/arm updates for 5.2 Marc Zyngier
2019-05-03 12:43 ` [PATCH 01/56] KVM: Documentation: Document arm64 core registers in detail Marc Zyngier
2019-05-03 12:43 ` [PATCH 02/56] arm64: fpsimd: Always set TIF_FOREIGN_FPSTATE on task state flush Marc Zyngier
2019-05-03 12:43 ` [PATCH 03/56] KVM: arm64: Delete orphaned declaration for __fpsimd_enabled() Marc Zyngier
2019-05-03 12:43 ` [PATCH 04/56] KVM: arm64: Refactor kvm_arm_num_regs() for easier maintenance Marc Zyngier
2019-05-03 12:43 ` [PATCH 05/56] KVM: arm64: Add missing #includes to kvm_host.h Marc Zyngier
2019-05-03 12:43 ` [PATCH 06/56] arm64/sve: Clarify role of the VQ map maintenance functions Marc Zyngier
2019-05-03 12:43 ` [PATCH 07/56] arm64/sve: Check SVE virtualisability Marc Zyngier
2019-05-03 12:43 ` [PATCH 08/56] arm64/sve: Enable SVE state tracking for non-task contexts Marc Zyngier
2019-05-03 12:43 ` [PATCH 09/56] KVM: arm64: Add a vcpu flag to control SVE visibility for the guest Marc Zyngier
2019-05-03 12:43 ` [PATCH 10/56] KVM: arm64: Propagate vcpu into read_id_reg() Marc Zyngier
2019-05-03 12:43 ` [PATCH 11/56] KVM: arm64: Support runtime sysreg visibility filtering Marc Zyngier
2019-05-03 12:43 ` [PATCH 12/56] KVM: arm64/sve: System register context switch and access support Marc Zyngier
2019-05-03 12:43 ` [PATCH 13/56] KVM: arm64/sve: Context switch the SVE registers Marc Zyngier
2019-05-03 12:43 ` [PATCH 14/56] KVM: Allow 2048-bit register access via ioctl interface Marc Zyngier
2019-05-03 12:43 ` [PATCH 15/56] KVM: arm64: Add missing #include of <linux/string.h> in guest.c Marc Zyngier
2019-05-03 12:43 ` [PATCH 16/56] KVM: arm64: Factor out core register ID enumeration Marc Zyngier
2019-05-03 12:43 ` [PATCH 17/56] KVM: arm64: Reject ioctl access to FPSIMD V-regs on SVE vcpus Marc Zyngier
2019-05-03 12:43 ` [PATCH 18/56] KVM: arm64/sve: Add SVE support to register access ioctl interface Marc Zyngier
2019-05-03 12:43 ` [PATCH 19/56] KVM: arm64: Enumerate SVE register indices for KVM_GET_REG_LIST Marc Zyngier
2019-05-03 12:43 ` Marc Zyngier [this message]
2019-05-03 12:43 ` [PATCH 21/56] KVM: arm/arm64: Add hook for arch-specific KVM initialisation Marc Zyngier
2019-05-03 12:43 ` [PATCH 22/56] KVM: arm/arm64: Add KVM_ARM_VCPU_FINALIZE ioctl Marc Zyngier
2019-05-03 12:43 ` [PATCH 23/56] KVM: arm64/sve: Add pseudo-register for the guest's vector lengths Marc Zyngier
2019-05-03 12:43 ` [PATCH 24/56] KVM: arm64/sve: Allow userspace to enable SVE for vcpus Marc Zyngier
2019-05-03 12:43 ` [PATCH 25/56] KVM: arm64: Add a capability to advertise SVE support Marc Zyngier
2019-05-03 12:43 ` [PATCH 26/56] KVM: Document errors for KVM_GET_ONE_REG and KVM_SET_ONE_REG Marc Zyngier
2019-05-03 12:43 ` [PATCH 27/56] KVM: arm64/sve: Document KVM API extensions for SVE Marc Zyngier
2019-05-03 12:43 ` [PATCH 28/56] arm64: KVM: Fix system register enumeration Marc Zyngier
2019-05-03 12:44 ` [PATCH 29/56] arm64/sve: Clarify vq map semantics Marc Zyngier
2019-05-03 12:44 ` [PATCH 30/56] KVM: arm/arm64: Demote kvm_arm_init_arch_resources() to just set up SVE Marc Zyngier
2019-05-03 12:44 ` [PATCH 31/56] KVM: arm: Make vcpu finalization stubs into inline functions Marc Zyngier
2019-05-03 12:44 ` [PATCH 32/56] KVM: arm64/sve: sys_regs: Demote redundant vcpu_has_sve() checks to WARNs Marc Zyngier
2019-05-03 12:44 ` [PATCH 33/56] KVM: arm64/sve: Clean up UAPI register ID definitions Marc Zyngier
2019-05-03 12:44 ` [PATCH 34/56] KVM: arm64/sve: Miscellaneous tidyups in guest.c Marc Zyngier
2019-05-03 12:44 ` [PATCH 35/56] KVM: arm64/sve: Make register ioctl access errors more consistent Marc Zyngier
2019-05-03 12:44 ` [PATCH 36/56] KVM: arm64/sve: WARN when avoiding divide-by-zero in sve_reg_to_region() Marc Zyngier
2019-05-03 12:44 ` [PATCH 37/56] KVM: arm64/sve: Simplify KVM_REG_ARM64_SVE_VLS array sizing Marc Zyngier
2019-05-03 12:44 ` [PATCH 38/56] KVM: arm64/sve: Explain validity checks in set_sve_vls() Marc Zyngier
2019-05-03 12:44 ` [PATCH 39/56] KVM: arm/arm64: Clean up vcpu finalization function parameter naming Marc Zyngier
2019-05-03 12:44 ` [PATCH 40/56] KVM: Clarify capability requirements for KVM_ARM_VCPU_FINALIZE Marc Zyngier
2019-05-03 12:44 ` [PATCH 41/56] KVM: Clarify KVM_{SET, GET}_ONE_REG error code documentation Marc Zyngier
2019-05-03 12:44 ` [PATCH 42/56] KVM: arm64: Clarify access behaviour for out-of-range SVE register slice IDs Marc Zyngier
2019-05-03 12:44 ` [PATCH 43/56] KVM: arm64: Add a vcpu flag to control ptrauth for guest Marc Zyngier
2019-05-03 12:44 ` [PATCH 44/56] KVM: arm/arm64: Context-switch ptrauth registers Marc Zyngier
2019-05-03 12:44 ` [PATCH 45/56] KVM: arm64: Add userspace flag to enable pointer authentication Marc Zyngier
2019-05-03 12:44 ` [PATCH 46/56] KVM: arm64: Add capability to advertise ptrauth for guest Marc Zyngier
2019-05-03 12:44 ` [PATCH 47/56] arm64: arm_pmu: Remove unnecessary isb instruction Marc Zyngier
2019-05-03 12:44 ` [PATCH 48/56] arm64: KVM: Encapsulate kvm_cpu_context in kvm_host_data Marc Zyngier
2019-05-03 12:44 ` [PATCH 49/56] arm64: KVM: Add accessors to track guest/host only counters Marc Zyngier
2019-05-03 12:44 ` [PATCH 50/56] arm64: arm_pmu: Add !VHE support for exclude_host/exclude_guest attributes Marc Zyngier
2019-05-03 12:44 ` [PATCH 51/56] arm64: KVM: Enable !VHE support for :G/:H perf event modifiers Marc Zyngier
2019-05-03 12:44 ` [PATCH 52/56] arm64: KVM: Enable VHE " Marc Zyngier
2019-05-03 12:44 ` [PATCH 53/56] arm64: KVM: Avoid isb's by using direct pmxevtyper sysreg Marc Zyngier
2019-05-03 12:44 ` [PATCH 54/56] arm64: docs: Document perf event attributes Marc Zyngier
2019-05-03 12:44 ` [PATCH 55/56] arm64: KVM: Fix perf cycle counter support for VHE Marc Zyngier
2019-05-03 12:44 ` [PATCH 56/56] KVM: arm64: Fix ptrauth ID register masking logic Marc Zyngier
2019-05-15 21:42 ` [GIT PULL] KVM/arm updates for 5.2 Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190503124427.190206-21-marc.zyngier@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=Dave.Martin@arm.com \
    --cc=amit.kachhap@arm.com \
    --cc=julien.grall@arm.com \
    --cc=kristina.martsenko@arm.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.com \
    --cc=will.deacon@arm.com \
    --cc=zhang.lei@jp.fujitsu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).