summaryrefslogtreecommitdiff
path: root/plat/arm
diff options
context:
space:
mode:
authordavidcunado-arm <david.cunado@arm.com>2017-06-16 09:17:28 +0100
committerGitHub <noreply@github.com>2017-06-16 09:17:28 +0100
commit3b6947ec55e4f26f4b1e9d2db7d57b63969f3569 (patch)
tree4296ad4dedbe9ea15dd130f1c63123a764d0ca1f /plat/arm
parent5808ed850241c6dc6c9c4ae84fefc02cffee838b (diff)
parent878a8bdfde846624db37bf33aa24f30dd39a8c06 (diff)
Merge pull request #986 from jagadeeshujja/jagujj/fix-get-power-state
CSS:Fix scpi "get_power_state" when ARM_PLAT_MT is set
Diffstat (limited to 'plat/arm')
-rw-r--r--plat/arm/css/drivers/scp/css_pm_scpi.c9
-rw-r--r--plat/arm/css/drivers/scpi/css_scpi.c9
2 files changed, 18 insertions, 0 deletions
diff --git a/plat/arm/css/drivers/scp/css_pm_scpi.c b/plat/arm/css/drivers/scp/css_pm_scpi.c
index 8678d203..545c3fbe 100644
--- a/plat/arm/css/drivers/scp/css_pm_scpi.c
+++ b/plat/arm/css/drivers/scp/css_pm_scpi.c
@@ -93,7 +93,16 @@ int css_scp_get_power_state(u_register_t mpidr, unsigned int power_level)
* The CPU state returned by SCP is an 8-bit bit mask
* corresponding to each CPU in the cluster
*/
+#if ARM_PLAT_MT
+ /*
+ * The current SCPI driver only caters for single-threaded
+ * platforms. Hence we ignore the thread ID (which is always 0)
+ * for such platforms.
+ */
+ element = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
+#else
element = mpidr & MPIDR_AFFLVL_MASK;
+#endif /* ARM_PLAT_MT */
return CSS_CPU_PWR_STATE(cpu_state, element) ==
CSS_CPU_PWR_STATE_ON ? HW_ON : HW_OFF;
} else {
diff --git a/plat/arm/css/drivers/scpi/css_scpi.c b/plat/arm/css/drivers/scpi/css_scpi.c
index 4a9d9cf6..3e92c86c 100644
--- a/plat/arm/css/drivers/scpi/css_scpi.c
+++ b/plat/arm/css/drivers/scpi/css_scpi.c
@@ -183,8 +183,17 @@ int scpi_get_css_power_state(unsigned int mpidr, unsigned int *cpu_state_p,
* Extract CPU and cluster membership of the given MPIDR. SCPI caters
* for only up to 0xf clusters, and 8 CPUs per cluster
*/
+#if ARM_PLAT_MT
+ /*
+ * The current SCPI driver only caters for single-threaded platforms.
+ * Hence we ignore the thread ID (which is always 0) for such platforms.
+ */
+ cpu = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
+ cluster = (mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK;
+#else
cpu = mpidr & MPIDR_AFFLVL_MASK;
cluster = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
+#endif /* ARM_PLAT_MT */
if (cpu >= 8 || cluster >= 0xf)
return -1;