Unverified Commit 750e6b5d authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

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

Merge Pull Request from: @ci-robot 
 
PR sync from: Zeng Heng <zengheng4@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/ZURY5DFEAAV2YYGAXBKSINMAR7NMIZ5K/ 
Zeng Heng (2):
  arm64: cpufeature: Both the major and the minor version numbers need
    to be checked
  arm64/mpam: skip mpam initialize under kdump kernel


--
2.25.1
 
https://gitee.com/openeuler/kernel/issues/I92AK4 
 
Link:https://gitee.com/openeuler/kernel/pulls/8440

 

Reviewed-by: default avatarWang ShaoBo <bobo.shaobowang@huawei.com>
Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents d7b58db0 fc1c5dc8
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);
+4 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include <linux/arm_mpam.h>
#include <linux/jump_label.h>
#include <linux/percpu.h>
#include <linux/crash_dump.h>

DEFINE_STATIC_KEY_FALSE(arm64_mpam_has_hcr);
DEFINE_STATIC_KEY_FALSE(mpam_enabled);
@@ -14,6 +15,9 @@ DEFINE_PER_CPU(u64, arm64_mpam_current);

static int __init arm64_mpam_register_cpus(void)
{
	if (is_kdump_kernel())
		return 0;

	u64 mpamidr = read_sanitised_ftr_reg(SYS_MPAMIDR_EL1);
	u16 partid_max = FIELD_GET(MPAMIDR_PARTID_MAX, mpamidr);
	u8 pmg_max = FIELD_GET(MPAMIDR_PMG_MAX, mpamidr);