| From ralf@linux-mips.org Mon May 10 11:09:27 2010 |
| From: Ralf Baechle <ralf@linux-mips.org> |
| Date: Fri, 23 Apr 2010 02:56:38 +0100 |
| Subject: MIPS: Sibyte: Apply M3 workaround only on affected chip types and versions. |
| To: Greg KH <greg@kroah.com>, stable@kernel.org |
| Cc: Ralf Baechle <ralf@linux-mips.org>, Sebastian Andrzej Siewior <sebastian@breakpoint.cc> |
| Message-ID: <1271987800-26851-1-git-send-email-ralf@linux-mips.org> |
| |
| (cherry picked from commit e65c7f33d75e977350ca350573d93c517ec02776) |
| |
| Previously it was unconditionally used on all Sibyte family SOCs. The |
| M3 bug has to be handled in the TLB exception handler which is extremly |
| performance sensitive, so this modification is expected to deliver around |
| 2-3% performance improvment. This is important as required changes to the |
| M3 workaround will make it more costly. |
| |
| Signed-off-by: Ralf Baechle <ralf@linux-mips.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/mips/include/asm/mach-sibyte/war.h | 6 +++++- |
| arch/mips/sibyte/sb1250/setup.c | 15 +++++++++++++++ |
| 2 files changed, 20 insertions(+), 1 deletion(-) |
| |
| --- a/arch/mips/include/asm/mach-sibyte/war.h |
| +++ b/arch/mips/include/asm/mach-sibyte/war.h |
| @@ -16,7 +16,11 @@ |
| #if defined(CONFIG_SB1_PASS_1_WORKAROUNDS) || \ |
| defined(CONFIG_SB1_PASS_2_WORKAROUNDS) |
| |
| -#define BCM1250_M3_WAR 1 |
| +#ifndef __ASSEMBLY__ |
| +extern int sb1250_m3_workaround_needed(void); |
| +#endif |
| + |
| +#define BCM1250_M3_WAR sb1250_m3_workaround_needed() |
| #define SIBYTE_1956_WAR 1 |
| |
| #else |
| --- a/arch/mips/sibyte/sb1250/setup.c |
| +++ b/arch/mips/sibyte/sb1250/setup.c |
| @@ -87,6 +87,21 @@ static int __init setup_bcm1250(void) |
| return ret; |
| } |
| |
| +int sb1250_m3_workaround_needed(void) |
| +{ |
| + switch (soc_type) { |
| + case K_SYS_SOC_TYPE_BCM1250: |
| + case K_SYS_SOC_TYPE_BCM1250_ALT: |
| + case K_SYS_SOC_TYPE_BCM1250_ALT2: |
| + case K_SYS_SOC_TYPE_BCM1125: |
| + case K_SYS_SOC_TYPE_BCM1125H: |
| + return soc_pass < K_SYS_REVISION_BCM1250_C0; |
| + |
| + default: |
| + return 0; |
| + } |
| +} |
| + |
| static int __init setup_bcm112x(void) |
| { |
| int ret = 0; |