diff options
author | Filip Drazic <filip.drazic@aggios.com> | 2016-07-20 17:17:39 +0200 |
---|---|---|
committer | Soren Brinkmann <soren.brinkmann@xilinx.com> | 2016-09-13 09:19:03 -0700 |
commit | 95fd990fe601af26b3d4e0aa34aa2d2aad70de30 (patch) | |
tree | 9089c8777d3befb87f1ba030d1c3a139aae02b2e /plat | |
parent | eccc7cde9f3eba2de4e533dcc7fde117adbf59cc (diff) |
zynqmp: pm: Provide state argument to the pm_self_suspend API call
The state argument of the pm_self_suspend API encodes the state to
which the APU intends to suspend. The state can be:
- PM_APU_STATE_CPU_IDLE - processor power down, all memories remain
on
- PM_APU_STATE_SUSPEND_TO_RAM - all processors powered down, L2$
powered down, all OCM banks in retention and DDR in
self-refresh.
The calls for setting requirements for L2$ and OCM banks are now
redundant and removed.
Signed-off-by: Filip Drazic <filip.drazic@aggios.com>
[ sb
- remove redundant #defines
]
Signed-off-by: Sören Brinkmann <soren.brinkmann@xilinx.com>
Diffstat (limited to 'plat')
-rw-r--r-- | plat/xilinx/zynqmp/plat_psci.c | 12 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/pm_service/pm_api_sys.c | 2 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/pm_service/pm_client.c | 40 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/pm_service/pm_defs.h | 4 |
4 files changed, 12 insertions, 46 deletions
diff --git a/plat/xilinx/zynqmp/plat_psci.c b/plat/xilinx/zynqmp/plat_psci.c index f0e260de..472adfb7 100644 --- a/plat/xilinx/zynqmp/plat_psci.c +++ b/plat/xilinx/zynqmp/plat_psci.c @@ -147,7 +147,7 @@ static void zynqmp_pwr_domain_off(const psci_power_state_t *target_state) * invoking CPU_on function, during which resume address will * be set. */ - pm_self_suspend(proc->node_id, MAX_LATENCY, 0, 0); + pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_IDLE, 0); } static void zynqmp_nopmu_pwr_domain_suspend(const psci_power_state_t *target_state) @@ -179,6 +179,7 @@ static void zynqmp_nopmu_pwr_domain_suspend(const psci_power_state_t *target_sta static void zynqmp_pwr_domain_suspend(const psci_power_state_t *target_state) { + unsigned int state; unsigned int cpu_id = plat_my_core_pos(); const struct pm_proc *proc = pm_get_proc(cpu_id); @@ -186,15 +187,14 @@ static void zynqmp_pwr_domain_suspend(const psci_power_state_t *target_state) VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", __func__, i, target_state->pwr_domain_state[i]); + state = target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE ? + PM_STATE_SUSPEND_TO_RAM : PM_STATE_CPU_IDLE; + /* Send request to PMU to suspend this core */ - pm_self_suspend(proc->node_id, MAX_LATENCY, 0, zynqmp_sec_entry); + pm_self_suspend(proc->node_id, MAX_LATENCY, state, zynqmp_sec_entry); /* APU is to be turned off */ if (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) { - /* Power down L2 cache */ - pm_set_requirement(NODE_L2, 0, 0, REQ_ACK_NO); - /* Send request for OCM retention state */ - set_ocm_retention(); /* disable coherency */ plat_arm_interconnect_exit_coherency(); } diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_sys.c b/plat/xilinx/zynqmp/pm_service/pm_api_sys.c index eac7801b..f78a3113 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_sys.c +++ b/plat/xilinx/zynqmp/pm_service/pm_api_sys.c @@ -76,7 +76,7 @@ * pm_self_suspend() - PM call for processor to suspend itself * @nid Node id of the processor or subsystem * @latency Requested maximum wakeup latency (not supported) - * @state Requested state (not supported) + * @state Requested state * @address Resume address * * This is a blocking call, it will return only once PMU has responded. diff --git a/plat/xilinx/zynqmp/pm_service/pm_client.c b/plat/xilinx/zynqmp/pm_service/pm_client.c index cf0d5f08..f0b34cbb 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_client.c +++ b/plat/xilinx/zynqmp/pm_service/pm_client.c @@ -43,16 +43,10 @@ #include "pm_ipi.h" #include "../zynqmp_def.h" -#define OCM_BANK_0 0xFFFC0000 -#define OCM_BANK_1 (OCM_BANK_0 + 0x10000) -#define OCM_BANK_2 (OCM_BANK_1 + 0x10000) -#define OCM_BANK_3 (OCM_BANK_2 + 0x10000) - #define UNDEFINED_CPUID (~0) + DEFINE_BAKERY_LOCK(pm_client_secure_lock); -/* Declaration of linker defined symbol */ -extern unsigned long __BL31_END__; extern const struct pm_ipi apu_ipi; /* Order in pm_procs_all array must match cpu ids */ @@ -80,38 +74,6 @@ static const struct pm_proc const pm_procs_all[] = { }; /** - * set_ocm_retention() - Configure OCM memory banks for retention - * - * APU specific requirements for suspend action: - * OCM has to enter retention state in order to preserve saved - * context after suspend request. OCM banks are determined by - * __BL31_END__ linker symbol. - * - * Return: Returns status, either success or error+reason - */ -enum pm_ret_status set_ocm_retention(void) -{ - enum pm_ret_status ret; - - /* OCM_BANK_0 will always be occupied */ - ret = pm_set_requirement(NODE_OCM_BANK_0, PM_CAP_CONTEXT, 0, - REQ_ACK_NO); - - /* Check for other OCM banks */ - if ((unsigned long)&__BL31_END__ >= OCM_BANK_1) - ret = pm_set_requirement(NODE_OCM_BANK_1, PM_CAP_CONTEXT, 0, - REQ_ACK_NO); - if ((unsigned long)&__BL31_END__ >= OCM_BANK_2) - ret = pm_set_requirement(NODE_OCM_BANK_2, PM_CAP_CONTEXT, 0, - REQ_ACK_NO); - if ((unsigned long)&__BL31_END__ >= OCM_BANK_3) - ret = pm_set_requirement(NODE_OCM_BANK_3, PM_CAP_CONTEXT, 0, - REQ_ACK_NO); - - return ret; -} - -/** * pm_get_proc() - returns pointer to the proc structure * @cpuid: id of the cpu whose proc struct pointer should be returned * diff --git a/plat/xilinx/zynqmp/pm_service/pm_defs.h b/plat/xilinx/zynqmp/pm_service/pm_defs.h index a8921e7b..7bbfec85 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_defs.h +++ b/plat/xilinx/zynqmp/pm_service/pm_defs.h @@ -53,6 +53,10 @@ #define MAX_LATENCY (~0U) #define MAX_QOS 100U +/* State arguments of the self suspend */ +#define PM_STATE_CPU_IDLE 0x0U +#define PM_STATE_SUSPEND_TO_RAM 0xFU + /********************************************************************* * Enum definitions ********************************************************************/ |