aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-mvebu
diff options
context:
space:
mode:
authorThomas Petazzoni <thomas.petazzoni@free-electrons.com>2014-11-13 04:38:56 -0500
committerJason Cooper <jason@lakedaemon.net>2014-11-21 20:49:27 -0500
commit30cdef97107370a7f63ab5d80fd2de30540750c8 (patch)
tree269adb36c794f5ddafc2b56f33f8f056a7ac6d78 /arch/arm/mach-mvebu
parent93a93d19c7267439364e7c52a643127ac5c2d4f1 (diff)
ARM: mvebu: make the coherency_ll.S functions work with no coherency fabric
The ll_add_cpu_to_smp_group(), ll_enable_coherency() and ll_disable_coherency() are used on Armada XP to control the coherency fabric. However, they make the assumption that the coherency fabric is always available, which is currently a correct assumption but will no longer be true with a followup commit that disables the usage of the coherency fabric when the conditions are not met to use it. Therefore, this commit modifies those functions so that they check the return value of ll_get_coherency_base(), and if the return value is 0, they simply return without configuring anything in the coherency fabric. The ll_get_coherency_base() function is also modified to properly return 0 when the function is called with the MMU disabled. In this case, it normally returns the physical address of the coherency fabric, but we now check if the virtual address is 0, and if that's case, return a physical address of 0 to indicate that the coherency fabric is not enabled. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: <stable@vger.kernel.org> # v3.8+ Acked-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Link: https://lkml.kernel.org/r/1415871540-20302-2-git-send-email-thomas.petazzoni@free-electrons.com Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'arch/arm/mach-mvebu')
-rw-r--r--arch/arm/mach-mvebu/coherency_ll.S21
1 files changed, 19 insertions, 2 deletions
diff --git a/arch/arm/mach-mvebu/coherency_ll.S b/arch/arm/mach-mvebu/coherency_ll.S
index f5d881b5d0f7..8b2fbc8b6bc6 100644
--- a/arch/arm/mach-mvebu/coherency_ll.S
+++ b/arch/arm/mach-mvebu/coherency_ll.S
@@ -24,7 +24,10 @@
24#include <asm/cp15.h> 24#include <asm/cp15.h>
25 25
26 .text 26 .text
27/* Returns the coherency base address in r1 (r0 is untouched) */ 27/*
28 * Returns the coherency base address in r1 (r0 is untouched), or 0 if
29 * the coherency fabric is not enabled.
30 */
28ENTRY(ll_get_coherency_base) 31ENTRY(ll_get_coherency_base)
29 mrc p15, 0, r1, c1, c0, 0 32 mrc p15, 0, r1, c1, c0, 0
30 tst r1, #CR_M @ Check MMU bit enabled 33 tst r1, #CR_M @ Check MMU bit enabled
@@ -32,8 +35,13 @@ ENTRY(ll_get_coherency_base)
32 35
33 /* 36 /*
34 * MMU is disabled, use the physical address of the coherency 37 * MMU is disabled, use the physical address of the coherency
35 * base address. 38 * base address. However, if the coherency fabric isn't mapped
39 * (i.e its virtual address is zero), it means coherency is
40 * not enabled, so we return 0.
36 */ 41 */
42 ldr r1, =coherency_base
43 cmp r1, #0
44 beq 2f
37 adr r1, 3f 45 adr r1, 3f
38 ldr r3, [r1] 46 ldr r3, [r1]
39 ldr r1, [r1, r3] 47 ldr r1, [r1, r3]
@@ -85,6 +93,9 @@ ENTRY(ll_add_cpu_to_smp_group)
85 */ 93 */
86 mov r0, lr 94 mov r0, lr
87 bl ll_get_coherency_base 95 bl ll_get_coherency_base
96 /* Bail out if the coherency is not enabled */
97 cmp r1, #0
98 reteq r0
88 bl ll_get_coherency_cpumask 99 bl ll_get_coherency_cpumask
89 mov lr, r0 100 mov lr, r0
90 add r0, r1, #ARMADA_XP_CFB_CFG_REG_OFFSET 101 add r0, r1, #ARMADA_XP_CFB_CFG_REG_OFFSET
@@ -107,6 +118,9 @@ ENTRY(ll_enable_coherency)
107 */ 118 */
108 mov r0, lr 119 mov r0, lr
109 bl ll_get_coherency_base 120 bl ll_get_coherency_base
121 /* Bail out if the coherency is not enabled */
122 cmp r1, #0
123 reteq r0
110 bl ll_get_coherency_cpumask 124 bl ll_get_coherency_cpumask
111 mov lr, r0 125 mov lr, r0
112 add r0, r1, #ARMADA_XP_CFB_CTL_REG_OFFSET 126 add r0, r1, #ARMADA_XP_CFB_CTL_REG_OFFSET
@@ -131,6 +145,9 @@ ENTRY(ll_disable_coherency)
131 */ 145 */
132 mov r0, lr 146 mov r0, lr
133 bl ll_get_coherency_base 147 bl ll_get_coherency_base
148 /* Bail out if the coherency is not enabled */
149 cmp r1, #0
150 reteq r0
134 bl ll_get_coherency_cpumask 151 bl ll_get_coherency_cpumask
135 mov lr, r0 152 mov lr, r0
136 add r0, r1, #ARMADA_XP_CFB_CTL_REG_OFFSET 153 add r0, r1, #ARMADA_XP_CFB_CTL_REG_OFFSET