[MIPS] R4000/R4400 errata workarounds
authorMaciej W. Rozycki <macro@linux-mips.org>
Tue, 23 Oct 2007 11:43:11 +0000 (12:43 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 29 Jan 2008 10:14:54 +0000 (10:14 +0000)
commit20d60d9973c3b441902b0a3f4f6f7e7ade08f77d
tree2dbadcb5600fcb486612ec30d972e6c29195ee1d
parent2b22c034d04d3632a339d14d5803c8f94e412608
[MIPS] R4000/R4400 errata workarounds

 This is the gereric part of R4000/R4400 errata workarounds.  They include
compiler and assembler support as well as some source code modifications
to address the problems with some combinations of multiply/divide+shift
instructions as well as the daddi and daddiu instructions.

 Changes included are as follows:

1. New Kconfig options to select workarounds by platforms as necessary.

2. Arch top-level Makefile to pass necessary options to the compiler; also
   incompatible configurations are detected (-mno-sym32 unsupported as
   horribly intrusive for little gain).

3. Bug detection updated and shuffled -- the multiply/divide+shift problem
   is lethal enough that if not worked around it makes the kernel crash in
   time_init() because of a division by zero; the daddiu erratum might
   also trigger early potentially, though I have not observed it.  On the
   other hand the daddi detection code requires the exception subsystem to
   have been initialised (and is there mainly for information).

4. r4k_daddiu_bug() added so that the existence of the erratum can be
   queried by code at the run time as necessary; useful for generated code
   like TLB fault and copy/clear page handlers.

5. __udelay() updated as it uses multiplication in inline assembly.

 Note that -mdaddi requires modified toolchain (which has been maintained
by myself and available from my site for ~4years now -- versions covered
are GCC 2.95.4 - 4.1.2 and binutils from 2.13 onwards).  The -mfix-r4000
and -mfix-r4400 have been standard for a while though.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/Kconfig
arch/mips/Makefile
arch/mips/kernel/cpu-bugs64.c
arch/mips/kernel/setup.c
include/asm-mips/bugs.h
include/asm-mips/delay.h
include/asm-mips/war.h