]> Git Repo - linux.git/commitdiff
ARM: mvebu: Fix bug in coherency fabric low level init function
authorNadav Haklai <[email protected]>
Thu, 23 May 2013 08:54:02 +0000 (10:54 +0200)
committerJason Cooper <[email protected]>
Tue, 28 May 2013 14:50:08 +0000 (14:50 +0000)
When adding CPU to the SMP group and enabling the coherency on this
CPU we must protect the register access.
The previous implementation claims to be atomic but doesn't provide
any protection against parallel access to the coherency fabric control
and configuration registers.

This patch fixes this by using the ldrex and strex mechanism.
This method should be used in all accesses to those registers.

[[email protected]: fixed the commit's topic]
Signed-off-by: Nadav Haklai <[email protected]>
Signed-off-by: Gregory CLEMENT <[email protected]>
Signed-off-by: Jason Cooper <[email protected]>
arch/arm/mach-mvebu/coherency_ll.S

index 53e8391192cd25d7495cd4e6b6602552182a1dc2..5476669ba9056ff80d63fab31d8f266ef25a2652 100644 (file)
@@ -32,15 +32,21 @@ ENTRY(ll_set_cpu_coherent)
 
        /* Add CPU to SMP group - Atomic */
        add     r3, r0, #ARMADA_XP_CFB_CTL_REG_OFFSET
-       ldr     r2, [r3]
+1:
+       ldrex   r2, [r3]
        orr     r2, r2, r1
-       str     r2, [r3]
+       strex   r0, r2, [r3]
+       cmp     r0, #0
+       bne 1b
 
        /* Enable coherency on CPU - Atomic */
-       add     r3, r0, #ARMADA_XP_CFB_CFG_REG_OFFSET
-       ldr     r2, [r3]
+       add     r3, r3, #ARMADA_XP_CFB_CFG_REG_OFFSET
+1:
+       ldrex   r2, [r3]
        orr     r2, r2, r1
-       str     r2, [r3]
+       strex   r0, r2, [r3]
+       cmp     r0, #0
+       bne 1b
 
        dsb
 
This page took 0.061554 seconds and 4 git commands to generate.