Pre-requisites for the arch timer errata workarounds:
- Allow checking of a CPU-local erratum - Add CNTVCT_EL0 trap handler - Define Cortex-A73 MIDR - Allow an erratum to be match for all revisions of a core - Add capability to advertise Cortex-A73 erratum 858921 -----BEGIN PGP SIGNATURE----- iQJJBAABCAAzFiEEn9UcU+C1Yxj9lZw9I9DQutE9ekMFAljnlbgVHG1hcmMuenlu Z2llckBhcm0uY29tAAoJECPQ0LrRPXpDx+YP/1OU8GnrVBR2cjEctaTz3s51sPRR +7j1BZ3pbKnwY3XpM6GJpxc//sSBSphqWZXN5GJZW1lSgw7hpl02mA9rh62G4Xmh wUqR2hmQ5UdenoR5tE39BZrzMFlef90bA7AZyatSqum6AEQcYPJZEgzOvEvfw/mY Bc4w73At9OTILRXeZjJZabdeJ4aJLs+6xMfsc9ApgxiZIZ5xhJ7CQzcJFdQ2tFeB 9wYqxkt8i9aZfmj3IX14m3fXISQ4JlXoi8QTBqy7qunCMEFU6jtCwC5aZKj1U3Hh zebVWomcWMQpFaJw3qxZgjVXftv5r2UsHbMoLo4wFa98Qerr7t9/bGifbFqpKm7S hA0uzcftUHoQF+l/Qxt9rTlsPKrBMoXjY2XDkKiWP/hqXsXKDBnngKQb2ZFJFT5r UABMBhqlBQpI2l0/Qn0fL7aEC1xZCVnSgGpAXFvg/Ci7X2K+HH37brt5uNh3vDZI c5UaWUUycDa5GcCnmoK3QWVeitVW/ydJGaoIT06CKBDrktcpsoO4u4w6CI8xsIJL RbJwCb72JU5HV7XDpdbc/lLzi30kWceOEUSHrs3dCEnkr41kOunDGm/Xxk/Sm8VL SeYSx9UotuJvWWozZzVWpLiUSizjh6UB2XWnkSLkT++KA6YPX4L2/hYAw7E3bYVe FAFoLL7jUYdrjpCF =XSx4 -----END PGP SIGNATURE----- Merge tag 'arch-timer-errata-prereq' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into for-next/core Pre-requisites for the arch timer errata workarounds: - Allow checking of a CPU-local erratum - Add CNTVCT_EL0 trap handler - Define Cortex-A73 MIDR - Allow an erratum to be match for all revisions of a core - Add capability to advertise Cortex-A73 erratum 858921 * tag 'arch-timer-errata-prereq' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms: arm64: cpu_errata: Add capability to advertise Cortex-A73 erratum 858921 arm64: cpu_errata: Allow an erratum to be match for all revisions of a core arm64: Define Cortex-A73 MIDR arm64: Add CNTVCT_EL0 trap handler arm64: Allow checking of a CPU-local erratum
This commit is contained in:
commit
a5a3237e50
|
@ -54,6 +54,7 @@ stable kernels.
|
||||||
| ARM | Cortex-A57 | #852523 | N/A |
|
| ARM | Cortex-A57 | #852523 | N/A |
|
||||||
| ARM | Cortex-A57 | #834220 | ARM64_ERRATUM_834220 |
|
| ARM | Cortex-A57 | #834220 | ARM64_ERRATUM_834220 |
|
||||||
| ARM | Cortex-A72 | #853709 | N/A |
|
| ARM | Cortex-A72 | #853709 | N/A |
|
||||||
|
| ARM | Cortex-A73 | #858921 | ARM64_ERRATUM_858921 |
|
||||||
| ARM | MMU-500 | #841119,#826419 | N/A |
|
| ARM | MMU-500 | #841119,#826419 | N/A |
|
||||||
| | | | |
|
| | | | |
|
||||||
| Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 |
|
| Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 |
|
||||||
|
|
|
@ -37,7 +37,8 @@
|
||||||
#define ARM64_HAS_NO_FPSIMD 16
|
#define ARM64_HAS_NO_FPSIMD 16
|
||||||
#define ARM64_WORKAROUND_REPEAT_TLBI 17
|
#define ARM64_WORKAROUND_REPEAT_TLBI 17
|
||||||
#define ARM64_WORKAROUND_QCOM_FALKOR_E1003 18
|
#define ARM64_WORKAROUND_QCOM_FALKOR_E1003 18
|
||||||
|
#define ARM64_WORKAROUND_858921 19
|
||||||
|
|
||||||
#define ARM64_NCAPS 19
|
#define ARM64_NCAPS 20
|
||||||
|
|
||||||
#endif /* __ASM_CPUCAPS_H */
|
#endif /* __ASM_CPUCAPS_H */
|
||||||
|
|
|
@ -80,6 +80,7 @@
|
||||||
#define ARM_CPU_PART_FOUNDATION 0xD00
|
#define ARM_CPU_PART_FOUNDATION 0xD00
|
||||||
#define ARM_CPU_PART_CORTEX_A57 0xD07
|
#define ARM_CPU_PART_CORTEX_A57 0xD07
|
||||||
#define ARM_CPU_PART_CORTEX_A53 0xD03
|
#define ARM_CPU_PART_CORTEX_A53 0xD03
|
||||||
|
#define ARM_CPU_PART_CORTEX_A73 0xD09
|
||||||
|
|
||||||
#define APM_CPU_PART_POTENZA 0x000
|
#define APM_CPU_PART_POTENZA 0x000
|
||||||
|
|
||||||
|
@ -92,6 +93,7 @@
|
||||||
|
|
||||||
#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
|
#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
|
||||||
#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
|
#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
|
||||||
|
#define MIDR_CORTEX_A73 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A73)
|
||||||
#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)
|
#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)
|
||||||
#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)
|
#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)
|
||||||
#define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
|
#define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
|
||||||
|
|
|
@ -175,6 +175,8 @@
|
||||||
#define ESR_ELx_SYS64_ISS_SYS_CTR_READ (ESR_ELx_SYS64_ISS_SYS_CTR | \
|
#define ESR_ELx_SYS64_ISS_SYS_CTR_READ (ESR_ELx_SYS64_ISS_SYS_CTR | \
|
||||||
ESR_ELx_SYS64_ISS_DIR_READ)
|
ESR_ELx_SYS64_ISS_DIR_READ)
|
||||||
|
|
||||||
|
#define ESR_ELx_SYS64_ISS_SYS_CNTVCT (ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 2, 14, 0) | \
|
||||||
|
ESR_ELx_SYS64_ISS_DIR_READ)
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,13 @@ static int cpu_enable_trap_ctr_access(void *__unused)
|
||||||
.midr_range_min = min, \
|
.midr_range_min = min, \
|
||||||
.midr_range_max = max
|
.midr_range_max = max
|
||||||
|
|
||||||
|
#define MIDR_ALL_VERSIONS(model) \
|
||||||
|
.def_scope = SCOPE_LOCAL_CPU, \
|
||||||
|
.matches = is_affected_midr_range, \
|
||||||
|
.midr_model = model, \
|
||||||
|
.midr_range_min = 0, \
|
||||||
|
.midr_range_max = (MIDR_VARIANT_MASK | MIDR_REVISION_MASK)
|
||||||
|
|
||||||
const struct arm64_cpu_capabilities arm64_errata[] = {
|
const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||||
#if defined(CONFIG_ARM64_ERRATUM_826319) || \
|
#if defined(CONFIG_ARM64_ERRATUM_826319) || \
|
||||||
defined(CONFIG_ARM64_ERRATUM_827319) || \
|
defined(CONFIG_ARM64_ERRATUM_827319) || \
|
||||||
|
@ -150,6 +157,14 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||||
MIDR_CPU_VAR_REV(0, 0),
|
MIDR_CPU_VAR_REV(0, 0),
|
||||||
MIDR_CPU_VAR_REV(0, 0)),
|
MIDR_CPU_VAR_REV(0, 0)),
|
||||||
},
|
},
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ARM64_ERRATUM_858921
|
||||||
|
{
|
||||||
|
/* Cortex-A73 all versions */
|
||||||
|
.desc = "ARM erratum 858921",
|
||||||
|
.capability = ARM64_WORKAROUND_858921,
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A73),
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -1100,20 +1100,29 @@ static void __init setup_feature_capabilities(void)
|
||||||
* Check if the current CPU has a given feature capability.
|
* Check if the current CPU has a given feature capability.
|
||||||
* Should be called from non-preemptible context.
|
* Should be called from non-preemptible context.
|
||||||
*/
|
*/
|
||||||
bool this_cpu_has_cap(unsigned int cap)
|
static bool __this_cpu_has_cap(const struct arm64_cpu_capabilities *cap_array,
|
||||||
|
unsigned int cap)
|
||||||
{
|
{
|
||||||
const struct arm64_cpu_capabilities *caps;
|
const struct arm64_cpu_capabilities *caps;
|
||||||
|
|
||||||
if (WARN_ON(preemptible()))
|
if (WARN_ON(preemptible()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (caps = arm64_features; caps->desc; caps++)
|
for (caps = cap_array; caps->desc; caps++)
|
||||||
if (caps->capability == cap && caps->matches)
|
if (caps->capability == cap && caps->matches)
|
||||||
return caps->matches(caps, SCOPE_LOCAL_CPU);
|
return caps->matches(caps, SCOPE_LOCAL_CPU);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern const struct arm64_cpu_capabilities arm64_errata[];
|
||||||
|
|
||||||
|
bool this_cpu_has_cap(unsigned int cap)
|
||||||
|
{
|
||||||
|
return (__this_cpu_has_cap(arm64_features, cap) ||
|
||||||
|
__this_cpu_has_cap(arm64_errata, cap));
|
||||||
|
}
|
||||||
|
|
||||||
void __init setup_cpu_features(void)
|
void __init setup_cpu_features(void)
|
||||||
{
|
{
|
||||||
u32 cwg;
|
u32 cwg;
|
||||||
|
|
|
@ -505,6 +505,14 @@ static void ctr_read_handler(unsigned int esr, struct pt_regs *regs)
|
||||||
regs->pc += 4;
|
regs->pc += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cntvct_read_handler(unsigned int esr, struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
int rt = (esr & ESR_ELx_SYS64_ISS_RT_MASK) >> ESR_ELx_SYS64_ISS_RT_SHIFT;
|
||||||
|
|
||||||
|
pt_regs_write_reg(regs, rt, arch_counter_get_cntvct());
|
||||||
|
regs->pc += 4;
|
||||||
|
}
|
||||||
|
|
||||||
struct sys64_hook {
|
struct sys64_hook {
|
||||||
unsigned int esr_mask;
|
unsigned int esr_mask;
|
||||||
unsigned int esr_val;
|
unsigned int esr_val;
|
||||||
|
@ -523,6 +531,12 @@ static struct sys64_hook sys64_hooks[] = {
|
||||||
.esr_val = ESR_ELx_SYS64_ISS_SYS_CTR_READ,
|
.esr_val = ESR_ELx_SYS64_ISS_SYS_CTR_READ,
|
||||||
.handler = ctr_read_handler,
|
.handler = ctr_read_handler,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Trap read access to CNTVCT_EL0 */
|
||||||
|
.esr_mask = ESR_ELx_SYS64_ISS_SYS_OP_MASK,
|
||||||
|
.esr_val = ESR_ELx_SYS64_ISS_SYS_CNTVCT,
|
||||||
|
.handler = cntvct_read_handler,
|
||||||
|
},
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue