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

Commit 256f2d4b authored by Paul Mackerras's avatar Paul Mackerras Committed by Benjamin Herrenschmidt
Browse files

powerpc: Use ibm, chip-id property to compute cpu_core_mask if available



Some systems have an ibm,chip-id property in the cpu nodes in the
device tree.  On these systems, we now use that to compute the
cpu_core_mask (i.e. the set of core siblings) rather than looking
at cache properties.

Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
Tested-by: default avatarVasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent a8a5356c
Loading
Loading
Loading
Loading
+45 −3
Original line number Original line Diff line number Diff line
@@ -609,6 +609,33 @@ int cpu_first_thread_of_core(int core)
}
}
EXPORT_SYMBOL_GPL(cpu_first_thread_of_core);
EXPORT_SYMBOL_GPL(cpu_first_thread_of_core);


static void traverse_siblings_chip_id(int cpu, bool add, int chipid)
{
	const struct cpumask *mask;
	struct device_node *np;
	int i, plen;
	const __be32 *prop;

	mask = add ? cpu_online_mask : cpu_present_mask;
	for_each_cpu(i, mask) {
		np = of_get_cpu_node(i, NULL);
		if (!np)
			continue;
		prop = of_get_property(np, "ibm,chip-id", &plen);
		if (prop && plen == sizeof(int) &&
		    of_read_number(prop, 1) == chipid) {
			if (add) {
				cpumask_set_cpu(cpu, cpu_core_mask(i));
				cpumask_set_cpu(i, cpu_core_mask(cpu));
			} else {
				cpumask_clear_cpu(cpu, cpu_core_mask(i));
				cpumask_clear_cpu(i, cpu_core_mask(cpu));
			}
		}
		of_node_put(np);
	}
}

/* Must be called when no change can occur to cpu_present_mask,
/* Must be called when no change can occur to cpu_present_mask,
 * i.e. during cpu online or offline.
 * i.e. during cpu online or offline.
 */
 */
@@ -633,14 +660,29 @@ static struct device_node *cpu_to_l2cache(int cpu)


static void traverse_core_siblings(int cpu, bool add)
static void traverse_core_siblings(int cpu, bool add)
{
{
	struct device_node *l2_cache;
	struct device_node *l2_cache, *np;
	const struct cpumask *mask;
	const struct cpumask *mask;
	int i;
	int i, chip, plen;
	const __be32 *prop;

	/* First see if we have ibm,chip-id properties in cpu nodes */
	np = of_get_cpu_node(cpu, NULL);
	if (np) {
		chip = -1;
		prop = of_get_property(np, "ibm,chip-id", &plen);
		if (prop && plen == sizeof(int))
			chip = of_read_number(prop, 1);
		of_node_put(np);
		if (chip >= 0) {
			traverse_siblings_chip_id(cpu, add, chip);
			return;
		}
	}


	l2_cache = cpu_to_l2cache(cpu);
	l2_cache = cpu_to_l2cache(cpu);
	mask = add ? cpu_online_mask : cpu_present_mask;
	mask = add ? cpu_online_mask : cpu_present_mask;
	for_each_cpu(i, mask) {
	for_each_cpu(i, mask) {
		struct device_node *np = cpu_to_l2cache(i);
		np = cpu_to_l2cache(i);
		if (!np)
		if (!np)
			continue;
			continue;
		if (np == l2_cache) {
		if (np == l2_cache) {