From 823f912b333a4cc114286b65ca821e7f9b1dcbf7 Mon Sep 17 00:00:00 2001 From: Anson Huang Date: Fri, 22 Nov 2019 14:34:18 +0800 Subject: imx: add system_reset2 support for i.MX8QM/i.MX8QX Add system_reset2 support for i.MX8QM/i.MX8QX to support WARM/COLD/BOARD reset. Signed-off-by: Anson Huang --- include/lib/psci/psci.h | 2 ++ plat/imx/common/imx8_psci.c | 26 ++++++++++++++++++++++++++ plat/imx/common/include/plat_imx8.h | 1 + plat/imx/imx8qm/imx8qm_psci.c | 1 + plat/imx/imx8qx/imx8qx_psci.c | 1 + 5 files changed, 31 insertions(+) diff --git a/include/lib/psci/psci.h b/include/lib/psci/psci.h index 7f7b7e3f..bfde9dc8 100644 --- a/include/lib/psci/psci.h +++ b/include/lib/psci/psci.h @@ -165,6 +165,8 @@ #define PSCI_RESET2_TYPE_VENDOR (U(1) << PSCI_RESET2_TYPE_VENDOR_SHIFT) #define PSCI_RESET2_TYPE_ARCH (U(0) << PSCI_RESET2_TYPE_VENDOR_SHIFT) #define PSCI_RESET2_SYSTEM_WARM_RESET (PSCI_RESET2_TYPE_ARCH | U(0)) +#define PSCI_RESET2_SYSTEM_COLD_RESET (PSCI_RESET2_TYPE_VENDOR | U(1)) +#define PSCI_RESET2_SYSTEM_BOARD_RESET (PSCI_RESET2_TYPE_VENDOR | U(2)) #ifndef __ASSEMBLER__ diff --git a/plat/imx/common/imx8_psci.c b/plat/imx/common/imx8_psci.c index 396a8854..97832b03 100644 --- a/plat/imx/common/imx8_psci.c +++ b/plat/imx/common/imx8_psci.c @@ -29,6 +29,32 @@ void __dead2 imx_system_reset(void) panic(); } +int imx_system_reset2(int is_vendor, int reset_type, u_register_t cookie) +{ + const char *reset_type_name = ""; + + switch(reset_type) { + case PSCI_RESET2_SYSTEM_WARM_RESET: + sc_pm_reboot(ipc_handle, SC_PM_RESET_TYPE_WARM); + reset_type_name = "warm"; + break; + case PSCI_RESET2_SYSTEM_COLD_RESET: + sc_pm_reboot(ipc_handle, SC_PM_RESET_TYPE_COLD); + reset_type_name = "cold"; + break; + case PSCI_RESET2_SYSTEM_BOARD_RESET: + sc_pm_reset(ipc_handle, SC_PM_RESET_TYPE_BOARD); + reset_type_name = "board"; + break; + default: + return PSCI_E_INVALID_PARAMS; + } + + wfi(); + ERROR("system %s reset failed.\n", reset_type_name); + panic(); +} + int imx_validate_power_state(unsigned int power_state, psci_power_state_t *req_state) { diff --git a/plat/imx/common/include/plat_imx8.h b/plat/imx/common/include/plat_imx8.h index be99b970..08066a84 100644 --- a/plat/imx/common/include/plat_imx8.h +++ b/plat/imx/common/include/plat_imx8.h @@ -25,6 +25,7 @@ void plat_gic_pcpu_init(void); void __dead2 imx_system_off(void); void __dead2 imx_system_reset(void); +int imx_system_reset2(int is_vendor, int reset_type, u_register_t cookie); int imx_validate_power_state(unsigned int power_state, psci_power_state_t *req_state); void imx_get_sys_suspend_power_state(psci_power_state_t *req_state); diff --git a/plat/imx/imx8qm/imx8qm_psci.c b/plat/imx/imx8qm/imx8qm_psci.c index e5e5576f..36248891 100644 --- a/plat/imx/imx8qm/imx8qm_psci.c +++ b/plat/imx/imx8qm/imx8qm_psci.c @@ -296,6 +296,7 @@ static const plat_psci_ops_t imx_plat_psci_ops = { .validate_ns_entrypoint = imx_validate_ns_entrypoint, .system_off = imx_system_off, .system_reset = imx_system_reset, + .system_reset2 = imx_system_reset2, }; int plat_setup_psci_ops(uintptr_t sec_entrypoint, diff --git a/plat/imx/imx8qx/imx8qx_psci.c b/plat/imx/imx8qx/imx8qx_psci.c index aab3a2da..1bca1010 100644 --- a/plat/imx/imx8qx/imx8qx_psci.c +++ b/plat/imx/imx8qx/imx8qx_psci.c @@ -219,6 +219,7 @@ static const plat_psci_ops_t imx_plat_psci_ops = { .validate_ns_entrypoint = imx_validate_ns_entrypoint, .system_off = imx_system_off, .system_reset = imx_system_reset, + .system_reset2 = imx_system_reset2, .pwr_domain_off = imx_pwr_domain_off, .pwr_domain_suspend = imx_domain_suspend, .pwr_domain_suspend_finish = imx_domain_suspend_finish, -- cgit v1.2.3