* [RESEND PATCH v3 0/2] remoteproc: get rproc devices for clusters @ 2023-10-14 23:15 Tanmay Shah 2023-10-14 23:15 ` [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work " Tanmay Shah 2023-10-14 23:15 ` [RESEND PATCH v3 2/2] remoteproc: enhance rproc_put() " Tanmay Shah 0 siblings, 2 replies; 7+ messages in thread From: Tanmay Shah @ 2023-10-14 23:15 UTC (permalink / raw) To: andersson, mathieu.poirier; +Cc: linux-remoteproc, linux-kernel, Tanmay Shah This series extends original patch and makes rproc_put() work for clusters along with rprog_get_by_phandle(). Changes in v3: - remove module_put call that was introduced in the patch by mistake - remove redundant check in rproc_put - Add inline comments in rproc_put that explains functionality Changes in v2: - Introduce patch to fix rproc_put as per modified rproc_get_by_phandle v1 is here: https://lore.kernel.org/all/20221214221643.1286585-1-mathieu.poirier@linaro.org/ Mathieu Poirier (1): remoteproc: Make rproc_get_by_phandle() work for clusters Tanmay Shah (1): remoteproc: enhance rproc_put() for clusters drivers/remoteproc/remoteproc_core.c | 45 ++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) base-commit: a7d272979d3a89b117ca2c547dc8a465c4f28635 -- 2.25.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work for clusters 2023-10-14 23:15 [RESEND PATCH v3 0/2] remoteproc: get rproc devices for clusters Tanmay Shah @ 2023-10-14 23:15 ` Tanmay Shah 2023-11-14 15:22 ` Bjorn Andersson 2023-10-14 23:15 ` [RESEND PATCH v3 2/2] remoteproc: enhance rproc_put() " Tanmay Shah 1 sibling, 1 reply; 7+ messages in thread From: Tanmay Shah @ 2023-10-14 23:15 UTC (permalink / raw) To: andersson, mathieu.poirier Cc: linux-remoteproc, linux-kernel, Ben Levinsky, Ben Levinsky From: Mathieu Poirier <mathieu.poirier@linaro.org> Multi-cluster remoteproc designs typically have the following DT declaration: remoteproc_cluster { compatible = "soc,remoteproc-cluster"; core0: core0 { compatible = "soc,remoteproc-core" memory-region; sram; }; core1: core1 { compatible = "soc,remoteproc-core" memory-region; sram; } }; A driver exists for the cluster rather than the individual cores themselves so that operation mode and HW specific configurations applicable to the cluster can be made. Because the driver exists at the cluster level and not the individual core level, function rproc_get_by_phandle() fails to return the remoteproc associated with the phandled it is called for. This patch enhances rproc_get_by_phandle() by looking for the cluster's driver when the driver for the immediate remoteproc's parent is not found. Reported-by: Ben Levinsky <ben.levinsky@xilinx.com> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Tested-by: Ben Levinsky <ben.levinsky@amd.com> --- drivers/remoteproc/remoteproc_core.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 695cce218e8c..3a8191803885 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -33,6 +33,7 @@ #include <linux/idr.h> #include <linux/elf.h> #include <linux/crc32.h> +#include <linux/of_platform.h> #include <linux/of_reserved_mem.h> #include <linux/virtio_ids.h> #include <linux/virtio_ring.h> @@ -2111,7 +2112,9 @@ EXPORT_SYMBOL(rproc_detach); #ifdef CONFIG_OF struct rproc *rproc_get_by_phandle(phandle phandle) { + struct platform_device *cluster_pdev; struct rproc *rproc = NULL, *r; + struct device_driver *driver; struct device_node *np; np = of_find_node_by_phandle(phandle); @@ -2122,7 +2125,30 @@ struct rproc *rproc_get_by_phandle(phandle phandle) list_for_each_entry_rcu(r, &rproc_list, node) { if (r->dev.parent && device_match_of_node(r->dev.parent, np)) { /* prevent underlying implementation from being removed */ - if (!try_module_get(r->dev.parent->driver->owner)) { + + /* + * If the remoteproc's parent has a driver, the + * remoteproc is not part of a cluster and we can use + * that driver. + */ + driver = r->dev.parent->driver; + + /* + * If the remoteproc's parent does not have a driver, + * look for the driver associated with the cluster. + */ + if (!driver) { + cluster_pdev = of_find_device_by_node(np->parent); + if (!cluster_pdev) { + dev_err(&r->dev, "can't get parent\n"); + break; + } + + driver = cluster_pdev->dev.driver; + put_device(&cluster_pdev->dev); + } + + if (!try_module_get(driver->owner)) { dev_err(&r->dev, "can't get owner\n"); break; } -- 2.25.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work for clusters 2023-10-14 23:15 ` [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work " Tanmay Shah @ 2023-11-14 15:22 ` Bjorn Andersson 2023-11-14 16:23 ` Mathieu Poirier 0 siblings, 1 reply; 7+ messages in thread From: Bjorn Andersson @ 2023-11-14 15:22 UTC (permalink / raw) To: Tanmay Shah Cc: mathieu.poirier, linux-remoteproc, linux-kernel, Ben Levinsky, Ben Levinsky On Sat, Oct 14, 2023 at 04:15:47PM -0700, Tanmay Shah wrote: > From: Mathieu Poirier <mathieu.poirier@linaro.org> > > Multi-cluster remoteproc designs typically have the following DT > declaration: > > remoteproc_cluster { > compatible = "soc,remoteproc-cluster"; > > core0: core0 { > compatible = "soc,remoteproc-core" > memory-region; > sram; > }; > > core1: core1 { > compatible = "soc,remoteproc-core" > memory-region; > sram; > } > }; > > A driver exists for the cluster rather than the individual cores > themselves so that operation mode and HW specific configurations > applicable to the cluster can be made. > > Because the driver exists at the cluster level and not the individual > core level, function rproc_get_by_phandle() fails to return the > remoteproc associated with the phandled it is called for. > > This patch enhances rproc_get_by_phandle() by looking for the cluster's > driver when the driver for the immediate remoteproc's parent is not > found. > > Reported-by: Ben Levinsky <ben.levinsky@xilinx.com> > Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> > Tested-by: Ben Levinsky <ben.levinsky@amd.com> > --- > drivers/remoteproc/remoteproc_core.c | 28 +++++++++++++++++++++++++++- > 1 file changed, 27 insertions(+), 1 deletion(-) > > diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c > index 695cce218e8c..3a8191803885 100644 > --- a/drivers/remoteproc/remoteproc_core.c > +++ b/drivers/remoteproc/remoteproc_core.c > @@ -33,6 +33,7 @@ > #include <linux/idr.h> > #include <linux/elf.h> > #include <linux/crc32.h> > +#include <linux/of_platform.h> > #include <linux/of_reserved_mem.h> > #include <linux/virtio_ids.h> > #include <linux/virtio_ring.h> > @@ -2111,7 +2112,9 @@ EXPORT_SYMBOL(rproc_detach); > #ifdef CONFIG_OF > struct rproc *rproc_get_by_phandle(phandle phandle) > { > + struct platform_device *cluster_pdev; > struct rproc *rproc = NULL, *r; > + struct device_driver *driver; > struct device_node *np; > > np = of_find_node_by_phandle(phandle); > @@ -2122,7 +2125,30 @@ struct rproc *rproc_get_by_phandle(phandle phandle) > list_for_each_entry_rcu(r, &rproc_list, node) { > if (r->dev.parent && device_match_of_node(r->dev.parent, np)) { > /* prevent underlying implementation from being removed */ > - if (!try_module_get(r->dev.parent->driver->owner)) { > + > + /* > + * If the remoteproc's parent has a driver, the > + * remoteproc is not part of a cluster and we can use > + * that driver. > + */ > + driver = r->dev.parent->driver; > + > + /* > + * If the remoteproc's parent does not have a driver, > + * look for the driver associated with the cluster. > + */ > + if (!driver) { > + cluster_pdev = of_find_device_by_node(np->parent); Both the Ti and Xilinx drivers are using of_platform_populate(), so their r->dev.parent should have a parent reference to the cluster device. Unless I'm reading the code wrong, I think we should follow that pointer, rather than taking the detour in the DeviceTree data. Regards, Bjorn > + if (!cluster_pdev) { > + dev_err(&r->dev, "can't get parent\n"); > + break; > + } > + > + driver = cluster_pdev->dev.driver; > + put_device(&cluster_pdev->dev); > + } > + > + if (!try_module_get(driver->owner)) { > dev_err(&r->dev, "can't get owner\n"); > break; > } > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work for clusters 2023-11-14 15:22 ` Bjorn Andersson @ 2023-11-14 16:23 ` Mathieu Poirier 2023-12-20 14:47 ` Tanmay Shah 0 siblings, 1 reply; 7+ messages in thread From: Mathieu Poirier @ 2023-11-14 16:23 UTC (permalink / raw) To: Bjorn Andersson Cc: Tanmay Shah, linux-remoteproc, linux-kernel, Ben Levinsky, Ben Levinsky On Tue, 14 Nov 2023 at 08:22, Bjorn Andersson <andersson@kernel.org> wrote: > > On Sat, Oct 14, 2023 at 04:15:47PM -0700, Tanmay Shah wrote: > > From: Mathieu Poirier <mathieu.poirier@linaro.org> > > > > Multi-cluster remoteproc designs typically have the following DT > > declaration: > > > > remoteproc_cluster { > > compatible = "soc,remoteproc-cluster"; > > > > core0: core0 { > > compatible = "soc,remoteproc-core" > > memory-region; > > sram; > > }; > > > > core1: core1 { > > compatible = "soc,remoteproc-core" > > memory-region; > > sram; > > } > > }; > > > > A driver exists for the cluster rather than the individual cores > > themselves so that operation mode and HW specific configurations > > applicable to the cluster can be made. > > > > Because the driver exists at the cluster level and not the individual > > core level, function rproc_get_by_phandle() fails to return the > > remoteproc associated with the phandled it is called for. > > > > This patch enhances rproc_get_by_phandle() by looking for the cluster's > > driver when the driver for the immediate remoteproc's parent is not > > found. > > > > Reported-by: Ben Levinsky <ben.levinsky@xilinx.com> > > Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> > > Tested-by: Ben Levinsky <ben.levinsky@amd.com> > > --- > > drivers/remoteproc/remoteproc_core.c | 28 +++++++++++++++++++++++++++- > > 1 file changed, 27 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c > > index 695cce218e8c..3a8191803885 100644 > > --- a/drivers/remoteproc/remoteproc_core.c > > +++ b/drivers/remoteproc/remoteproc_core.c > > @@ -33,6 +33,7 @@ > > #include <linux/idr.h> > > #include <linux/elf.h> > > #include <linux/crc32.h> > > +#include <linux/of_platform.h> > > #include <linux/of_reserved_mem.h> > > #include <linux/virtio_ids.h> > > #include <linux/virtio_ring.h> > > @@ -2111,7 +2112,9 @@ EXPORT_SYMBOL(rproc_detach); > > #ifdef CONFIG_OF > > struct rproc *rproc_get_by_phandle(phandle phandle) > > { > > + struct platform_device *cluster_pdev; > > struct rproc *rproc = NULL, *r; > > + struct device_driver *driver; > > struct device_node *np; > > > > np = of_find_node_by_phandle(phandle); > > @@ -2122,7 +2125,30 @@ struct rproc *rproc_get_by_phandle(phandle phandle) > > list_for_each_entry_rcu(r, &rproc_list, node) { > > if (r->dev.parent && device_match_of_node(r->dev.parent, np)) { > > /* prevent underlying implementation from being removed */ > > - if (!try_module_get(r->dev.parent->driver->owner)) { > > + > > + /* > > + * If the remoteproc's parent has a driver, the > > + * remoteproc is not part of a cluster and we can use > > + * that driver. > > + */ > > + driver = r->dev.parent->driver; > > + > > + /* > > + * If the remoteproc's parent does not have a driver, > > + * look for the driver associated with the cluster. > > + */ > > + if (!driver) { > > + cluster_pdev = of_find_device_by_node(np->parent); > > Both the Ti and Xilinx drivers are using of_platform_populate(), so > their r->dev.parent should have a parent reference to the cluster > device. > So you are proposing to get the cluster's driver using something like r->dev.parent->parent->driver? I will have to verify the parent/child relationship is set up properly through the of_platform_populate(). If it is, following the pointer trail is an equally valid approach and I will respin this set. > Unless I'm reading the code wrong, I think we should follow that > pointer, rather than taking the detour in the DeviceTree data. > > Regards, > Bjorn > > > + if (!cluster_pdev) { > > + dev_err(&r->dev, "can't get parent\n"); > > + break; > > + } > > + > > + driver = cluster_pdev->dev.driver; > > + put_device(&cluster_pdev->dev); > > + } > > + > > + if (!try_module_get(driver->owner)) { > > dev_err(&r->dev, "can't get owner\n"); > > break; > > } > > -- > > 2.25.1 > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work for clusters 2023-11-14 16:23 ` Mathieu Poirier @ 2023-12-20 14:47 ` Tanmay Shah 2024-01-02 18:43 ` Mathieu Poirier 0 siblings, 1 reply; 7+ messages in thread From: Tanmay Shah @ 2023-12-20 14:47 UTC (permalink / raw) To: Mathieu Poirier, Bjorn Andersson Cc: linux-remoteproc, linux-kernel, Ben Levinsky On 11/14/23 10:23 AM, Mathieu Poirier wrote: > On Tue, 14 Nov 2023 at 08:22, Bjorn Andersson <andersson@kernel.org> wrote: > > > > On Sat, Oct 14, 2023 at 04:15:47PM -0700, Tanmay Shah wrote: > > > From: Mathieu Poirier <mathieu.poirier@linaro.org> > > > > > > Multi-cluster remoteproc designs typically have the following DT > > > declaration: > > > > > > remoteproc_cluster { > > > compatible = "soc,remoteproc-cluster"; > > > > > > core0: core0 { > > > compatible = "soc,remoteproc-core" > > > memory-region; > > > sram; > > > }; > > > > > > core1: core1 { > > > compatible = "soc,remoteproc-core" > > > memory-region; > > > sram; > > > } > > > }; > > > > > > A driver exists for the cluster rather than the individual cores > > > themselves so that operation mode and HW specific configurations > > > applicable to the cluster can be made. > > > > > > Because the driver exists at the cluster level and not the individual > > > core level, function rproc_get_by_phandle() fails to return the > > > remoteproc associated with the phandled it is called for. > > > > > > This patch enhances rproc_get_by_phandle() by looking for the cluster's > > > driver when the driver for the immediate remoteproc's parent is not > > > found. > > > > > > Reported-by: Ben Levinsky <ben.levinsky@xilinx.com> > > > Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> > > > Tested-by: Ben Levinsky <ben.levinsky@amd.com> > > > --- > > > drivers/remoteproc/remoteproc_core.c | 28 +++++++++++++++++++++++++++- > > > 1 file changed, 27 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c > > > index 695cce218e8c..3a8191803885 100644 > > > --- a/drivers/remoteproc/remoteproc_core.c > > > +++ b/drivers/remoteproc/remoteproc_core.c > > > @@ -33,6 +33,7 @@ > > > #include <linux/idr.h> > > > #include <linux/elf.h> > > > #include <linux/crc32.h> > > > +#include <linux/of_platform.h> > > > #include <linux/of_reserved_mem.h> > > > #include <linux/virtio_ids.h> > > > #include <linux/virtio_ring.h> > > > @@ -2111,7 +2112,9 @@ EXPORT_SYMBOL(rproc_detach); > > > #ifdef CONFIG_OF > > > struct rproc *rproc_get_by_phandle(phandle phandle) > > > { > > > + struct platform_device *cluster_pdev; > > > struct rproc *rproc = NULL, *r; > > > + struct device_driver *driver; > > > struct device_node *np; > > > > > > np = of_find_node_by_phandle(phandle); > > > @@ -2122,7 +2125,30 @@ struct rproc *rproc_get_by_phandle(phandle phandle) > > > list_for_each_entry_rcu(r, &rproc_list, node) { > > > if (r->dev.parent && device_match_of_node(r->dev.parent, np)) { > > > /* prevent underlying implementation from being removed */ > > > - if (!try_module_get(r->dev.parent->driver->owner)) { > > > + > > > + /* > > > + * If the remoteproc's parent has a driver, the > > > + * remoteproc is not part of a cluster and we can use > > > + * that driver. > > > + */ > > > + driver = r->dev.parent->driver; > > > + > > > + /* > > > + * If the remoteproc's parent does not have a driver, > > > + * look for the driver associated with the cluster. > > > + */ > > > + if (!driver) { > > > + cluster_pdev = of_find_device_by_node(np->parent); > > > > Both the Ti and Xilinx drivers are using of_platform_populate(), so > > their r->dev.parent should have a parent reference to the cluster > > device. > > > > So you are proposing to get the cluster's driver using something like > r->dev.parent->parent->driver? > > I will have to verify the parent/child relationship is set up properly > through the of_platform_populate(). If it is, following the pointer > trail is an equally valid approach and I will respin this set. Hi Mathieu, I addressed Bjorn's comments and verified on ZynqMP hardware that it's working. Let me know if you would like to see v4 with suggested changes. Thanks, Tanmay > > Unless I'm reading the code wrong, I think we should follow that > > pointer, rather than taking the detour in the DeviceTree data. > > > > Regards, > > Bjorn > > > > > + if (!cluster_pdev) { > > > + dev_err(&r->dev, "can't get parent\n"); > > > + break; > > > + } > > > + > > > + driver = cluster_pdev->dev.driver; > > > + put_device(&cluster_pdev->dev); > > > + } > > > + > > > + if (!try_module_get(driver->owner)) { > > > dev_err(&r->dev, "can't get owner\n"); > > > break; > > > } > > > -- > > > 2.25.1 > > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work for clusters 2023-12-20 14:47 ` Tanmay Shah @ 2024-01-02 18:43 ` Mathieu Poirier 0 siblings, 0 replies; 7+ messages in thread From: Mathieu Poirier @ 2024-01-02 18:43 UTC (permalink / raw) To: Tanmay Shah; +Cc: Bjorn Andersson, linux-remoteproc, linux-kernel, Ben Levinsky On Wed, Dec 20, 2023 at 08:47:19AM -0600, Tanmay Shah wrote: > > On 11/14/23 10:23 AM, Mathieu Poirier wrote: > > On Tue, 14 Nov 2023 at 08:22, Bjorn Andersson <andersson@kernel.org> wrote: > > > > > > On Sat, Oct 14, 2023 at 04:15:47PM -0700, Tanmay Shah wrote: > > > > From: Mathieu Poirier <mathieu.poirier@linaro.org> > > > > > > > > Multi-cluster remoteproc designs typically have the following DT > > > > declaration: > > > > > > > > remoteproc_cluster { > > > > compatible = "soc,remoteproc-cluster"; > > > > > > > > core0: core0 { > > > > compatible = "soc,remoteproc-core" > > > > memory-region; > > > > sram; > > > > }; > > > > > > > > core1: core1 { > > > > compatible = "soc,remoteproc-core" > > > > memory-region; > > > > sram; > > > > } > > > > }; > > > > > > > > A driver exists for the cluster rather than the individual cores > > > > themselves so that operation mode and HW specific configurations > > > > applicable to the cluster can be made. > > > > > > > > Because the driver exists at the cluster level and not the individual > > > > core level, function rproc_get_by_phandle() fails to return the > > > > remoteproc associated with the phandled it is called for. > > > > > > > > This patch enhances rproc_get_by_phandle() by looking for the cluster's > > > > driver when the driver for the immediate remoteproc's parent is not > > > > found. > > > > > > > > Reported-by: Ben Levinsky <ben.levinsky@xilinx.com> > > > > Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> > > > > Tested-by: Ben Levinsky <ben.levinsky@amd.com> > > > > --- > > > > drivers/remoteproc/remoteproc_core.c | 28 +++++++++++++++++++++++++++- > > > > 1 file changed, 27 insertions(+), 1 deletion(-) > > > > > > > > diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c > > > > index 695cce218e8c..3a8191803885 100644 > > > > --- a/drivers/remoteproc/remoteproc_core.c > > > > +++ b/drivers/remoteproc/remoteproc_core.c > > > > @@ -33,6 +33,7 @@ > > > > #include <linux/idr.h> > > > > #include <linux/elf.h> > > > > #include <linux/crc32.h> > > > > +#include <linux/of_platform.h> > > > > #include <linux/of_reserved_mem.h> > > > > #include <linux/virtio_ids.h> > > > > #include <linux/virtio_ring.h> > > > > @@ -2111,7 +2112,9 @@ EXPORT_SYMBOL(rproc_detach); > > > > #ifdef CONFIG_OF > > > > struct rproc *rproc_get_by_phandle(phandle phandle) > > > > { > > > > + struct platform_device *cluster_pdev; > > > > struct rproc *rproc = NULL, *r; > > > > + struct device_driver *driver; > > > > struct device_node *np; > > > > > > > > np = of_find_node_by_phandle(phandle); > > > > @@ -2122,7 +2125,30 @@ struct rproc *rproc_get_by_phandle(phandle phandle) > > > > list_for_each_entry_rcu(r, &rproc_list, node) { > > > > if (r->dev.parent && device_match_of_node(r->dev.parent, np)) { > > > > /* prevent underlying implementation from being removed */ > > > > - if (!try_module_get(r->dev.parent->driver->owner)) { > > > > + > > > > + /* > > > > + * If the remoteproc's parent has a driver, the > > > > + * remoteproc is not part of a cluster and we can use > > > > + * that driver. > > > > + */ > > > > + driver = r->dev.parent->driver; > > > > + > > > > + /* > > > > + * If the remoteproc's parent does not have a driver, > > > > + * look for the driver associated with the cluster. > > > > + */ > > > > + if (!driver) { > > > > + cluster_pdev = of_find_device_by_node(np->parent); > > > > > > Both the Ti and Xilinx drivers are using of_platform_populate(), so > > > their r->dev.parent should have a parent reference to the cluster > > > device. > > > > > > > So you are proposing to get the cluster's driver using something like > > r->dev.parent->parent->driver? > > > > I will have to verify the parent/child relationship is set up properly > > through the of_platform_populate(). If it is, following the pointer > > trail is an equally valid approach and I will respin this set. > > > Hi Mathieu, > > I addressed Bjorn's comments and verified on ZynqMP hardware that it's working. > > Let me know if you would like to see v4 with suggested changes. > Yes, please send a V4 with the proposed changes. > > Thanks, > > Tanmay > > > > Unless I'm reading the code wrong, I think we should follow that > > > pointer, rather than taking the detour in the DeviceTree data. > > > > > > Regards, > > > Bjorn > > > > > > > + if (!cluster_pdev) { > > > > + dev_err(&r->dev, "can't get parent\n"); > > > > + break; > > > > + } > > > > + > > > > + driver = cluster_pdev->dev.driver; > > > > + put_device(&cluster_pdev->dev); > > > > + } > > > > + > > > > + if (!try_module_get(driver->owner)) { > > > > dev_err(&r->dev, "can't get owner\n"); > > > > break; > > > > } > > > > -- > > > > 2.25.1 > > > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [RESEND PATCH v3 2/2] remoteproc: enhance rproc_put() for clusters 2023-10-14 23:15 [RESEND PATCH v3 0/2] remoteproc: get rproc devices for clusters Tanmay Shah 2023-10-14 23:15 ` [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work " Tanmay Shah @ 2023-10-14 23:15 ` Tanmay Shah 1 sibling, 0 replies; 7+ messages in thread From: Tanmay Shah @ 2023-10-14 23:15 UTC (permalink / raw) To: andersson, mathieu.poirier Cc: linux-remoteproc, linux-kernel, Tanmay Shah, kernel test robot, Tarak Reddy This patch enhances rproc_put() to support remoteproc clusters with multiple child nodes as in rproc_get_by_phandle(). Reported-by: kernel test robot <lkp@intel.com> Link: https://lore.kernel.org/oe-kbuild-all/202303221441.cuBnpvye-lkp@intel.com/ Signed-off-by: Tarak Reddy <tarak.reddy@amd.com> Signed-off-by: Tanmay Shah <tanmay.shah@amd.com> --- drivers/remoteproc/remoteproc_core.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 3a8191803885..3d95543971b5 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -2559,7 +2559,22 @@ EXPORT_SYMBOL(rproc_free); */ void rproc_put(struct rproc *rproc) { - module_put(rproc->dev.parent->driver->owner); + struct platform_device *cluster_pdev; + + if (rproc->dev.parent->driver) { + module_put(rproc->dev.parent->driver->owner); + } else { + /* + * If the remoteproc's parent does not have a driver, + * driver is associated with the cluster. + */ + cluster_pdev = of_find_device_by_node(rproc->dev.parent->of_node->parent); + if (cluster_pdev) { + module_put(cluster_pdev->dev.driver->owner); + put_device(&cluster_pdev->dev); + } + } + put_device(&rproc->dev); } EXPORT_SYMBOL(rproc_put); -- 2.25.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-01-02 18:43 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-10-14 23:15 [RESEND PATCH v3 0/2] remoteproc: get rproc devices for clusters Tanmay Shah 2023-10-14 23:15 ` [RESEND PATCH v3 1/2] remoteproc: Make rproc_get_by_phandle() work " Tanmay Shah 2023-11-14 15:22 ` Bjorn Andersson 2023-11-14 16:23 ` Mathieu Poirier 2023-12-20 14:47 ` Tanmay Shah 2024-01-02 18:43 ` Mathieu Poirier 2023-10-14 23:15 ` [RESEND PATCH v3 2/2] remoteproc: enhance rproc_put() " Tanmay Shah
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox