diff options
author | Roberto Vargas <roberto.vargas@arm.com> | 2017-08-16 08:57:45 +0100 |
---|---|---|
committer | Roberto Vargas <roberto.vargas@arm.com> | 2017-10-13 08:08:32 +0100 |
commit | b48ae263d255718efee7b4ed0cb1d6c2e3cb1fb8 (patch) | |
tree | 31c877115105ae0e831d0210fbf3921c579f0816 /plat | |
parent | ed3c0ef8ac08d7a4759bc3e70769e6ea5216a502 (diff) | |
download | platform_external_arm-trusted-firmware-b48ae263d255718efee7b4ed0cb1d6c2e3cb1fb8.tar.gz platform_external_arm-trusted-firmware-b48ae263d255718efee7b4ed0cb1d6c2e3cb1fb8.tar.bz2 platform_external_arm-trusted-firmware-b48ae263d255718efee7b4ed0cb1d6c2e3cb1fb8.zip |
reset2: Add css_system_reset2()
This function implements the platform dependant part of PSCI system
reset2 for CSS platforms using SCMI.
Change-Id: I724389decab484043cadf577aeed96b349c1466d
Signed-off-by: Roberto Vargas <roberto.vargas@arm.com>
Diffstat (limited to 'plat')
-rw-r--r-- | plat/arm/css/common/css_pm.c | 3 | ||||
-rw-r--r-- | plat/arm/css/drivers/scp/css_pm_scmi.c | 34 | ||||
-rw-r--r-- | plat/arm/css/drivers/scp/css_scp.h | 1 |
3 files changed, 32 insertions, 6 deletions
diff --git a/plat/arm/css/common/css_pm.c b/plat/arm/css/common/css_pm.c index 93d51fe66..39c02aff2 100644 --- a/plat/arm/css/common/css_pm.c +++ b/plat/arm/css/common/css_pm.c @@ -300,4 +300,7 @@ plat_psci_ops_t plat_arm_psci_pm_ops = { .read_mem_protect = arm_psci_read_mem_protect, .write_mem_protect = arm_nor_psci_write_mem_protect, #endif +#if CSS_USE_SCMI_SDS_DRIVER + .system_reset2 = css_system_reset2, +#endif }; diff --git a/plat/arm/css/drivers/scp/css_pm_scmi.c b/plat/arm/css/drivers/scp/css_pm_scmi.c index dc5fa2620..e29cd8679 100644 --- a/plat/arm/css/drivers/scp/css_pm_scmi.c +++ b/plat/arm/css/drivers/scp/css_pm_scmi.c @@ -358,13 +358,35 @@ const plat_psci_ops_t *plat_arm_psci_override_pm_ops(plat_psci_ops_t *ops) ops->system_off = NULL; ops->system_reset = NULL; ops->get_sys_suspend_power_state = NULL; - } else if (!(msg_attr & SCMI_SYS_PWR_SUSPEND_SUPPORTED)) { - /* - * System power management protocol is available, but it does - * not support SYSTEM SUSPEND. - */ - ops->get_sys_suspend_power_state = NULL; + } else { + if (!(msg_attr & SCMI_SYS_PWR_SUSPEND_SUPPORTED)) { + /* + * System power management protocol is available, but + * it does not support SYSTEM SUSPEND. + */ + ops->get_sys_suspend_power_state = NULL; + } + if (!(msg_attr & SCMI_SYS_PWR_WARM_RESET_SUPPORTED)) { + /* + * WARM reset is not available. + */ + ops->system_reset2 = NULL; + } } return ops; } + +int css_system_reset2(int is_vendor, int reset_type, u_register_t cookie) +{ + if (is_vendor || (reset_type != PSCI_RESET2_SYSTEM_WARM_RESET)) + return PSCI_E_INVALID_PARAMS; + + css_scp_system_off(SCMI_SYS_PWR_WARM_RESET); + /* + * css_scp_system_off cannot return (it is a __dead function), + * but css_system_reset2 has to return some value, even in + * this case. + */ + return 0; +} diff --git a/plat/arm/css/drivers/scp/css_scp.h b/plat/arm/css/drivers/scp/css_scp.h index 4a6d4738b..1f0cf8e24 100644 --- a/plat/arm/css/drivers/scp/css_scp.h +++ b/plat/arm/css/drivers/scp/css_scp.h @@ -15,6 +15,7 @@ struct psci_power_state; /* API for power management by SCP */ +int css_system_reset2(int is_vendor, int reset_type, u_register_t cookie); void css_scp_suspend(const struct psci_power_state *target_state); void css_scp_off(const struct psci_power_state *target_state); void css_scp_on(u_register_t mpidr); |