]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Enable partial low interrupt latency mode for ARM1136
authorCatalin Marinas <catalin.marinas@arm.com>
Thu, 11 Sep 2008 14:06:34 +0000 (15:06 +0100)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:32:28 +0000 (08:32 +0200)
Enable partial low interrupt latency mode for ARM1136

This patch is a workaround for the 364296 ARM1136 r0pX errata
(possible cache data corruption with hit-under-miss enabled). It sets
the undocumented bit 31 in the auxiliary control register and the FI bit in
the control register, thus disabling hit-under-miss without putting the
processor into full low interrupt latency mode.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm/Kconfig
arch/arm/mm/proc-v6.S

index f9b212e0bc4d5458153753229dde9910785fb8e3..6ecc1c406ade2652352192a0775aec56add8ef82 100644 (file)
@@ -1071,6 +1071,19 @@ config ARM_ERRATA_411920
          It does not affect the MPCore. This option enables the ARM Ltd.
          recommended workaround.
 
+config ARM_ERRATA_364296
+       bool "Enable partial low interrupt latency mode for ARM1136"
+       depends on CPU_V6 && !SMP
+       default n
+       help
+         This options enables the workaround for the 364296 ARM1136
+         r0pX errata (possible cache data corruption with
+         hit-under-miss enabled). It sets the undocumented bit 31 in
+         the auxiliary control register and the FI bit in the control
+         register, thus disabling hit-under-miss without putting the
+         processor into full low interrupt latency mode. ARM11MPCore
+         is not affected.
+
 config ARM_ERRATA_430973
        bool "ARM errata: Stale prediction on replaced interworking branch"
        depends on CPU_V7
index 1d2b8451bf25c24f9e66ac10f83faf54ebcdc401..10c936325663e8f1be013dab607a5a13313d1abf 100644 (file)
@@ -225,6 +225,22 @@ __v6_setup:
        mrc     p15, 0, r0, c1, c0, 0           @ read control register
        bic     r0, r0, r5                      @ clear bits them
        orr     r0, r0, r6                      @ set them
+#ifdef CONFIG_ARM_ERRATA_364296
+       /* Workaround for the 364296 ARM1136 r0pX errata (possible cache data
+        * corruption with hit-under-miss enabled). The conditional code below
+        * (setting the undocumented bit 31 in the auxiliary control register
+        * and the FI bit in the control register) disables hit-under-miss
+        * without putting the processor into full low interrupt latency mode.
+        */
+       ldr     r6, =0x4107b360                 @ id for ARM1136 r0pX
+       mrc     p15, 0, r5, c0, c0, 0           @ get processor id
+       bic     r5, r5, #0xf                    @ mask out part bits [3:0]
+       teq     r5, r6                          @ check for the faulty core
+       mrceq   p15, 0, r5, c1, c0, 1           @ load aux control reg
+       orreq   r5, r5, #(1 << 31)              @ set the undocumented bit 31
+       mcreq   p15, 0, r5, c1, c0, 1           @ write aux control reg
+       orreq   r0, r0, #(1 << 21)              @ low interrupt latency configuration
+#endif
        mov     pc, lr                          @ return to head.S:__ret
 
        /*