summaryrefslogtreecommitdiff
path: root/arch/arm64/kernel/fpsimd.c
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2023-10-16 11:24:33 +0100
committerCatalin Marinas <catalin.marinas@arm.com>2023-10-16 14:16:53 +0100
commitbc9bbb78801af1bd155cda6a30ecaa720ef2bab7 (patch)
treedaa4abc5b15912ed0dedb7909a60a6ee1cc99a66 /arch/arm64/kernel/fpsimd.c
parentd8569fba13850bbf46a172fcee63df2130cf4ecc (diff)
arm64: Explicitly save/restore CPACR when probing SVE and SME
When a CPUs onlined we first probe for supported features and propetites, and then we subsequently enable features that have been detected. This is a little problematic for SVE and SME, as some properties (e.g. vector lengths) cannot be probed while they are disabled. Due to this, the code probing for SVE properties has to enable SVE for EL1 prior to proving, and the code probing for SME properties has to enable SME for EL1 prior to probing. We never disable SVE or SME for EL1 after probing. It would be a little nicer to transiently enable SVE and SME during probing, leaving them both disabled unless explicitly enabled, as this would make it much easier to catch unintentional usage (e.g. when they are not present system-wide). This patch reworks the SVE and SME feature probing code to only transiently enable support at EL1, disabling after probing is complete. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Suzuki K Poulose <suzuki.poulose@arm.com> Cc: Will Deacon <will@kernel.org> Reviewed-by: Mark Brown <broonie@kernel.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64/kernel/fpsimd.c')
-rw-r--r--arch/arm64/kernel/fpsimd.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 91e44ac7150f..601b973f90ad 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -1174,7 +1174,7 @@ void sve_kernel_enable(const struct arm64_cpu_capabilities *__always_unused p)
* Read the pseudo-ZCR used by cpufeatures to identify the supported SVE
* vector length.
*
- * Use only if SVE is present.
+ * Use only if SVE is present and enabled.
* This function clobbers the SVE vector length.
*/
u64 read_zcr_features(void)
@@ -1183,7 +1183,6 @@ u64 read_zcr_features(void)
* Set the maximum possible VL, and write zeroes to all other
* bits to see if they stick.
*/
- sve_kernel_enable(NULL);
write_sysreg_s(ZCR_ELx_LEN_MASK, SYS_ZCR_EL1);
/* Return LEN value that would be written to get the maximum VL */
@@ -1337,13 +1336,11 @@ void fa64_kernel_enable(const struct arm64_cpu_capabilities *__always_unused p)
* Read the pseudo-SMCR used by cpufeatures to identify the supported
* vector length.
*
- * Use only if SME is present.
+ * Use only if SME is present and enabled.
* This function clobbers the SME vector length.
*/
u64 read_smcr_features(void)
{
- sme_kernel_enable(NULL);
-
/*
* Set the maximum possible VL.
*/