Hi, Jason: jason-jh.lin <jason-jh.lin@xxxxxxxxxxxx> 於 2021年7月22日 週四 上午9:47寫道: > > The cursor plane should use the current plane state in atomic_async_update > because it would not be the new plane state in the global atomic state > since _swap_state happened when those hook are run. > > Fix cursor plane issue by below modification: > 1. Remove plane_helper_funcs->atomic_update(plane, state) in > mtk_drm_crtc_async_update. > 2. Add mtk_drm_update_new_state in to mtk_plane_atomic_async_update to > update the cursor plane by current plane state hook and update > others plane by the new_state. Applied to mediatek-drm-fixes [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-fixes Regards, Chun-Kuang. > > Fixes: 37418bf14c13 ("drm: Use state helper instead of the plane state pointer") > Signed-off-by: jason-jh.lin <jason-jh.lin@xxxxxxxxxxxx> > Tested-by: Enric Balletbo i Serra <enric.balletbo@xxxxxxxxxxxxx> > --- > Change in v4: > - Fix compile warning: > ../drivers/gpu/drm/mediatek/mtk_drm_crtc.c:578:39: warning: unused > variable ‘plane_helper_funcs’ [-Wunused-variable > --- > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 3 -- > drivers/gpu/drm/mediatek/mtk_drm_plane.c | 60 ++++++++++++++---------- > 2 files changed, 34 insertions(+), 29 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > index 40df2c823187..515315505e3b 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > @@ -532,13 +532,10 @@ void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane, > struct drm_atomic_state *state) > { > struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > - const struct drm_plane_helper_funcs *plane_helper_funcs = > - plane->helper_private; > > if (!mtk_crtc->enabled) > return; > > - plane_helper_funcs->atomic_update(plane, state); > mtk_drm_crtc_update_config(mtk_crtc, false); > } > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c > index b5582dcf564c..e6dcb34d3052 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c > @@ -110,6 +110,35 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane, > true, true); > } > > +static void mtk_plane_update_new_state(struct drm_plane_state *new_state, > + struct mtk_plane_state *mtk_plane_state) > +{ > + struct drm_framebuffer *fb = new_state->fb; > + struct drm_gem_object *gem; > + struct mtk_drm_gem_obj *mtk_gem; > + unsigned int pitch, format; > + dma_addr_t addr; > + > + gem = fb->obj[0]; > + mtk_gem = to_mtk_gem_obj(gem); > + addr = mtk_gem->dma_addr; > + pitch = fb->pitches[0]; > + format = fb->format->format; > + > + addr += (new_state->src.x1 >> 16) * fb->format->cpp[0]; > + addr += (new_state->src.y1 >> 16) * pitch; > + > + mtk_plane_state->pending.enable = true; > + mtk_plane_state->pending.pitch = pitch; > + mtk_plane_state->pending.format = format; > + mtk_plane_state->pending.addr = addr; > + mtk_plane_state->pending.x = new_state->dst.x1; > + mtk_plane_state->pending.y = new_state->dst.y1; > + mtk_plane_state->pending.width = drm_rect_width(&new_state->dst); > + mtk_plane_state->pending.height = drm_rect_height(&new_state->dst); > + mtk_plane_state->pending.rotation = new_state->rotation; > +} > + > static void mtk_plane_atomic_async_update(struct drm_plane *plane, > struct drm_atomic_state *state) > { > @@ -126,8 +155,10 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane, > plane->state->src_h = new_state->src_h; > plane->state->src_w = new_state->src_w; > swap(plane->state->fb, new_state->fb); > - new_plane_state->pending.async_dirty = true; > > + mtk_plane_update_new_state(new_state, new_plane_state); > + wmb(); /* Make sure the above parameters are set before update */ > + new_plane_state->pending.async_dirty = true; > mtk_drm_crtc_async_update(new_state->crtc, plane, state); > } > > @@ -189,14 +220,8 @@ static void mtk_plane_atomic_update(struct drm_plane *plane, > struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state, > plane); > struct mtk_plane_state *mtk_plane_state = to_mtk_plane_state(new_state); > - struct drm_crtc *crtc = new_state->crtc; > - struct drm_framebuffer *fb = new_state->fb; > - struct drm_gem_object *gem; > - struct mtk_drm_gem_obj *mtk_gem; > - unsigned int pitch, format; > - dma_addr_t addr; > > - if (!crtc || WARN_ON(!fb)) > + if (!new_state->crtc || WARN_ON(!new_state->fb)) > return; > > if (!new_state->visible) { > @@ -204,24 +229,7 @@ static void mtk_plane_atomic_update(struct drm_plane *plane, > return; > } > > - gem = fb->obj[0]; > - mtk_gem = to_mtk_gem_obj(gem); > - addr = mtk_gem->dma_addr; > - pitch = fb->pitches[0]; > - format = fb->format->format; > - > - addr += (new_state->src.x1 >> 16) * fb->format->cpp[0]; > - addr += (new_state->src.y1 >> 16) * pitch; > - > - mtk_plane_state->pending.enable = true; > - mtk_plane_state->pending.pitch = pitch; > - mtk_plane_state->pending.format = format; > - mtk_plane_state->pending.addr = addr; > - mtk_plane_state->pending.x = new_state->dst.x1; > - mtk_plane_state->pending.y = new_state->dst.y1; > - mtk_plane_state->pending.width = drm_rect_width(&new_state->dst); > - mtk_plane_state->pending.height = drm_rect_height(&new_state->dst); > - mtk_plane_state->pending.rotation = new_state->rotation; > + mtk_plane_update_new_state(new_state, mtk_plane_state); > wmb(); /* Make sure the above parameters are set before update */ > mtk_plane_state->pending.dirty = true; > } > -- > 2.18.0 >