drm/mediatek: Fix iommu fault by swapping FBs after updating plane state
authorJason-JH.Lin <jason-jh.lin@mediatek.com>
Wed, 9 Aug 2023 12:57:21 +0000 (20:57 +0800)
committerChun-Kuang Hu <chunkuang.hu@kernel.org>
Sun, 8 Oct 2023 01:28:31 +0000 (01:28 +0000)
According to the comment in drm_atomic_helper_async_commit(),
we should make sure FBs have been swapped, so that cleanups in the
new_state performs a cleanup in the old FB.

So we should move swapping FBs after calling mtk_plane_update_new_state(),
to avoid using the old FB which could be freed.

Fixes: 1a64a7aff8da ("drm/mediatek: Fix cursor plane no update")
Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: CK Hu <ck.hu@mediatek.com>
Reviewed-by: Alexandre Mergnat <amergnat@baylibre.com>
Link: https://patchwork.kernel.org/project/linux-mediatek/patch/20230809125722.24112-2-jason-jh.lin@mediatek.com/
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
drivers/gpu/drm/mediatek/mtk_drm_plane.c

index 5acb03b7c6fe59afbeda4105f8a000acbdedd8a9..ddc9355b06d5159f24b200265f096c822f129854 100644 (file)
@@ -227,9 +227,9 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane,
        plane->state->src_y = new_state->src_y;
        plane->state->src_h = new_state->src_h;
        plane->state->src_w = new_state->src_w;
-       swap(plane->state->fb, new_state->fb);
 
        mtk_plane_update_new_state(new_state, new_plane_state);
+       swap(plane->state->fb, new_state->fb);
        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);