Commit 851354cb authored by Andre Przywara's avatar Andre Przywara Committed by Catalin Marinas

clocksource/drivers/arm_arch_timer: limit XGene-1 workaround

The AppliedMicro XGene-1 CPU has an erratum where the timer condition
would only consider TVAL, not CVAL. We currently apply a workaround when
seeing the PartNum field of MIDR_EL1 being 0x000, under the assumption
that this would match only the XGene-1 CPU model.
However even the Ampere eMAG (aka XGene-3) uses that same part number, and
only differs in the "Variant" and "Revision" fields: XGene-1's MIDR is
0x500f0000, our eMAG reports 0x503f0002. Experiments show the latter
doesn't show the faulty behaviour.

Increase the specificity of the check to only consider partnum 0x000 and
variant 0x00, to exclude the Ampere eMAG.

Fixes: 012f1885 ("clocksource/drivers/arm_arch_timer: Work around broken CVAL implementations")
Reported-by: default avatarRoss Burton <ross.burton@arm.com>
Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
Acked-by: default avatarMarc Zyngier <maz@kernel.org>
Reviewed-by: default avatarOliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20231016153127.116101-1-andre.przywara@arm.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 0899a627
...@@ -85,7 +85,8 @@ ...@@ -85,7 +85,8 @@
#define ARM_CPU_PART_NEOVERSE_N2 0xD49 #define ARM_CPU_PART_NEOVERSE_N2 0xD49
#define ARM_CPU_PART_CORTEX_A78C 0xD4B #define ARM_CPU_PART_CORTEX_A78C 0xD4B
#define APM_CPU_PART_POTENZA 0x000 #define APM_CPU_PART_XGENE 0x000
#define APM_CPU_VAR_POTENZA 0x00
#define CAVIUM_CPU_PART_THUNDERX 0x0A1 #define CAVIUM_CPU_PART_THUNDERX 0x0A1
#define CAVIUM_CPU_PART_THUNDERX_81XX 0x0A2 #define CAVIUM_CPU_PART_THUNDERX_81XX 0x0A2
......
...@@ -874,7 +874,7 @@ u32 __attribute_const__ kvm_target_cpu(void) ...@@ -874,7 +874,7 @@ u32 __attribute_const__ kvm_target_cpu(void)
break; break;
case ARM_CPU_IMP_APM: case ARM_CPU_IMP_APM:
switch (part_number) { switch (part_number) {
case APM_CPU_PART_POTENZA: case APM_CPU_PART_XGENE:
return KVM_ARM_TARGET_XGENE_POTENZA; return KVM_ARM_TARGET_XGENE_POTENZA;
} }
break; break;
......
...@@ -836,8 +836,9 @@ static u64 __arch_timer_check_delta(void) ...@@ -836,8 +836,9 @@ static u64 __arch_timer_check_delta(void)
* Note that TVAL is signed, thus has only 31 of its * Note that TVAL is signed, thus has only 31 of its
* 32 bits to express magnitude. * 32 bits to express magnitude.
*/ */
MIDR_ALL_VERSIONS(MIDR_CPU_MODEL(ARM_CPU_IMP_APM, MIDR_REV_RANGE(MIDR_CPU_MODEL(ARM_CPU_IMP_APM,
APM_CPU_PART_POTENZA)), APM_CPU_PART_XGENE),
APM_CPU_VAR_POTENZA, 0x0, 0xf),
{}, {},
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment