From b48ae263d255718efee7b4ed0cb1d6c2e3cb1fb8 Mon Sep 17 00:00:00 2001 From: Roberto Vargas Date: Wed, 16 Aug 2017 08:57:45 +0100 Subject: [PATCH] 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 --- plat/arm/css/common/css_pm.c | 3 +++ plat/arm/css/drivers/scp/css_pm_scmi.c | 34 +++++++++++++++++++++----- 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 93d51fe662..39c02aff29 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 dc5fa26205..e29cd8679e 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 4a6d4738b9..1f0cf8e24a 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);