[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1817371.3VsfAaAtOV@diego>
Date: Mon, 27 May 2024 22:43:18 +0200
From: Heiko Stübner <heiko@...ech.de>
To: Val Packett <val@...kett.cool>
Cc: Val Packett <val@...kett.cool>, stable@...r.kernel.org,
Sandy Huang <hjc@...k-chips.com>, Andy Yan <andy.yan@...k-chips.com>,
Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>,
Maxime Ripard <mripard@...nel.org>, Thomas Zimmermann <tzimmermann@...e.de>,
David Airlie <airlied@...il.com>, Daniel Vetter <daniel@...ll.ch>,
dri-devel@...ts.freedesktop.org, linux-arm-kernel@...ts.infradead.org,
linux-rockchip@...ts.infradead.org, linux-kernel@...r.kernel.org
Subject:
Re: [PATCH v2 1/2] drm/rockchip: vop: clear DMA stop bit upon vblank on
RK3066
Hi Val,
Am Montag, 27. Mai 2024, 09:16:33 CEST schrieb Val Packett:
> On the RK3066, there is a bit that must be cleared, otherwise
> the picture does not show up on the display (at least for RGB).
>
> Fixes: f4a6de8 ("drm: rockchip: vop: add rk3066 vop definitions")
> Cc: stable@...r.kernel.org
> Signed-off-by: Val Packett <val@...kett.cool>
> ---
> v2: doing this on vblank makes more sense; added fixes tag
can you give a rationale for this please?
I.e. does this dma-stop bit need to be set on each vblank that happens
to push this frame to the display somehow?
Because at least in theory atomic_flush where this was living in in v1,
might happen at a slower interval?
Thanks
Heiko
> ---
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 6 ++++++
> drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 1 +
> drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 1 +
> 3 files changed, 8 insertions(+)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index a13473b2d..2731fe2b2 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -1766,6 +1766,12 @@ static void vop_handle_vblank(struct vop *vop)
> }
> spin_unlock(&drm->event_lock);
>
> + if (VOP_HAS_REG(vop, common, dma_stop)) {
> + spin_lock(&vop->reg_lock);
> + VOP_REG_SET(vop, common, dma_stop, 0);
> + spin_unlock(&vop->reg_lock);
> + }
> +
> if (test_and_clear_bit(VOP_PENDING_FB_UNREF, &vop->pending))
> drm_flip_work_commit(&vop->fb_unref_work, system_unbound_wq);
> }
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> index b33e5bdc2..0cf512cc1 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> @@ -122,6 +122,7 @@ struct vop_common {
> struct vop_reg lut_buffer_index;
> struct vop_reg gate_en;
> struct vop_reg mmu_en;
> + struct vop_reg dma_stop;
> struct vop_reg out_mode;
> struct vop_reg standby;
> };
> diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> index b9ee02061..9bcb40a64 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> @@ -466,6 +466,7 @@ static const struct vop_output rk3066_output = {
> };
>
> static const struct vop_common rk3066_common = {
> + .dma_stop = VOP_REG(RK3066_SYS_CTRL0, 0x1, 0),
> .standby = VOP_REG(RK3066_SYS_CTRL0, 0x1, 1),
> .out_mode = VOP_REG(RK3066_DSP_CTRL0, 0xf, 0),
> .cfg_done = VOP_REG(RK3066_REG_CFG_DONE, 0x1, 0),
>
Powered by blists - more mailing lists