drm/mediatek: Fix cursor plane no update
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.
Fixes: 37418bf14c
("drm: Use state helper instead of the plane state pointer")
Signed-off-by: jason-jh.lin <jason-jh.lin@mediatek.com>
Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
This commit is contained in:
Родитель
6b57ba3243
Коммит
1a64a7aff8
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче