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: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Link: https://lkml.kernel.org/r/1397483228-25625-3-git-send-email-thomas.petazzoni@free-electrons.com Signed-off-by: Jason Cooper <jason@lakedaemon.net>
This commit is contained in:
parent
924d38f404
commit
501f928e00
@ -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)
|
|||||||
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)
|
|||||||
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 COHERENCY_FABRIC_TYPE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int coherency_available(void)
|
||||||
|
{
|
||||||
|
return coherency_type() != COHERENCY_FABRIC_TYPE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __init coherency_init(void)
|
||||||
|
{
|
||||||
|
int type = coherency_type();
|
||||||
|
struct device_node *np;
|
||||||
|
|
||||||
|
np = of_find_matching_node(NULL, of_coherency_table);
|
||||||
|
|
||||||
|
if (type == COHERENCY_FABRIC_TYPE_ARMADA_370_XP)
|
||||||
|
armada_370_coherency_init(np);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init coherency_late_init(void)
|
static int __init coherency_late_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
if (coherency_available())
|
||||||
|
|
||||||
np = of_find_matching_node(NULL, of_coherency_table);
|
|
||||||
if (np) {
|
|
||||||
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;
|
|||||||
|
|
||||||
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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user