* [PATCH v8] remoteproc: imx_rproc: detect and attach to pre-booted remote cores
@ 2025-07-16 19:46 Hiago De Franco
2025-07-17 14:44 ` Mathieu Poirier
2025-07-18 10:44 ` Ulf Hansson
0 siblings, 2 replies; 3+ messages in thread
From: Hiago De Franco @ 2025-07-16 19:46 UTC (permalink / raw)
To: Mathieu Poirier, Ulf Hansson, linux-remoteproc
Cc: Shawn Guo, Sascha Hauer, Bjorn Andersson, imx, linux-arm-kernel,
linux-kernel, daniel.baluta, iuliana.prodan, Rafael J . Wysocki,
Hiago De Franco, Peng Fan
From: Hiago De Franco <hiago.franco@toradex.com>
When the Cortex-M remote core is started and already running before
Linux boots (typically by the Cortex-A bootloader using a command like
bootaux), the current driver is unable to attach to it. This is because
the driver only checks for remote cores running in different SCU
partitions. However in this case, the M-core is in the same partition as
Linux and is already powered up and running by the bootloader.
This patch adds a check using dev_pm_genpd_is_on() to verify whether the
M-core's power domains are already on. If all power domain devices are
on, the driver assumes the M-core is running and proceed to attach to
it.
To accomplish this, we need to avoid passing any attach_data or flags to
dev_pm_domain_attach_list(), allowing the platform device become a
consumer of the power domain provider without changing its current
state.
During probe, also enable and sync the device runtime PM to make sure
the power domains are correctly managed when the core is controlled by
the kernel.
Suggested-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Hiago De Franco <hiago.franco@toradex.com>
---
Hi Mathieu, Ulf,
This is the v8 of patch3 from the patch series:
https://lore.kernel.org/all/20250629172512.14857-1-hiagofranco@gmail.com/
As patches 1 and 2 are already applied on Ulf's next branch, as
requested I am sending now only the v8 of patch 3.
I made a small correction into the commit description, s/SCFW
partitions/SCU partitions/g and updated with the check for the return
value.
I hope this is ok.
Thanks!
Hiago.
v7 -> v8:
- Added return error check for dev_pm_domain_attach_list().
- Commit description: changed to use "SCU partitions" instead of
"SCFW partitions". This is more accurate since these are hardware
enforced partitions.
v6 -> v7:
- Added Peng reviewed-by.
v5 -> v6:
- Commit description improved, as suggested. Added Ulf Hansson reviewed
by. Comment on imx-rproc.c improved.
v4 -> v5:
- pm_runtime_get_sync() removed in favor of
pm_runtime_resume_and_get(). Now it also checks the return value of
this function.
- Added pm_runtime_disable() and pm_runtime_put() to imx_rproc_remove()
function.
v3 -> v4:
- Changed to use the new dev_pm_genpd_is_on() function instead, as
suggested by Ulf. This will now get the power status of the two
remote cores power domains to decided if imx_rpoc needs to attach or
not. In order to do that, pm_runtime_enable() and
pm_runtime_get_sync() were introduced and pd_data was removed.
v2 -> v3:
- Unchanged.
v1 -> v2:
- Dropped unecessary include. Removed the imx_rproc_is_on function, as
suggested.
---
---
drivers/remoteproc/imx_rproc.c | 41 +++++++++++++++++++++++++++++-----
1 file changed, 35 insertions(+), 6 deletions(-)
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index 627e57a88db2..a6eef0080ca9 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -18,6 +18,7 @@
#include <linux/of_reserved_mem.h>
#include <linux/platform_device.h>
#include <linux/pm_domain.h>
+#include <linux/pm_runtime.h>
#include <linux/reboot.h>
#include <linux/regmap.h>
#include <linux/remoteproc.h>
@@ -890,10 +891,8 @@ static int imx_rproc_partition_notify(struct notifier_block *nb,
static int imx_rproc_attach_pd(struct imx_rproc *priv)
{
struct device *dev = priv->dev;
- int ret;
- struct dev_pm_domain_attach_data pd_data = {
- .pd_flags = PD_FLAG_DEV_LINK_ON,
- };
+ int ret, i;
+ bool detached = true;
/*
* If there is only one power-domain entry, the platform driver framework
@@ -902,8 +901,25 @@ static int imx_rproc_attach_pd(struct imx_rproc *priv)
if (dev->pm_domain)
return 0;
- ret = dev_pm_domain_attach_list(dev, &pd_data, &priv->pd_list);
- return ret < 0 ? ret : 0;
+ ret = dev_pm_domain_attach_list(dev, NULL, &priv->pd_list);
+ if (ret < 0)
+ return ret;
+ /*
+ * If all the power domain devices are already turned on, the remote
+ * core is already powered up and running when the kernel booted (e.g.,
+ * started by U-Boot's bootaux command). In this case attach to it.
+ */
+ for (i = 0; i < ret; i++) {
+ if (!dev_pm_genpd_is_on(priv->pd_list->pd_devs[i])) {
+ detached = false;
+ break;
+ }
+ }
+
+ if (detached)
+ priv->rproc->state = RPROC_DETACHED;
+
+ return 0;
}
static int imx_rproc_detect_mode(struct imx_rproc *priv)
@@ -1146,6 +1162,15 @@ static int imx_rproc_probe(struct platform_device *pdev)
}
}
+ if (dcfg->method == IMX_RPROC_SCU_API) {
+ pm_runtime_enable(dev);
+ ret = pm_runtime_resume_and_get(dev);
+ if (ret) {
+ dev_err(dev, "pm_runtime get failed: %d\n", ret);
+ goto err_put_clk;
+ }
+ }
+
ret = rproc_add(rproc);
if (ret) {
dev_err(dev, "rproc_add failed\n");
@@ -1171,6 +1196,10 @@ static void imx_rproc_remove(struct platform_device *pdev)
struct rproc *rproc = platform_get_drvdata(pdev);
struct imx_rproc *priv = rproc->priv;
+ if (priv->dcfg->method == IMX_RPROC_SCU_API) {
+ pm_runtime_disable(priv->dev);
+ pm_runtime_put(priv->dev);
+ }
clk_disable_unprepare(priv->clk);
rproc_del(rproc);
imx_rproc_put_scu(rproc);
--
2.39.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v8] remoteproc: imx_rproc: detect and attach to pre-booted remote cores
2025-07-16 19:46 [PATCH v8] remoteproc: imx_rproc: detect and attach to pre-booted remote cores Hiago De Franco
@ 2025-07-17 14:44 ` Mathieu Poirier
2025-07-18 10:44 ` Ulf Hansson
1 sibling, 0 replies; 3+ messages in thread
From: Mathieu Poirier @ 2025-07-17 14:44 UTC (permalink / raw)
To: Hiago De Franco
Cc: Ulf Hansson, linux-remoteproc, Shawn Guo, Sascha Hauer,
Bjorn Andersson, imx, linux-arm-kernel, linux-kernel,
daniel.baluta, iuliana.prodan, Rafael J . Wysocki,
Hiago De Franco, Peng Fan
On Wed, Jul 16, 2025 at 04:46:38PM -0300, Hiago De Franco wrote:
> From: Hiago De Franco <hiago.franco@toradex.com>
>
> When the Cortex-M remote core is started and already running before
> Linux boots (typically by the Cortex-A bootloader using a command like
> bootaux), the current driver is unable to attach to it. This is because
> the driver only checks for remote cores running in different SCU
> partitions. However in this case, the M-core is in the same partition as
> Linux and is already powered up and running by the bootloader.
>
> This patch adds a check using dev_pm_genpd_is_on() to verify whether the
> M-core's power domains are already on. If all power domain devices are
> on, the driver assumes the M-core is running and proceed to attach to
> it.
>
> To accomplish this, we need to avoid passing any attach_data or flags to
> dev_pm_domain_attach_list(), allowing the platform device become a
> consumer of the power domain provider without changing its current
> state.
>
> During probe, also enable and sync the device runtime PM to make sure
> the power domains are correctly managed when the core is controlled by
> the kernel.
>
> Suggested-by: Ulf Hansson <ulf.hansson@linaro.org>
> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
> Reviewed-by: Peng Fan <peng.fan@nxp.com>
> Signed-off-by: Hiago De Franco <hiago.franco@toradex.com>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
> Hi Mathieu, Ulf,
>
> This is the v8 of patch3 from the patch series:
> https://lore.kernel.org/all/20250629172512.14857-1-hiagofranco@gmail.com/
>
> As patches 1 and 2 are already applied on Ulf's next branch, as
> requested I am sending now only the v8 of patch 3.
>
> I made a small correction into the commit description, s/SCFW
> partitions/SCU partitions/g and updated with the check for the return
> value.
>
> I hope this is ok.
>
> Thanks!
>
> Hiago.
>
> v7 -> v8:
> - Added return error check for dev_pm_domain_attach_list().
> - Commit description: changed to use "SCU partitions" instead of
> "SCFW partitions". This is more accurate since these are hardware
> enforced partitions.
> v6 -> v7:
> - Added Peng reviewed-by.
> v5 -> v6:
> - Commit description improved, as suggested. Added Ulf Hansson reviewed
> by. Comment on imx-rproc.c improved.
> v4 -> v5:
> - pm_runtime_get_sync() removed in favor of
> pm_runtime_resume_and_get(). Now it also checks the return value of
> this function.
> - Added pm_runtime_disable() and pm_runtime_put() to imx_rproc_remove()
> function.
> v3 -> v4:
> - Changed to use the new dev_pm_genpd_is_on() function instead, as
> suggested by Ulf. This will now get the power status of the two
> remote cores power domains to decided if imx_rpoc needs to attach or
> not. In order to do that, pm_runtime_enable() and
> pm_runtime_get_sync() were introduced and pd_data was removed.
> v2 -> v3:
> - Unchanged.
> v1 -> v2:
> - Dropped unecessary include. Removed the imx_rproc_is_on function, as
> suggested.
> ---
> ---
> drivers/remoteproc/imx_rproc.c | 41 +++++++++++++++++++++++++++++-----
> 1 file changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
> index 627e57a88db2..a6eef0080ca9 100644
> --- a/drivers/remoteproc/imx_rproc.c
> +++ b/drivers/remoteproc/imx_rproc.c
> @@ -18,6 +18,7 @@
> #include <linux/of_reserved_mem.h>
> #include <linux/platform_device.h>
> #include <linux/pm_domain.h>
> +#include <linux/pm_runtime.h>
> #include <linux/reboot.h>
> #include <linux/regmap.h>
> #include <linux/remoteproc.h>
> @@ -890,10 +891,8 @@ static int imx_rproc_partition_notify(struct notifier_block *nb,
> static int imx_rproc_attach_pd(struct imx_rproc *priv)
> {
> struct device *dev = priv->dev;
> - int ret;
> - struct dev_pm_domain_attach_data pd_data = {
> - .pd_flags = PD_FLAG_DEV_LINK_ON,
> - };
> + int ret, i;
> + bool detached = true;
>
> /*
> * If there is only one power-domain entry, the platform driver framework
> @@ -902,8 +901,25 @@ static int imx_rproc_attach_pd(struct imx_rproc *priv)
> if (dev->pm_domain)
> return 0;
>
> - ret = dev_pm_domain_attach_list(dev, &pd_data, &priv->pd_list);
> - return ret < 0 ? ret : 0;
> + ret = dev_pm_domain_attach_list(dev, NULL, &priv->pd_list);
> + if (ret < 0)
> + return ret;
> + /*
> + * If all the power domain devices are already turned on, the remote
> + * core is already powered up and running when the kernel booted (e.g.,
> + * started by U-Boot's bootaux command). In this case attach to it.
> + */
> + for (i = 0; i < ret; i++) {
> + if (!dev_pm_genpd_is_on(priv->pd_list->pd_devs[i])) {
> + detached = false;
> + break;
> + }
> + }
> +
> + if (detached)
> + priv->rproc->state = RPROC_DETACHED;
> +
> + return 0;
> }
>
> static int imx_rproc_detect_mode(struct imx_rproc *priv)
> @@ -1146,6 +1162,15 @@ static int imx_rproc_probe(struct platform_device *pdev)
> }
> }
>
> + if (dcfg->method == IMX_RPROC_SCU_API) {
> + pm_runtime_enable(dev);
> + ret = pm_runtime_resume_and_get(dev);
> + if (ret) {
> + dev_err(dev, "pm_runtime get failed: %d\n", ret);
> + goto err_put_clk;
> + }
> + }
> +
> ret = rproc_add(rproc);
> if (ret) {
> dev_err(dev, "rproc_add failed\n");
> @@ -1171,6 +1196,10 @@ static void imx_rproc_remove(struct platform_device *pdev)
> struct rproc *rproc = platform_get_drvdata(pdev);
> struct imx_rproc *priv = rproc->priv;
>
> + if (priv->dcfg->method == IMX_RPROC_SCU_API) {
> + pm_runtime_disable(priv->dev);
> + pm_runtime_put(priv->dev);
> + }
> clk_disable_unprepare(priv->clk);
> rproc_del(rproc);
> imx_rproc_put_scu(rproc);
> --
> 2.39.5
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v8] remoteproc: imx_rproc: detect and attach to pre-booted remote cores
2025-07-16 19:46 [PATCH v8] remoteproc: imx_rproc: detect and attach to pre-booted remote cores Hiago De Franco
2025-07-17 14:44 ` Mathieu Poirier
@ 2025-07-18 10:44 ` Ulf Hansson
1 sibling, 0 replies; 3+ messages in thread
From: Ulf Hansson @ 2025-07-18 10:44 UTC (permalink / raw)
To: Hiago De Franco
Cc: Mathieu Poirier, linux-remoteproc, Shawn Guo, Sascha Hauer,
Bjorn Andersson, imx, linux-arm-kernel, linux-kernel,
daniel.baluta, iuliana.prodan, Rafael J . Wysocki,
Hiago De Franco, Peng Fan
On Wed, 16 Jul 2025 at 21:47, Hiago De Franco <hiagofranco@gmail.com> wrote:
>
> From: Hiago De Franco <hiago.franco@toradex.com>
>
> When the Cortex-M remote core is started and already running before
> Linux boots (typically by the Cortex-A bootloader using a command like
> bootaux), the current driver is unable to attach to it. This is because
> the driver only checks for remote cores running in different SCU
> partitions. However in this case, the M-core is in the same partition as
> Linux and is already powered up and running by the bootloader.
>
> This patch adds a check using dev_pm_genpd_is_on() to verify whether the
> M-core's power domains are already on. If all power domain devices are
> on, the driver assumes the M-core is running and proceed to attach to
> it.
>
> To accomplish this, we need to avoid passing any attach_data or flags to
> dev_pm_domain_attach_list(), allowing the platform device become a
> consumer of the power domain provider without changing its current
> state.
>
> During probe, also enable and sync the device runtime PM to make sure
> the power domains are correctly managed when the core is controlled by
> the kernel.
>
> Suggested-by: Ulf Hansson <ulf.hansson@linaro.org>
> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
> Reviewed-by: Peng Fan <peng.fan@nxp.com>
> Signed-off-by: Hiago De Franco <hiago.franco@toradex.com>
Applied for next, thanks!
Kind regards
Uffe
> ---
> Hi Mathieu, Ulf,
>
> This is the v8 of patch3 from the patch series:
> https://lore.kernel.org/all/20250629172512.14857-1-hiagofranco@gmail.com/
>
> As patches 1 and 2 are already applied on Ulf's next branch, as
> requested I am sending now only the v8 of patch 3.
>
> I made a small correction into the commit description, s/SCFW
> partitions/SCU partitions/g and updated with the check for the return
> value.
>
> I hope this is ok.
>
> Thanks!
>
> Hiago.
>
> v7 -> v8:
> - Added return error check for dev_pm_domain_attach_list().
> - Commit description: changed to use "SCU partitions" instead of
> "SCFW partitions". This is more accurate since these are hardware
> enforced partitions.
> v6 -> v7:
> - Added Peng reviewed-by.
> v5 -> v6:
> - Commit description improved, as suggested. Added Ulf Hansson reviewed
> by. Comment on imx-rproc.c improved.
> v4 -> v5:
> - pm_runtime_get_sync() removed in favor of
> pm_runtime_resume_and_get(). Now it also checks the return value of
> this function.
> - Added pm_runtime_disable() and pm_runtime_put() to imx_rproc_remove()
> function.
> v3 -> v4:
> - Changed to use the new dev_pm_genpd_is_on() function instead, as
> suggested by Ulf. This will now get the power status of the two
> remote cores power domains to decided if imx_rpoc needs to attach or
> not. In order to do that, pm_runtime_enable() and
> pm_runtime_get_sync() were introduced and pd_data was removed.
> v2 -> v3:
> - Unchanged.
> v1 -> v2:
> - Dropped unecessary include. Removed the imx_rproc_is_on function, as
> suggested.
> ---
> ---
> drivers/remoteproc/imx_rproc.c | 41 +++++++++++++++++++++++++++++-----
> 1 file changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
> index 627e57a88db2..a6eef0080ca9 100644
> --- a/drivers/remoteproc/imx_rproc.c
> +++ b/drivers/remoteproc/imx_rproc.c
> @@ -18,6 +18,7 @@
> #include <linux/of_reserved_mem.h>
> #include <linux/platform_device.h>
> #include <linux/pm_domain.h>
> +#include <linux/pm_runtime.h>
> #include <linux/reboot.h>
> #include <linux/regmap.h>
> #include <linux/remoteproc.h>
> @@ -890,10 +891,8 @@ static int imx_rproc_partition_notify(struct notifier_block *nb,
> static int imx_rproc_attach_pd(struct imx_rproc *priv)
> {
> struct device *dev = priv->dev;
> - int ret;
> - struct dev_pm_domain_attach_data pd_data = {
> - .pd_flags = PD_FLAG_DEV_LINK_ON,
> - };
> + int ret, i;
> + bool detached = true;
>
> /*
> * If there is only one power-domain entry, the platform driver framework
> @@ -902,8 +901,25 @@ static int imx_rproc_attach_pd(struct imx_rproc *priv)
> if (dev->pm_domain)
> return 0;
>
> - ret = dev_pm_domain_attach_list(dev, &pd_data, &priv->pd_list);
> - return ret < 0 ? ret : 0;
> + ret = dev_pm_domain_attach_list(dev, NULL, &priv->pd_list);
> + if (ret < 0)
> + return ret;
> + /*
> + * If all the power domain devices are already turned on, the remote
> + * core is already powered up and running when the kernel booted (e.g.,
> + * started by U-Boot's bootaux command). In this case attach to it.
> + */
> + for (i = 0; i < ret; i++) {
> + if (!dev_pm_genpd_is_on(priv->pd_list->pd_devs[i])) {
> + detached = false;
> + break;
> + }
> + }
> +
> + if (detached)
> + priv->rproc->state = RPROC_DETACHED;
> +
> + return 0;
> }
>
> static int imx_rproc_detect_mode(struct imx_rproc *priv)
> @@ -1146,6 +1162,15 @@ static int imx_rproc_probe(struct platform_device *pdev)
> }
> }
>
> + if (dcfg->method == IMX_RPROC_SCU_API) {
> + pm_runtime_enable(dev);
> + ret = pm_runtime_resume_and_get(dev);
> + if (ret) {
> + dev_err(dev, "pm_runtime get failed: %d\n", ret);
> + goto err_put_clk;
> + }
> + }
> +
> ret = rproc_add(rproc);
> if (ret) {
> dev_err(dev, "rproc_add failed\n");
> @@ -1171,6 +1196,10 @@ static void imx_rproc_remove(struct platform_device *pdev)
> struct rproc *rproc = platform_get_drvdata(pdev);
> struct imx_rproc *priv = rproc->priv;
>
> + if (priv->dcfg->method == IMX_RPROC_SCU_API) {
> + pm_runtime_disable(priv->dev);
> + pm_runtime_put(priv->dev);
> + }
> clk_disable_unprepare(priv->clk);
> rproc_del(rproc);
> imx_rproc_put_scu(rproc);
> --
> 2.39.5
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-07-18 10:45 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-16 19:46 [PATCH v8] remoteproc: imx_rproc: detect and attach to pre-booted remote cores Hiago De Franco
2025-07-17 14:44 ` Mathieu Poirier
2025-07-18 10:44 ` Ulf Hansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).