MIPS: smp-cps: use CPC core-other locking
authorPaul Burton <paul.burton@imgtec.com>
Fri, 7 Mar 2014 10:42:52 +0000 (10:42 +0000)
committerPaul Burton <paul.burton@imgtec.com>
Wed, 28 May 2014 15:20:30 +0000 (16:20 +0100)
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>
arch/mips/kernel/smp-cps.c

index c3661ca5f25c22252d464994d1f332f708854736..b519c851097220176c57948b50bb2914c253efc4 100644 (file)
@@ -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);