Message ID | 20240813085748.2144637-1-peng.fan@oss.nxp.com |
---|---|
State | New |
Headers | show |
Series | pmdomain: imx: wait SSAR when i.MX93 power domain on | expand |
On Tue, 13 Aug 2024 at 10:49, Peng Fan (OSS) <peng.fan@oss.nxp.com> wrote: > > From: Peng Fan <peng.fan@nxp.com> > > With "quite" set in bootargs, there is power domain failure: > "imx93_power_domain 44462400.power-domain: pd_off timeout: name: > 44462400.power-domain, stat: 4" > > The current power on opertation takes ISO state as power on finished > flag, but it is wrong. Before powering on operation really finishes, > powering off comes and powering off will never finish because the last > powering on still not finishes, so the following powering off actually > not trigger hardware state machine to run. SSAR is the last step when > powering on a domain, so need to wait SSAR done when powering on. > > Since EdgeLock Enclave(ELE) handshake is involved in the flow, enlarge > the waiting time to 10ms for both on and off to avoid timeout. > > Reviewed-by: Jacky Bai <ping.bai@nxp.com> > Signed-off-by: Peng Fan <peng.fan@nxp.com> Should we add a stable and a fixes tag for this too? Kind regards Uffe > --- > > V1: > Downstream R-b tag kept > > drivers/pmdomain/imx/imx93-pd.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/pmdomain/imx/imx93-pd.c b/drivers/pmdomain/imx/imx93-pd.c > index 1e94b499c19b..d750a7dc58d2 100644 > --- a/drivers/pmdomain/imx/imx93-pd.c > +++ b/drivers/pmdomain/imx/imx93-pd.c > @@ -20,6 +20,7 @@ > #define FUNC_STAT_PSW_STAT_MASK BIT(0) > #define FUNC_STAT_RST_STAT_MASK BIT(2) > #define FUNC_STAT_ISO_STAT_MASK BIT(4) > +#define FUNC_STAT_SSAR_STAT_MASK BIT(8) > > struct imx93_power_domain { > struct generic_pm_domain genpd; > @@ -50,7 +51,7 @@ static int imx93_pd_on(struct generic_pm_domain *genpd) > writel(val, addr + MIX_SLICE_SW_CTRL_OFF); > > ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val, > - !(val & FUNC_STAT_ISO_STAT_MASK), 1, 10000); > + !(val & FUNC_STAT_SSAR_STAT_MASK), 1, 10000); > if (ret) { > dev_err(domain->dev, "pd_on timeout: name: %s, stat: %x\n", genpd->name, val); > return ret; > @@ -72,7 +73,7 @@ static int imx93_pd_off(struct generic_pm_domain *genpd) > writel(val, addr + MIX_SLICE_SW_CTRL_OFF); > > ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val, > - val & FUNC_STAT_PSW_STAT_MASK, 1, 1000); > + val & FUNC_STAT_PSW_STAT_MASK, 1, 10000); > if (ret) { > dev_err(domain->dev, "pd_off timeout: name: %s, stat: %x\n", genpd->name, val); > return ret; > -- > 2.37.1 >
diff --git a/drivers/pmdomain/imx/imx93-pd.c b/drivers/pmdomain/imx/imx93-pd.c index 1e94b499c19b..d750a7dc58d2 100644 --- a/drivers/pmdomain/imx/imx93-pd.c +++ b/drivers/pmdomain/imx/imx93-pd.c @@ -20,6 +20,7 @@ #define FUNC_STAT_PSW_STAT_MASK BIT(0) #define FUNC_STAT_RST_STAT_MASK BIT(2) #define FUNC_STAT_ISO_STAT_MASK BIT(4) +#define FUNC_STAT_SSAR_STAT_MASK BIT(8) struct imx93_power_domain { struct generic_pm_domain genpd; @@ -50,7 +51,7 @@ static int imx93_pd_on(struct generic_pm_domain *genpd) writel(val, addr + MIX_SLICE_SW_CTRL_OFF); ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val, - !(val & FUNC_STAT_ISO_STAT_MASK), 1, 10000); + !(val & FUNC_STAT_SSAR_STAT_MASK), 1, 10000); if (ret) { dev_err(domain->dev, "pd_on timeout: name: %s, stat: %x\n", genpd->name, val); return ret; @@ -72,7 +73,7 @@ static int imx93_pd_off(struct generic_pm_domain *genpd) writel(val, addr + MIX_SLICE_SW_CTRL_OFF); ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val, - val & FUNC_STAT_PSW_STAT_MASK, 1, 1000); + val & FUNC_STAT_PSW_STAT_MASK, 1, 10000); if (ret) { dev_err(domain->dev, "pd_off timeout: name: %s, stat: %x\n", genpd->name, val); return ret;