[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