From 7b9b62cff3816e2196d1d9c94d8c95eedda96dec Mon Sep 17 00:00:00 2001 From: Bai Ping Date: Mon, 11 Jun 2018 13:19:20 +0800 Subject: plat: imx8mm: mask the non-wakeup irq in low power mode Only enable the wakeup irq when system enter DSM mode. Signed-off-by: Bai Ping --- plat/imx/imx8mm/gpc.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/plat/imx/imx8mm/gpc.c b/plat/imx/imx8mm/gpc.c index 4cccc89a..71dc15f8 100644 --- a/plat/imx/imx8mm/gpc.c +++ b/plat/imx/imx8mm/gpc.c @@ -189,6 +189,7 @@ static struct imx_pwr_domain pu_domains[] = { IMX_PD_DOMAIN(VPU_G2), }; +static uint32_t gpc_wake_irqs[4] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, }; static uint32_t gpc_imr_offset[] = { 0x30, 0x40, 0x1c0, 0x1d0, }; /* save gic dist&redist context when NOC wrapper is power down */ static struct plat_gic_ctx imx_gicv3_ctx; @@ -586,7 +587,7 @@ void imx_set_sys_wakeup(int last_core, bool pdn) /* clear last core's IMR based on GIC's mask setting */ for (int i = 0; i < 4; i++) { if (pdn) - irq_mask = ~dist_ctx->gicd_isenabler[i]; + irq_mask = ~dist_ctx->gicd_isenabler[i] | gpc_wake_irqs[i]; else irq_mask = IMR_MASK_ALL; @@ -595,6 +596,16 @@ void imx_set_sys_wakeup(int last_core, bool pdn) } } +static void imx_gpc_set_wake_irq(uint32_t hwirq, uint32_t on) +{ + uint32_t mask, idx; + + mask = 1 << hwirq % 32; + idx = hwirq / 32; + gpc_wake_irqs[idx] = on ? gpc_wake_irqs[idx] & ~mask : + gpc_wake_irqs[idx] | mask; +} + static void imx_gpc_pm_domain_enable(uint32_t domain_id, uint32_t on) { uint32_t val; @@ -751,6 +762,9 @@ int imx_gpc_handler(uint32_t smc_fid, case FSL_SIP_CONFIG_GPC_PM_DOMAIN: imx_gpc_pm_domain_enable(x2, x3); break; + case FSL_SIP_CONFIG_GPC_SET_WAKE: + imx_gpc_set_wake_irq(x2, x3); + break; default: return SMC_UNK; } -- cgit v1.2.3