Skip to content

Commit d4209d8

Browse files
Steven Pricewilldeacon
authored andcommitted
arm64: cpufeature: Export matrix and other features to userspace
Export the features introduced as part of ARMv8.6 exposed in the ID_AA64ISAR1_EL1 and ID_AA64ZFR0_EL1 registers. This introduces the Matrix features (ARMv8.2-I8MM, ARMv8.2-F64MM and ARMv8.2-F32MM) along with BFloat16 (Armv8.2-BF16), speculation invalidation (SPECRES) and Data Gathering Hint (ARMv8.0-DGH). Signed-off-by: Julien Grall <[email protected]> [Added other features in those registers] Signed-off-by: Steven Price <[email protected]> [will: Don't advertise SPECRES to userspace] Signed-off-by: Will Deacon <[email protected]>
1 parent 46cf053 commit d4209d8

File tree

7 files changed

+93
-0
lines changed

7 files changed

+93
-0
lines changed

Documentation/arm64/cpu-feature-registers.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,12 @@ infrastructure:
200200
+------------------------------+---------+---------+
201201
| Name | bits | visible |
202202
+------------------------------+---------+---------+
203+
| I8MM | [55-52] | y |
204+
+------------------------------+---------+---------+
205+
| DGH | [51-48] | y |
206+
+------------------------------+---------+---------+
207+
| BF16 | [47-44] | y |
208+
+------------------------------+---------+---------+
203209
| SB | [39-36] | y |
204210
+------------------------------+---------+---------+
205211
| FRINTTS | [35-32] | y |
@@ -234,10 +240,18 @@ infrastructure:
234240
+------------------------------+---------+---------+
235241
| Name | bits | visible |
236242
+------------------------------+---------+---------+
243+
| F64MM | [59-56] | y |
244+
+------------------------------+---------+---------+
245+
| F32MM | [55-52] | y |
246+
+------------------------------+---------+---------+
247+
| I8MM | [47-44] | y |
248+
+------------------------------+---------+---------+
237249
| SM4 | [43-40] | y |
238250
+------------------------------+---------+---------+
239251
| SHA3 | [35-32] | y |
240252
+------------------------------+---------+---------+
253+
| BF16 | [23-20] | y |
254+
+------------------------------+---------+---------+
241255
| BitPerm | [19-16] | y |
242256
+------------------------------+---------+---------+
243257
| AES | [7-4] | y |

Documentation/arm64/elf_hwcaps.rst

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,33 @@ HWCAP2_FRINT
204204

205205
Functionality implied by ID_AA64ISAR1_EL1.FRINTTS == 0b0001.
206206

207+
HWCAP2_SVEI8MM
208+
209+
Functionality implied by ID_AA64ZFR0_EL1.I8MM == 0b0001.
210+
211+
HWCAP2_SVEF32MM
212+
213+
Functionality implied by ID_AA64ZFR0_EL1.F32MM == 0b0001.
214+
215+
HWCAP2_SVEF64MM
216+
217+
Functionality implied by ID_AA64ZFR0_EL1.F64MM == 0b0001.
218+
219+
HWCAP2_SVEBF16
220+
221+
Functionality implied by ID_AA64ZFR0_EL1.BF16 == 0b0001.
222+
223+
HWCAP2_I8MM
224+
225+
Functionality implied by ID_AA64ISAR1_EL1.I8MM == 0b0001.
226+
227+
HWCAP2_BF16
228+
229+
Functionality implied by ID_AA64ISAR1_EL1.BF16 == 0b0001.
230+
231+
HWCAP2_DGH
232+
233+
Functionality implied by ID_AA64ISAR1_EL1.DGH == 0b0001.
207234

208235
4. Unused AT_HWCAP bits
209236
-----------------------

arch/arm64/include/asm/hwcap.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@
8686
#define KERNEL_HWCAP_SVESM4 __khwcap2_feature(SVESM4)
8787
#define KERNEL_HWCAP_FLAGM2 __khwcap2_feature(FLAGM2)
8888
#define KERNEL_HWCAP_FRINT __khwcap2_feature(FRINT)
89+
#define KERNEL_HWCAP_SVEI8MM __khwcap2_feature(SVEI8MM)
90+
#define KERNEL_HWCAP_SVEF32MM __khwcap2_feature(SVEF32MM)
91+
#define KERNEL_HWCAP_SVEF64MM __khwcap2_feature(SVEF64MM)
92+
#define KERNEL_HWCAP_SVEBF16 __khwcap2_feature(SVEBF16)
93+
#define KERNEL_HWCAP_I8MM __khwcap2_feature(I8MM)
94+
#define KERNEL_HWCAP_DGH __khwcap2_feature(DGH)
95+
#define KERNEL_HWCAP_BF16 __khwcap2_feature(BF16)
8996

9097
/*
9198
* This yields a mask that user programs can use to figure out what

arch/arm64/include/asm/sysreg.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,10 @@
553553
#define ID_AA64ISAR0_AES_SHIFT 4
554554

555555
/* id_aa64isar1 */
556+
#define ID_AA64ISAR1_I8MM_SHIFT 52
557+
#define ID_AA64ISAR1_DGH_SHIFT 48
558+
#define ID_AA64ISAR1_BF16_SHIFT 44
559+
#define ID_AA64ISAR1_SPECRES_SHIFT 40
556560
#define ID_AA64ISAR1_SB_SHIFT 36
557561
#define ID_AA64ISAR1_FRINTTS_SHIFT 32
558562
#define ID_AA64ISAR1_GPI_SHIFT 28
@@ -605,12 +609,20 @@
605609
#define ID_AA64PFR1_SSBS_PSTATE_INSNS 2
606610

607611
/* id_aa64zfr0 */
612+
#define ID_AA64ZFR0_F64MM_SHIFT 56
613+
#define ID_AA64ZFR0_F32MM_SHIFT 52
614+
#define ID_AA64ZFR0_I8MM_SHIFT 44
608615
#define ID_AA64ZFR0_SM4_SHIFT 40
609616
#define ID_AA64ZFR0_SHA3_SHIFT 32
617+
#define ID_AA64ZFR0_BF16_SHIFT 20
610618
#define ID_AA64ZFR0_BITPERM_SHIFT 16
611619
#define ID_AA64ZFR0_AES_SHIFT 4
612620
#define ID_AA64ZFR0_SVEVER_SHIFT 0
613621

622+
#define ID_AA64ZFR0_F64MM 0x1
623+
#define ID_AA64ZFR0_F32MM 0x1
624+
#define ID_AA64ZFR0_I8MM 0x1
625+
#define ID_AA64ZFR0_BF16 0x1
614626
#define ID_AA64ZFR0_SM4 0x1
615627
#define ID_AA64ZFR0_SHA3 0x1
616628
#define ID_AA64ZFR0_BITPERM 0x1

arch/arm64/include/uapi/asm/hwcap.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,12 @@
6565
#define HWCAP2_SVESM4 (1 << 6)
6666
#define HWCAP2_FLAGM2 (1 << 7)
6767
#define HWCAP2_FRINT (1 << 8)
68+
#define HWCAP2_SVEI8MM (1 << 9)
69+
#define HWCAP2_SVEF32MM (1 << 10)
70+
#define HWCAP2_SVEF64MM (1 << 11)
71+
#define HWCAP2_SVEBF16 (1 << 12)
72+
#define HWCAP2_I8MM (1 << 13)
73+
#define HWCAP2_BF16 (1 << 14)
74+
#define HWCAP2_DGH (1 << 15)
6875

6976
#endif /* _UAPI__ASM_HWCAP_H */

arch/arm64/kernel/cpufeature.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ static const struct arm64_ftr_bits ftr_id_aa64isar0[] = {
135135
};
136136

137137
static const struct arm64_ftr_bits ftr_id_aa64isar1[] = {
138+
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_I8MM_SHIFT, 4, 0),
139+
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_DGH_SHIFT, 4, 0),
140+
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_BF16_SHIFT, 4, 0),
141+
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_SPECRES_SHIFT, 4, 0),
138142
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_SB_SHIFT, 4, 0),
139143
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_FRINTTS_SHIFT, 4, 0),
140144
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_PTR_AUTH),
@@ -176,10 +180,18 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr1[] = {
176180
};
177181

178182
static const struct arm64_ftr_bits ftr_id_aa64zfr0[] = {
183+
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
184+
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_F64MM_SHIFT, 4, 0),
185+
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
186+
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_F32MM_SHIFT, 4, 0),
187+
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
188+
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_I8MM_SHIFT, 4, 0),
179189
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
180190
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SM4_SHIFT, 4, 0),
181191
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
182192
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SHA3_SHIFT, 4, 0),
193+
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
194+
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_BF16_SHIFT, 4, 0),
183195
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
184196
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_BITPERM_SHIFT, 4, 0),
185197
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
@@ -1651,15 +1663,22 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
16511663
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_LRCPC_SHIFT, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_ILRCPC),
16521664
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_FRINTTS_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FRINT),
16531665
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_SB_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SB),
1666+
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_BF16_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_BF16),
1667+
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_DGH_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_DGH),
1668+
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_I8MM_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_I8MM),
16541669
HWCAP_CAP(SYS_ID_AA64MMFR2_EL1, ID_AA64MMFR2_AT_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_USCAT),
16551670
#ifdef CONFIG_ARM64_SVE
16561671
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_SVE_SHIFT, FTR_UNSIGNED, ID_AA64PFR0_SVE, CAP_HWCAP, KERNEL_HWCAP_SVE),
16571672
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SVEVER_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_SVEVER_SVE2, CAP_HWCAP, KERNEL_HWCAP_SVE2),
16581673
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_AES_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_AES, CAP_HWCAP, KERNEL_HWCAP_SVEAES),
16591674
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_AES_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_AES_PMULL, CAP_HWCAP, KERNEL_HWCAP_SVEPMULL),
16601675
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_BITPERM_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_BITPERM, CAP_HWCAP, KERNEL_HWCAP_SVEBITPERM),
1676+
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_BF16_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_BF16, CAP_HWCAP, KERNEL_HWCAP_SVEBF16),
16611677
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SHA3_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_SHA3, CAP_HWCAP, KERNEL_HWCAP_SVESHA3),
16621678
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SM4_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_SM4, CAP_HWCAP, KERNEL_HWCAP_SVESM4),
1679+
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_I8MM_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_I8MM, CAP_HWCAP, KERNEL_HWCAP_SVEI8MM),
1680+
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_F32MM_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_F32MM, CAP_HWCAP, KERNEL_HWCAP_SVEF32MM),
1681+
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_F64MM_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_F64MM, CAP_HWCAP, KERNEL_HWCAP_SVEF64MM),
16631682
#endif
16641683
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_SSBS_SHIFT, FTR_UNSIGNED, ID_AA64PFR1_SSBS_PSTATE_INSNS, CAP_HWCAP, KERNEL_HWCAP_SSBS),
16651684
#ifdef CONFIG_ARM64_PTR_AUTH

arch/arm64/kernel/cpuinfo.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ static const char *const hwcap_str[] = {
8484
"svesm4",
8585
"flagm2",
8686
"frint",
87+
"svei8mm",
88+
"svef32mm",
89+
"svef64mm",
90+
"svebf16",
91+
"i8mm",
92+
"bf16",
93+
"dgh",
8794
NULL
8895
};
8996

0 commit comments

Comments
 (0)