[PATCH 13/13] video: Rockchip: Add VOP2 driver

Ahmad Fatoum a.fatoum at pengutronix.de
Thu Sep 26 23:13:20 PDT 2024


Hi Sascha,

On 26.09.24 15:15, Sascha Hauer wrote:
> This adds support for the Rockchip VOP2 video core found on the Rockchip
> SoCs RK3566, RK3568 and RK3588. The code is based on the Linux driver
> and has been heavily stripped down for barebox. Support for the cluster
> windows has been removed, also support for YUV modes has been dropped.
> 
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>

With below described adjustments:

Tested-by: Ahmad Fatoum <a.fatoum at pengutronix.de> # rk3566 HDMI

> +config DRIVER_VIDEO_ROCKCHIP_HDMI
> +        bool "Rockchip HDMI driver"
> +        select VIDEO_VPL
> +        select OFTREE
> +        depends on DRIVER_VIDEO_EDID
> +        depends on DRIVER_VIDEO_DW_HDMI

Turn these two into select? Makes it easier to enable.

> +static int dw_hdmi_rockchip_probe(struct device *dev)
> +{
> +	struct dw_hdmi_plat_data *plat_data;
> +	struct rockchip_hdmi *hdmi;
> +	int ret;
> +
> +	hdmi = xzalloc(sizeof(*hdmi));
> +
> +	ret = dev_get_drvdata(dev, (const void **)&plat_data);
> +	if (ret)
> +		return ret;

We should really phase out dev_get_drvdata. For one, it doesn't
do the same thing as in Linux and those casts are ugly.

Can you use device_get_match_data instead?

> +	ret = rockchip_hdmi_parse_dt(hdmi);
> +	if (ret) {
> +		if (ret != -EPROBE_DEFER)
> +			dev_err(hdmi->dev, "Unable to parse OF data\n");

dev_err_probe here and below would be nice, but I assume it's that way in Linux too?

> +static struct vop2_win *vop2_find_unused_win(struct vop2 *vop2)
> +{
> +	int i;
> +
> +	for (i = 0; i < vop2->registered_num_wins; i++) {
> +		struct vop2_win *win = &vop2->win[i];

I think the logic here is wrong. In a below hunk, we already have the same loop
and now we set i = 0 and restart. That means that the same win can be used twice.

win has struct fb_info as element though, so in that case, the same framebuffer
is registered twice, which leads to an error message on my rk3566.

You may want to turn this into a:

	static struct vop2_win *vop2_next_unused_win(struct vop2 *vop2, int *i)

and then start from i. The i++ in the main loop will take care to advance i,
so no win is reused again.

> +	nvp = 0;
> +	for (i = 0; i < vop2->registered_num_wins; i++) {
> +		struct vop2_win *win = &vop2->win[i];
> +
> +		if (vop2->data->soc_id == 3566) {
> +			/*
> +			 * On RK3566 these windows don't have an independent
> +			 * framebuffer. They share the framebuffer with smart0,
> +			 * esmart0 and cluster0 respectively.
> +			 */
> +			switch (win->data->phys_id) {
> +			case ROCKCHIP_VOP2_SMART1:
> +			case ROCKCHIP_VOP2_ESMART1:
> +			case ROCKCHIP_VOP2_CLUSTER1:
> +				continue;
> +			}

I don't get any overlay framebuffers registered on rk3566. You know what might be the reason?

> +	for (i = 0; i < vop2->registered_num_wins; i++) {
> +		struct vop2_win *win = &vop2->win[i];
> +		struct vop2_video_port *vp = win->vp;
> +		int j;
> +
> +		if (win->type != DRM_PLANE_TYPE_PRIMARY)
> +			continue;

On rk3566, you may end up with vp == NULL here, so you probably
want to add a `|| !vp` into the above if condition.

> +
> +		ret = vop2_register_plane(vp, win);
> +		if (ret)
> +			continue;
> +
> +		for (j = 0; j < overlay_per_vp; j++) {
> +			win = vop2_find_unused_win(vop2);
> +			if (!win)
> +				break;
> +
> +			win->vp = vp;
> +
> +			ret = vop2_register_plane(vp, win);
> +			if (ret)
> +				return ret;
> +		}
> +		vp->nlayers = j + 1;
> +	}
> +
> +	return 0;
> +}
> +

> +struct driver vop2_driver = {
> +	.probe = vop2_bind,
> +	.name = "rockchip-vop2",
> +	.of_compatible = vop2_dt_match,
> +};
> +late_platform_driver(vop2_driver);

Does this have to be a late driver? Can't we let deep probe take
care of the dependency handling?


> diff --git a/drivers/video/rockchip/rockchip_vop_reg.c b/drivers/video/rockchip/rockchip_vop_reg.c

This file is unused.


Cheers,
Ahmad

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the barebox mailing list