[PATCH 4/5] drm/repaper: Implement {begin,end}_fb_access helpers

Thomas Zimmermann tzimmermann at suse.de
Mon Oct 17 11:15:09 UTC 2022


Call drm_gem_fb_begin_cpu_access() and drm_gem_fb_end_cpu_access() in
the simple pipe's {begin,end}_fb_access helpers. This allows to abort
commits correctly after observing an error.

Remove the corresponding CPU-access calls from the driver's damage
handler. It runs during the atomic-apply phase when it's already too
late to handle errors.

Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
---
 drivers/gpu/drm/tiny/repaper.c | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/tiny/repaper.c b/drivers/gpu/drm/tiny/repaper.c
index e62f4d16b2c6b..e0f1ac8ab2186 100644
--- a/drivers/gpu/drm/tiny/repaper.c
+++ b/drivers/gpu/drm/tiny/repaper.c
@@ -539,10 +539,6 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb)
 		goto out_exit;
 	}
 
-	ret = drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE);
-	if (ret)
-		goto out_free;
-
 	iosys_map_set_vaddr(&dst, buf);
 	iosys_map_set_vaddr(&vmap, dma_obj->vaddr);
 	drm_fb_xrgb8888_to_mono(&dst, &dst_pitch, &vmap, fb, &clip);
@@ -596,8 +592,6 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb)
 			}
 	}
 
-out_free:
-	kfree(buf);
 out_exit:
 	drm_dev_exit(idx);
 
@@ -839,11 +833,35 @@ static void repaper_pipe_update(struct drm_simple_display_pipe *pipe,
 		repaper_fb_dirty(state->fb);
 }
 
+static int repaper_pipe_begin_fb_access(struct drm_simple_display_pipe *pipe,
+					struct drm_plane_state *plane_state)
+{
+	struct drm_framebuffer *fb = plane_state->fb;
+
+	if (!fb)
+		return 0;
+
+	return drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE);
+}
+
+static void repaper_pipe_end_fb_access(struct drm_simple_display_pipe *pipe,
+				       struct drm_plane_state *plane_state)
+{
+	struct drm_framebuffer *fb = plane_state->fb;
+
+	if (!fb)
+		return;
+
+	drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE);
+}
+
 static const struct drm_simple_display_pipe_funcs repaper_pipe_funcs = {
 	.mode_valid = repaper_pipe_mode_valid,
 	.enable = repaper_pipe_enable,
 	.disable = repaper_pipe_disable,
 	.update = repaper_pipe_update,
+	.begin_fb_access = repaper_pipe_begin_fb_access,
+	.end_fb_access = repaper_pipe_end_fb_access,
 };
 
 static int repaper_connector_get_modes(struct drm_connector *connector)
-- 
2.38.0



More information about the dri-devel mailing list