diff options
author | Maciej W. Rozycki <macro@linux-mips.org> | 2013-09-18 14:08:15 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2013-09-18 14:25:23 -0400 |
commit | 9213ad77070ea75fc3a5e43e3d9e9c4146e4930a (patch) | |
tree | a9e25c4ff8ee18e6bd895517a4eaf679d203f280 /arch | |
parent | 8ff374b9c296b96484d5e63b45b22d0862ffee8f (diff) |
MIPS: 74K/1074K: Correct erratum workaround.
Make sure 74K revision numbers are not applied to the 1074K. Also catch
invalid usage.
Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Cc: Steven J. Hill <Steven.Hill@imgtec.com>
Cc: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/5857/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mips/mm/c-r4k.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index ae500ca76580..627883bc6d5f 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -786,20 +786,30 @@ static inline void rm7k_erratum31(void) | |||
786 | 786 | ||
787 | static inline void alias_74k_erratum(struct cpuinfo_mips *c) | 787 | static inline void alias_74k_erratum(struct cpuinfo_mips *c) |
788 | { | 788 | { |
789 | unsigned int imp = c->processor_id & PRID_IMP_MASK; | ||
790 | unsigned int rev = c->processor_id & PRID_REV_MASK; | ||
791 | |||
789 | /* | 792 | /* |
790 | * Early versions of the 74K do not update the cache tags on a | 793 | * Early versions of the 74K do not update the cache tags on a |
791 | * vtag miss/ptag hit which can occur in the case of KSEG0/KUSEG | 794 | * vtag miss/ptag hit which can occur in the case of KSEG0/KUSEG |
792 | * aliases. In this case it is better to treat the cache as always | 795 | * aliases. In this case it is better to treat the cache as always |
793 | * having aliases. | 796 | * having aliases. |
794 | */ | 797 | */ |
795 | if ((c->processor_id & PRID_REV_MASK) <= PRID_REV_ENCODE_332(2, 4, 0)) | 798 | switch (imp) { |
796 | c->dcache.flags |= MIPS_CACHE_VTAG; | 799 | case PRID_IMP_74K: |
797 | if ((c->processor_id & PRID_REV_MASK) == PRID_REV_ENCODE_332(2, 4, 0)) | 800 | if (rev <= PRID_REV_ENCODE_332(2, 4, 0)) |
798 | write_c0_config6(read_c0_config6() | MIPS_CONF6_SYND); | 801 | c->dcache.flags |= MIPS_CACHE_VTAG; |
799 | if ((c->processor_id & PRID_IMP_MASK) == PRID_IMP_1074K && | 802 | if (rev == PRID_REV_ENCODE_332(2, 4, 0)) |
800 | (c->processor_id & PRID_REV_MASK) <= PRID_REV_ENCODE_332(1, 1, 0)) { | 803 | write_c0_config6(read_c0_config6() | MIPS_CONF6_SYND); |
801 | c->dcache.flags |= MIPS_CACHE_VTAG; | 804 | break; |
802 | write_c0_config6(read_c0_config6() | MIPS_CONF6_SYND); | 805 | case PRID_IMP_1074K: |
806 | if (rev <= PRID_REV_ENCODE_332(1, 1, 0)) { | ||
807 | c->dcache.flags |= MIPS_CACHE_VTAG; | ||
808 | write_c0_config6(read_c0_config6() | MIPS_CONF6_SYND); | ||
809 | } | ||
810 | break; | ||
811 | default: | ||
812 | BUG(); | ||
803 | } | 813 | } |
804 | } | 814 | } |
805 | 815 | ||