From 0b3a4e414bbc4b897c7279a08f3da286141a2a2e Mon Sep 17 00:00:00 2001 From: Filip Drazic Date: Tue, 7 Feb 2017 12:03:57 +0100 Subject: [PATCH] zynqmp: pm: Decode start address related SMC arguments for pm_req_wakeup The pm_req_wakeup PM API accepts start address (64-bit unsiged integer) and a flag stating if address should be used. To save an argument of the SMC call, flag is encoded in the LSB of the address, since addresses are word aligned. Decode start address and use-address flag in the PM SMC handler and pass them to pm_req_wakeup. Signed-off-by: Filip Drazic Acked-by: Will Wong --- plat/xilinx/zynqmp/pm_service/pm_svc_main.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plat/xilinx/zynqmp/pm_service/pm_svc_main.c b/plat/xilinx/zynqmp/pm_service/pm_svc_main.c index 2906a41d39..69e711aa24 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_svc_main.c +++ b/plat/xilinx/zynqmp/pm_service/pm_svc_main.c @@ -117,9 +117,16 @@ 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_REQ_WAKEUP: - ret = pm_req_wakeup(pm_arg[0], pm_arg[1], pm_arg[2], + { + /* Use address flag is encoded in the 1st bit of the low-word */ + unsigned int set_addr = pm_arg[1] & 0x1; + uint64_t address = (uint64_t)pm_arg[2] << 32; + + address |= pm_arg[1] & (~0x1); + ret = pm_req_wakeup(pm_arg[0], set_addr, address, pm_arg[3]); SMC_RET1(handle, (uint64_t)ret); + } case PM_FORCE_POWERDOWN: ret = pm_force_powerdown(pm_arg[0], pm_arg[1]);