|
@@ -24,7 +24,10 @@
|
|
|
#include <asm/cp15.h>
|
|
|
|
|
|
.text
|
|
|
-/* Returns the coherency base address in r1 (r0 is untouched) */
|
|
|
+/*
|
|
|
+ * Returns the coherency base address in r1 (r0 is untouched), or 0 if
|
|
|
+ * the coherency fabric is not enabled.
|
|
|
+ */
|
|
|
ENTRY(ll_get_coherency_base)
|
|
|
mrc p15, 0, r1, c1, c0, 0
|
|
|
tst r1, #CR_M @ Check MMU bit enabled
|
|
@@ -32,8 +35,13 @@ ENTRY(ll_get_coherency_base)
|
|
|
|
|
|
/*
|
|
|
* MMU is disabled, use the physical address of the coherency
|
|
|
- * base address.
|
|
|
+ * base address. However, if the coherency fabric isn't mapped
|
|
|
+ * (i.e its virtual address is zero), it means coherency is
|
|
|
+ * not enabled, so we return 0.
|
|
|
*/
|
|
|
+ ldr r1, =coherency_base
|
|
|
+ cmp r1, #0
|
|
|
+ beq 2f
|
|
|
adr r1, 3f
|
|
|
ldr r3, [r1]
|
|
|
ldr r1, [r1, r3]
|
|
@@ -85,6 +93,9 @@ ENTRY(ll_add_cpu_to_smp_group)
|
|
|
*/
|
|
|
mov r0, lr
|
|
|
bl ll_get_coherency_base
|
|
|
+ /* Bail out if the coherency is not enabled */
|
|
|
+ cmp r1, #0
|
|
|
+ reteq r0
|
|
|
bl ll_get_coherency_cpumask
|
|
|
mov lr, r0
|
|
|
add r0, r1, #ARMADA_XP_CFB_CFG_REG_OFFSET
|
|
@@ -107,6 +118,9 @@ ENTRY(ll_enable_coherency)
|
|
|
*/
|
|
|
mov r0, lr
|
|
|
bl ll_get_coherency_base
|
|
|
+ /* Bail out if the coherency is not enabled */
|
|
|
+ cmp r1, #0
|
|
|
+ reteq r0
|
|
|
bl ll_get_coherency_cpumask
|
|
|
mov lr, r0
|
|
|
add r0, r1, #ARMADA_XP_CFB_CTL_REG_OFFSET
|
|
@@ -131,6 +145,9 @@ ENTRY(ll_disable_coherency)
|
|
|
*/
|
|
|
mov r0, lr
|
|
|
bl ll_get_coherency_base
|
|
|
+ /* Bail out if the coherency is not enabled */
|
|
|
+ cmp r1, #0
|
|
|
+ reteq r0
|
|
|
bl ll_get_coherency_cpumask
|
|
|
mov lr, r0
|
|
|
add r0, r1, #ARMADA_XP_CFB_CTL_REG_OFFSET
|