> 2023年5月22日 23:03,Jonas Gorski <jonas.gorski@xxxxxxxxx> 写道: > > On Mon, 22 May 2023 at 22:38, Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx> wrote: >> >> >> >>> 2023年5月22日 19:40,Jonas Gorski <jonas.gorski@xxxxxxxxx> 写道: >>> >>> Hi, >>> >>> On Fri, 19 May 2023 at 18:49, Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx> wrote: >>>> >>>> WAR_4KC_LLSC is used to control workaround of 4KC LLSC issue >>>> that affects 4Kc up to version 0.9. >>>> >>>> Early ath25 chips are known to be affected. >>>> >>>> Signed-off-by: Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx> >>>> --- >>>> arch/mips/Kconfig | 6 ++++++ >>>> arch/mips/include/asm/cpu.h | 1 + >>>> arch/mips/include/asm/mach-ath25/cpu-feature-overrides.h | 2 +- >>>> arch/mips/kernel/cpu-probe.c | 7 +++++++ >>>> 4 files changed, 15 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig >>>> index 30e90a2d53f4..354d033364ad 100644 >>>> --- a/arch/mips/Kconfig >>>> +++ b/arch/mips/Kconfig >>>> @@ -230,6 +230,7 @@ config ATH25 >>>> select SYS_SUPPORTS_BIG_ENDIAN >>>> select SYS_SUPPORTS_32BIT_KERNEL >>>> select SYS_HAS_EARLY_PRINTK >>>> + select WAR_4KC_LLSC if !SOC_AR5312 >>> >>> Shouldn't this be "if SOC_AR5312"? >> >> Ah sorry, I misread the original code. >> >>> >>> Though since you are adding runtime detection/correction below, I >>> wonder if this would be really needed as an extra symbol, and rather >>> use the later introduced (CPU_MAY_HAVE_LLSC) directly. >> >> I bet it’s better to have a symbol just for tracking errata. So we can easily know >> if SoC is affected by a errata and have some extra documentation. >> >>> >>> Or rather have select "CPU_HAS_LLSC if !SOC_AR5312" in that case. >>> >>>> help >>>> Support for Atheros AR231x and Atheros AR531x based boards >>>> >>>> @@ -2544,6 +2545,11 @@ config WAR_ICACHE_REFILLS >>>> config WAR_R10000_LLSC >>>> bool >>>> >>>> +# On 4Kc up to version 0.9 (PRID_REV < 1) there is a bug that may cause llsc >>>> +# sequences to deadlock. >>>> +config WAR_4KC_LLSC >>>> + bool >>>> + >>>> # 34K core erratum: "Problems Executing the TLBR Instruction" >>>> config WAR_MIPS34K_MISSED_ITLB >>>> bool >>>> diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h >>>> index ecb9854cb432..84bb1931a8b4 100644 >>>> --- a/arch/mips/include/asm/cpu.h >>>> +++ b/arch/mips/include/asm/cpu.h >>>> @@ -247,6 +247,7 @@ >>>> #define PRID_REV_VR4122 0x0070 >>>> #define PRID_REV_VR4181A 0x0070 /* Same as VR4122 */ >>>> #define PRID_REV_VR4130 0x0080 >>>> +#define PRID_REV_4KC_V1_0 0x0001 >>>> #define PRID_REV_34K_V1_0_2 0x0022 >>>> #define PRID_REV_LOONGSON1B 0x0020 >>>> #define PRID_REV_LOONGSON1C 0x0020 /* Same as Loongson-1B */ >>>> diff --git a/arch/mips/include/asm/mach-ath25/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ath25/cpu-feature-overrides.h >>>> index ec3604c44ef2..5df292b1ff04 100644 >>>> --- a/arch/mips/include/asm/mach-ath25/cpu-feature-overrides.h >>>> +++ b/arch/mips/include/asm/mach-ath25/cpu-feature-overrides.h >>>> @@ -24,7 +24,7 @@ >>>> #define cpu_has_counter 1 >>>> #define cpu_has_ejtag 1 >>>> >>>> -#if !defined(CONFIG_SOC_AR5312) >>>> +#if !defined(WAR_4KC_LLSC) >>>> # define cpu_has_llsc 1 >>> >>> since the #else path defines cpu_has_llsc as 0, it means that kernels >>> targeting both SoCs would force llsc to be unavailable (not introduced >>> by you). >> >> I’m a little bit confused. >> The logic seems very clear to me: If a SoC is not affected by WAR_4KC_LLSC, >> then wire cpu_has_llsc to 1, else wire it to 0. > > ATH25 allows you building for multiple SoCs at the same time, and if > you do so, you don't know in advance on which SoC you boot. So you > need to have third path here where cpu_has_llsc isn't wired to > anything. Thanks for pointing out the missing piece, I thought ATH25 can only be built for a single SoC :-) > > This is wrong in the current code already, so should be fixed there. > [...] > AFAICT the core issue is if the platform hardcodes cpu_has_llsc to 1. > > So the error/warning this should be then something like this > > if ((c->processor_id & PRID_REV_MASK) < PRID_REV_4KC_V1_0) { > c->options &= ~MIPS_CPU_LLSC; > if (cpu_has_llsc) { // <- should now be false, unless the platform > defines it as 1 > pr_err("CPU has LLSC erratum, but cpu_has_llsc is force enabled!\n"); > } > > because clearing MIPS_CPU_LLSC does nothing if cpu_has_llsc is > #defined as 1, regardless if it selected WAR_4K_LLSC or not. > > (also your error print is missing a \n at the end) Ah, thanks. I’m planning to replace this pr_err with WARN_TAINT_ONCE. Thanks - Jiaxun > > Regards, > Jonas