Commit 407390d1 authored by Zeng Heng's avatar Zeng Heng
Browse files

arm64: cpufeature: Both the major and the minor version numbers need to be checked

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I92AK4

-----------------------------

Both the major version number and the minor version numbers need to be
checked to confirm whether the MPAM Extension is supported on the
platform.

This supports MPAM v0.1 version for cpufeature detection, check [1] for
details.

[1] https://developer.arm.com/documentation/ddi0595/2021-12/AArch64-


Registers/ID-AA64PFR1-EL1--AArch64-Processor-Feature-Register-1?lang=en

Fixes: 21771eaa ("arm64: cpufeature: discover CPU support for MPAM")
Signed-off-by: default avatarZeng Heng <zengheng4@huawei.com>
parent 735f0ab7
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -626,6 +626,13 @@ static inline bool id_aa64pfr0_mpam(u64 pfr0)
	return val > 0;
}

static inline bool id_aa64pfr1_mpamfrac(u64 pfr1)
{
	u32 val = cpuid_feature_extract_unsigned_field(pfr1, ID_AA64PFR1_EL1_MPAM_frac_SHIFT);

	return val > 0;
}

static inline bool id_aa64pfr1_mte(u64 pfr1)
{
	u32 val = cpuid_feature_extract_unsigned_field(pfr1, ID_AA64PFR1_EL1_MTE_SHIFT);
+9 −4
Original line number Diff line number Diff line
@@ -1078,7 +1078,8 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)
		vec_init_vq_map(ARM64_VEC_SME);
	}

	if (id_aa64pfr0_mpam(info->reg_id_aa64pfr0))
	if (id_aa64pfr0_mpam(info->reg_id_aa64pfr0) ||
	    id_aa64pfr1_mpamfrac(info->reg_id_aa64pfr1))
		init_cpu_ftr_reg(SYS_MPAMIDR_EL1, info->reg_mpamidr);

	if (id_aa64pfr1_mte(info->reg_id_aa64pfr1))
@@ -1340,7 +1341,8 @@ void update_cpu_features(int cpu,
			vec_update_vq_map(ARM64_VEC_SME);
	}

	if (id_aa64pfr0_mpam(info->reg_id_aa64pfr0)) {
	if (id_aa64pfr0_mpam(info->reg_id_aa64pfr0) ||
	    id_aa64pfr1_mpamfrac(info->reg_id_aa64pfr1)) {
		taint |= check_update_ftr_reg(SYS_MPAMIDR_EL1, cpu,
					info->reg_mpamidr, boot->reg_mpamidr);
	}
@@ -2308,7 +2310,11 @@ cpucap_panic_on_conflict(const struct arm64_cpu_capabilities *cap)
static bool __maybe_unused
test_has_mpam(const struct arm64_cpu_capabilities *entry, int scope)
{
	if (!has_cpuid_feature(entry, scope))
	u64 pfr0 = read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1);
	u64 pfr1 = read_sanitised_ftr_reg(SYS_ID_AA64PFR1_EL1);

	if (!id_aa64pfr0_mpam(pfr0) &&
	    !id_aa64pfr1_mpamfrac(pfr1))
		return false;

	/* Check firmware actually enabled MPAM on this cpu. */
@@ -2844,7 +2850,6 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
		.capability = ARM64_MPAM,
		.matches = test_has_mpam,
		.cpu_enable = cpu_enable_mpam,
		ARM64_CPUID_FIELDS(ID_AA64PFR0_EL1, MPAM, 1)
	},
#endif
#ifdef CONFIG_ARM64_TWED
+2 −1
Original line number Diff line number Diff line
@@ -461,7 +461,8 @@ static void __cpuinfo_store_cpu(struct cpuinfo_arm64 *info)
		__cpuinfo_store_cpu_32bit(&info->aarch32);

	if (IS_ENABLED(CONFIG_ARM64_MPAM) &&
	    id_aa64pfr0_mpam(info->reg_id_aa64pfr0))
	   (id_aa64pfr0_mpam(info->reg_id_aa64pfr0) ||
	    id_aa64pfr1_mpamfrac(info->reg_id_aa64pfr1)))
		info->reg_mpamidr = read_cpuid(MPAMIDR_EL1);

	cpuinfo_detect_icache_policy(info);