clocksource/drivers/arm_arch_timer: limit XGene-1 workaround
authorAndre Przywara <andre.przywara@arm.com>
Mon, 16 Oct 2023 15:31:27 +0000 (16:31 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:59:12 +0000 (11:59 +0100)
[ Upstream commit 851354cbd12bb9500909733c3d4054306f61df87 ]

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: 012f18850452 ("clocksource/drivers/arm_arch_timer: Work around broken CVAL implementations")
Reported-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20231016153127.116101-1-andre.przywara@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/arm64/include/asm/cputype.h
arch/arm64/kvm/guest.c
drivers/clocksource/arm_arch_timer.c

index 74d00feb62f03e7e2ea609be70a008989623bba4..7c7493cb571f97bf98b0b4841aeb756d43990718 100644 (file)
@@ -86,7 +86,8 @@
 #define ARM_CPU_PART_NEOVERSE_N2       0xD49
 #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_81XX  0x0A2
index 95f6945c443252a2fc02934c49a1a9ab3bbfb530..a1710e5fa72b6788bdcedbbfb400ee40da08e032 100644 (file)
@@ -874,7 +874,7 @@ u32 __attribute_const__ kvm_target_cpu(void)
                break;
        case ARM_CPU_IMP_APM:
                switch (part_number) {
-               case APM_CPU_PART_POTENZA:
+               case APM_CPU_PART_XGENE:
                        return KVM_ARM_TARGET_XGENE_POTENZA;
                }
                break;
index 7dd2c615bce231322ad25519e10d4a46de987f1e..071b04f1ee73092a0b04a1b05d21c3b8919325ff 100644 (file)
@@ -836,8 +836,9 @@ static u64 __arch_timer_check_delta(void)
                 * Note that TVAL is signed, thus has only 31 of its
                 * 32 bits to express magnitude.
                 */
-               MIDR_ALL_VERSIONS(MIDR_CPU_MODEL(ARM_CPU_IMP_APM,
-                                                APM_CPU_PART_POTENZA)),
+               MIDR_REV_RANGE(MIDR_CPU_MODEL(ARM_CPU_IMP_APM,
+                                             APM_CPU_PART_XGENE),
+                              APM_CPU_VAR_POTENZA, 0x0, 0xf),
                {},
        };