[PATCH 13/17] media: rockchip: rga: bind all cores to the master

Nicolas Dufresne nicolas at ndufresne.ca
Fri Jul 10 14:06:30 PDT 2026


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 at pengutronix.de>
> ---
>  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[];
>  };
>  
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: This is a digitally signed message part
URL: <http://lists.infradead.org/pipermail/linux-rockchip/attachments/20260710/777b48e1/attachment.sig>


More information about the Linux-rockchip mailing list