diff options
author | Nadav Haklai <nadavh@marvell.com> | 2013-05-23 10:54:02 +0200 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2013-05-28 14:50:08 +0000 |
commit | b60b61d41220c8d34e2c62a748bc78bc5d40585e (patch) | |
tree | 577e002b7826bd271580a6e34c41028895ec1d2b /arch/arm | |
parent | e89b4058096569c999fa599370162022a5a2b3d2 (diff) | |
download | op-kernel-dev-b60b61d41220c8d34e2c62a748bc78bc5d40585e.zip op-kernel-dev-b60b61d41220c8d34e2c62a748bc78bc5d40585e.tar.gz |
ARM: mvebu: Fix bug in coherency fabric low level init function
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.
[gregory.clement@free-electrons.com: fixed the commit's topic]
Signed-off-by: Nadav Haklai <nadavh@marvell.com>
Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-mvebu/coherency_ll.S | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/arch/arm/mach-mvebu/coherency_ll.S b/arch/arm/mach-mvebu/coherency_ll.S index 53e8391..5476669 100644 --- a/arch/arm/mach-mvebu/coherency_ll.S +++ b/arch/arm/mach-mvebu/coherency_ll.S @@ -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 |