Re: [PATCH 13/17] media: rockchip: rga: bind all cores to the master
From: Nicolas Dufresne
Date: Fri Jul 10 2026 - 17:06:41 EST
Le samedi 06 juin 2026 à 00:06 +0200, Sven Püschel a écrit :
> Bind all core components to the master component. Previously only the
> first core has been added to the master device to avoid creating
> multiple video devices. As the video device creation has been moved to
> the master component, it allows us to bind all cores without creating
> additional video devices.
>
> We expect that all cores to report the same version number, as we only
> add cores with the same compatible value. This is important, as we
> setup the command buffer before actually scheduling the work to a
> specific core. Therefore adjusting command buffers depending on the
> version register only works when all cores have the same value.
>
> Signed-off-by: Sven Püschel <s.pueschel@xxxxxxxxxxxxxx>
> ---
> drivers/media/platform/rockchip/rga/rga.c | 22 +++++++++++-----------
> drivers/media/platform/rockchip/rga/rga.h | 1 +
> 2 files changed, 12 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c
> index 0413b8518dfc8..6add6c510c127 100644
> --- a/drivers/media/platform/rockchip/rga/rga.c
> +++ b/drivers/media/platform/rockchip/rga/rga.c
> @@ -742,6 +742,7 @@ static int rga_core_bind(struct device *dev, struct device *master, void *data)
> {
> struct rockchip_rga *rga = data;
> struct rga_core *core = dev_get_drvdata(dev);
> + struct rockchip_rga_version version;
> int ret = 0;
>
> core->rga = rga;
> @@ -750,14 +751,21 @@ static int rga_core_bind(struct device *dev, struct device *master, void *data)
> if (ret < 0)
> return ret;
>
> - rga->version = rga->hw->get_version(core);
> + version = rga->hw->get_version(core);
>
> v4l2_info(&rga->v4l2_dev, "HW Version: 0x%02x.%02x\n",
> - rga->version.major, rga->version.minor);
> + version.major, version.minor);
> +
> + if (rga->num_cores) {
> + /* we are not the first core, expect that we have the same version */
> + if (rga->version.major != version.major || rga->version.minor != version.minor)
> + v4l2_warn(&rga->v4l2_dev, "Detected multi-core setup with different core versions!\n");
We should fail, and not just warn.
Nicolas
> + } else
> + rga->version = version;
>
> pm_runtime_put(core->dev);
>
> - rga->cores[0] = core;
> + rga->cores[rga->num_cores++] = core;
>
> return 0;
> }
> @@ -983,14 +991,6 @@ static int rga_probe(struct platform_device *pdev)
> component_match_add_release(dev, &match, component_release_of,
> component_compare_of, core_node);
> num_cores++;
> -
> - /*
> - * As multi core is not implemented yet,
> - * break out of the loop to only have one core per rockchip_rga struct.
> - * Also put the node, which otherwise would've been done by the loop iteration.
> - */
> - of_node_put(core_node);
> - break;
> }
>
> if (!match)
> diff --git a/drivers/media/platform/rockchip/rga/rga.h b/drivers/media/platform/rockchip/rga/rga.h
> index fcf1ef7d2029f..6237436b984eb 100644
> --- a/drivers/media/platform/rockchip/rga/rga.h
> +++ b/drivers/media/platform/rockchip/rga/rga.h
> @@ -88,6 +88,7 @@ struct rockchip_rga {
>
> const struct rga_hw *hw;
>
> + u8 num_cores;
> struct rga_core *cores[];
> };
>
Attachment:
signature.asc
Description: This is a digitally signed message part