powerpc: Enable the DAWR on POWER9 DD2.3 and above
The hardware bug in POWER9 preventing use of the DAWR was fixed in DD2.3. Set the CPU_FTR_DAWR feature bit on these newer systems to start using it again, and update the documentation accordingly. The CPU features for DD2.3 are currently determined by "DD2.2 or later" logic. In adding DD2.3 as a discrete case for the first time here, I'm carrying the quirks of DD2.2 forward to keep all behavior outside of this DAWR change the same. This leaves the assessment and potential removal of those quirks on DD2.3 for later. Signed-off-by: Reza Arbab <arbab@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220503170152.23412-1-arbab@linux.ibm.com
This commit is contained in:
parent
b4d9cc7572
commit
26b78c81e8
|
@ -2,15 +2,23 @@
|
||||||
DAWR issues on POWER9
|
DAWR issues on POWER9
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
On POWER9 the Data Address Watchpoint Register (DAWR) can cause a checkstop
|
On older POWER9 processors, the Data Address Watchpoint Register (DAWR) can
|
||||||
if it points to cache inhibited (CI) memory. Currently Linux has no way to
|
cause a checkstop if it points to cache inhibited (CI) memory. Currently Linux
|
||||||
distinguish CI memory when configuring the DAWR, so (for now) the DAWR is
|
has no way to distinguish CI memory when configuring the DAWR, so on affected
|
||||||
disabled by this commit::
|
systems, the DAWR is disabled.
|
||||||
|
|
||||||
commit 9654153158d3e0684a1bdb76dbababdb7111d5a0
|
Affected processor revisions
|
||||||
Author: Michael Neuling <mikey@neuling.org>
|
============================
|
||||||
Date: Tue Mar 27 15:37:24 2018 +1100
|
|
||||||
powerpc: Disable DAWR in the base POWER9 CPU features
|
This issue is only present on processors prior to v2.3. The revision can be
|
||||||
|
found in /proc/cpuinfo::
|
||||||
|
|
||||||
|
processor : 0
|
||||||
|
cpu : POWER9, altivec supported
|
||||||
|
clock : 3800.000000MHz
|
||||||
|
revision : 2.3 (pvr 004e 1203)
|
||||||
|
|
||||||
|
On a system with the issue, the DAWR is disabled as detailed below.
|
||||||
|
|
||||||
Technical Details:
|
Technical Details:
|
||||||
==================
|
==================
|
||||||
|
|
|
@ -440,6 +440,10 @@ static inline void cpu_feature_keys_init(void) { }
|
||||||
#define CPU_FTRS_POWER9_DD2_2 (CPU_FTRS_POWER9 | CPU_FTR_POWER9_DD2_1 | \
|
#define CPU_FTRS_POWER9_DD2_2 (CPU_FTRS_POWER9 | CPU_FTR_POWER9_DD2_1 | \
|
||||||
CPU_FTR_P9_TM_HV_ASSIST | \
|
CPU_FTR_P9_TM_HV_ASSIST | \
|
||||||
CPU_FTR_P9_TM_XER_SO_BUG)
|
CPU_FTR_P9_TM_XER_SO_BUG)
|
||||||
|
#define CPU_FTRS_POWER9_DD2_3 (CPU_FTRS_POWER9 | CPU_FTR_POWER9_DD2_1 | \
|
||||||
|
CPU_FTR_P9_TM_HV_ASSIST | \
|
||||||
|
CPU_FTR_P9_TM_XER_SO_BUG | \
|
||||||
|
CPU_FTR_DAWR)
|
||||||
#define CPU_FTRS_POWER10 (CPU_FTR_LWSYNC | \
|
#define CPU_FTRS_POWER10 (CPU_FTR_LWSYNC | \
|
||||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\
|
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\
|
||||||
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||||
|
@ -469,14 +473,16 @@ static inline void cpu_feature_keys_init(void) { }
|
||||||
#define CPU_FTRS_POSSIBLE \
|
#define CPU_FTRS_POSSIBLE \
|
||||||
(CPU_FTRS_POWER7 | CPU_FTRS_POWER8E | CPU_FTRS_POWER8 | \
|
(CPU_FTRS_POWER7 | CPU_FTRS_POWER8E | CPU_FTRS_POWER8 | \
|
||||||
CPU_FTR_ALTIVEC_COMP | CPU_FTR_VSX_COMP | CPU_FTRS_POWER9 | \
|
CPU_FTR_ALTIVEC_COMP | CPU_FTR_VSX_COMP | CPU_FTRS_POWER9 | \
|
||||||
CPU_FTRS_POWER9_DD2_1 | CPU_FTRS_POWER9_DD2_2 | CPU_FTRS_POWER10)
|
CPU_FTRS_POWER9_DD2_1 | CPU_FTRS_POWER9_DD2_2 | \
|
||||||
|
CPU_FTRS_POWER9_DD2_3 | CPU_FTRS_POWER10)
|
||||||
#else
|
#else
|
||||||
#define CPU_FTRS_POSSIBLE \
|
#define CPU_FTRS_POSSIBLE \
|
||||||
(CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | \
|
(CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | \
|
||||||
CPU_FTRS_POWER6 | CPU_FTRS_POWER7 | CPU_FTRS_POWER8E | \
|
CPU_FTRS_POWER6 | CPU_FTRS_POWER7 | CPU_FTRS_POWER8E | \
|
||||||
CPU_FTRS_POWER8 | CPU_FTRS_CELL | CPU_FTRS_PA6T | \
|
CPU_FTRS_POWER8 | CPU_FTRS_CELL | CPU_FTRS_PA6T | \
|
||||||
CPU_FTR_VSX_COMP | CPU_FTR_ALTIVEC_COMP | CPU_FTRS_POWER9 | \
|
CPU_FTR_VSX_COMP | CPU_FTR_ALTIVEC_COMP | CPU_FTRS_POWER9 | \
|
||||||
CPU_FTRS_POWER9_DD2_1 | CPU_FTRS_POWER9_DD2_2 | CPU_FTRS_POWER10)
|
CPU_FTRS_POWER9_DD2_1 | CPU_FTRS_POWER9_DD2_2 | \
|
||||||
|
CPU_FTRS_POWER9_DD2_3 | CPU_FTRS_POWER10)
|
||||||
#endif /* CONFIG_CPU_LITTLE_ENDIAN */
|
#endif /* CONFIG_CPU_LITTLE_ENDIAN */
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -487,11 +487,29 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||||
.machine_check_early = __machine_check_early_realmode_p9,
|
.machine_check_early = __machine_check_early_realmode_p9,
|
||||||
.platform = "power9",
|
.platform = "power9",
|
||||||
},
|
},
|
||||||
{ /* Power9 DD2.2 or later */
|
{ /* Power9 DD2.2 */
|
||||||
|
.pvr_mask = 0xffffefff,
|
||||||
|
.pvr_value = 0x004e0202,
|
||||||
|
.cpu_name = "POWER9 (raw)",
|
||||||
|
.cpu_features = CPU_FTRS_POWER9_DD2_2,
|
||||||
|
.cpu_user_features = COMMON_USER_POWER9,
|
||||||
|
.cpu_user_features2 = COMMON_USER2_POWER9,
|
||||||
|
.mmu_features = MMU_FTRS_POWER9,
|
||||||
|
.icache_bsize = 128,
|
||||||
|
.dcache_bsize = 128,
|
||||||
|
.num_pmcs = 6,
|
||||||
|
.pmc_type = PPC_PMC_IBM,
|
||||||
|
.oprofile_cpu_type = "ppc64/power9",
|
||||||
|
.cpu_setup = __setup_cpu_power9,
|
||||||
|
.cpu_restore = __restore_cpu_power9,
|
||||||
|
.machine_check_early = __machine_check_early_realmode_p9,
|
||||||
|
.platform = "power9",
|
||||||
|
},
|
||||||
|
{ /* Power9 DD2.3 or later */
|
||||||
.pvr_mask = 0xffff0000,
|
.pvr_mask = 0xffff0000,
|
||||||
.pvr_value = 0x004e0000,
|
.pvr_value = 0x004e0000,
|
||||||
.cpu_name = "POWER9 (raw)",
|
.cpu_name = "POWER9 (raw)",
|
||||||
.cpu_features = CPU_FTRS_POWER9_DD2_2,
|
.cpu_features = CPU_FTRS_POWER9_DD2_3,
|
||||||
.cpu_user_features = COMMON_USER_POWER9,
|
.cpu_user_features = COMMON_USER_POWER9,
|
||||||
.cpu_user_features2 = COMMON_USER2_POWER9,
|
.cpu_user_features2 = COMMON_USER2_POWER9,
|
||||||
.mmu_features = MMU_FTRS_POWER9,
|
.mmu_features = MMU_FTRS_POWER9,
|
||||||
|
|
|
@ -774,20 +774,26 @@ static __init void cpufeatures_cpu_quirks(void)
|
||||||
if ((version & 0xffffefff) == 0x004e0200) {
|
if ((version & 0xffffefff) == 0x004e0200) {
|
||||||
/* DD2.0 has no feature flag */
|
/* DD2.0 has no feature flag */
|
||||||
cur_cpu_spec->cpu_features |= CPU_FTR_P9_RADIX_PREFETCH_BUG;
|
cur_cpu_spec->cpu_features |= CPU_FTR_P9_RADIX_PREFETCH_BUG;
|
||||||
|
cur_cpu_spec->cpu_features &= ~(CPU_FTR_DAWR);
|
||||||
} else if ((version & 0xffffefff) == 0x004e0201) {
|
} else if ((version & 0xffffefff) == 0x004e0201) {
|
||||||
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1;
|
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1;
|
||||||
cur_cpu_spec->cpu_features |= CPU_FTR_P9_RADIX_PREFETCH_BUG;
|
cur_cpu_spec->cpu_features |= CPU_FTR_P9_RADIX_PREFETCH_BUG;
|
||||||
|
cur_cpu_spec->cpu_features &= ~(CPU_FTR_DAWR);
|
||||||
} else if ((version & 0xffffefff) == 0x004e0202) {
|
} else if ((version & 0xffffefff) == 0x004e0202) {
|
||||||
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TM_HV_ASSIST;
|
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TM_HV_ASSIST;
|
||||||
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TM_XER_SO_BUG;
|
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TM_XER_SO_BUG;
|
||||||
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1;
|
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1;
|
||||||
|
cur_cpu_spec->cpu_features &= ~(CPU_FTR_DAWR);
|
||||||
|
} else if ((version & 0xffffefff) == 0x004e0203) {
|
||||||
|
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TM_HV_ASSIST;
|
||||||
|
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TM_XER_SO_BUG;
|
||||||
|
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1;
|
||||||
} else if ((version & 0xffff0000) == 0x004e0000) {
|
} else if ((version & 0xffff0000) == 0x004e0000) {
|
||||||
/* DD2.1 and up have DD2_1 */
|
/* DD2.1 and up have DD2_1 */
|
||||||
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1;
|
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((version & 0xffff0000) == 0x004e0000) {
|
if ((version & 0xffff0000) == 0x004e0000) {
|
||||||
cur_cpu_spec->cpu_features &= ~(CPU_FTR_DAWR);
|
|
||||||
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TIDR;
|
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TIDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue