Thread (19 messages) 19 messages, 5 authors, 2025-06-17

Re: [PATCH v4 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores

From: Bjorn Andersson <andersson@kernel.org>
Date: 2025-06-11 15:36:36
Also in: imx, linux-pm, linux-remoteproc, lkml

On Wed, Jun 04, 2025 at 03:19:52AM +0000, Peng Fan wrote:
quoted
Subject: [PATCH v4 3/3] remoteproc: imx_rproc: detect and attach to
pre-booted remote cores

From: Hiago De Franco <redacted>

When the remote core is started before Linux boots (e.g., by the
bootloader), the driver currently is not able to attach because it only
checks for cores running in different partitions. If the core was kicked
by the bootloader, it is in the same partition as Linux and it is already
up and running.

This adds power mode verification through dev_pm_genpd_is_on(),
enabling the driver to detect when the remote core is already running
and properly attach to it if all the power domain devices are on.

To accomplish this, we need to avoid passing any attach_data or flags
to dev_pm_domain_attach_list(), letting the platform device become a
consumer of the power domain provider. With that the current power
state of the genpds will not change, allowing the detection of the
remote core power state.

We enable and sync the device runtime PM during probe to make sure
the power domains are correctly managed when the core is controlled
by the kernel.

Suggested-by: Ulf Hansson <redacted>
Signed-off-by: Hiago De Franco <redacted>
---
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.
v3: Unchanged.
v2: Dropped unecessary include. Removed the imx_rproc_is_on
function, as suggested.
v1:
---
 drivers/remoteproc/imx_rproc.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/drivers/remoteproc/imx_rproc.c
b/drivers/remoteproc/imx_rproc.c index
627e57a88db2..6f9680142704 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,7 +901,22 @@ 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-
quoted
pd_list);
+	ret = dev_pm_domain_attach_list(dev, NULL, &priv->pd_list);
+	/*
+	 * If all the power domain devices are already turned on, the
remote
+	 * core is already up when the kernel booted (e.g. kicked by
the
+	 * bootloader). 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 ret < 0 ? ret : 0;
 }
@@ -1146,6 +1160,11 @@ static int imx_rproc_probe(struct
platform_device *pdev)
 		}
 	}

+	if (dcfg->method == IMX_RPROC_SCU_API) {
+		pm_runtime_enable(dev);
+		pm_runtime_get_sync(dev);
Need put and disable in imx_rproc_remove.
Note that you also need to pm_runtime_put() if pm_runtime_get_sync()
returns an error. So the suggestion is to use the convenience helper
pm_runtime_resume_and_get() to handle this for you.

Probably a good idea to check the return value regardless.

Regards,
Bjorn
BTW: Has this patchset tested with M4 in a separate partition,
saying M4 image packed in flash.bin?

Regards,
Peng
quoted
+	}
+
 	ret = rproc_add(rproc);
 	if (ret) {
 		dev_err(dev, "rproc_add failed\n");
--
2.39.5
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help