Tegra186: calculate proper power state for cluster/system power down
authorVarun Wadekar <vwadekar@nvidia.com>
Fri, 7 Apr 2017 00:33:31 +0000 (17:33 -0700)
committerVarun Wadekar <vwadekar@nvidia.com>
Mon, 1 May 2017 22:29:13 +0000 (15:29 -0700)
Earlier, we were setting "System Suspend" as the power state for all system
states. This caused incorrect system state during a cluster power down.

This patch fixes this anomaly and sets the correct power state during a
cluster/system power down.

Change-Id: Ibd002930e0ae103e381e0a19670c3c4d057e7cb7
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
plat/nvidia/tegra/soc/t186/plat_psci_handlers.c

index 9790b817a688d7df09d922001a00e91c13edd1ed..a7f41c101fa33cadb79dc9b42d92aeae8e9fc62f 100644 (file)
@@ -188,8 +188,11 @@ plat_local_state_t tegra_soc_get_target_pwr_state(unsigned int lvl,
        int core_pos = read_mpidr() & MPIDR_CPU_MASK;
        mce_cstate_info_t cstate_info = { 0 };
 
-       /* get the current core's power state */
-       target = *(states + core_pos);
+       /* get the power state at this level */
+       if (lvl == MPIDR_AFFLVL1)
+               target = *(states + core_pos);
+       if (lvl == MPIDR_AFFLVL2)
+               target = *(states + cpu);
 
        /* CPU suspend */
        if (lvl == MPIDR_AFFLVL1 && target == PSTATE_ID_CORE_POWERDN) {
@@ -242,7 +245,8 @@ plat_local_state_t tegra_soc_get_target_pwr_state(unsigned int lvl,
        }
 
        /* System Suspend */
-       if ((lvl == MPIDR_AFFLVL2) || (target == PSTATE_ID_SOC_POWERDN))
+       if (((lvl == MPIDR_AFFLVL2) || (lvl == MPIDR_AFFLVL1)) &&
+           (target == PSTATE_ID_SOC_POWERDN))
                return PSTATE_ID_SOC_POWERDN;
 
        /* default state */