|
@@ -199,12 +199,12 @@ static const struct arm64_ftr_bits ftr_id_aa64mmfr2[] = {
|
|
|
};
|
|
|
|
|
|
static const struct arm64_ftr_bits ftr_ctr[] = {
|
|
|
- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RES1 */
|
|
|
- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 29, 1, 1), /* DIC */
|
|
|
- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 28, 1, 1), /* IDC */
|
|
|
- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, 24, 4, 0), /* CWG */
|
|
|
- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, 20, 4, 0), /* ERG */
|
|
|
- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 1), /* DminLine */
|
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RES1 */
|
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_DIC_SHIFT, 1, 1),
|
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_IDC_SHIFT, 1, 1),
|
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, CTR_CWG_SHIFT, 4, 0),
|
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, CTR_ERG_SHIFT, 4, 0),
|
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_DMINLINE_SHIFT, 4, 1),
|
|
|
/*
|
|
|
* Linux can handle differing I-cache policies. Userspace JITs will
|
|
|
* make use of *minLine.
|
|
@@ -852,6 +852,18 @@ static bool has_no_fpsimd(const struct arm64_cpu_capabilities *entry, int __unus
|
|
|
ID_AA64PFR0_FP_SHIFT) < 0;
|
|
|
}
|
|
|
|
|
|
+static bool has_cache_idc(const struct arm64_cpu_capabilities *entry,
|
|
|
+ int __unused)
|
|
|
+{
|
|
|
+ return read_sanitised_ftr_reg(SYS_CTR_EL0) & BIT(CTR_IDC_SHIFT);
|
|
|
+}
|
|
|
+
|
|
|
+static bool has_cache_dic(const struct arm64_cpu_capabilities *entry,
|
|
|
+ int __unused)
|
|
|
+{
|
|
|
+ return read_sanitised_ftr_reg(SYS_CTR_EL0) & BIT(CTR_DIC_SHIFT);
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
|
|
static int __kpti_forced; /* 0: not forced, >0: forced on, <0: forced off */
|
|
|
|
|
@@ -1088,6 +1100,18 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
.enable = cpu_clear_disr,
|
|
|
},
|
|
|
#endif /* CONFIG_ARM64_RAS_EXTN */
|
|
|
+ {
|
|
|
+ .desc = "Data cache clean to the PoU not required for I/D coherence",
|
|
|
+ .capability = ARM64_HAS_CACHE_IDC,
|
|
|
+ .def_scope = SCOPE_SYSTEM,
|
|
|
+ .matches = has_cache_idc,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .desc = "Instruction cache invalidation not required for I/D coherence",
|
|
|
+ .capability = ARM64_HAS_CACHE_DIC,
|
|
|
+ .def_scope = SCOPE_SYSTEM,
|
|
|
+ .matches = has_cache_dic,
|
|
|
+ },
|
|
|
{},
|
|
|
};
|
|
|
|