summaryrefslogtreecommitdiff
path: root/plat/xilinx
diff options
context:
space:
mode:
authorFilip Drazic <filip.drazic@aggios.com>2016-07-20 17:17:39 +0200
committerSoren Brinkmann <soren.brinkmann@xilinx.com>2016-09-13 09:19:03 -0700
commit95fd990fe601af26b3d4e0aa34aa2d2aad70de30 (patch)
tree9089c8777d3befb87f1ba030d1c3a139aae02b2e /plat/xilinx
parenteccc7cde9f3eba2de4e533dcc7fde117adbf59cc (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/xilinx')
-rw-r--r--plat/xilinx/zynqmp/plat_psci.c12
-rw-r--r--plat/xilinx/zynqmp/pm_service/pm_api_sys.c2
-rw-r--r--plat/xilinx/zynqmp/pm_service/pm_client.c40
-rw-r--r--plat/xilinx/zynqmp/pm_service/pm_defs.h4
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
********************************************************************/