]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ARM: LPAE: add ISBs around MMU enabling code
authorWill Deacon <will.deacon@arm.com>
Thu, 7 Apr 2011 15:29:22 +0000 (16:29 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 14 Jun 2011 13:43:55 +0000 (14:43 +0100)
Before we enable the MMU, we must ensure that the TTBR registers contain
sane values. After the MMU has been enabled, we jump to the *virtual*
address of the following function, so we also need to ensure that the
SCTLR write has taken effect.

This patch adds ISB instructions around the SCTLR write to ensure the
visibility of the above.

Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm/boot/compressed/head.S
arch/arm/include/asm/assembler.h
arch/arm/kernel/head.S
arch/arm/kernel/sleep.S

index f9da41921c521e216f07816eb5cab99c041f4845..706492ab0b4cf39ee7106d8bb3306b4d7ac85a5f 100644 (file)
@@ -550,6 +550,7 @@ __armv7_mmu_cache_on:
                mcrne   p15, 0, r3, c2, c0, 0   @ load page table pointer
                mcrne   p15, 0, r1, c3, c0, 0   @ load domain access control
 #endif
+               mcr     p15, 0, r0, c7, c5, 4   @ ISB
                mcr     p15, 0, r0, c1, c0, 0   @ load control register
                mrc     p15, 0, r0, c1, c0, 0   @ and read it back
                mov     r0, #0
index bc2d2d75f7068998bb69a92b69c1216ec4dbd8fe..2bcc456b68794abdc549b244e5a09cc03f47d32f 100644 (file)
 #define ALT_UP_B(label) b label
 #endif
 
+/*
+ * Instruction barrier
+ */
+       .macro  instr_sync
+#if __LINUX_ARM_ARCH__ >= 7
+       isb
+#elif __LINUX_ARM_ARCH__ == 6
+       mcr     p15, 0, r0, c7, c5, 4
+#endif
+       .endm
+
 /*
  * SMP data memory barrier
  */
index 278c1b0ebb2ee340fcb0e4f4b010c80e535c9308..5f6bf818d82ec18332b5f6e974b2184e20eab037 100644 (file)
@@ -388,8 +388,10 @@ ENDPROC(__enable_mmu)
        .align  5
 __turn_mmu_on:
        mov     r0, r0
+       instr_sync
        mcr     p15, 0, r0, c1, c0, 0           @ write control reg
        mrc     p15, 0, r3, c0, c0, 0           @ read id reg
+       instr_sync
        mov     r3, r3
        mov     r3, r13
        mov     pc, r3
index 6398ead9d1c08da1774dba4568a04e22fe4125ae..1ac5dcecb2a2c87b3e39dea32181043036021657 100644 (file)
@@ -88,8 +88,10 @@ ENDPROC(cpu_resume_mmu)
        .ltorg
        .align  5
 cpu_resume_turn_mmu_on:
+       instr_sync
        mcr     p15, 0, r1, c1, c0, 0   @ turn on MMU, I-cache, etc
        mrc     p15, 0, r1, c0, c0, 0   @ read id reg
+       instr_sync
        mov     r1, r1
        mov     r1, r1
        mov     pc, r3                  @ jump to virtual address