diff options
author | Varun Wadekar <vwadekar@nvidia.com> | 2017-08-23 10:19:25 -0700 |
---|---|---|
committer | Varun Wadekar <vwadekar@nvidia.com> | 2019-01-23 10:32:51 -0800 |
commit | d7be5e2e3af87c059bd692459ce8c4a493f404bb (patch) | |
tree | c19e8b11e5880b86534872a1cbe967a355debda6 /plat/nvidia/tegra/soc | |
parent | 601a8e549544ea85f478f43b68c4afdc3430a9e7 (diff) |
Tegra: bpmp: return error if BPMP init fails
This patch returns error if BPMP initialization fails. The platform
code marks the cluster as "runnning" since we wont be able to get
it into the low power state without BPMP.
Change-Id: I86f51d478626240bb7b4ccede8907674290c5dc1
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Diffstat (limited to 'plat/nvidia/tegra/soc')
-rw-r--r-- | plat/nvidia/tegra/soc/t210/plat_psci_handlers.c | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/plat/nvidia/tegra/soc/t210/plat_psci_handlers.c b/plat/nvidia/tegra/soc/t210/plat_psci_handlers.c index 958aa925..f52d975d 100644 --- a/plat/nvidia/tegra/soc/t210/plat_psci_handlers.c +++ b/plat/nvidia/tegra/soc/t210/plat_psci_handlers.c @@ -104,41 +104,55 @@ plat_local_state_t tegra_soc_get_target_pwr_state(unsigned int lvl, if ((lvl == MPIDR_AFFLVL1) && (target == PSTATE_ID_CLUSTER_IDLE)) { /* initialize the bpmp interface */ - (void)tegra_bpmp_init(); - - /* Cluster idle */ - data[0] = (uint32_t)cpu; - data[1] = TEGRA_PM_CC6; - data[2] = TEGRA_PM_SC1; - ret = tegra_bpmp_send_receive_atomic(MRQ_DO_IDLE, - (void *)&data, (int)sizeof(data), - (void *)&bpmp_reply, (int)sizeof(bpmp_reply)); - - /* check if cluster idle entry is allowed */ - if ((ret != 0L) || (bpmp_reply != BPMP_CCx_ALLOWED)) { + ret = tegra_bpmp_init(); + if (ret != 0U) { /* Cluster idle not allowed */ target = PSCI_LOCAL_STATE_RUN; + } else { + + /* Cluster idle */ + data[0] = (uint32_t)cpu; + data[1] = TEGRA_PM_CC6; + data[2] = TEGRA_PM_SC1; + ret = tegra_bpmp_send_receive_atomic(MRQ_DO_IDLE, + (void *)&data, (int)sizeof(data), + (void *)&bpmp_reply, + (int)sizeof(bpmp_reply)); + + /* check if cluster idle entry is allowed */ + if ((ret != 0L) || (bpmp_reply != BPMP_CCx_ALLOWED)) { + + /* Cluster idle not allowed */ + target = PSCI_LOCAL_STATE_RUN; + } } } else if ((lvl == MPIDR_AFFLVL1) && (target == PSTATE_ID_CLUSTER_POWERDN)) { /* initialize the bpmp interface */ - (void)tegra_bpmp_init(); - - /* Cluster power-down */ - data[0] = (uint32_t)cpu; - data[1] = TEGRA_PM_CC7; - data[2] = TEGRA_PM_SC1; - ret = tegra_bpmp_send_receive_atomic(MRQ_DO_IDLE, - (void *)&data, (int)sizeof(data), - (void *)&bpmp_reply, (int)sizeof(bpmp_reply)); - - /* check if cluster power down is allowed */ - if ((ret != 0L) || (bpmp_reply != BPMP_CCx_ALLOWED)) { + ret = tegra_bpmp_init(); + if (ret != 0U) { /* Cluster power down not allowed */ target = PSCI_LOCAL_STATE_RUN; + } else { + + /* Cluster power-down */ + data[0] = (uint32_t)cpu; + data[1] = TEGRA_PM_CC7; + data[2] = TEGRA_PM_SC1; + ret = tegra_bpmp_send_receive_atomic(MRQ_DO_IDLE, + (void *)&data, (int)sizeof(data), + (void *)&bpmp_reply, + (int)sizeof(bpmp_reply)); + + /* check if cluster power down is allowed */ + if ((ret != 0L) || (bpmp_reply != BPMP_CCx_ALLOWED)) { + + /* Cluster power down not allowed */ + target = PSCI_LOCAL_STATE_RUN; + } } } else if (((lvl == MPIDR_AFFLVL2) || (lvl == MPIDR_AFFLVL1)) && |