linux-arch.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dave Martin <Dave.Martin@arm.com>
To: linux-arm-kernel@lists.infradead.org
Cc: "Catalin Marinas" <catalin.marinas@arm.com>,
	"Will Deacon" <will.deacon@arm.com>,
	"Ard Biesheuvel" <ard.biesheuvel@linaro.org>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Szabolcs Nagy" <szabolcs.nagy@arm.com>,
	"Okamoto Takayuki" <tokamoto@jp.fujitsu.com>,
	kvmarm@lists.cs.columbia.edu, libc-alpha@sourceware.org,
	linux-arch@vger.kernel.org
Subject: [PATCH v4 25/28] arm64/sve: Detect SVE and activate runtime support
Date: Fri, 27 Oct 2017 11:51:07 +0100	[thread overview]
Message-ID: <1509101470-7881-26-git-send-email-Dave.Martin@arm.com> (raw)
In-Reply-To: <1509101470-7881-1-git-send-email-Dave.Martin@arm.com>

This patch enables detection of hardware SVE support via the
cpufeatures framework, and reports its presence to the kernel and
userspace via the new ARM64_SVE cpucap and HWCAP_SVE hwcap
respectively.

Userspace can also detect SVE using ID_AA64PFR0_EL1, using the
cpufeatures MRS emulation.

When running on hardware that supports SVE, this enables runtime
kernel support for SVE, and allows user tasks to execute SVE
instructions and make of the of the SVE-specific user/kernel
interface extensions implemented by this series.

Signed-off-by: Dave Martin <Dave.Martin@arm.com>
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>

---

**Dropped** Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
The entry.S changes need reviewing; however the rest of the cpufeatures
support (reviewed by Suzuki) has not changed and shouldn't need re-
review.

Changes since v3
----------------

Changes requested by Catalin Marinas / Will Deacon:

 * ABI change: Zero SVE regs on syscall entry:

   Move to asm alternatives for skipping SVE discard at syscall entry,
   now that we have a suitable cpucap defined.

Miscellaneous:

 * Add HWCAP_SVE description to elf_hwcaps.txt
---
 Documentation/arm64/cpu-feature-registers.txt |  6 +++++-
 Documentation/arm64/elf_hwcaps.txt            |  4 ++++
 arch/arm64/include/asm/cpucaps.h              |  3 ++-
 arch/arm64/include/asm/cpufeature.h           |  3 ++-
 arch/arm64/include/uapi/asm/hwcap.h           |  1 +
 arch/arm64/kernel/cpufeature.c                | 17 +++++++++++++++++
 arch/arm64/kernel/cpuinfo.c                   |  1 +
 arch/arm64/kernel/entry.S                     |  7 ++++---
 8 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/Documentation/arm64/cpu-feature-registers.txt b/Documentation/arm64/cpu-feature-registers.txt
index 011ddfc..bd9b3fa 100644
--- a/Documentation/arm64/cpu-feature-registers.txt
+++ b/Documentation/arm64/cpu-feature-registers.txt
@@ -142,7 +142,11 @@ infrastructure:
      x--------------------------------------------------x
      | Name                         |  bits   | visible |
      |--------------------------------------------------|
-     | RES0                         | [63-28] |    n    |
+     | RES0                         | [63-36] |    n    |
+     |--------------------------------------------------|
+     | SVE                          | [35-32] |    y    |
+     |--------------------------------------------------|
+     | RES0                         | [31-28] |    n    |
      |--------------------------------------------------|
      | GIC                          | [27-24] |    n    |
      |--------------------------------------------------|
diff --git a/Documentation/arm64/elf_hwcaps.txt b/Documentation/arm64/elf_hwcaps.txt
index 0ba1805..89edba1 100644
--- a/Documentation/arm64/elf_hwcaps.txt
+++ b/Documentation/arm64/elf_hwcaps.txt
@@ -154,3 +154,7 @@ HWCAP_ASIMDDP
 HWCAP_SHA512
 
     Functionality implied by ID_AA64ISAR0_EL1.SHA2 == 0b0002.
+
+HWCAP_SVE
+
+    Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001.
diff --git a/arch/arm64/include/asm/cpucaps.h b/arch/arm64/include/asm/cpucaps.h
index 8da6216..2ff7c5e 100644
--- a/arch/arm64/include/asm/cpucaps.h
+++ b/arch/arm64/include/asm/cpucaps.h
@@ -40,7 +40,8 @@
 #define ARM64_WORKAROUND_858921			19
 #define ARM64_WORKAROUND_CAVIUM_30115		20
 #define ARM64_HAS_DCPOP				21
+#define ARM64_SVE				22
 
-#define ARM64_NCAPS				22
+#define ARM64_NCAPS				23
 
 #endif /* __ASM_CPUCAPS_H */
diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
index 9b27e8c..ac67cfc 100644
--- a/arch/arm64/include/asm/cpufeature.h
+++ b/arch/arm64/include/asm/cpufeature.h
@@ -273,7 +273,8 @@ static inline bool system_uses_ttbr0_pan(void)
 
 static inline bool system_supports_sve(void)
 {
-	return false;
+	return IS_ENABLED(CONFIG_ARM64_SVE) &&
+		cpus_have_const_cap(ARM64_SVE);
 }
 
 /*
diff --git a/arch/arm64/include/uapi/asm/hwcap.h b/arch/arm64/include/uapi/asm/hwcap.h
index a4bad90..6229410 100644
--- a/arch/arm64/include/uapi/asm/hwcap.h
+++ b/arch/arm64/include/uapi/asm/hwcap.h
@@ -41,5 +41,6 @@
 #define HWCAP_SM4		(1 << 19)
 #define HWCAP_ASIMDDP		(1 << 20)
 #define HWCAP_SHA512		(1 << 21)
+#define HWCAP_SVE		(1 << 22)
 
 #endif /* _UAPI__ASM_HWCAP_H */
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index 2154373..c5ba009 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -145,6 +145,7 @@ static const struct arm64_ftr_bits ftr_id_aa64isar1[] = {
 };
 
 static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
+	ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_SVE_SHIFT, 4, 0),
 	ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_GIC_SHIFT, 4, 0),
 	S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_ASIMD_SHIFT, 4, ID_AA64PFR0_ASIMD_NI),
 	S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_FP_SHIFT, 4, ID_AA64PFR0_FP_NI),
@@ -948,6 +949,19 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
 		.min_field_value = 1,
 	},
 #endif
+#ifdef CONFIG_ARM64_SVE
+	{
+		.desc = "Scalable Vector Extension",
+		.capability = ARM64_SVE,
+		.def_scope = SCOPE_SYSTEM,
+		.sys_reg = SYS_ID_AA64PFR0_EL1,
+		.sign = FTR_UNSIGNED,
+		.field_pos = ID_AA64PFR0_SVE_SHIFT,
+		.min_field_value = ID_AA64PFR0_SVE,
+		.matches = has_cpuid_feature,
+		.enable = sve_kernel_enable,
+	},
+#endif /* CONFIG_ARM64_SVE */
 	{},
 };
 
@@ -985,6 +999,9 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
 	HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_JSCVT_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, HWCAP_JSCVT),
 	HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_FCMA_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, HWCAP_FCMA),
 	HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_LRCPC_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, HWCAP_LRCPC),
+#ifdef CONFIG_ARM64_SVE
+	HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_SVE_SHIFT, FTR_UNSIGNED, ID_AA64PFR0_SVE, CAP_HWCAP, HWCAP_SVE),
+#endif
 	{},
 };
 
diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
index 58da504..1e25545 100644
--- a/arch/arm64/kernel/cpuinfo.c
+++ b/arch/arm64/kernel/cpuinfo.c
@@ -75,6 +75,7 @@ static const char *const hwcap_str[] = {
 	"sm4",
 	"asimddp",
 	"sha512",
+	"sve",
 	NULL
 };
 
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index 56e848f..67522ac 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -853,9 +853,10 @@ el0_svc:
 	mov	wscno, w8			// syscall number in w8
 	mov	wsc_nr, #__NR_syscalls
 
-#ifndef CONFIG_ARM64_SVE
+#ifdef CONFIG_ARM64_SVE
+alternative_if_not ARM64_SVE
 	b	el0_svc_naked
-#else
+alternative_else_nop_endif
 	tbz	x16, #TIF_SVE, el0_svc_naked	// Skip unless TIF_SVE set:
 	bic	x16, x16, #_TIF_SVE		// discard SVE state
 	str	x16, [tsk, #TSK_TI_FLAGS]
@@ -870,7 +871,7 @@ el0_svc:
 	mrs	x9, cpacr_el1
 	bic	x9, x9, #CPACR_EL1_ZEN_EL0EN	// disable SVE for el0
 	msr	cpacr_el1, x9			// synchronised by eret to el0
-#endif /* CONFIG_ARM64_SVE */
+#endif
 
 el0_svc_naked:					// compat entry point
 	stp	x0, xscno, [sp, #S_ORIG_X0]	// save the original x0 and syscall number
-- 
2.1.4

  parent reply	other threads:[~2017-10-27 10:52 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-27 10:50 [PATCH v4 00/28] ARM Scalable Vector Extension (SVE) Dave Martin
2017-10-27 10:50 ` [PATCH v4 01/28] regset: Add support for dynamically sized regsets Dave Martin
2017-10-27 10:50   ` Dave Martin
2017-10-27 10:50 ` [PATCH v4 02/28] arm64: KVM: Hide unsupported AArch64 CPU features from guests Dave Martin
2017-10-27 10:50   ` Dave Martin
2017-10-31 10:57   ` Alex Bennée
2017-10-31 10:57     ` Alex Bennée
2017-10-27 10:50 ` [PATCH v4 03/28] arm64: efi: Add missing Kconfig dependency on KERNEL_MODE_NEON Dave Martin
2017-10-27 10:50 ` [PATCH v4 04/28] arm64: Port deprecated instruction emulation to new sysctl interface Dave Martin
2017-10-27 10:50   ` Dave Martin
2017-10-27 10:50 ` [PATCH v4 05/28] arm64: fpsimd: Simplify uses of {set, clear}_ti_thread_flag() Dave Martin
2017-10-27 10:50   ` [PATCH v4 05/28] arm64: fpsimd: Simplify uses of {set,clear}_ti_thread_flag() Dave Martin
2017-10-27 10:50 ` [PATCH v4 06/28] arm64/sve: System register and exception syndrome definitions Dave Martin
2017-10-27 10:50 ` [PATCH v4 07/28] arm64/sve: Low-level SVE architectural state manipulation functions Dave Martin
2017-10-27 10:50 ` [PATCH v4 08/28] arm64/sve: Kconfig update and conditional compilation support Dave Martin
2017-10-27 10:50 ` [PATCH v4 09/28] arm64/sve: Signal frame and context structure definition Dave Martin
2017-10-27 10:50   ` Dave Martin
2017-10-27 10:50 ` [PATCH v4 10/28] arm64/sve: Low-level CPU setup Dave Martin
2017-10-27 10:50 ` [PATCH v4 11/28] arm64/sve: Core task context handling Dave Martin
2017-10-27 10:50   ` Dave Martin
2017-10-27 12:45   ` Catalin Marinas
2017-10-27 12:45     ` Catalin Marinas
2017-10-27 10:50 ` [PATCH v4 12/28] arm64/sve: Support vector length resetting for new processes Dave Martin
2017-10-27 10:50 ` [PATCH v4 13/28] arm64/sve: Signal handling support Dave Martin
2017-10-27 10:50   ` Dave Martin
2017-10-27 12:54   ` Catalin Marinas
2017-10-27 10:50 ` [PATCH v4 14/28] arm64/sve: Backend logic for setting the vector length Dave Martin
2017-10-27 10:50 ` [PATCH v4 15/28] arm64: cpufeature: Move sys_caps_initialised declarations Dave Martin
2017-10-27 10:50 ` [PATCH v4 16/28] arm64/sve: Probe SVE capabilities and usable vector lengths Dave Martin
2017-10-27 10:50   ` Dave Martin
2017-10-27 12:56   ` Catalin Marinas
2017-10-27 12:56     ` Catalin Marinas
2017-10-27 10:50 ` [PATCH v4 17/28] arm64/sve: Preserve SVE registers around kernel-mode NEON use Dave Martin
2017-10-27 10:50   ` Dave Martin
2017-10-27 10:51 ` [PATCH v4 18/28] arm64/sve: Preserve SVE registers around EFI runtime service calls Dave Martin
2017-10-27 10:51   ` Dave Martin
2017-10-27 10:51 ` [PATCH v4 19/28] arm64/sve: ptrace and ELF coredump support Dave Martin
2017-10-27 13:04   ` Catalin Marinas
2017-10-27 13:04     ` Catalin Marinas
2017-10-27 10:51 ` [PATCH v4 20/28] arm64/sve: Add prctl controls for userspace vector length management Dave Martin
2017-10-27 10:51   ` Dave Martin
2017-10-27 17:52   ` Alex Bennée
2017-10-27 17:52     ` Alex Bennée
2017-10-28 16:05     ` Dave Martin
2017-10-30 16:12       ` Alex Bennée
2017-10-30 16:12         ` Alex Bennée
2017-10-30 16:17         ` Dave Martin
2017-10-30 16:17           ` Dave Martin
2017-10-27 10:51 ` [PATCH v4 21/28] arm64/sve: Add sysctl to set the default vector length for new processes Dave Martin
2017-10-27 10:51 ` [PATCH v4 22/28] arm64/sve: KVM: Prevent guests from using SVE Dave Martin
2017-10-27 10:51 ` [PATCH v4 23/28] arm64/sve: KVM: Treat guest SVE use as undefined instruction execution Dave Martin
2017-10-27 10:51   ` Dave Martin
2017-10-27 10:51 ` [PATCH v4 24/28] arm64/sve: KVM: Hide SVE from CPU features exposed to guests Dave Martin
2017-10-27 10:51 ` Dave Martin [this message]
2017-10-27 13:05   ` [PATCH v4 25/28] arm64/sve: Detect SVE and activate runtime support Catalin Marinas
2017-10-27 10:51 ` [PATCH v4 26/28] arm64/sve: Add documentation Dave Martin
2017-10-27 13:06   ` Catalin Marinas
2017-10-27 10:51 ` [RFC PATCH v4 27/28] arm64: signal: Report signal frame size to userspace via auxv Dave Martin
2017-10-27 10:51   ` Dave Martin
2017-10-27 10:51 ` [RFC PATCH v4 28/28] arm64/sve: signal: Include SVE when computing AT_MINSIGSTKSZ Dave Martin

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=1509101470-7881-26-git-send-email-Dave.Martin@arm.com \
    --to=dave.martin@arm.com \
    --cc=alex.bennee@linaro.org \
    --cc=ard.biesheuvel@linaro.org \
    --cc=catalin.marinas@arm.com \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=libc-alpha@sourceware.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=szabolcs.nagy@arm.com \
    --cc=tokamoto@jp.fujitsu.com \
    --cc=will.deacon@arm.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).