From 2ab0ef8db9561699fef0f77f5a1735e4903f6b3e Mon Sep 17 00:00:00 2001 From: Sai Krishna Potthuri Date: Tue, 20 Oct 2020 07:00:06 -0600 Subject: [PATCH] plat: zynqmp: Check for DLL status before doing reset This patch check for the DLL status before doing the DLL reset. If DLL reset is already issued then skip the reset inside ATF otherwise DLL reset will be issued. By doing this way, all the following cases will be supported. 1. Patched ATF + Patched Linux base. 2. Older ATF + Patched Linux base. 3. Patched ATF + Older Linux base. Signed-off-by: Sai Krishna Potthuri Acked-by: Michal Simek Signed-off-by: Michal Simek Change-Id: I53a0a27521330f1543275cc9cb44cd1dfc569c65 --- plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c | 27 +++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c b/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c index 60e80d907..9b1ffbc7a 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c +++ b/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c @@ -282,17 +282,29 @@ static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid, { unsigned int shift; enum pm_ret_status ret; + unsigned int val, mask; - if (nid == NODE_SD_0) + if (nid == NODE_SD_0) { shift = 0; - else if (nid == NODE_SD_1) + mask = ZYNQMP_SD0_DLL_RST_MASK; + } else if (nid == NODE_SD_1) { shift = ZYNQMP_SD_TAP_OFFSET; - else + mask = ZYNQMP_SD1_DLL_RST_MASK; + } else { return PM_RET_ERROR_ARGS; + } - ret = pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_ASSERT); - if (ret != PM_RET_SUCCESS) + ret = pm_mmio_read(ZYNQMP_SD_DLL_CTRL, &val); + if (ret != PM_RET_SUCCESS) { return ret; + } + + if ((val & mask) == 0) { + ret = pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_ASSERT); + if (ret != PM_RET_SUCCESS) { + return ret; + } + } if (type == PM_TAPDELAY_INPUT) { ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY, @@ -326,7 +338,10 @@ static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid, } reset_release: - pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_RELEASE); + if ((val & mask) == 0) { + (void)pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_RELEASE); + } + return ret; }