diff mbox series

[v2,5/9] cpu: Keep track of the "ec_primary" in big core more

Message ID 20190319060405.22264-6-mikey@neuling.org
State Superseded
Headers show
Series Initial "big cores" support for POWER9 | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success Successfully applied on branch master (92a5c57a14e24a60c306a9106bd6415c03f1234d)
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot success Test snowpatch/job/snowpatch-skiboot on branch master
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot-dco success Signed-off-by present

Commit Message

Michael Neuling March 19, 2019, 6:04 a.m. UTC
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

The "EC" primary is the primary thread of an EC, ie, the corresponding
small core "half" of the big core where the thread resides.

It will be necessary for the direct controls to target the right
half when doing special wakeups among others.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Michael Neuling <mikey@neuling.org>
---
 core/cpu.c    | 20 ++++++++++++++------
 include/cpu.h |  1 +
 2 files changed, 15 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/core/cpu.c b/core/cpu.c
index 1bcd2b6660..010a257055 100644
--- a/core/cpu.c
+++ b/core/cpu.c
@@ -832,9 +832,11 @@  struct cpu_thread *first_ungarded_cpu(void)
 
 struct cpu_thread *next_ungarded_primary(struct cpu_thread *cpu)
 {
+	bool is_primary;
 	do {
 		cpu = next_cpu(cpu);
-	} while(cpu && (cpu->state == cpu_state_unavailable || cpu->primary != cpu));
+		is_primary = cpu == cpu->primary || cpu == cpu->ec_primary;
+	} while(cpu && (cpu->state == cpu_state_unavailable || !is_primary));
 
 	return cpu;
 }
@@ -1183,7 +1185,7 @@  void init_all_cpus(void)
 		unsigned int pir, server_no, chip_id, threads;
 		enum cpu_thread_state state;
 		const struct dt_property *p;
-		struct cpu_thread *t, *pt;
+		struct cpu_thread *t, *pt0, *pt1;
 
 		/* Skip cache nodes */
 		if (strcmp(dt_prop_get(cpu, "device_type"), "cpu"))
@@ -1218,14 +1220,18 @@  void init_all_cpus(void)
 
 		/* Setup thread 0 */
 		assert(pir <= cpu_max_pir);
-		t = pt = &cpu_stacks[pir].cpu;
+		t = pt0 = &cpu_stacks[pir].cpu;
 		if (t != boot_cpu) {
 			init_cpu_thread(t, state, pir);
 			/* Each cpu gets its own later in init_trace_buffers */
 			t->trace = boot_cpu->trace;
 		}
+		if (t->is_fused_core)
+			pt1 = &cpu_stacks[pir + 1].cpu;
+		else
+			pt1 = pt0;
 		t->server_no = server_no;
-		t->primary = t;
+		t->primary = t->ec_primary = t;
 		t->node = cpu;
 		t->chip_id = chip_id;
 		t->icp_regs = NULL; /* Will be set later */
@@ -1263,10 +1269,12 @@  void init_all_cpus(void)
 			t->trace = boot_cpu->trace;
 			t->server_no = ((const u32 *)p->prop)[thread];
 			t->is_secondary = true;
-			t->primary = pt;
+			t->is_fused_core = pt0->is_fused_core;
+			t->primary = pt0;
+			t->ec_primary = (thread & 1) ? pt1 : pt0;
 			t->node = cpu;
 			t->chip_id = chip_id;
-			t->core_hmi_state_ptr = &pt->core_hmi_state;
+			t->core_hmi_state_ptr = &pt0->core_hmi_state;
 		}
 		prlog(PR_INFO, "CPU:  %d secondary threads\n", thread);
 	}
diff --git a/include/cpu.h b/include/cpu.h
index 009ae52c76..ba2228821f 100644
--- a/include/cpu.h
+++ b/include/cpu.h
@@ -56,6 +56,7 @@  struct cpu_thread {
 	bool				is_secondary;
 	bool				is_fused_core;
 	struct cpu_thread		*primary;
+	struct cpu_thread		*ec_primary;
 	enum cpu_thread_state		state;
 	struct dt_node			*node;
 	struct trace_info		*trace;