From: Hiago De Franco <hiago.franco@toradex.com>
For the i.MX8X and i.MX8 family SoCs, when the M-core is powered up
by the bootloader, M-core and Linux are in same SCFW (System Controller
Firmware) partition, so linux has permission to control M-core.
But when M-core is started, the SCFW will automatically enable the clock
and configure the rate, and any users that want to enable the clock will
get error 'LOCKED' from SCFW. So current imx_rproc.c probe function
fails because clk_prepare_enable also fails. With that, the M-core power
domain is powered off when it is still running, causing a SCU (System
Controller Unit) fault reset, and the system restarts.
To address the issue, ignore handling the clk for i.MX8X and i.MX8 M-core,
because SCFW will automatically enable and configure the clock.
Suggested-by: Peng Fan <peng.fan@nxp.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Hiago De Franco <hiago.franco@toradex.com>
---
v4 -> v5:
- Unchanged.
v3 -> v4:
- Unchanged.
v2 -> v3:
- Unchanged.
v1 -> v2:
- Commit description updated, as suggested. Fixed Peng Fan email.
---
drivers/remoteproc/imx_rproc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index 74299af1d7f1..627e57a88db2 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -1029,8 +1029,8 @@ static int imx_rproc_clk_enable(struct imx_rproc *priv)
struct device *dev = priv->dev;
int ret;
- /* Remote core is not under control of Linux */
- if (dcfg->method == IMX_RPROC_NONE)
+ /* Remote core is not under control of Linux or it is managed by SCU API */
+ if (dcfg->method == IMX_RPROC_NONE || dcfg->method == IMX_RPROC_SCU_API)
return 0;
priv->clk = devm_clk_get(dev, NULL);
--
2.39.5
Hi Hiago, On Tue, Jun 17, 2025 at 04:34:49PM -0300, Hiago De Franco wrote: > From: Hiago De Franco <hiago.franco@toradex.com> > > For the i.MX8X and i.MX8 family SoCs, when the M-core is powered up > by the bootloader, M-core and Linux are in same SCFW (System Controller > Firmware) partition, so linux has permission to control M-core. Ok > > But when M-core is started, the SCFW will automatically enable the clock I find the "But when M-core is started" part confusing. Started by who? And are you making a distinction between "powered up" and "started"? It is not possible for someone that doesn't have HW documentation to understand what is going on. > and configure the rate, and any users that want to enable the clock will > get error 'LOCKED' from SCFW. So current imx_rproc.c probe function > fails because clk_prepare_enable also fails. With that, the M-core power > domain is powered off when it is still running, causing a SCU (System > Controller Unit) fault reset, and the system restarts. > > To address the issue, ignore handling the clk for i.MX8X and i.MX8 M-core, > because SCFW will automatically enable and configure the clock. > > Suggested-by: Peng Fan <peng.fan@nxp.com> > Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> > Signed-off-by: Hiago De Franco <hiago.franco@toradex.com> > --- > v4 -> v5: > - Unchanged. > v3 -> v4: > - Unchanged. > v2 -> v3: > - Unchanged. > v1 -> v2: > - Commit description updated, as suggested. Fixed Peng Fan email. > --- > drivers/remoteproc/imx_rproc.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > index 74299af1d7f1..627e57a88db2 100644 > --- a/drivers/remoteproc/imx_rproc.c > +++ b/drivers/remoteproc/imx_rproc.c > @@ -1029,8 +1029,8 @@ static int imx_rproc_clk_enable(struct imx_rproc *priv) > struct device *dev = priv->dev; > int ret; > > - /* Remote core is not under control of Linux */ > - if (dcfg->method == IMX_RPROC_NONE) > + /* Remote core is not under control of Linux or it is managed by SCU API */ > + if (dcfg->method == IMX_RPROC_NONE || dcfg->method == IMX_RPROC_SCU_API) > return 0; > > priv->clk = devm_clk_get(dev, NULL); > -- > 2.39.5 >
Hi Mathieu, On Mon, Jun 23, 2025 at 09:15:52AM -0600, Mathieu Poirier wrote: > Hi Hiago, > > On Tue, Jun 17, 2025 at 04:34:49PM -0300, Hiago De Franco wrote: > > From: Hiago De Franco <hiago.franco@toradex.com> > > > > For the i.MX8X and i.MX8 family SoCs, when the M-core is powered up > > by the bootloader, M-core and Linux are in same SCFW (System Controller > > Firmware) partition, so linux has permission to control M-core. > > Ok > > > > > But when M-core is started, the SCFW will automatically enable the clock > > I find the "But when M-core is started" part confusing. Started by who? And > are you making a distinction between "powered up" and "started"? It is not > possible for someone that doesn't have HW documentation to understand what is > going on. Ok, understood, I will improve this in the next revision. Just to make clear, I am talking about Cortex-A bootloader starting Cortex-M (U-Boot bootaux command in this case). This means powered up, started and running. > > > and configure the rate, and any users that want to enable the clock will > > get error 'LOCKED' from SCFW. So current imx_rproc.c probe function > > fails because clk_prepare_enable also fails. With that, the M-core power > > domain is powered off when it is still running, causing a SCU (System > > Controller Unit) fault reset, and the system restarts. > > > > To address the issue, ignore handling the clk for i.MX8X and i.MX8 M-core, > > because SCFW will automatically enable and configure the clock. > > > > Suggested-by: Peng Fan <peng.fan@nxp.com> > > Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> > > Signed-off-by: Hiago De Franco <hiago.franco@toradex.com> > > --- > > v4 -> v5: > > - Unchanged. > > v3 -> v4: > > - Unchanged. > > v2 -> v3: > > - Unchanged. > > v1 -> v2: > > - Commit description updated, as suggested. Fixed Peng Fan email. > > --- > > drivers/remoteproc/imx_rproc.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > index 74299af1d7f1..627e57a88db2 100644 > > --- a/drivers/remoteproc/imx_rproc.c > > +++ b/drivers/remoteproc/imx_rproc.c > > @@ -1029,8 +1029,8 @@ static int imx_rproc_clk_enable(struct imx_rproc *priv) > > struct device *dev = priv->dev; > > int ret; > > > > - /* Remote core is not under control of Linux */ > > - if (dcfg->method == IMX_RPROC_NONE) > > + /* Remote core is not under control of Linux or it is managed by SCU API */ > > + if (dcfg->method == IMX_RPROC_NONE || dcfg->method == IMX_RPROC_SCU_API) > > return 0; > > > > priv->clk = devm_clk_get(dev, NULL); > > -- > > 2.39.5 > >
© 2016 - 2025 Red Hat, Inc.