Commit 501f928e authored by Thomas Petazzoni's avatar Thomas Petazzoni Committed by Jason Cooper

ARM: mvebu: add a coherency_available() call

This commit extends the coherency fabric code to provide a
coherency_available()function that the SoC code can call to be told
whether coherency support is available or not. On Armada 370/XP,
coherency support is available as soon as the relevant DT node is
present. On some upcoming SoCs, the DT node needs to be present *and*
the system running with CONFIG_SMP enabled.
Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Link: https://lkml.kernel.org/r/1397483228-25625-3-git-send-email-thomas.petazzoni@free-electrons.comSigned-off-by: default avatarJason Cooper <jason@lakedaemon.net>
parent 924d38f4
...@@ -39,6 +39,7 @@ static void __iomem *coherency_cpu_base; ...@@ -39,6 +39,7 @@ static void __iomem *coherency_cpu_base;
#define IO_SYNC_BARRIER_CTL_OFFSET 0x0 #define IO_SYNC_BARRIER_CTL_OFFSET 0x0
enum { enum {
COHERENCY_FABRIC_TYPE_NONE,
COHERENCY_FABRIC_TYPE_ARMADA_370_XP, COHERENCY_FABRIC_TYPE_ARMADA_370_XP,
}; };
...@@ -144,7 +145,7 @@ static void __init armada_370_coherency_init(struct device_node *np) ...@@ -144,7 +145,7 @@ static void __init armada_370_coherency_init(struct device_node *np)
set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0); set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
} }
int __init coherency_init(void) static int coherency_type(void)
{ {
struct device_node *np; struct device_node *np;
...@@ -155,27 +156,40 @@ int __init coherency_init(void) ...@@ -155,27 +156,40 @@ int __init coherency_init(void)
int type; int type;
type = (int) match->data; type = (int) match->data;
pr_info("Initializing Coherency fabric\n");
/* Armada 370/XP coherency works in both UP and SMP */
if (type == COHERENCY_FABRIC_TYPE_ARMADA_370_XP) if (type == COHERENCY_FABRIC_TYPE_ARMADA_370_XP)
armada_370_coherency_init(np); return type;
of_node_put(np); of_node_put(np);
} }
return 0; return COHERENCY_FABRIC_TYPE_NONE;
} }
static int __init coherency_late_init(void) int coherency_available(void)
{ {
return coherency_type() != COHERENCY_FABRIC_TYPE_NONE;
}
int __init coherency_init(void)
{
int type = coherency_type();
struct device_node *np; struct device_node *np;
np = of_find_matching_node(NULL, of_coherency_table); np = of_find_matching_node(NULL, of_coherency_table);
if (np) {
if (type == COHERENCY_FABRIC_TYPE_ARMADA_370_XP)
armada_370_coherency_init(np);
return 0;
}
static int __init coherency_late_init(void)
{
if (coherency_available())
bus_register_notifier(&platform_bus_type, bus_register_notifier(&platform_bus_type,
&mvebu_hwcc_platform_nb); &mvebu_hwcc_platform_nb);
of_node_put(np);
}
return 0; return 0;
} }
......
...@@ -18,5 +18,6 @@ extern unsigned long coherency_phys_base; ...@@ -18,5 +18,6 @@ extern unsigned long coherency_phys_base;
int set_cpu_coherent(unsigned int cpu_id, int smp_group_id); int set_cpu_coherent(unsigned int cpu_id, int smp_group_id);
int coherency_init(void); int coherency_init(void);
int coherency_available(void);
#endif /* __MACH_370_XP_COHERENCY_H */ #endif /* __MACH_370_XP_COHERENCY_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment