Unverified Commit af30366f authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files
parents b19555a7 3dd2401b
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -205,6 +205,8 @@ stable kernels.
+----------------+-----------------+-----------------+-----------------------------+
| Hisilicon      | LINXICORE9100   | #162100125      | HISILICON_ERRATUM_162100125 |
+----------------+-----------------+-----------------+-----------------------------+
| Hisilicon      | LINXICORE9100   | #1980005        | HISILICON_ERRATUM_1980005   |
+----------------+-----------------+-----------------+-----------------------------+
+----------------+-----------------+-----------------+-----------------------------+
| Qualcomm Tech. | Kryo/Falkor v1  | E1003           | QCOM_FALKOR_ERRATUM_1003    |
+----------------+-----------------+-----------------+-----------------------------+
+10 −0
Original line number Diff line number Diff line
@@ -1170,6 +1170,16 @@ config HISILICON_ERRATUM_162100125

	  If unsure, say Y.

config HISILICON_ERRATUM_1980005
	bool "Hisilicon erratum 1980005: IDC support"
	default n
	help
	  Some of the Hisilicon linxicore support idc but report wrong value to
	  the kernel, which result to the unnecessary cache flush, leading to
	  performance degradation.

	  If unsure, say N.

config QCOM_FALKOR_ERRATUM_1003
	bool "Falkor E1003: Incorrect translation due to ASID change"
	default y
+9 −0
Original line number Diff line number Diff line
@@ -112,6 +112,15 @@ int cache_line_size(void);
static inline u32 __attribute_const__ read_cpuid_effective_cachetype(void)
{
	u32 ctr = read_cpuid_cachetype();
#ifdef CONFIG_HISILICON_ERRATUM_1980005
	static const struct midr_range idc_support_list[] = {
		MIDR_ALL_VERSIONS(MIDR_HISI_TSV110),
		MIDR_REV(MIDR_HISI_LINXICORE9100, 1, 0),
		{ /* sentinel */ }
	};
	if (is_midr_in_range_list(read_cpuid_id(), idc_support_list))
		ctr |= BIT(CTR_EL0_IDC_SHIFT);
#endif

	if (!(ctr & BIT(CTR_EL0_IDC_SHIFT))) {
		u64 clidr = read_sysreg(clidr_el1);
+33 −0
Original line number Diff line number Diff line
@@ -60,6 +60,30 @@ is_kryo_midr(const struct arm64_cpu_capabilities *entry, int scope)
	return model == entry->midr_range.model;
}

#ifdef CONFIG_HISILICON_ERRATUM_1980005
static bool
hisilicon_1980005_match(const struct arm64_cpu_capabilities *entry,
			int scope)
{
	static const struct midr_range idc_support_list[] = {
		MIDR_ALL_VERSIONS(MIDR_HISI_TSV110),
		MIDR_REV(MIDR_HISI_LINXICORE9100, 1, 0),
		{ /* sentinel */ }
	};

	return is_midr_in_range_list(read_cpuid_id(), idc_support_list);
}

static void
hisilicon_1980005_enable(const struct arm64_cpu_capabilities *__unused)
{
	__set_bit(ARM64_HAS_CACHE_IDC, system_cpucaps);
	arm64_ftr_reg_ctrel0.sys_val |= BIT(CTR_EL0_IDC_SHIFT);
	arm64_ftr_reg_ctrel0.strict_mask &= ~BIT(CTR_EL0_IDC_SHIFT);
	sysreg_clear_set(sctlr_el1, SCTLR_EL1_UCT, 0);
}
#endif

static bool
has_mismatched_cache_type(const struct arm64_cpu_capabilities *entry,
			  int scope)
@@ -567,6 +591,15 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
		ERRATA_MIDR_RANGE_LIST(hisilicon_erratum_162100125_cpus),
	},
#endif
#ifdef CONFIG_HISILICON_ERRATUM_1980005
	{
		.desc = "Hisilicon erratum 1980005 (IDC)",
		.capability = ARM64_WORKAROUND_HISILICON_1980005,
		.matches = hisilicon_1980005_match,
		.type = ARM64_CPUCAP_SYSTEM_FEATURE,
		.cpu_enable = hisilicon_1980005_enable,
	},
#endif
#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1003
	{
		.desc = "Qualcomm Technologies Falkor/Kryo erratum 1003",
+1 −0
Original line number Diff line number Diff line
@@ -102,3 +102,4 @@ WORKAROUND_REPEAT_TLBI
WORKAROUND_SPECULATIVE_AT
WORKAROUND_HISILICON_ERRATUM_162100125
WORKAROUND_HISI_HIP08_RU_PREFETCH
WORKAROUND_HISILICON_1980005