* [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions
@ 2026-03-02 22:53 Mark Brown
2026-03-02 22:53 ` [PATCH 1/8] arm64/hwcap: Generate the KERNEL_HWCAP_ definitions for the hwcaps Mark Brown
` (7 more replies)
0 siblings, 8 replies; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
The 2025 dpISA extensions introduce a number of architecture features
all of which are fairly straightforward from a kernel point of view
since they only introduce new instructions, not any architecture state.
All the relevant newly added ID registers are already exported by KVM,
all non-RES0 bits in ID_AA64ZFR0_EL1 and ID_AA64FPFR0_EL1 are writable
and the updates to ID_AA64ISARx_EL1 are all additional values in already
exported bitfields.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
Mark Brown (8):
arm64/hwcap: Generate the KERNEL_HWCAP_ definitions for the hwcaps
arm64/sysreg: Update ID_AA64ISAR0_EL1 description to DDI0601 2025-12
arm64/sysreg: Update ID_AA64ISAR2_EL1 description to DDI0601 2025-12
arm64/sysreg: Update ID_AA64FPFR0_EL1 description to DDI0601 2025-12
arm64/sysreg: Update ID_AA64ZFR0_EL1 description to DDI0601 2025-12
arm64/sysreg: Update ID_AA64SMFR0_EL1 description to DDI0601 2025-12
arm64/cpufeature: Define hwcaps for 2025 dpISA features
kselftest/arm64: Add 2025 dpISA coverage to hwcaps
Documentation/arch/arm64/elf_hwcaps.rst | 24 ++++++
arch/arm64/include/asm/hwcap.h | 120 +-----------------------------
arch/arm64/include/uapi/asm/hwcap.h | 8 ++
arch/arm64/kernel/cpufeature.c | 11 +++
arch/arm64/kernel/cpuinfo.c | 8 ++
arch/arm64/tools/Makefile | 8 +-
arch/arm64/tools/gen-kernel-hwcaps.sh | 23 ++++++
arch/arm64/tools/sysreg | 20 ++++-
tools/testing/selftests/arm64/abi/hwcap.c | 116 +++++++++++++++++++++++++++++
9 files changed, 217 insertions(+), 121 deletions(-)
---
base-commit: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f
change-id: 20260106-arm64-dpisa-2025-d6673ae6acee
Best regards,
--
Mark Brown <broonie@kernel.org>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/8] arm64/hwcap: Generate the KERNEL_HWCAP_ definitions for the hwcaps
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
@ 2026-03-02 22:53 ` Mark Brown
2026-03-02 22:53 ` [PATCH 2/8] arm64/sysreg: Update ID_AA64ISAR0_EL1 description to DDI0601 2025-12 Mark Brown
` (6 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
Currently for each hwcap we define both the HWCAPn_NAME definition which is
exposed to userspace and a kernel internal KERNEL_HWCAP_NAME definition
which we use internally. This is tedious and repetitive, instead use a
script to generate the KERNEL_HWCAP_ definitions from the UAPI definitions.
No functional changes intended.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
arch/arm64/include/asm/hwcap.h | 120 +---------------------------------
arch/arm64/tools/Makefile | 8 ++-
arch/arm64/tools/gen-kernel-hwcaps.sh | 23 +++++++
3 files changed, 32 insertions(+), 119 deletions(-)
diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h
index 72ea4bda79f3..abe8218b2325 100644
--- a/arch/arm64/include/asm/hwcap.h
+++ b/arch/arm64/include/asm/hwcap.h
@@ -60,126 +60,10 @@
* of KERNEL_HWCAP_{feature}.
*/
#define __khwcap_feature(x) const_ilog2(HWCAP_ ## x)
-#define KERNEL_HWCAP_FP __khwcap_feature(FP)
-#define KERNEL_HWCAP_ASIMD __khwcap_feature(ASIMD)
-#define KERNEL_HWCAP_EVTSTRM __khwcap_feature(EVTSTRM)
-#define KERNEL_HWCAP_AES __khwcap_feature(AES)
-#define KERNEL_HWCAP_PMULL __khwcap_feature(PMULL)
-#define KERNEL_HWCAP_SHA1 __khwcap_feature(SHA1)
-#define KERNEL_HWCAP_SHA2 __khwcap_feature(SHA2)
-#define KERNEL_HWCAP_CRC32 __khwcap_feature(CRC32)
-#define KERNEL_HWCAP_ATOMICS __khwcap_feature(ATOMICS)
-#define KERNEL_HWCAP_FPHP __khwcap_feature(FPHP)
-#define KERNEL_HWCAP_ASIMDHP __khwcap_feature(ASIMDHP)
-#define KERNEL_HWCAP_CPUID __khwcap_feature(CPUID)
-#define KERNEL_HWCAP_ASIMDRDM __khwcap_feature(ASIMDRDM)
-#define KERNEL_HWCAP_JSCVT __khwcap_feature(JSCVT)
-#define KERNEL_HWCAP_FCMA __khwcap_feature(FCMA)
-#define KERNEL_HWCAP_LRCPC __khwcap_feature(LRCPC)
-#define KERNEL_HWCAP_DCPOP __khwcap_feature(DCPOP)
-#define KERNEL_HWCAP_SHA3 __khwcap_feature(SHA3)
-#define KERNEL_HWCAP_SM3 __khwcap_feature(SM3)
-#define KERNEL_HWCAP_SM4 __khwcap_feature(SM4)
-#define KERNEL_HWCAP_ASIMDDP __khwcap_feature(ASIMDDP)
-#define KERNEL_HWCAP_SHA512 __khwcap_feature(SHA512)
-#define KERNEL_HWCAP_SVE __khwcap_feature(SVE)
-#define KERNEL_HWCAP_ASIMDFHM __khwcap_feature(ASIMDFHM)
-#define KERNEL_HWCAP_DIT __khwcap_feature(DIT)
-#define KERNEL_HWCAP_USCAT __khwcap_feature(USCAT)
-#define KERNEL_HWCAP_ILRCPC __khwcap_feature(ILRCPC)
-#define KERNEL_HWCAP_FLAGM __khwcap_feature(FLAGM)
-#define KERNEL_HWCAP_SSBS __khwcap_feature(SSBS)
-#define KERNEL_HWCAP_SB __khwcap_feature(SB)
-#define KERNEL_HWCAP_PACA __khwcap_feature(PACA)
-#define KERNEL_HWCAP_PACG __khwcap_feature(PACG)
-#define KERNEL_HWCAP_GCS __khwcap_feature(GCS)
-#define KERNEL_HWCAP_CMPBR __khwcap_feature(CMPBR)
-#define KERNEL_HWCAP_FPRCVT __khwcap_feature(FPRCVT)
-#define KERNEL_HWCAP_F8MM8 __khwcap_feature(F8MM8)
-#define KERNEL_HWCAP_F8MM4 __khwcap_feature(F8MM4)
-#define KERNEL_HWCAP_SVE_F16MM __khwcap_feature(SVE_F16MM)
-#define KERNEL_HWCAP_SVE_ELTPERM __khwcap_feature(SVE_ELTPERM)
-#define KERNEL_HWCAP_SVE_AES2 __khwcap_feature(SVE_AES2)
-#define KERNEL_HWCAP_SVE_BFSCALE __khwcap_feature(SVE_BFSCALE)
-#define KERNEL_HWCAP_SVE2P2 __khwcap_feature(SVE2P2)
-#define KERNEL_HWCAP_SME2P2 __khwcap_feature(SME2P2)
-#define KERNEL_HWCAP_SME_SBITPERM __khwcap_feature(SME_SBITPERM)
-#define KERNEL_HWCAP_SME_AES __khwcap_feature(SME_AES)
-#define KERNEL_HWCAP_SME_SFEXPA __khwcap_feature(SME_SFEXPA)
-#define KERNEL_HWCAP_SME_STMOP __khwcap_feature(SME_STMOP)
-#define KERNEL_HWCAP_SME_SMOP4 __khwcap_feature(SME_SMOP4)
-
#define __khwcap2_feature(x) (const_ilog2(HWCAP2_ ## x) + 64)
-#define KERNEL_HWCAP_DCPODP __khwcap2_feature(DCPODP)
-#define KERNEL_HWCAP_SVE2 __khwcap2_feature(SVE2)
-#define KERNEL_HWCAP_SVEAES __khwcap2_feature(SVEAES)
-#define KERNEL_HWCAP_SVEPMULL __khwcap2_feature(SVEPMULL)
-#define KERNEL_HWCAP_SVEBITPERM __khwcap2_feature(SVEBITPERM)
-#define KERNEL_HWCAP_SVESHA3 __khwcap2_feature(SVESHA3)
-#define KERNEL_HWCAP_SVESM4 __khwcap2_feature(SVESM4)
-#define KERNEL_HWCAP_FLAGM2 __khwcap2_feature(FLAGM2)
-#define KERNEL_HWCAP_FRINT __khwcap2_feature(FRINT)
-#define KERNEL_HWCAP_SVEI8MM __khwcap2_feature(SVEI8MM)
-#define KERNEL_HWCAP_SVEF32MM __khwcap2_feature(SVEF32MM)
-#define KERNEL_HWCAP_SVEF64MM __khwcap2_feature(SVEF64MM)
-#define KERNEL_HWCAP_SVEBF16 __khwcap2_feature(SVEBF16)
-#define KERNEL_HWCAP_I8MM __khwcap2_feature(I8MM)
-#define KERNEL_HWCAP_BF16 __khwcap2_feature(BF16)
-#define KERNEL_HWCAP_DGH __khwcap2_feature(DGH)
-#define KERNEL_HWCAP_RNG __khwcap2_feature(RNG)
-#define KERNEL_HWCAP_BTI __khwcap2_feature(BTI)
-#define KERNEL_HWCAP_MTE __khwcap2_feature(MTE)
-#define KERNEL_HWCAP_ECV __khwcap2_feature(ECV)
-#define KERNEL_HWCAP_AFP __khwcap2_feature(AFP)
-#define KERNEL_HWCAP_RPRES __khwcap2_feature(RPRES)
-#define KERNEL_HWCAP_MTE3 __khwcap2_feature(MTE3)
-#define KERNEL_HWCAP_SME __khwcap2_feature(SME)
-#define KERNEL_HWCAP_SME_I16I64 __khwcap2_feature(SME_I16I64)
-#define KERNEL_HWCAP_SME_F64F64 __khwcap2_feature(SME_F64F64)
-#define KERNEL_HWCAP_SME_I8I32 __khwcap2_feature(SME_I8I32)
-#define KERNEL_HWCAP_SME_F16F32 __khwcap2_feature(SME_F16F32)
-#define KERNEL_HWCAP_SME_B16F32 __khwcap2_feature(SME_B16F32)
-#define KERNEL_HWCAP_SME_F32F32 __khwcap2_feature(SME_F32F32)
-#define KERNEL_HWCAP_SME_FA64 __khwcap2_feature(SME_FA64)
-#define KERNEL_HWCAP_WFXT __khwcap2_feature(WFXT)
-#define KERNEL_HWCAP_EBF16 __khwcap2_feature(EBF16)
-#define KERNEL_HWCAP_SVE_EBF16 __khwcap2_feature(SVE_EBF16)
-#define KERNEL_HWCAP_CSSC __khwcap2_feature(CSSC)
-#define KERNEL_HWCAP_RPRFM __khwcap2_feature(RPRFM)
-#define KERNEL_HWCAP_SVE2P1 __khwcap2_feature(SVE2P1)
-#define KERNEL_HWCAP_SME2 __khwcap2_feature(SME2)
-#define KERNEL_HWCAP_SME2P1 __khwcap2_feature(SME2P1)
-#define KERNEL_HWCAP_SME_I16I32 __khwcap2_feature(SME_I16I32)
-#define KERNEL_HWCAP_SME_BI32I32 __khwcap2_feature(SME_BI32I32)
-#define KERNEL_HWCAP_SME_B16B16 __khwcap2_feature(SME_B16B16)
-#define KERNEL_HWCAP_SME_F16F16 __khwcap2_feature(SME_F16F16)
-#define KERNEL_HWCAP_MOPS __khwcap2_feature(MOPS)
-#define KERNEL_HWCAP_HBC __khwcap2_feature(HBC)
-#define KERNEL_HWCAP_SVE_B16B16 __khwcap2_feature(SVE_B16B16)
-#define KERNEL_HWCAP_LRCPC3 __khwcap2_feature(LRCPC3)
-#define KERNEL_HWCAP_LSE128 __khwcap2_feature(LSE128)
-#define KERNEL_HWCAP_FPMR __khwcap2_feature(FPMR)
-#define KERNEL_HWCAP_LUT __khwcap2_feature(LUT)
-#define KERNEL_HWCAP_FAMINMAX __khwcap2_feature(FAMINMAX)
-#define KERNEL_HWCAP_F8CVT __khwcap2_feature(F8CVT)
-#define KERNEL_HWCAP_F8FMA __khwcap2_feature(F8FMA)
-#define KERNEL_HWCAP_F8DP4 __khwcap2_feature(F8DP4)
-#define KERNEL_HWCAP_F8DP2 __khwcap2_feature(F8DP2)
-#define KERNEL_HWCAP_F8E4M3 __khwcap2_feature(F8E4M3)
-#define KERNEL_HWCAP_F8E5M2 __khwcap2_feature(F8E5M2)
-#define KERNEL_HWCAP_SME_LUTV2 __khwcap2_feature(SME_LUTV2)
-#define KERNEL_HWCAP_SME_F8F16 __khwcap2_feature(SME_F8F16)
-#define KERNEL_HWCAP_SME_F8F32 __khwcap2_feature(SME_F8F32)
-#define KERNEL_HWCAP_SME_SF8FMA __khwcap2_feature(SME_SF8FMA)
-#define KERNEL_HWCAP_SME_SF8DP4 __khwcap2_feature(SME_SF8DP4)
-#define KERNEL_HWCAP_SME_SF8DP2 __khwcap2_feature(SME_SF8DP2)
-#define KERNEL_HWCAP_POE __khwcap2_feature(POE)
-
#define __khwcap3_feature(x) (const_ilog2(HWCAP3_ ## x) + 128)
-#define KERNEL_HWCAP_MTE_FAR __khwcap3_feature(MTE_FAR)
-#define KERNEL_HWCAP_MTE_STORE_ONLY __khwcap3_feature(MTE_STORE_ONLY)
-#define KERNEL_HWCAP_LSFE __khwcap3_feature(LSFE)
-#define KERNEL_HWCAP_LS64 __khwcap3_feature(LS64)
+
+#include "asm/kernel-hwcap.h"
/*
* This yields a mask that user programs can use to figure out what
diff --git a/arch/arm64/tools/Makefile b/arch/arm64/tools/Makefile
index c2b34e761006..a94b3d9caad6 100644
--- a/arch/arm64/tools/Makefile
+++ b/arch/arm64/tools/Makefile
@@ -3,7 +3,7 @@
gen := arch/$(ARCH)/include/generated
kapi := $(gen)/asm
-kapisyshdr-y := cpucap-defs.h sysreg-defs.h
+kapisyshdr-y := cpucap-defs.h kernel-hwcap.h sysreg-defs.h
kapi-hdrs-y := $(addprefix $(kapi)/, $(kapisyshdr-y))
@@ -18,11 +18,17 @@ kapi: $(kapi-hdrs-y)
quiet_cmd_gen_cpucaps = GEN $@
cmd_gen_cpucaps = mkdir -p $(dir $@); $(AWK) -f $(real-prereqs) > $@
+quiet_cmd_gen_kernel_hwcap = GEN $@
+ cmd_gen_kernel_hwcap = mkdir -p $(dir $@); /bin/sh -e $(real-prereqs) > $@
+
quiet_cmd_gen_sysreg = GEN $@
cmd_gen_sysreg = mkdir -p $(dir $@); $(AWK) -f $(real-prereqs) > $@
$(kapi)/cpucap-defs.h: $(src)/gen-cpucaps.awk $(src)/cpucaps FORCE
$(call if_changed,gen_cpucaps)
+$(kapi)/kernel-hwcap.h: $(src)/gen-kernel-hwcaps.sh $(srctree)/arch/arm64/include/uapi/asm/hwcap.h FORCE
+ $(call if_changed,gen_kernel_hwcap)
+
$(kapi)/sysreg-defs.h: $(src)/gen-sysreg.awk $(src)/sysreg FORCE
$(call if_changed,gen_sysreg)
diff --git a/arch/arm64/tools/gen-kernel-hwcaps.sh b/arch/arm64/tools/gen-kernel-hwcaps.sh
new file mode 100644
index 000000000000..e7cdcf428d91
--- /dev/null
+++ b/arch/arm64/tools/gen-kernel-hwcaps.sh
@@ -0,0 +1,23 @@
+#!/bin/sh -e
+# SPDX-License-Identifier: GPL-2.0
+#
+# gen-kernel-hwcap.sh - Generate kernel internal hwcap.h definitions
+#
+# Copyright 2026 Arm, Ltd.
+
+if [ "$1" = "" ]; then
+ echo "$0: no filename specified"
+ exit 1
+fi
+
+echo "#ifndef __ASM_KERNEL_HWCAPS_H"
+echo "#define __ASM_KERNEL_HWCAPS_H"
+echo ""
+echo "/* Generated file - do not edit */"
+echo ""
+
+grep -E '^#define HWCAP[0-9]*_[A-Z0-9_]+' $1 | \
+ sed 's/.*HWCAP\([0-9]*\)_\([A-Z0-9_]\+\).*/#define KERNEL_HWCAP_\2\t__khwcap\1_feature(\2)/'
+
+echo ""
+echo "#endif /* __ASM_KERNEL_HWCAPS_H */"
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/8] arm64/sysreg: Update ID_AA64ISAR0_EL1 description to DDI0601 2025-12
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
2026-03-02 22:53 ` [PATCH 1/8] arm64/hwcap: Generate the KERNEL_HWCAP_ definitions for the hwcaps Mark Brown
@ 2026-03-02 22:53 ` Mark Brown
2026-03-02 22:53 ` [PATCH 3/8] arm64/sysreg: Update ID_AA64ISAR2_EL1 " Mark Brown
` (5 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
The 2025 extensions add FEAT_F16F32DOT and FEAT_F16F32MM.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
arch/arm64/tools/sysreg | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/tools/sysreg b/arch/arm64/tools/sysreg
index 9d1c21108057..623577b7554b 100644
--- a/arch/arm64/tools/sysreg
+++ b/arch/arm64/tools/sysreg
@@ -1835,6 +1835,8 @@ EndEnum
UnsignedEnum 51:48 FHM
0b0000 NI
0b0001 IMP
+ 0b0010 F16F32DOT
+ 0b0011 F16F32MM
EndEnum
UnsignedEnum 47:44 DP
0b0000 NI
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/8] arm64/sysreg: Update ID_AA64ISAR2_EL1 description to DDI0601 2025-12
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
2026-03-02 22:53 ` [PATCH 1/8] arm64/hwcap: Generate the KERNEL_HWCAP_ definitions for the hwcaps Mark Brown
2026-03-02 22:53 ` [PATCH 2/8] arm64/sysreg: Update ID_AA64ISAR0_EL1 description to DDI0601 2025-12 Mark Brown
@ 2026-03-02 22:53 ` Mark Brown
2026-03-02 22:53 ` [PATCH 4/8] arm64/sysreg: Update ID_AA64FPFR0_EL1 " Mark Brown
` (4 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
The 2025 extensions update the LUT field for new instructions added by
SVE and SME 2.3, there is no separate FEAT_ feature for these.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
arch/arm64/tools/sysreg | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm64/tools/sysreg b/arch/arm64/tools/sysreg
index 623577b7554b..0d619c173c87 100644
--- a/arch/arm64/tools/sysreg
+++ b/arch/arm64/tools/sysreg
@@ -1978,6 +1978,7 @@ EndEnum
UnsignedEnum 59:56 LUT
0b0000 NI
0b0001 IMP
+ 0b0010 LUT6
EndEnum
UnsignedEnum 55:52 CSSC
0b0000 NI
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/8] arm64/sysreg: Update ID_AA64FPFR0_EL1 description to DDI0601 2025-12
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
` (2 preceding siblings ...)
2026-03-02 22:53 ` [PATCH 3/8] arm64/sysreg: Update ID_AA64ISAR2_EL1 " Mark Brown
@ 2026-03-02 22:53 ` Mark Brown
2026-03-02 22:53 ` [PATCH 5/8] arm64/sysreg: Update ID_AA64ZFR0_EL1 " Mark Brown
` (3 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
The 2025 extensions add FEAT_F16MM and adjust some of the RES0 bits to be
RAZ instead as a placeholder for future extensions.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
arch/arm64/tools/sysreg | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/tools/sysreg b/arch/arm64/tools/sysreg
index 0d619c173c87..451ad312dc78 100644
--- a/arch/arm64/tools/sysreg
+++ b/arch/arm64/tools/sysreg
@@ -1654,7 +1654,13 @@ UnsignedEnum 26 F8MM4
0b0 NI
0b1 IMP
EndEnum
-Res0 25:2
+Res0 25:16
+UnsignedEnum 15 F16MM2
+ 0b0 NI
+ 0b1 IMP
+EndEnum
+Res0 14:8
+Raz 7:2
UnsignedEnum 1 F8E4M3
0b0 NI
0b1 IMP
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 5/8] arm64/sysreg: Update ID_AA64ZFR0_EL1 description to DDI0601 2025-12
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
` (3 preceding siblings ...)
2026-03-02 22:53 ` [PATCH 4/8] arm64/sysreg: Update ID_AA64FPFR0_EL1 " Mark Brown
@ 2026-03-02 22:53 ` Mark Brown
2026-03-02 22:53 ` [PATCH 6/8] arm64/sysreg: Update ID_AA64SMFR0_EL1 " Mark Brown
` (2 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
The 2025 extensions add FEAT_SVE2P3 and FEAT_SVE_B16MM.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
arch/arm64/tools/sysreg | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/tools/sysreg b/arch/arm64/tools/sysreg
index 451ad312dc78..75b8644c4753 100644
--- a/arch/arm64/tools/sysreg
+++ b/arch/arm64/tools/sysreg
@@ -1496,6 +1496,7 @@ UnsignedEnum 27:24 B16B16
0b0000 NI
0b0001 IMP
0b0010 BFSCALE
+ 0b0011 B16MM
EndEnum
UnsignedEnum 23:20 BF16
0b0000 NI
@@ -1522,6 +1523,7 @@ UnsignedEnum 3:0 SVEver
0b0001 SVE2
0b0010 SVE2p1
0b0011 SVE2p2
+ 0b0100 SVE2p3
EndEnum
EndSysreg
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 6/8] arm64/sysreg: Update ID_AA64SMFR0_EL1 description to DDI0601 2025-12
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
` (4 preceding siblings ...)
2026-03-02 22:53 ` [PATCH 5/8] arm64/sysreg: Update ID_AA64ZFR0_EL1 " Mark Brown
@ 2026-03-02 22:53 ` Mark Brown
2026-03-02 22:53 ` [PATCH 7/8] arm64/cpufeature: Define hwcaps for 2025 dpISA features Mark Brown
2026-03-02 22:53 ` [PATCH 8/8] kselftest/arm64: Add 2025 dpISA coverage to hwcaps Mark Brown
7 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
The 2025 extensions add FEAT_SME2P3, including LUT6.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
arch/arm64/tools/sysreg | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/tools/sysreg b/arch/arm64/tools/sysreg
index 75b8644c4753..eded0bee6ce4 100644
--- a/arch/arm64/tools/sysreg
+++ b/arch/arm64/tools/sysreg
@@ -1532,7 +1532,11 @@ UnsignedEnum 63 FA64
0b0 NI
0b1 IMP
EndEnum
-Res0 62:61
+Res0 62
+UnsignedEnum 61 LUT6
+ 0b0 NI
+ 0b1 IMP
+EndEnum
UnsignedEnum 60 LUTv2
0b0 NI
0b1 IMP
@@ -1542,6 +1546,7 @@ UnsignedEnum 59:56 SMEver
0b0001 SME2
0b0010 SME2p1
0b0011 SME2p2
+ 0b0100 SME2p3
EndEnum
UnsignedEnum 55:52 I16I64
0b0000 NI
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 7/8] arm64/cpufeature: Define hwcaps for 2025 dpISA features
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
` (5 preceding siblings ...)
2026-03-02 22:53 ` [PATCH 6/8] arm64/sysreg: Update ID_AA64SMFR0_EL1 " Mark Brown
@ 2026-03-02 22:53 ` Mark Brown
2026-04-09 11:33 ` Catalin Marinas
2026-03-02 22:53 ` [PATCH 8/8] kselftest/arm64: Add 2025 dpISA coverage to hwcaps Mark Brown
7 siblings, 1 reply; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
The features added by the 2025 dpISA are all straightforward instruction
only features so there is no state to manage, we can just expose hwcaps to
let userspace know they are available.
F16MM is slightly odd in that the feature is FEAT_F16MM but it is discovered
via ID_AA64FPFR0_EL1.F16MM2. We follow the feature name.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
Documentation/arch/arm64/elf_hwcaps.rst | 24 ++++++++++++++++++++++++
arch/arm64/include/uapi/asm/hwcap.h | 8 ++++++++
arch/arm64/kernel/cpufeature.c | 11 +++++++++++
arch/arm64/kernel/cpuinfo.c | 8 ++++++++
4 files changed, 51 insertions(+)
diff --git a/Documentation/arch/arm64/elf_hwcaps.rst b/Documentation/arch/arm64/elf_hwcaps.rst
index 97315ae6c0da..ea9215d65481 100644
--- a/Documentation/arch/arm64/elf_hwcaps.rst
+++ b/Documentation/arch/arm64/elf_hwcaps.rst
@@ -451,6 +451,30 @@ HWCAP3_LS64
of CPU. User should only use ld64b/st64b on supported target (device)
memory location, otherwise fallback to the non-atomic alternatives.
+HWCAP3_SVE_B16MM
+ Functionality implied by ID_AA64ZFR0_EL1.B16B16 == 0b0011
+
+HWCAP3_SVE2P3
+ Functionality implied by ID_AA64ZFR0_EL1.SVEver == 0b0100
+
+HWCAP3_SME_LUT6
+ Functionality implied by ID_AA64SMFR0_EL1.LUT6 == 0b1
+
+HWCAP3_SME2P3
+ Functionality implied by ID_AA64SMFR0_EL1.SMEver == 0b0100
+
+HWCAP3_F16MM
+ Functionality implied by ID_AA64FPFR0_EL1.F16MM2 == 0b1
+
+HWCAP3_F16F32DOT
+ Functionality implied by ID_AA64ISAR0_EL1.FHM == 0b0010
+
+HWCAP3_F16F32MM
+ Functionality implied by ID_AA64ISAR0_EL1.FHM == 0b0011
+
+HWCAP3_LUT6
+ Functionality implied by ID_AA64ISAR2_EL1.LUT == 0b0010
+
4. Unused AT_HWCAP bits
-----------------------
diff --git a/arch/arm64/include/uapi/asm/hwcap.h b/arch/arm64/include/uapi/asm/hwcap.h
index 06f83ca8de56..a48aee07a54a 100644
--- a/arch/arm64/include/uapi/asm/hwcap.h
+++ b/arch/arm64/include/uapi/asm/hwcap.h
@@ -147,5 +147,13 @@
#define HWCAP3_MTE_STORE_ONLY (1UL << 1)
#define HWCAP3_LSFE (1UL << 2)
#define HWCAP3_LS64 (1UL << 3)
+#define HWCAP3_SVE_B16MM (1UL << 4)
+#define HWCAP3_SVE2P3 (1UL << 5)
+#define HWCAP3_SME_LUT6 (1UL << 6)
+#define HWCAP3_SME2P3 (1UL << 7)
+#define HWCAP3_F16MM (1UL << 8)
+#define HWCAP3_F16F32DOT (1UL << 9)
+#define HWCAP3_F16F32MM (1UL << 10)
+#define HWCAP3_LUT6 (1UL << 11)
#endif /* _UAPI__ASM_HWCAP_H */
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index c31f8e17732a..a26cef210b08 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -361,6 +361,8 @@ static const struct arm64_ftr_bits ftr_id_aa64zfr0[] = {
static const struct arm64_ftr_bits ftr_id_aa64smfr0[] = {
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SME),
FTR_STRICT, FTR_EXACT, ID_AA64SMFR0_EL1_FA64_SHIFT, 1, 0),
+ ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SME),
+ FTR_STRICT, FTR_EXACT, ID_AA64SMFR0_EL1_LUT6_SHIFT, 1, 0),
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SME),
FTR_STRICT, FTR_EXACT, ID_AA64SMFR0_EL1_LUTv2_SHIFT, 1, 0),
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SME),
@@ -415,6 +417,7 @@ static const struct arm64_ftr_bits ftr_id_aa64fpfr0[] = {
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, ID_AA64FPFR0_EL1_F8DP2_SHIFT, 1, 0),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, ID_AA64FPFR0_EL1_F8MM8_SHIFT, 1, 0),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, ID_AA64FPFR0_EL1_F8MM4_SHIFT, 1, 0),
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, ID_AA64FPFR0_EL1_F16MM2_SHIFT, 1, 0),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, ID_AA64FPFR0_EL1_F8E4M3_SHIFT, 1, 0),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, ID_AA64FPFR0_EL1_F8E5M2_SHIFT, 1, 0),
ARM64_FTR_END,
@@ -3265,6 +3268,8 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
HWCAP_CAP(ID_AA64ISAR0_EL1, SM4, IMP, CAP_HWCAP, KERNEL_HWCAP_SM4),
HWCAP_CAP(ID_AA64ISAR0_EL1, DP, IMP, CAP_HWCAP, KERNEL_HWCAP_ASIMDDP),
HWCAP_CAP(ID_AA64ISAR0_EL1, FHM, IMP, CAP_HWCAP, KERNEL_HWCAP_ASIMDFHM),
+ HWCAP_CAP(ID_AA64ISAR0_EL1, FHM, F16F32DOT, CAP_HWCAP, KERNEL_HWCAP_F16F32DOT),
+ HWCAP_CAP(ID_AA64ISAR0_EL1, FHM, F16F32MM, CAP_HWCAP, KERNEL_HWCAP_F16F32MM),
HWCAP_CAP(ID_AA64ISAR0_EL1, TS, FLAGM, CAP_HWCAP, KERNEL_HWCAP_FLAGM),
HWCAP_CAP(ID_AA64ISAR0_EL1, TS, FLAGM2, CAP_HWCAP, KERNEL_HWCAP_FLAGM2),
HWCAP_CAP(ID_AA64ISAR0_EL1, RNDR, IMP, CAP_HWCAP, KERNEL_HWCAP_RNG),
@@ -3290,11 +3295,13 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
HWCAP_CAP(ID_AA64ISAR1_EL1, I8MM, IMP, CAP_HWCAP, KERNEL_HWCAP_I8MM),
HWCAP_CAP(ID_AA64ISAR1_EL1, LS64, LS64, CAP_HWCAP, KERNEL_HWCAP_LS64),
HWCAP_CAP(ID_AA64ISAR2_EL1, LUT, IMP, CAP_HWCAP, KERNEL_HWCAP_LUT),
+ HWCAP_CAP(ID_AA64ISAR2_EL1, LUT, LUT6, CAP_HWCAP, KERNEL_HWCAP_LUT6),
HWCAP_CAP(ID_AA64ISAR3_EL1, FAMINMAX, IMP, CAP_HWCAP, KERNEL_HWCAP_FAMINMAX),
HWCAP_CAP(ID_AA64ISAR3_EL1, LSFE, IMP, CAP_HWCAP, KERNEL_HWCAP_LSFE),
HWCAP_CAP(ID_AA64MMFR2_EL1, AT, IMP, CAP_HWCAP, KERNEL_HWCAP_USCAT),
#ifdef CONFIG_ARM64_SVE
HWCAP_CAP(ID_AA64PFR0_EL1, SVE, IMP, CAP_HWCAP, KERNEL_HWCAP_SVE),
+ HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, SVEver, SVE2p3, CAP_HWCAP, KERNEL_HWCAP_SVE2P3),
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, SVEver, SVE2p2, CAP_HWCAP, KERNEL_HWCAP_SVE2P2),
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, SVEver, SVE2p1, CAP_HWCAP, KERNEL_HWCAP_SVE2P1),
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, SVEver, SVE2, CAP_HWCAP, KERNEL_HWCAP_SVE2),
@@ -3304,6 +3311,7 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, BitPerm, IMP, CAP_HWCAP, KERNEL_HWCAP_SVEBITPERM),
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, B16B16, IMP, CAP_HWCAP, KERNEL_HWCAP_SVE_B16B16),
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, B16B16, BFSCALE, CAP_HWCAP, KERNEL_HWCAP_SVE_BFSCALE),
+ HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, B16B16, B16MM, CAP_HWCAP, KERNEL_HWCAP_SVE_B16MM),
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, BF16, IMP, CAP_HWCAP, KERNEL_HWCAP_SVEBF16),
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, BF16, EBF16, CAP_HWCAP, KERNEL_HWCAP_SVE_EBF16),
HWCAP_CAP_MATCH_ID(has_sve_feature, ID_AA64ZFR0_EL1, SHA3, IMP, CAP_HWCAP, KERNEL_HWCAP_SVESHA3),
@@ -3343,7 +3351,9 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
#ifdef CONFIG_ARM64_SME
HWCAP_CAP(ID_AA64PFR1_EL1, SME, IMP, CAP_HWCAP, KERNEL_HWCAP_SME),
HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, FA64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_FA64),
+ HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, LUT6, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_LUT6),
HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, LUTv2, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_LUTV2),
+ HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, SMEver, SME2p3, CAP_HWCAP, KERNEL_HWCAP_SME2P3),
HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, SMEver, SME2p2, CAP_HWCAP, KERNEL_HWCAP_SME2P2),
HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, SMEver, SME2p1, CAP_HWCAP, KERNEL_HWCAP_SME2P1),
HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, SMEver, SME2, CAP_HWCAP, KERNEL_HWCAP_SME2),
@@ -3374,6 +3384,7 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
HWCAP_CAP(ID_AA64FPFR0_EL1, F8DP2, IMP, CAP_HWCAP, KERNEL_HWCAP_F8DP2),
HWCAP_CAP(ID_AA64FPFR0_EL1, F8MM8, IMP, CAP_HWCAP, KERNEL_HWCAP_F8MM8),
HWCAP_CAP(ID_AA64FPFR0_EL1, F8MM4, IMP, CAP_HWCAP, KERNEL_HWCAP_F8MM4),
+ HWCAP_CAP(ID_AA64FPFR0_EL1, F16MM2, IMP, CAP_HWCAP, KERNEL_HWCAP_F16MM),
HWCAP_CAP(ID_AA64FPFR0_EL1, F8E4M3, IMP, CAP_HWCAP, KERNEL_HWCAP_F8E4M3),
HWCAP_CAP(ID_AA64FPFR0_EL1, F8E5M2, IMP, CAP_HWCAP, KERNEL_HWCAP_F8E5M2),
#ifdef CONFIG_ARM64_POE
diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
index 6149bc91251d..1967ef4e25c8 100644
--- a/arch/arm64/kernel/cpuinfo.c
+++ b/arch/arm64/kernel/cpuinfo.c
@@ -164,6 +164,14 @@ static const char *const hwcap_str[] = {
[KERNEL_HWCAP_MTE_FAR] = "mtefar",
[KERNEL_HWCAP_MTE_STORE_ONLY] = "mtestoreonly",
[KERNEL_HWCAP_LSFE] = "lsfe",
+ [KERNEL_HWCAP_SVE_B16MM] = "sveb16mm",
+ [KERNEL_HWCAP_SVE2P3] = "sve2p3",
+ [KERNEL_HWCAP_SME_LUT6] = "smelut6",
+ [KERNEL_HWCAP_SME2P3] = "sme2p3",
+ [KERNEL_HWCAP_F16MM] = "f16mm",
+ [KERNEL_HWCAP_F16F32DOT] = "f16f32dot",
+ [KERNEL_HWCAP_F16F32MM] = "f16f32mm",
+ [KERNEL_HWCAP_LUT6] = "lut6",
};
#ifdef CONFIG_COMPAT
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 8/8] kselftest/arm64: Add 2025 dpISA coverage to hwcaps
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
` (6 preceding siblings ...)
2026-03-02 22:53 ` [PATCH 7/8] arm64/cpufeature: Define hwcaps for 2025 dpISA features Mark Brown
@ 2026-03-02 22:53 ` Mark Brown
7 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2026-03-02 22:53 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Jonathan Corbet, Shuah Khan
Cc: linux-arm-kernel, linux-kernel, linux-doc, linux-kselftest,
Mark Brown
Add coverage of the new hwcaps to the test program, encodings cross checked
against LLVM 22.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
tools/testing/selftests/arm64/abi/hwcap.c | 116 ++++++++++++++++++++++++++++++
1 file changed, 116 insertions(+)
diff --git a/tools/testing/selftests/arm64/abi/hwcap.c b/tools/testing/selftests/arm64/abi/hwcap.c
index 9d2df1f3e6bb..fbb5563ac7ac 100644
--- a/tools/testing/selftests/arm64/abi/hwcap.c
+++ b/tools/testing/selftests/arm64/abi/hwcap.c
@@ -107,6 +107,24 @@ static void f8mm8_sigill(void)
asm volatile(".inst 0x6e80ec00");
}
+static void f16f32dot_sigill(void)
+{
+ /* FDOT V0.2S, V0.4H, V0.2H[0] */
+ asm volatile(".inst 0xf409000");
+}
+
+static void f16f32mm_sigill(void)
+{
+ /* FMMLA V0.4S, V0.8H, V0.8H */
+ asm volatile(".inst 0x4e40ec00");
+}
+
+static void f16mm_sigill(void)
+{
+ /* FMMLA V0.8H, V0.8H, V0.8H */
+ asm volatile(".inst 0x4ec0ec00");
+}
+
static void faminmax_sigill(void)
{
/* FAMIN V0.4H, V0.4H, V0.4H */
@@ -190,6 +208,12 @@ static void lut_sigill(void)
asm volatile(".inst 0x4e801000");
}
+static void lut6_sigill(void)
+{
+ /* LUTI6 Z0.H, { Z0.H, Z1.H }, Z0[0] */
+ asm volatile(".inst 0x4560ac00");
+}
+
static void mops_sigill(void)
{
char dst[1], src[1];
@@ -281,6 +305,18 @@ static void sme2p2_sigill(void)
asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
}
+static void sme2p3_sigill(void)
+{
+ /* SMSTART SM */
+ asm volatile("msr S0_3_C4_C3_3, xzr" : : : );
+
+ /* ADDQP Z0.B, Z0.B, Z0.B */
+ asm volatile(".inst 0x4207800" : : : "z0");
+
+ /* SMSTOP */
+ asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
static void sme_aes_sigill(void)
{
/* SMSTART SM */
@@ -377,6 +413,18 @@ static void smef8f32_sigill(void)
asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
}
+static void smelut6_sigill(void)
+{
+ /* SMSTART */
+ asm volatile("msr S0_3_C4_C7_3, xzr" : : : );
+
+ /* LUTI6 { Z0.B-Z3.B }, ZT0, { Z0-Z2 } */
+ asm volatile(".inst 0xc08a0000" : : : );
+
+ /* SMSTOP */
+ asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
static void smelutv2_sigill(void)
{
/* SMSTART */
@@ -485,6 +533,12 @@ static void sve2p2_sigill(void)
asm volatile(".inst 0x4cea000" : : : "z0");
}
+static void sve2p3_sigill(void)
+{
+ /* ADDQP Z0.B, Z0.B, Z0.B */
+ asm volatile(".inst 0x4207800" : : : "z0");
+}
+
static void sveaes_sigill(void)
{
/* AESD z0.b, z0.b, z0.b */
@@ -503,6 +557,12 @@ static void sveb16b16_sigill(void)
asm volatile(".inst 0x65000000" : : : );
}
+static void sveb16mm_sigill(void)
+{
+ /* BFMMLA Z0.H, Z0.H, Z0.H */
+ asm volatile(".inst 0x64e0e000" : : : );
+}
+
static void svebfscale_sigill(void)
{
/* BFSCALE Z0.H, P0/M, Z0.H, Z0.H */
@@ -728,6 +788,27 @@ static const struct hwcap_data {
.cpuinfo = "f8mm4",
.sigill_fn = f8mm4_sigill,
},
+ {
+ .name = "F16MM",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_F16MM,
+ .cpuinfo = "f16mm",
+ .sigill_fn = f16mm_sigill,
+ },
+ {
+ .name = "F16F32DOT",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_F16F32DOT,
+ .cpuinfo = "f16f32dot",
+ .sigill_fn = f16f32dot_sigill,
+ },
+ {
+ .name = "F16F32MM",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_F16F32MM,
+ .cpuinfo = "f16f32mm",
+ .sigill_fn = f16f32mm_sigill,
+ },
{
.name = "FAMINMAX",
.at_hwcap = AT_HWCAP2,
@@ -830,6 +911,13 @@ static const struct hwcap_data {
.cpuinfo = "lut",
.sigill_fn = lut_sigill,
},
+ {
+ .name = "LUT6",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_LUT6,
+ .cpuinfo = "lut6",
+ .sigill_fn = lut6_sigill,
+ },
{
.name = "MOPS",
.at_hwcap = AT_HWCAP2,
@@ -917,6 +1005,13 @@ static const struct hwcap_data {
.cpuinfo = "sme2p2",
.sigill_fn = sme2p2_sigill,
},
+ {
+ .name = "SME 2.3",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_SME2P3,
+ .cpuinfo = "sme2p3",
+ .sigill_fn = sme2p3_sigill,
+ },
{
.name = "SME AES",
.at_hwcap = AT_HWCAP,
@@ -966,6 +1061,13 @@ static const struct hwcap_data {
.cpuinfo = "smef8f32",
.sigill_fn = smef8f32_sigill,
},
+ {
+ .name = "SME LUT6",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_SME_LUT6,
+ .cpuinfo = "smelut6",
+ .sigill_fn = smelut6_sigill,
+ },
{
.name = "SME LUTV2",
.at_hwcap = AT_HWCAP2,
@@ -1051,6 +1153,13 @@ static const struct hwcap_data {
.cpuinfo = "sve2p2",
.sigill_fn = sve2p2_sigill,
},
+ {
+ .name = "SVE 2.3",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_SVE2P3,
+ .cpuinfo = "sve2p3",
+ .sigill_fn = sve2p3_sigill,
+ },
{
.name = "SVE AES",
.at_hwcap = AT_HWCAP2,
@@ -1065,6 +1174,13 @@ static const struct hwcap_data {
.cpuinfo = "sveaes2",
.sigill_fn = sveaes2_sigill,
},
+ {
+ .name = "SVE B16MM",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_SVE_B16MM,
+ .cpuinfo = "sveb16mm",
+ .sigill_fn = sveb16mm_sigill,
+ },
{
.name = "SVE BFSCALE",
.at_hwcap = AT_HWCAP,
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 7/8] arm64/cpufeature: Define hwcaps for 2025 dpISA features
2026-03-02 22:53 ` [PATCH 7/8] arm64/cpufeature: Define hwcaps for 2025 dpISA features Mark Brown
@ 2026-04-09 11:33 ` Catalin Marinas
0 siblings, 0 replies; 10+ messages in thread
From: Catalin Marinas @ 2026-04-09 11:33 UTC (permalink / raw)
To: Mark Brown
Cc: Will Deacon, Jonathan Corbet, Shuah Khan, linux-arm-kernel,
linux-kernel, linux-doc, linux-kselftest
On Mon, Mar 02, 2026 at 10:53:22PM +0000, Mark Brown wrote:
> @@ -3290,11 +3295,13 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
> HWCAP_CAP(ID_AA64ISAR1_EL1, I8MM, IMP, CAP_HWCAP, KERNEL_HWCAP_I8MM),
> HWCAP_CAP(ID_AA64ISAR1_EL1, LS64, LS64, CAP_HWCAP, KERNEL_HWCAP_LS64),
> HWCAP_CAP(ID_AA64ISAR2_EL1, LUT, IMP, CAP_HWCAP, KERNEL_HWCAP_LUT),
> + HWCAP_CAP(ID_AA64ISAR2_EL1, LUT, LUT6, CAP_HWCAP, KERNEL_HWCAP_LUT6),
IIUC that's a LUTI6 SVE instruction which would not be available if
SVE2p3 is not available (or SVE in general), though we have the
equivalent SME one with SME2p3 (and a separate HWCAP for it). We should
rename it to HWCAP_SVE_LUT6 and make it conditional on
has_sve_feature().
KVM will probably confuse guests here if SVE is disabled but the
ISAR2.LUT field is not capped (I haven't checked). The conditional
has_sve_feature() would solve this but it won't address the MRS
emulation. Arguably it's a KVM problem for exposing inconsistent
id regs: ISAR2.LUT==0b0010 is not permitted without SVE2p3 or SME2p3.
But the spec isn't greatly written either - why does a field about
AdvSIMD all of a sudden reports SVE instructions availability?
On SME, unless I'm misreading the spec, the bits seem to have been
written by three different people in isolation:
- ID_AA64ZFR0_EL1.SVEver + ID_AA64PFR1_EL1.SME (and if these weren't
enough, we have ID_AA64SMFR0_EL1.SMEver) tells us that SME2p3 is
implemented. LUTI6 is mandated by SME2p3
- ID_AA64SMFR0_EL1.LUT6 means that the LUTI6 instruction is present but
this field can only be 0b1 with SME2p3
- ID_AA64ISAR2_EL1.LUT == 0b0010 means that LUTI6 instruction is present
(if SVE2p3 or SME2p3) and, again, that's the only value permitted by
SME2p3
So a lot of redundancy and we did end up reporting the fine-grained
details to the user already. The SMExpy versions seem to be cumulative
unless Arm decides to make some of the instructions optional (it still
doesn't explain why we have the same information in SMFR0 and ISAR2). I
guess that's where the fine-grained HWCAPs come in handy.
I wonder if the user would ever be able to parse these ID fields
correctly if using the MRS emulation. We'd need to sanity-check KVM as
well, not sure it proactively caps id fields.
--
Catalin
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-04-09 11:33 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-02 22:53 [PATCH 0/8] arm64: Implement support for 2025 dpISA extensions Mark Brown
2026-03-02 22:53 ` [PATCH 1/8] arm64/hwcap: Generate the KERNEL_HWCAP_ definitions for the hwcaps Mark Brown
2026-03-02 22:53 ` [PATCH 2/8] arm64/sysreg: Update ID_AA64ISAR0_EL1 description to DDI0601 2025-12 Mark Brown
2026-03-02 22:53 ` [PATCH 3/8] arm64/sysreg: Update ID_AA64ISAR2_EL1 " Mark Brown
2026-03-02 22:53 ` [PATCH 4/8] arm64/sysreg: Update ID_AA64FPFR0_EL1 " Mark Brown
2026-03-02 22:53 ` [PATCH 5/8] arm64/sysreg: Update ID_AA64ZFR0_EL1 " Mark Brown
2026-03-02 22:53 ` [PATCH 6/8] arm64/sysreg: Update ID_AA64SMFR0_EL1 " Mark Brown
2026-03-02 22:53 ` [PATCH 7/8] arm64/cpufeature: Define hwcaps for 2025 dpISA features Mark Brown
2026-04-09 11:33 ` Catalin Marinas
2026-03-02 22:53 ` [PATCH 8/8] kselftest/arm64: Add 2025 dpISA coverage to hwcaps Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox