Commit 9736c615 authored by Matt Redfearn's avatar Matt Redfearn Committed by Ralf Baechle

MIPS: smp-cps: Allow booting of CPU other than VP0 within a core

The boot_core function was hardcoded to always start VP0 when starting
a core via the CPC. When hotplugging a CPU this may not be the desired
behaviour.

Make boot_core receive the VP ID to start running on the core, such that
alternate VPs can be started via CPU hotplug.
Also ensure that all other VPs within the core are stopped before
bringing the core out of reset so that only the desired VP starts.
Signed-off-by: default avatarMatt Redfearn <matt.redfearn@imgtec.com>
Reviewed-by: default avatarPaul Burton <paul.burton@imgtec.com>
Cc: Matt Redfearn <matt.redfearn@imgtec.com>
Cc: Qais Yousef <qais.yousef@imgtec.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/13750/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 253aced6
...@@ -206,7 +206,7 @@ static void __init cps_prepare_cpus(unsigned int max_cpus) ...@@ -206,7 +206,7 @@ static void __init cps_prepare_cpus(unsigned int max_cpus)
} }
} }
static void boot_core(unsigned core) static void boot_core(unsigned int core, unsigned int vpe_id)
{ {
u32 access, stat, seq_state; u32 access, stat, seq_state;
unsigned timeout; unsigned timeout;
...@@ -233,8 +233,9 @@ static void boot_core(unsigned core) ...@@ -233,8 +233,9 @@ static void boot_core(unsigned core)
mips_cpc_lock_other(core); mips_cpc_lock_other(core);
if (mips_cm_revision() >= CM_REV_CM3) { if (mips_cm_revision() >= CM_REV_CM3) {
/* Run VP0 following the reset */ /* Run only the requested VP following the reset */
write_cpc_co_vp_run(0x1); write_cpc_co_vp_stop(0xf);
write_cpc_co_vp_run(1 << vpe_id);
/* /*
* Ensure that the VP_RUN register is written before the * Ensure that the VP_RUN register is written before the
...@@ -306,7 +307,7 @@ static void cps_boot_secondary(int cpu, struct task_struct *idle) ...@@ -306,7 +307,7 @@ static void cps_boot_secondary(int cpu, struct task_struct *idle)
if (!test_bit(core, core_power)) { if (!test_bit(core, core_power)) {
/* Boot a VPE on a powered down core */ /* Boot a VPE on a powered down core */
boot_core(core); boot_core(core, vpe_id);
goto out; goto out;
} }
......
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