Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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.com


Signed-off-by: default avatarJason Cooper <jason@lakedaemon.net>
parent 924d38f4
Loading
Loading
Loading
Loading
+22 −8
Original line number Original line Diff line number Diff line
@@ -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 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;
}
}


+1 −0
Original line number Original line Diff line number Diff line
@@ -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 */