summaryrefslogtreecommitdiff
path: root/arch/mips/kernel/smp-cps.c
diff options
context:
space:
mode:
authorPaul Burton <paul.burton@imgtec.com>2014-03-07 10:42:52 +0000
committerPaul Burton <paul.burton@imgtec.com>2014-05-28 16:20:30 +0100
commitdd9233d0470bb8b02b30982c1de0a2dbffb407d5 (patch)
treee46190f57b2f17a0b9f8d67f09c1670f6e5c1eaa /arch/mips/kernel/smp-cps.c
parent0f4d3d1155d9a5e71e74658ac50b61141e370cf3 (diff)
MIPS: smp-cps: use CPC core-other locking
The core which the CPC core-other region relates to is based upon the core-local core-other addressing register. As its name suggests this register is shared between all VPEs within a core, and if there is a possibility that multiple VPEs within a core will attempt to access another core simultaneously then locking is required. This wasn't previously a problem with the only user being cpu0 during boot, but will be an issue once hotplug is implemented & may race with other users such as cpuidle. Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Diffstat (limited to 'arch/mips/kernel/smp-cps.c')
-rw-r--r--arch/mips/kernel/smp-cps.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/arch/mips/kernel/smp-cps.c b/arch/mips/kernel/smp-cps.c
index c3661ca5f25c..b519c8510972 100644
--- a/arch/mips/kernel/smp-cps.c
+++ b/arch/mips/kernel/smp-cps.c
@@ -161,11 +161,10 @@ static void boot_core(unsigned core)
write_gcr_access(access);
if (mips_cpc_present()) {
- /* Select the appropriate core */
- write_cpc_cl_other(core << CPC_Cx_OTHER_CORENUM_SHF);
-
/* Reset the core */
+ mips_cpc_lock_other(core);
write_cpc_co_cmd(CPC_Cx_CMD_RESET);
+ mips_cpc_unlock_other();
} else {
/* Take the core out of reset */
write_gcr_co_reset_release(0);