mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 09:34:18 +00:00
feat(xilinx): add new state to identify cpu power down
Currently there is only 1 state for CPU idle which is used while CPU power down from Linux CPU idle feature. But CPU power down when firmware send CPU power down request needs new state in self suspend to distinguish in firmware for CPU power down from power down request or CPU power down from Linux CPU idle. So add new state PM_STATE_CPU_OFF to indicate CPU power down from power down request from firmware. PM_STATE_CPU_OFF state is supported from self-suspend version 3. So added feature check which sends new state in case of new firmware and old state i.e. PM_STATE_CPU_IDLE in case of old firmware. Signed-off-by: Jay Buddhabhatti <jay.buddhabhatti@amd.com> Change-Id: I4118e1b813e5f76fca7b7e9ca1cc598715203fb0
This commit is contained in:
parent
88ee0816a7
commit
5949701600
3 changed files with 25 additions and 4 deletions
|
@ -18,6 +18,7 @@
|
|||
|
||||
/* State arguments of the self suspend */
|
||||
#define PM_STATE_CPU_IDLE 0x0U
|
||||
#define PM_STATE_CPU_OFF 0x1U
|
||||
#define PM_STATE_SUSPEND_TO_RAM 0xFU
|
||||
|
||||
#define MAX_LATENCY (~0U)
|
||||
|
|
|
@ -186,6 +186,7 @@ static void __dead2 versal_system_reset(void)
|
|||
*/
|
||||
static void versal_pwr_domain_off(const psci_power_state_t *target_state)
|
||||
{
|
||||
uint32_t ret, fw_api_version, version[PAYLOAD_ARG_CNT] = {0U};
|
||||
uint32_t cpu_id = plat_my_core_pos();
|
||||
const struct pm_proc *proc = pm_get_proc(cpu_id);
|
||||
|
||||
|
@ -205,8 +206,17 @@ static void versal_pwr_domain_off(const psci_power_state_t *target_state)
|
|||
* invoking CPU_on function, during which resume address will
|
||||
* be set.
|
||||
*/
|
||||
(void)pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_IDLE, 0,
|
||||
SECURE_FLAG);
|
||||
ret = pm_feature_check((uint32_t)PM_SELF_SUSPEND, &version[0], SECURE_FLAG);
|
||||
if (ret == PM_RET_SUCCESS) {
|
||||
fw_api_version = version[0] & 0xFFFFU;
|
||||
if (fw_api_version >= 3U) {
|
||||
(void)pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_OFF, 0,
|
||||
SECURE_FLAG);
|
||||
} else {
|
||||
(void)pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_IDLE, 0,
|
||||
SECURE_FLAG);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -59,6 +59,7 @@ static int32_t versal_net_pwr_domain_on(u_register_t mpidr)
|
|||
*/
|
||||
static void versal_net_pwr_domain_off(const psci_power_state_t *target_state)
|
||||
{
|
||||
uint32_t ret, fw_api_version, version[PAYLOAD_ARG_CNT] = {0U};
|
||||
uint32_t cpu_id = plat_my_core_pos();
|
||||
const struct pm_proc *proc = pm_get_proc(cpu_id);
|
||||
|
||||
|
@ -78,8 +79,17 @@ static void versal_net_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, PM_STATE_CPU_IDLE, 0,
|
||||
SECURE_FLAG);
|
||||
ret = pm_feature_check((uint32_t)PM_SELF_SUSPEND, &version[0], SECURE_FLAG);
|
||||
if (ret == PM_RET_SUCCESS) {
|
||||
fw_api_version = version[0] & 0xFFFFU;
|
||||
if (fw_api_version >= 3U) {
|
||||
(void)pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_OFF, 0,
|
||||
SECURE_FLAG);
|
||||
} else {
|
||||
(void)pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_IDLE, 0,
|
||||
SECURE_FLAG);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue