diff --git a/plat/xilinx/zynqmp/plat_psci.c b/plat/xilinx/zynqmp/plat_psci.c index 55227ea9442a29002710ef4b5a18a7c6041bd685..7f7e0322d25a125cdac5f4a671a74f966631a11d 100644 --- a/plat/xilinx/zynqmp/plat_psci.c +++ b/plat/xilinx/zynqmp/plat_psci.c @@ -270,7 +270,8 @@ static void __dead2 zynqmp_system_off(void) plat_arm_interconnect_exit_coherency(); /* Send the power down request to the PMU */ - pm_system_shutdown(0); + pm_system_shutdown(PMF_SHUTDOWN_TYPE_SHUTDOWN, + PMF_SHUTDOWN_SUBTYPE_SUBSYSTEM); while (1) wfi(); @@ -304,7 +305,8 @@ static void __dead2 zynqmp_system_reset(void) plat_arm_interconnect_exit_coherency(); /* Send the system reset request to the PMU */ - pm_system_shutdown(1); + pm_system_shutdown(PMF_SHUTDOWN_TYPE_RESET, + PMF_SHUTDOWN_SUBTYPE_SUBSYSTEM); while (1) wfi(); diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_sys.c b/plat/xilinx/zynqmp/pm_service/pm_api_sys.c index b9906060640e1337249a29fac2171b7528cb8b73..941601692299aa9ab80a25af57a8a1f3bd0f009c 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_sys.c +++ b/plat/xilinx/zynqmp/pm_service/pm_api_sys.c @@ -243,11 +243,11 @@ enum pm_ret_status pm_set_wakeup_source(enum pm_node_id target, * * @return Returns status, either success or error+reason */ -enum pm_ret_status pm_system_shutdown(unsigned int restart) +enum pm_ret_status pm_system_shutdown(unsigned int type, unsigned int subtype) { uint32_t payload[PAYLOAD_ARG_CNT]; - PM_PACK_PAYLOAD2(payload, PM_SYSTEM_SHUTDOWN, restart); + PM_PACK_PAYLOAD3(payload, PM_SYSTEM_SHUTDOWN, type, subtype); return pm_ipi_send(primary_proc, payload); } diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_sys.h b/plat/xilinx/zynqmp/pm_service/pm_api_sys.h index 1f681180104bfad3856c6575cd90fe8eae0dcff7..8cbd13b2f54b99f5cbe3c5c0a27817d443934998 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_sys.h +++ b/plat/xilinx/zynqmp/pm_service/pm_api_sys.h @@ -61,7 +61,7 @@ enum pm_ret_status pm_set_wakeup_source(enum pm_node_id target, enum pm_node_id wkup_node, unsigned int enable); -enum pm_ret_status pm_system_shutdown(unsigned int restart); +enum pm_ret_status pm_system_shutdown(unsigned int type, unsigned int subtype); enum pm_ret_status pm_init_suspend_cb(enum pm_suspend_reason reason, unsigned int latency, diff --git a/plat/xilinx/zynqmp/pm_service/pm_defs.h b/plat/xilinx/zynqmp/pm_service/pm_defs.h index aec335a5e73f24d18ca6a5588944fd6b6a5f7873..0c071c1f27965136934c52d760500641a426a484 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_defs.h +++ b/plat/xilinx/zynqmp/pm_service/pm_defs.h @@ -225,4 +225,15 @@ enum pm_boot_status { PM_BOOT_ERROR, }; +enum pm_shutdown_type { + PMF_SHUTDOWN_TYPE_SHUTDOWN, + PMF_SHUTDOWN_TYPE_RESET, +}; + +enum pm_shutdown_subtype { + PMF_SHUTDOWN_SUBTYPE_SUBSYSTEM, + PMF_SHUTDOWN_SUBTYPE_PS_ONLY, + PMF_SHUTDOWN_SUBTYPE_SYSTEM, +}; + #endif /* _PM_DEFS_H_ */ diff --git a/plat/xilinx/zynqmp/pm_service/pm_svc_main.c b/plat/xilinx/zynqmp/pm_service/pm_svc_main.c index d6355834013d41e989fef22843840ee1ebf00796..c062392e488f383f29325427cc6157de69624086 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_svc_main.c +++ b/plat/xilinx/zynqmp/pm_service/pm_svc_main.c @@ -152,7 +152,7 @@ uint64_t pm_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, SMC_RET1(handle, (uint64_t)ret); case PM_SYSTEM_SHUTDOWN: - ret = pm_system_shutdown(pm_arg[0]); + ret = pm_system_shutdown(pm_arg[0], pm_arg[1]); SMC_RET1(handle, (uint64_t)ret); case PM_REQ_NODE: