* [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader @ 2025-06-29 17:25 Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 1/3] pmdomain: core: introduce dev_pm_genpd_is_on() Hiago De Franco ` (3 more replies) 0 siblings, 4 replies; 14+ messages in thread From: Hiago De Franco @ 2025-06-29 17:25 UTC (permalink / raw) To: Mathieu Poirier, Ulf Hansson, linux-pm, linux-remoteproc Cc: Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki From: Hiago De Franco <hiago.franco@toradex.com> This patch series depends on Ulf's patches that are currently under review, "pmdomain: Add generic ->sync_state() support to genpd" [1]. Without them, this series is not going to work. For the i.MX8X and i.MX8 family SoCs, currently when the remotecore is started by the bootloader and the M core and A core are in the same partition, the driver is not capable to detect the remote core and report the correct state of it. This patch series implement a new function, dev_pm_genpd_is_on(), which returns the power status of a given power domain (M core power domains IMX_SC_R_M4_0_PID0 and IMX_SC_R_M4_0_MU_1A in this case). If it is already powered on, the driver will attach to it. Finally, the imx_rproc_clk_enable() function was also changed to make it return before dev_clk_get() is called, as it currently generates an SCU fault reset if the remote core is already running and the kernel tries to enable the clock again. These changes are a follow up from a v1 sent to imx_rproc [2] and from a reported regression [3]. [1] https://lore.kernel.org/all/20250523134025.75130-1-ulf.hansson@linaro.org/ [2] https://lore.kernel.org/lkml/20250423155131.101473-1-hiagofranco@gmail.com/ [3] https://lore.kernel.org/lkml/20250404141713.ac2ntcsjsf7epdfa@hiago-nb/ v7: - Added Peng reviewed-by. v6: - https://lore.kernel.org/all/20250626215911.5992-1-hiagofranco@gmail.com/ v5: - https://lore.kernel.org/all/20250617193450.183889-1-hiagofranco@gmail.com/ v4: - https://lore.kernel.org/lkml/20250602131906.25751-1-hiagofranco@gmail.com/ v3: - https://lore.kernel.org/all/20250519171514.61974-1-hiagofranco@gmail.com/ v2: - https://lore.kernel.org/lkml/20250507160056.11876-1-hiagofranco@gmail.com/ v1: - https://lore.kernel.org/lkml/20250505154849.64889-1-hiagofranco@gmail.com/ Hiago De Franco (3): pmdomain: core: introduce dev_pm_genpd_is_on() remoteproc: imx_rproc: skip clock enable when M-core is managed by the SCU remoteproc: imx_rproc: detect and attach to pre-booted remote cores drivers/pmdomain/core.c | 33 +++++++++++++++++++++++++++ drivers/remoteproc/imx_rproc.c | 41 ++++++++++++++++++++++++++++------ include/linux/pm_domain.h | 6 +++++ 3 files changed, 73 insertions(+), 7 deletions(-) -- 2.39.5 ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v7 1/3] pmdomain: core: introduce dev_pm_genpd_is_on() 2025-06-29 17:25 [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Hiago De Franco @ 2025-06-29 17:25 ` Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 2/3] remoteproc: imx_rproc: skip clock enable when M-core is managed by the SCU Hiago De Franco ` (2 subsequent siblings) 3 siblings, 0 replies; 14+ messages in thread From: Hiago De Franco @ 2025-06-29 17:25 UTC (permalink / raw) To: Mathieu Poirier, Ulf Hansson, linux-pm, linux-remoteproc Cc: Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan From: Hiago De Franco <hiago.franco@toradex.com> This helper function returns the current power status of a given generic power domain. As example, remoteproc/imx_rproc.c can now use this function to check the power status of the remote core to properly set "attached" or "offline" modes. Suggested-by: Ulf Hansson <ulf.hansson@linaro.org> Reviewed-by: Bjorn Andersson <andersson@kernel.org> Reviewed-by: Peng Fan <peng.fan@nxp.com> Signed-off-by: Hiago De Franco <hiago.franco@toradex.com> --- v6 -> v7: - Added Peng reviewed-by. v5 -> v6: - Added Bjorn reviewed-by. v4 -> v5: - s/dev_pm_genpd_is_on/dev_pm_genpd_is_on()/ in function description. - Updated function description to be explicit the function reflects the current power status and that this might change after the function returns, especially if the genpd is shared. v3 -> v4: - New patch. --- drivers/pmdomain/core.c | 33 +++++++++++++++++++++++++++++++++ include/linux/pm_domain.h | 6 ++++++ 2 files changed, 39 insertions(+) diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c index ff5c7f2b69ce..2f387e15cb75 100644 --- a/drivers/pmdomain/core.c +++ b/drivers/pmdomain/core.c @@ -758,6 +758,39 @@ int dev_pm_genpd_rpm_always_on(struct device *dev, bool on) } EXPORT_SYMBOL_GPL(dev_pm_genpd_rpm_always_on); +/** + * dev_pm_genpd_is_on() - Get device's current power domain status + * + * @dev: Device to get the current power status + * + * This function checks whether the generic power domain associated with the + * given device is on or not by verifying if genpd_status_on equals + * GENPD_STATE_ON. + * + * Note: this function returns the power status of the genpd at the time of the + * call. The power status may change after due to activity from other devices + * sharing the same genpd. Therefore, this information should not be relied for + * long-term decisions about the device power state. + * + * Return: 'true' if the device's power domain is on, 'false' otherwise. + */ +bool dev_pm_genpd_is_on(struct device *dev) +{ + struct generic_pm_domain *genpd; + bool is_on; + + genpd = dev_to_genpd_safe(dev); + if (!genpd) + return false; + + genpd_lock(genpd); + is_on = genpd_status_on(genpd); + genpd_unlock(genpd); + + return is_on; +} +EXPORT_SYMBOL_GPL(dev_pm_genpd_is_on); + /** * pm_genpd_inc_rejected() - Adjust the rejected/usage counts for an idle-state. * diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index 0b18160901a2..c12580b6579b 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -301,6 +301,7 @@ void dev_pm_genpd_synced_poweroff(struct device *dev); int dev_pm_genpd_set_hwmode(struct device *dev, bool enable); bool dev_pm_genpd_get_hwmode(struct device *dev); int dev_pm_genpd_rpm_always_on(struct device *dev, bool on); +bool dev_pm_genpd_is_on(struct device *dev); extern struct dev_power_governor simple_qos_governor; extern struct dev_power_governor pm_domain_always_on_gov; @@ -393,6 +394,11 @@ static inline int dev_pm_genpd_rpm_always_on(struct device *dev, bool on) return -EOPNOTSUPP; } +static inline bool dev_pm_genpd_is_on(struct device *dev) +{ + return false; +} + #define simple_qos_governor (*(struct dev_power_governor *)(NULL)) #define pm_domain_always_on_gov (*(struct dev_power_governor *)(NULL)) #endif -- 2.39.5 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v7 2/3] remoteproc: imx_rproc: skip clock enable when M-core is managed by the SCU 2025-06-29 17:25 [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 1/3] pmdomain: core: introduce dev_pm_genpd_is_on() Hiago De Franco @ 2025-06-29 17:25 ` Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores Hiago De Franco 2025-07-03 16:45 ` [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Mathieu Poirier 3 siblings, 0 replies; 14+ messages in thread From: Hiago De Franco @ 2025-06-29 17:25 UTC (permalink / raw) To: Mathieu Poirier, Ulf Hansson, linux-pm, linux-remoteproc Cc: Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan From: Hiago De Franco <hiago.franco@toradex.com> For the i.MX8X and i.MX8 family SoCs, when the Cortex-M core is powered up and started by the Cortex-A core using the bootloader (e.g., via the U-Boot bootaux command), both M-core and Linux run within the same SCFW (System Controller Firmware) partition. With that, Linux has permission to control the M-core. But once the M-core is started by the bootloader, the SCFW automatically enables its clock and sets the clock rate. If Linux later attempts to enable the same clock via clk_prepare_enable(), the SCFW returns a 'LOCKED' error, as the clock is already configured by the SCFW. This causes the probe function in imx_rproc.c to fail, leading to the M-core power domain being shut down while the core is still running. This results in a fault from the SCU (System Controller Unit) and triggers a system reset. To address this issue, ignore handling the clk for i.MX8X and i.MX8 M-core, as SCFW already takes care of enabling and configuring the clock. Suggested-by: Peng Fan <peng.fan@nxp.com> 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> --- v6 -> v7: - Added Peng reviewed-by. v5 -> v6: - Commit description improved, as suggested. 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 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores 2025-06-29 17:25 [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 1/3] pmdomain: core: introduce dev_pm_genpd_is_on() Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 2/3] remoteproc: imx_rproc: skip clock enable when M-core is managed by the SCU Hiago De Franco @ 2025-06-29 17:25 ` Hiago De Franco 2025-07-15 15:32 ` Mathieu Poirier 2025-07-03 16:45 ` [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Mathieu Poirier 3 siblings, 1 reply; 14+ messages in thread From: Hiago De Franco @ 2025-06-29 17:25 UTC (permalink / raw) To: Mathieu Poirier, Ulf Hansson, linux-pm, linux-remoteproc Cc: Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, 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 SCFW 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> --- 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 | 37 +++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c index 627e57a88db2..24597b60c5b0 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->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 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 ret < 0 ? ret : 0; } @@ -1146,6 +1160,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 +1194,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] 14+ messages in thread
* Re: [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores 2025-06-29 17:25 ` [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores Hiago De Franco @ 2025-07-15 15:32 ` Mathieu Poirier 2025-07-15 16:03 ` Ulf Hansson 0 siblings, 1 reply; 14+ messages in thread From: Mathieu Poirier @ 2025-07-15 15:32 UTC (permalink / raw) To: Hiago De Franco Cc: Ulf Hansson, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > 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> > --- > 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 | 37 +++++++++++++++++++++++++++++----- > 1 file changed, 32 insertions(+), 5 deletions(-) > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > index 627e57a88db2..24597b60c5b0 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->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 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; > + } > + } I was doing one final review of this work when I noticed the return code for dev_pm_domain_attach_list() is never checked for error. Thanks, Mathieu > + > + if (detached) > + priv->rproc->state = RPROC_DETACHED; > + > return ret < 0 ? ret : 0; > } > > @@ -1146,6 +1160,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 +1194,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] 14+ messages in thread
* Re: [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores 2025-07-15 15:32 ` Mathieu Poirier @ 2025-07-15 16:03 ` Ulf Hansson 2025-07-16 13:25 ` Hiago De Franco 0 siblings, 1 reply; 14+ messages in thread From: Ulf Hansson @ 2025-07-15 16:03 UTC (permalink / raw) To: Mathieu Poirier Cc: Hiago De Franco, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan On Tue, 15 Jul 2025 at 17:32, Mathieu Poirier <mathieu.poirier@linaro.org> wrote: > > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > 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> > > --- > > 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 | 37 +++++++++++++++++++++++++++++----- > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > index 627e57a88db2..24597b60c5b0 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->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 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; > > + } > > + } > > I was doing one final review of this work when I noticed the return code for > dev_pm_domain_attach_list() is never checked for error. The for loop covers the error condition correctly, I think. It's only when ret >=1 when the loop should be started - and ret is propagated to the caller a few lines below. > > Thanks, > Mathieu > Kind regards Uffe > > + > > + if (detached) > > + priv->rproc->state = RPROC_DETACHED; > > + > > return ret < 0 ? ret : 0; > > } > > > > @@ -1146,6 +1160,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 +1194,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] 14+ messages in thread
* Re: [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores 2025-07-15 16:03 ` Ulf Hansson @ 2025-07-16 13:25 ` Hiago De Franco 2025-07-16 16:50 ` Mathieu Poirier 0 siblings, 1 reply; 14+ messages in thread From: Hiago De Franco @ 2025-07-16 13:25 UTC (permalink / raw) To: Mathieu Poirier, Ulf Hansson Cc: linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan Hi Mathieu, Ulf, On Tue, Jul 15, 2025 at 09:32:44AM -0600, Mathieu Poirier wrote: > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > 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> > > --- > > 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 | 37 +++++++++++++++++++++++++++++----- > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > index 627e57a88db2..24597b60c5b0 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->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 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; > > + } > > + } > > I was doing one final review of this work when I noticed the return code for > dev_pm_domain_attach_list() is never checked for error. As Ulf pointed out, the 'return' a few lines below will return the negative value to the caller of 'imx_rproc_attach_pd', which ultimately will fail 'imx_rproc_detect_mode' and fail the probe of imx_rproc. Please notice that even tough 'dev_pm_domain_attach_list' fails, the rproc->state will still be set as RPROC_DETACHED because we are starting 'detached' as true, but I am not seeing this as an issue because as mentioned above the probe will fail anyway. Please let me know if you see this as an issue. > > Thanks, > Mathieu > > > + > > + if (detached) > > + priv->rproc->state = RPROC_DETACHED; > > + > > return ret < 0 ? ret : 0; > > } > > > > @@ -1146,6 +1160,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 +1194,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 > > On Tue, Jul 15, 2025 at 06:03:44PM +0200, Ulf Hansson wrote: > On Tue, 15 Jul 2025 at 17:32, Mathieu Poirier > <mathieu.poirier@linaro.org> wrote: > > > > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > > 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> > > > --- > > > 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 | 37 +++++++++++++++++++++++++++++----- > > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > > index 627e57a88db2..24597b60c5b0 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->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 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; > > > + } > > > + } > > > > I was doing one final review of this work when I noticed the return code for > > dev_pm_domain_attach_list() is never checked for error. > > The for loop covers the error condition correctly, I think. It's only > when ret >=1 when the loop should be started - and ret is propagated > to the caller a few lines below. > > > > > Thanks, > > Mathieu > > > > Kind regards > Uffe > > > > + > > > + if (detached) > > > + priv->rproc->state = RPROC_DETACHED; > > > + > > > return ret < 0 ? ret : 0; > > > } > > > > > > @@ -1146,6 +1160,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 +1194,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 > > > Best Regards, Hiago. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores 2025-07-16 13:25 ` Hiago De Franco @ 2025-07-16 16:50 ` Mathieu Poirier 2025-07-16 17:23 ` Hiago De Franco 0 siblings, 1 reply; 14+ messages in thread From: Mathieu Poirier @ 2025-07-16 16:50 UTC (permalink / raw) To: Hiago De Franco Cc: Ulf Hansson, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan On Wed, Jul 16, 2025 at 10:25:52AM -0300, Hiago De Franco wrote: > Hi Mathieu, Ulf, > > On Tue, Jul 15, 2025 at 09:32:44AM -0600, Mathieu Poirier wrote: > > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > > 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> > > > --- > > > 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 | 37 +++++++++++++++++++++++++++++----- > > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > > index 627e57a88db2..24597b60c5b0 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->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 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; > > > + } > > > + } > > > > I was doing one final review of this work when I noticed the return code for > > dev_pm_domain_attach_list() is never checked for error. > > As Ulf pointed out, the 'return' a few lines below will return the > negative value to the caller of 'imx_rproc_attach_pd', which ultimately > will fail 'imx_rproc_detect_mode' and fail the probe of imx_rproc. > > Please notice that even tough 'dev_pm_domain_attach_list' fails, the > rproc->state will still be set as RPROC_DETACHED because we are starting > 'detached' as true, but I am not seeing this as an issue because as > mentioned above the probe will fail anyway. Please let me know if you > see this as an issue. Two things to consider here: (1) It is only a matter of time before someone with a cleaver coccinelle script sends me a patch that adds the missing error check. (2) I think that @rproc->state being changed on error conditions is a bug waiting to happen. This kind of implicit error handling is difficult to maintain and even more difficult for people to make enhancements to the driver. Adding a simple error check will make sure neither of the above will happen. It is a simple change and we are at rc6 - this work can still go in the merge window. > > > > > Thanks, > > Mathieu > > > > > + > > > + if (detached) > > > + priv->rproc->state = RPROC_DETACHED; > > > + > > > return ret < 0 ? ret : 0; > > > } > > > > > > @@ -1146,6 +1160,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 +1194,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 > > > > > On Tue, Jul 15, 2025 at 06:03:44PM +0200, Ulf Hansson wrote: > > On Tue, 15 Jul 2025 at 17:32, Mathieu Poirier > > <mathieu.poirier@linaro.org> wrote: > > > > > > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > > > 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> > > > > --- > > > > 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 | 37 +++++++++++++++++++++++++++++----- > > > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > > > index 627e57a88db2..24597b60c5b0 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->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 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; > > > > + } > > > > + } > > > > > > I was doing one final review of this work when I noticed the return code for > > > dev_pm_domain_attach_list() is never checked for error. > > > > The for loop covers the error condition correctly, I think. It's only > > when ret >=1 when the loop should be started - and ret is propagated > > to the caller a few lines below. > > > > > > > > Thanks, > > > Mathieu > > > > > > > Kind regards > > Uffe > > > > > > + > > > > + if (detached) > > > > + priv->rproc->state = RPROC_DETACHED; > > > > + > > > > return ret < 0 ? ret : 0; > > > > } > > > > > > > > @@ -1146,6 +1160,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 +1194,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 > > > > > > Best Regards, > > Hiago. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores 2025-07-16 16:50 ` Mathieu Poirier @ 2025-07-16 17:23 ` Hiago De Franco 2025-07-16 18:56 ` Ulf Hansson 0 siblings, 1 reply; 14+ messages in thread From: Hiago De Franco @ 2025-07-16 17:23 UTC (permalink / raw) To: Mathieu Poirier Cc: Ulf Hansson, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan On Wed, Jul 16, 2025 at 10:50:08AM -0600, Mathieu Poirier wrote: > On Wed, Jul 16, 2025 at 10:25:52AM -0300, Hiago De Franco wrote: > > Hi Mathieu, Ulf, > > > > On Tue, Jul 15, 2025 at 09:32:44AM -0600, Mathieu Poirier wrote: > > > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > > > 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> > > > > --- > > > > 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 | 37 +++++++++++++++++++++++++++++----- > > > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > > > index 627e57a88db2..24597b60c5b0 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->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 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; > > > > + } > > > > + } > > > > > > I was doing one final review of this work when I noticed the return code for > > > dev_pm_domain_attach_list() is never checked for error. > > > > As Ulf pointed out, the 'return' a few lines below will return the > > negative value to the caller of 'imx_rproc_attach_pd', which ultimately > > will fail 'imx_rproc_detect_mode' and fail the probe of imx_rproc. > > > > Please notice that even tough 'dev_pm_domain_attach_list' fails, the > > rproc->state will still be set as RPROC_DETACHED because we are starting > > 'detached' as true, but I am not seeing this as an issue because as > > mentioned above the probe will fail anyway. Please let me know if you > > see this as an issue. > > Two things to consider here: > > (1) It is only a matter of time before someone with a cleaver coccinelle script > sends me a patch that adds the missing error check. > > (2) I think that @rproc->state being changed on error conditions is a bug > waiting to happen. This kind of implicit error handling is difficult to > maintain and even more difficult for people to make enhancements to the driver. > > Adding a simple error check will make sure neither of the above will happen. It > is a simple change and we are at rc6 - this work can still go in the merge > window. Sure, I can submit a new revision with this error check. Sorry I did not see this before, I only had a close look at this '->state' now that you asked on the previous email. Thanks, Hiago. > > > > > > > > > Thanks, > > > Mathieu > > > > > > > + > > > > + if (detached) > > > > + priv->rproc->state = RPROC_DETACHED; > > > > + > > > > return ret < 0 ? ret : 0; > > > > } > > > > > > > > @@ -1146,6 +1160,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 +1194,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 > > > > > > > > On Tue, Jul 15, 2025 at 06:03:44PM +0200, Ulf Hansson wrote: > > > On Tue, 15 Jul 2025 at 17:32, Mathieu Poirier > > > <mathieu.poirier@linaro.org> wrote: > > > > > > > > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > > > > 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> > > > > > --- > > > > > 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 | 37 +++++++++++++++++++++++++++++----- > > > > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > > > > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > > > > index 627e57a88db2..24597b60c5b0 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->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 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; > > > > > + } > > > > > + } > > > > > > > > I was doing one final review of this work when I noticed the return code for > > > > dev_pm_domain_attach_list() is never checked for error. > > > > > > The for loop covers the error condition correctly, I think. It's only > > > when ret >=1 when the loop should be started - and ret is propagated > > > to the caller a few lines below. > > > > > > > > > > > Thanks, > > > > Mathieu > > > > > > > > > > Kind regards > > > Uffe > > > > > > > > + > > > > > + if (detached) > > > > > + priv->rproc->state = RPROC_DETACHED; > > > > > + > > > > > return ret < 0 ? ret : 0; > > > > > } > > > > > > > > > > @@ -1146,6 +1160,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 +1194,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 > > > > > > > > > Best Regards, > > > > Hiago. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores 2025-07-16 17:23 ` Hiago De Franco @ 2025-07-16 18:56 ` Ulf Hansson 2025-07-16 19:50 ` Hiago De Franco 0 siblings, 1 reply; 14+ messages in thread From: Ulf Hansson @ 2025-07-16 18:56 UTC (permalink / raw) To: Hiago De Franco Cc: Mathieu Poirier, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan On Wed, 16 Jul 2025 at 19:23, Hiago De Franco <hiagofranco@gmail.com> wrote: > > On Wed, Jul 16, 2025 at 10:50:08AM -0600, Mathieu Poirier wrote: > > On Wed, Jul 16, 2025 at 10:25:52AM -0300, Hiago De Franco wrote: > > > Hi Mathieu, Ulf, > > > > > > On Tue, Jul 15, 2025 at 09:32:44AM -0600, Mathieu Poirier wrote: > > > > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > > > > 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> > > > > > --- > > > > > 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 | 37 +++++++++++++++++++++++++++++----- > > > > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > > > > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > > > > index 627e57a88db2..24597b60c5b0 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->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 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; > > > > > + } > > > > > + } > > > > > > > > I was doing one final review of this work when I noticed the return code for > > > > dev_pm_domain_attach_list() is never checked for error. > > > > > > As Ulf pointed out, the 'return' a few lines below will return the > > > negative value to the caller of 'imx_rproc_attach_pd', which ultimately > > > will fail 'imx_rproc_detect_mode' and fail the probe of imx_rproc. > > > > > > Please notice that even tough 'dev_pm_domain_attach_list' fails, the > > > rproc->state will still be set as RPROC_DETACHED because we are starting > > > 'detached' as true, but I am not seeing this as an issue because as > > > mentioned above the probe will fail anyway. Please let me know if you > > > see this as an issue. > > > > Two things to consider here: > > > > (1) It is only a matter of time before someone with a cleaver coccinelle script > > sends me a patch that adds the missing error check. > > > > (2) I think that @rproc->state being changed on error conditions is a bug > > waiting to happen. This kind of implicit error handling is difficult to > > maintain and even more difficult for people to make enhancements to the driver. > > > > Adding a simple error check will make sure neither of the above will happen. It > > is a simple change and we are at rc6 - this work can still go in the merge > > window. > > Sure, I can submit a new revision with this error check. Sorry I did not > see this before, I only had a close look at this '->state' now that you > asked on the previous email. Alright. To avoid having you to resend patch1 and patch2 I have applied them on my next branch and added Mathieu's ack for patch2. Note that my vacation is around the corner, so if you want patch3 for v6.17 you better be quick. :-) [...] Thanks and kind regards Uffe ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores 2025-07-16 18:56 ` Ulf Hansson @ 2025-07-16 19:50 ` Hiago De Franco 0 siblings, 0 replies; 14+ messages in thread From: Hiago De Franco @ 2025-07-16 19:50 UTC (permalink / raw) To: Ulf Hansson Cc: Mathieu Poirier, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki, Peng Fan On Wed, Jul 16, 2025 at 08:56:37PM +0200, Ulf Hansson wrote: > On Wed, 16 Jul 2025 at 19:23, Hiago De Franco <hiagofranco@gmail.com> wrote: > > > > On Wed, Jul 16, 2025 at 10:50:08AM -0600, Mathieu Poirier wrote: > > > On Wed, Jul 16, 2025 at 10:25:52AM -0300, Hiago De Franco wrote: > > > > Hi Mathieu, Ulf, > > > > > > > > On Tue, Jul 15, 2025 at 09:32:44AM -0600, Mathieu Poirier wrote: > > > > > On Sun, Jun 29, 2025 at 02:25:12PM -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 SCFW > > > > > > 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> > > > > > > --- > > > > > > 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 | 37 +++++++++++++++++++++++++++++----- > > > > > > 1 file changed, 32 insertions(+), 5 deletions(-) > > > > > > > > > > > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > > > > > > index 627e57a88db2..24597b60c5b0 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->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 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; > > > > > > + } > > > > > > + } > > > > > > > > > > I was doing one final review of this work when I noticed the return code for > > > > > dev_pm_domain_attach_list() is never checked for error. > > > > > > > > As Ulf pointed out, the 'return' a few lines below will return the > > > > negative value to the caller of 'imx_rproc_attach_pd', which ultimately > > > > will fail 'imx_rproc_detect_mode' and fail the probe of imx_rproc. > > > > > > > > Please notice that even tough 'dev_pm_domain_attach_list' fails, the > > > > rproc->state will still be set as RPROC_DETACHED because we are starting > > > > 'detached' as true, but I am not seeing this as an issue because as > > > > mentioned above the probe will fail anyway. Please let me know if you > > > > see this as an issue. > > > > > > Two things to consider here: > > > > > > (1) It is only a matter of time before someone with a cleaver coccinelle script > > > sends me a patch that adds the missing error check. > > > > > > (2) I think that @rproc->state being changed on error conditions is a bug > > > waiting to happen. This kind of implicit error handling is difficult to > > > maintain and even more difficult for people to make enhancements to the driver. > > > > > > Adding a simple error check will make sure neither of the above will happen. It > > > is a simple change and we are at rc6 - this work can still go in the merge > > > window. > > > > Sure, I can submit a new revision with this error check. Sorry I did not > > see this before, I only had a close look at this '->state' now that you > > asked on the previous email. > > Alright. To avoid having you to resend patch1 and patch2 I have > applied them on my next branch and added Mathieu's ack for patch2. > > Note that my vacation is around the corner, so if you want patch3 for > v6.17 you better be quick. :-) Thanks Ulf, as requested I resend only patch 3. https://lore.kernel.org/all/20250716194638.113115-1-hiagofranco@gmail.com/ Have a nice vacation =) Best Regards, Hiago. > > [...] > > Thanks and kind regards > Uffe ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader 2025-06-29 17:25 [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Hiago De Franco ` (2 preceding siblings ...) 2025-06-29 17:25 ` [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores Hiago De Franco @ 2025-07-03 16:45 ` Mathieu Poirier 2025-07-15 11:49 ` Ulf Hansson 3 siblings, 1 reply; 14+ messages in thread From: Mathieu Poirier @ 2025-07-03 16:45 UTC (permalink / raw) To: Hiago De Franco Cc: Ulf Hansson, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki Hi Hiago, Many thanks for re-working the changelog and comments in this patchset, things are much clearer now. Thanks, Mathieu On Sun, Jun 29, 2025 at 02:25:09PM -0300, Hiago De Franco wrote: > From: Hiago De Franco <hiago.franco@toradex.com> > > This patch series depends on Ulf's patches that are currently under > review, "pmdomain: Add generic ->sync_state() support to genpd" [1]. > Without them, this series is not going to work. > > For the i.MX8X and i.MX8 family SoCs, currently when the remotecore is > started by the bootloader and the M core and A core are in the same > partition, the driver is not capable to detect the remote core and > report the correct state of it. > > This patch series implement a new function, dev_pm_genpd_is_on(), which > returns the power status of a given power domain (M core power domains > IMX_SC_R_M4_0_PID0 and IMX_SC_R_M4_0_MU_1A in this case). If it is > already powered on, the driver will attach to it. > > Finally, the imx_rproc_clk_enable() function was also changed to make it > return before dev_clk_get() is called, as it currently generates an SCU > fault reset if the remote core is already running and the kernel tries > to enable the clock again. These changes are a follow up from a v1 sent > to imx_rproc [2] and from a reported regression [3]. > > [1] https://lore.kernel.org/all/20250523134025.75130-1-ulf.hansson@linaro.org/ > [2] https://lore.kernel.org/lkml/20250423155131.101473-1-hiagofranco@gmail.com/ > [3] https://lore.kernel.org/lkml/20250404141713.ac2ntcsjsf7epdfa@hiago-nb/ > > v7: > - Added Peng reviewed-by. > v6: > - https://lore.kernel.org/all/20250626215911.5992-1-hiagofranco@gmail.com/ > v5: > - https://lore.kernel.org/all/20250617193450.183889-1-hiagofranco@gmail.com/ > v4: > - https://lore.kernel.org/lkml/20250602131906.25751-1-hiagofranco@gmail.com/ > v3: > - https://lore.kernel.org/all/20250519171514.61974-1-hiagofranco@gmail.com/ > v2: > - https://lore.kernel.org/lkml/20250507160056.11876-1-hiagofranco@gmail.com/ > v1: > - https://lore.kernel.org/lkml/20250505154849.64889-1-hiagofranco@gmail.com/ > > Hiago De Franco (3): > pmdomain: core: introduce dev_pm_genpd_is_on() > remoteproc: imx_rproc: skip clock enable when M-core is managed by the > SCU > remoteproc: imx_rproc: detect and attach to pre-booted remote cores > > drivers/pmdomain/core.c | 33 +++++++++++++++++++++++++++ > drivers/remoteproc/imx_rproc.c | 41 ++++++++++++++++++++++++++++------ > include/linux/pm_domain.h | 6 +++++ > 3 files changed, 73 insertions(+), 7 deletions(-) > > -- > 2.39.5 > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader 2025-07-03 16:45 ` [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Mathieu Poirier @ 2025-07-15 11:49 ` Ulf Hansson 2025-07-15 15:37 ` Mathieu Poirier 0 siblings, 1 reply; 14+ messages in thread From: Ulf Hansson @ 2025-07-15 11:49 UTC (permalink / raw) To: Mathieu Poirier Cc: Hiago De Franco, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki Hi Mathieu, On Thu, 3 Jul 2025 at 18:45, Mathieu Poirier <mathieu.poirier@linaro.org> wrote: > > Hi Hiago, > > Many thanks for re-working the changelog and comments in this patchset, things > are much clearer now. > > Thanks, > Mathieu > > On Sun, Jun 29, 2025 at 02:25:09PM -0300, Hiago De Franco wrote: > > From: Hiago De Franco <hiago.franco@toradex.com> > > > > This patch series depends on Ulf's patches that are currently under > > review, "pmdomain: Add generic ->sync_state() support to genpd" [1]. > > Without them, this series is not going to work. The series above have been queued for v6.17 in my pmdomain tree. Do I have your ack to pick $subject series via my pmdomain tree for v6.17 too or do you think it's better to postpone to v6.18? Kind regards Uffe > > > > For the i.MX8X and i.MX8 family SoCs, currently when the remotecore is > > started by the bootloader and the M core and A core are in the same > > partition, the driver is not capable to detect the remote core and > > report the correct state of it. > > > > This patch series implement a new function, dev_pm_genpd_is_on(), which > > returns the power status of a given power domain (M core power domains > > IMX_SC_R_M4_0_PID0 and IMX_SC_R_M4_0_MU_1A in this case). If it is > > already powered on, the driver will attach to it. > > > > Finally, the imx_rproc_clk_enable() function was also changed to make it > > return before dev_clk_get() is called, as it currently generates an SCU > > fault reset if the remote core is already running and the kernel tries > > to enable the clock again. These changes are a follow up from a v1 sent > > to imx_rproc [2] and from a reported regression [3]. > > > > [1] https://lore.kernel.org/all/20250523134025.75130-1-ulf.hansson@linaro.org/ > > [2] https://lore.kernel.org/lkml/20250423155131.101473-1-hiagofranco@gmail.com/ > > [3] https://lore.kernel.org/lkml/20250404141713.ac2ntcsjsf7epdfa@hiago-nb/ > > > > v7: > > - Added Peng reviewed-by. > > v6: > > - https://lore.kernel.org/all/20250626215911.5992-1-hiagofranco@gmail.com/ > > v5: > > - https://lore.kernel.org/all/20250617193450.183889-1-hiagofranco@gmail.com/ > > v4: > > - https://lore.kernel.org/lkml/20250602131906.25751-1-hiagofranco@gmail.com/ > > v3: > > - https://lore.kernel.org/all/20250519171514.61974-1-hiagofranco@gmail.com/ > > v2: > > - https://lore.kernel.org/lkml/20250507160056.11876-1-hiagofranco@gmail.com/ > > v1: > > - https://lore.kernel.org/lkml/20250505154849.64889-1-hiagofranco@gmail.com/ > > > > Hiago De Franco (3): > > pmdomain: core: introduce dev_pm_genpd_is_on() > > remoteproc: imx_rproc: skip clock enable when M-core is managed by the > > SCU > > remoteproc: imx_rproc: detect and attach to pre-booted remote cores > > > > drivers/pmdomain/core.c | 33 +++++++++++++++++++++++++++ > > drivers/remoteproc/imx_rproc.c | 41 ++++++++++++++++++++++++++++------ > > include/linux/pm_domain.h | 6 +++++ > > 3 files changed, 73 insertions(+), 7 deletions(-) > > > > -- > > 2.39.5 > > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader 2025-07-15 11:49 ` Ulf Hansson @ 2025-07-15 15:37 ` Mathieu Poirier 0 siblings, 0 replies; 14+ messages in thread From: Mathieu Poirier @ 2025-07-15 15:37 UTC (permalink / raw) To: Ulf Hansson Cc: Hiago De Franco, linux-pm, linux-remoteproc, Shawn Guo, Sascha Hauer, Bjorn Andersson, Hiago De Franco, imx, linux-arm-kernel, linux-kernel, Peng Fan, daniel.baluta, iuliana.prodan, Rafael J . Wysocki Hi, On Tue, Jul 15, 2025 at 01:49:42PM +0200, Ulf Hansson wrote: > Hi Mathieu, > > On Thu, 3 Jul 2025 at 18:45, Mathieu Poirier <mathieu.poirier@linaro.org> wrote: > > > > Hi Hiago, > > > > Many thanks for re-working the changelog and comments in this patchset, things > > are much clearer now. > > > > Thanks, > > Mathieu > > > > On Sun, Jun 29, 2025 at 02:25:09PM -0300, Hiago De Franco wrote: > > > From: Hiago De Franco <hiago.franco@toradex.com> > > > > > > This patch series depends on Ulf's patches that are currently under > > > review, "pmdomain: Add generic ->sync_state() support to genpd" [1]. > > > Without them, this series is not going to work. > > The series above have been queued for v6.17 in my pmdomain tree. > > Do I have your ack to pick $subject series via my pmdomain tree for > v6.17 too or do you think it's better to postpone to v6.18? > I may have spotted an error condition that is not handled properly in 3/3 of this series. Given that we are already at rc6, it is probably better to way for the next cycle. Thanks for sheperding this work. > Kind regards > Uffe > > > > > > > For the i.MX8X and i.MX8 family SoCs, currently when the remotecore is > > > started by the bootloader and the M core and A core are in the same > > > partition, the driver is not capable to detect the remote core and > > > report the correct state of it. > > > > > > This patch series implement a new function, dev_pm_genpd_is_on(), which > > > returns the power status of a given power domain (M core power domains > > > IMX_SC_R_M4_0_PID0 and IMX_SC_R_M4_0_MU_1A in this case). If it is > > > already powered on, the driver will attach to it. > > > > > > Finally, the imx_rproc_clk_enable() function was also changed to make it > > > return before dev_clk_get() is called, as it currently generates an SCU > > > fault reset if the remote core is already running and the kernel tries > > > to enable the clock again. These changes are a follow up from a v1 sent > > > to imx_rproc [2] and from a reported regression [3]. > > > > > > [1] https://lore.kernel.org/all/20250523134025.75130-1-ulf.hansson@linaro.org/ > > > [2] https://lore.kernel.org/lkml/20250423155131.101473-1-hiagofranco@gmail.com/ > > > [3] https://lore.kernel.org/lkml/20250404141713.ac2ntcsjsf7epdfa@hiago-nb/ > > > > > > v7: > > > - Added Peng reviewed-by. > > > v6: > > > - https://lore.kernel.org/all/20250626215911.5992-1-hiagofranco@gmail.com/ > > > v5: > > > - https://lore.kernel.org/all/20250617193450.183889-1-hiagofranco@gmail.com/ > > > v4: > > > - https://lore.kernel.org/lkml/20250602131906.25751-1-hiagofranco@gmail.com/ > > > v3: > > > - https://lore.kernel.org/all/20250519171514.61974-1-hiagofranco@gmail.com/ > > > v2: > > > - https://lore.kernel.org/lkml/20250507160056.11876-1-hiagofranco@gmail.com/ > > > v1: > > > - https://lore.kernel.org/lkml/20250505154849.64889-1-hiagofranco@gmail.com/ > > > > > > Hiago De Franco (3): > > > pmdomain: core: introduce dev_pm_genpd_is_on() > > > remoteproc: imx_rproc: skip clock enable when M-core is managed by the > > > SCU > > > remoteproc: imx_rproc: detect and attach to pre-booted remote cores > > > > > > drivers/pmdomain/core.c | 33 +++++++++++++++++++++++++++ > > > drivers/remoteproc/imx_rproc.c | 41 ++++++++++++++++++++++++++++------ > > > include/linux/pm_domain.h | 6 +++++ > > > 3 files changed, 73 insertions(+), 7 deletions(-) > > > > > > -- > > > 2.39.5 > > > ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-07-16 19:50 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-29 17:25 [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 1/3] pmdomain: core: introduce dev_pm_genpd_is_on() Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 2/3] remoteproc: imx_rproc: skip clock enable when M-core is managed by the SCU Hiago De Franco 2025-06-29 17:25 ` [PATCH v7 3/3] remoteproc: imx_rproc: detect and attach to pre-booted remote cores Hiago De Franco 2025-07-15 15:32 ` Mathieu Poirier 2025-07-15 16:03 ` Ulf Hansson 2025-07-16 13:25 ` Hiago De Franco 2025-07-16 16:50 ` Mathieu Poirier 2025-07-16 17:23 ` Hiago De Franco 2025-07-16 18:56 ` Ulf Hansson 2025-07-16 19:50 ` Hiago De Franco 2025-07-03 16:45 ` [PATCH v7 0/3] remoteproc: imx_rproc: allow attaching to running core kicked by the bootloader Mathieu Poirier 2025-07-15 11:49 ` Ulf Hansson 2025-07-15 15:37 ` Mathieu Poirier
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).