Skip to content

Commit cc9f69a

Browse files
brooniectmarinas
authored andcommitted
arm64/cpufeature: Hook new identification registers up to cpufeature
The 2023 architecture extensions have defined several new ID registers, hook them up to the cpufeature code so we can add feature checks and hwcaps based on their contents. Signed-off-by: Mark Brown <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Catalin Marinas <[email protected]>
1 parent 54be6c6 commit cc9f69a

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

arch/arm64/include/asm/cpu.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,17 @@ struct cpuinfo_arm64 {
5252
u64 reg_id_aa64isar0;
5353
u64 reg_id_aa64isar1;
5454
u64 reg_id_aa64isar2;
55+
u64 reg_id_aa64isar3;
5556
u64 reg_id_aa64mmfr0;
5657
u64 reg_id_aa64mmfr1;
5758
u64 reg_id_aa64mmfr2;
5859
u64 reg_id_aa64mmfr3;
5960
u64 reg_id_aa64pfr0;
6061
u64 reg_id_aa64pfr1;
62+
u64 reg_id_aa64pfr2;
6163
u64 reg_id_aa64zfr0;
6264
u64 reg_id_aa64smfr0;
65+
u64 reg_id_aa64fpfr0;
6366

6467
struct cpuinfo_32bit aarch32;
6568
};

arch/arm64/kernel/cpufeature.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ static const struct arm64_ftr_bits ftr_id_aa64isar2[] = {
234234
ARM64_FTR_END,
235235
};
236236

237+
static const struct arm64_ftr_bits ftr_id_aa64isar3[] = {
238+
ARM64_FTR_END,
239+
};
240+
237241
static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
238242
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL1_CSV3_SHIFT, 4, 0),
239243
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL1_CSV2_SHIFT, 4, 0),
@@ -267,6 +271,10 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr1[] = {
267271
ARM64_FTR_END,
268272
};
269273

274+
static const struct arm64_ftr_bits ftr_id_aa64pfr2[] = {
275+
ARM64_FTR_END,
276+
};
277+
270278
static const struct arm64_ftr_bits ftr_id_aa64zfr0[] = {
271279
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
272280
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_EL1_F64MM_SHIFT, 4, 0),
@@ -319,6 +327,10 @@ static const struct arm64_ftr_bits ftr_id_aa64smfr0[] = {
319327
ARM64_FTR_END,
320328
};
321329

330+
static const struct arm64_ftr_bits ftr_id_aa64fpfr0[] = {
331+
ARM64_FTR_END,
332+
};
333+
322334
static const struct arm64_ftr_bits ftr_id_aa64mmfr0[] = {
323335
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR0_EL1_ECV_SHIFT, 4, 0),
324336
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR0_EL1_FGT_SHIFT, 4, 0),
@@ -702,10 +714,12 @@ static const struct __ftr_reg_entry {
702714
&id_aa64pfr0_override),
703715
ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64PFR1_EL1, ftr_id_aa64pfr1,
704716
&id_aa64pfr1_override),
717+
ARM64_FTR_REG(SYS_ID_AA64PFR2_EL1, ftr_id_aa64pfr2),
705718
ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64ZFR0_EL1, ftr_id_aa64zfr0,
706719
&id_aa64zfr0_override),
707720
ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64SMFR0_EL1, ftr_id_aa64smfr0,
708721
&id_aa64smfr0_override),
722+
ARM64_FTR_REG(SYS_ID_AA64FPFR0_EL1, ftr_id_aa64fpfr0),
709723

710724
/* Op1 = 0, CRn = 0, CRm = 5 */
711725
ARM64_FTR_REG(SYS_ID_AA64DFR0_EL1, ftr_id_aa64dfr0),
@@ -717,6 +731,7 @@ static const struct __ftr_reg_entry {
717731
&id_aa64isar1_override),
718732
ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64ISAR2_EL1, ftr_id_aa64isar2,
719733
&id_aa64isar2_override),
734+
ARM64_FTR_REG(SYS_ID_AA64ISAR3_EL1, ftr_id_aa64isar3),
720735

721736
/* Op1 = 0, CRn = 0, CRm = 7 */
722737
ARM64_FTR_REG(SYS_ID_AA64MMFR0_EL1, ftr_id_aa64mmfr0),
@@ -1043,14 +1058,17 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)
10431058
init_cpu_ftr_reg(SYS_ID_AA64ISAR0_EL1, info->reg_id_aa64isar0);
10441059
init_cpu_ftr_reg(SYS_ID_AA64ISAR1_EL1, info->reg_id_aa64isar1);
10451060
init_cpu_ftr_reg(SYS_ID_AA64ISAR2_EL1, info->reg_id_aa64isar2);
1061+
init_cpu_ftr_reg(SYS_ID_AA64ISAR3_EL1, info->reg_id_aa64isar3);
10461062
init_cpu_ftr_reg(SYS_ID_AA64MMFR0_EL1, info->reg_id_aa64mmfr0);
10471063
init_cpu_ftr_reg(SYS_ID_AA64MMFR1_EL1, info->reg_id_aa64mmfr1);
10481064
init_cpu_ftr_reg(SYS_ID_AA64MMFR2_EL1, info->reg_id_aa64mmfr2);
10491065
init_cpu_ftr_reg(SYS_ID_AA64MMFR3_EL1, info->reg_id_aa64mmfr3);
10501066
init_cpu_ftr_reg(SYS_ID_AA64PFR0_EL1, info->reg_id_aa64pfr0);
10511067
init_cpu_ftr_reg(SYS_ID_AA64PFR1_EL1, info->reg_id_aa64pfr1);
1068+
init_cpu_ftr_reg(SYS_ID_AA64PFR2_EL1, info->reg_id_aa64pfr2);
10521069
init_cpu_ftr_reg(SYS_ID_AA64ZFR0_EL1, info->reg_id_aa64zfr0);
10531070
init_cpu_ftr_reg(SYS_ID_AA64SMFR0_EL1, info->reg_id_aa64smfr0);
1071+
init_cpu_ftr_reg(SYS_ID_AA64FPFR0_EL1, info->reg_id_aa64fpfr0);
10541072

10551073
if (id_aa64pfr0_32bit_el0(info->reg_id_aa64pfr0))
10561074
init_32bit_cpu_features(&info->aarch32);
@@ -1272,6 +1290,8 @@ void update_cpu_features(int cpu,
12721290
info->reg_id_aa64isar1, boot->reg_id_aa64isar1);
12731291
taint |= check_update_ftr_reg(SYS_ID_AA64ISAR2_EL1, cpu,
12741292
info->reg_id_aa64isar2, boot->reg_id_aa64isar2);
1293+
taint |= check_update_ftr_reg(SYS_ID_AA64ISAR3_EL1, cpu,
1294+
info->reg_id_aa64isar3, boot->reg_id_aa64isar3);
12751295

12761296
/*
12771297
* Differing PARange support is fine as long as all peripherals and
@@ -1291,13 +1311,18 @@ void update_cpu_features(int cpu,
12911311
info->reg_id_aa64pfr0, boot->reg_id_aa64pfr0);
12921312
taint |= check_update_ftr_reg(SYS_ID_AA64PFR1_EL1, cpu,
12931313
info->reg_id_aa64pfr1, boot->reg_id_aa64pfr1);
1314+
taint |= check_update_ftr_reg(SYS_ID_AA64PFR2_EL1, cpu,
1315+
info->reg_id_aa64pfr2, boot->reg_id_aa64pfr2);
12941316

12951317
taint |= check_update_ftr_reg(SYS_ID_AA64ZFR0_EL1, cpu,
12961318
info->reg_id_aa64zfr0, boot->reg_id_aa64zfr0);
12971319

12981320
taint |= check_update_ftr_reg(SYS_ID_AA64SMFR0_EL1, cpu,
12991321
info->reg_id_aa64smfr0, boot->reg_id_aa64smfr0);
13001322

1323+
taint |= check_update_ftr_reg(SYS_ID_AA64FPFR0_EL1, cpu,
1324+
info->reg_id_aa64fpfr0, boot->reg_id_aa64fpfr0);
1325+
13011326
/* Probe vector lengths */
13021327
if (IS_ENABLED(CONFIG_ARM64_SVE) &&
13031328
id_aa64pfr0_sve(read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1))) {
@@ -1410,8 +1435,10 @@ u64 __read_sysreg_by_encoding(u32 sys_id)
14101435

14111436
read_sysreg_case(SYS_ID_AA64PFR0_EL1);
14121437
read_sysreg_case(SYS_ID_AA64PFR1_EL1);
1438+
read_sysreg_case(SYS_ID_AA64PFR2_EL1);
14131439
read_sysreg_case(SYS_ID_AA64ZFR0_EL1);
14141440
read_sysreg_case(SYS_ID_AA64SMFR0_EL1);
1441+
read_sysreg_case(SYS_ID_AA64FPFR0_EL1);
14151442
read_sysreg_case(SYS_ID_AA64DFR0_EL1);
14161443
read_sysreg_case(SYS_ID_AA64DFR1_EL1);
14171444
read_sysreg_case(SYS_ID_AA64MMFR0_EL1);
@@ -1421,6 +1448,7 @@ u64 __read_sysreg_by_encoding(u32 sys_id)
14211448
read_sysreg_case(SYS_ID_AA64ISAR0_EL1);
14221449
read_sysreg_case(SYS_ID_AA64ISAR1_EL1);
14231450
read_sysreg_case(SYS_ID_AA64ISAR2_EL1);
1451+
read_sysreg_case(SYS_ID_AA64ISAR3_EL1);
14241452

14251453
read_sysreg_case(SYS_CNTFRQ_EL0);
14261454
read_sysreg_case(SYS_CTR_EL0);

arch/arm64/kernel/cpuinfo.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,14 +443,17 @@ static void __cpuinfo_store_cpu(struct cpuinfo_arm64 *info)
443443
info->reg_id_aa64isar0 = read_cpuid(ID_AA64ISAR0_EL1);
444444
info->reg_id_aa64isar1 = read_cpuid(ID_AA64ISAR1_EL1);
445445
info->reg_id_aa64isar2 = read_cpuid(ID_AA64ISAR2_EL1);
446+
info->reg_id_aa64isar3 = read_cpuid(ID_AA64ISAR3_EL1);
446447
info->reg_id_aa64mmfr0 = read_cpuid(ID_AA64MMFR0_EL1);
447448
info->reg_id_aa64mmfr1 = read_cpuid(ID_AA64MMFR1_EL1);
448449
info->reg_id_aa64mmfr2 = read_cpuid(ID_AA64MMFR2_EL1);
449450
info->reg_id_aa64mmfr3 = read_cpuid(ID_AA64MMFR3_EL1);
450451
info->reg_id_aa64pfr0 = read_cpuid(ID_AA64PFR0_EL1);
451452
info->reg_id_aa64pfr1 = read_cpuid(ID_AA64PFR1_EL1);
453+
info->reg_id_aa64pfr2 = read_cpuid(ID_AA64PFR2_EL1);
452454
info->reg_id_aa64zfr0 = read_cpuid(ID_AA64ZFR0_EL1);
453455
info->reg_id_aa64smfr0 = read_cpuid(ID_AA64SMFR0_EL1);
456+
info->reg_id_aa64fpfr0 = read_cpuid(ID_AA64FPFR0_EL1);
454457

455458
if (id_aa64pfr1_mte(info->reg_id_aa64pfr1))
456459
info->reg_gmid = read_cpuid(GMID_EL1);

0 commit comments

Comments
 (0)