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

Thomas Zimmermann tzimmermann at suse.de
Mon Oct 17 11:15:10 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/st7586.c | 44 ++++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/tiny/st7586.c b/drivers/gpu/drm/tiny/st7586.c
index b6f620b902e6d..bd61e0d22ca2d 100644
--- a/drivers/gpu/drm/tiny/st7586.c
+++ b/drivers/gpu/drm/tiny/st7586.c
@@ -92,29 +92,20 @@ static void st7586_xrgb8888_to_gray332(u8 *dst, void *vaddr,
 	kfree(buf);
 }
 
-static int st7586_buf_copy(void *dst, struct drm_framebuffer *fb,
-			   struct drm_rect *clip)
+static void st7586_buf_copy(void *dst, struct drm_framebuffer *fb,
+			    struct drm_rect *clip)
 {
 	struct drm_gem_dma_object *dma_obj = drm_fb_dma_get_gem_obj(fb, 0);
 	void *src = dma_obj->vaddr;
-	int ret = 0;
-
-	ret = drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE);
-	if (ret)
-		return ret;
 
 	st7586_xrgb8888_to_gray332(dst, src, fb, clip);
-
-	drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE);
-
-	return 0;
 }
 
 static void st7586_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
 {
 	struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(fb->dev);
 	struct mipi_dbi *dbi = &dbidev->dbi;
-	int start, end, idx, ret = 0;
+	int start, end, idx, ret;
 
 	if (!drm_dev_enter(fb->dev, &idx))
 		return;
@@ -125,9 +116,7 @@ static void st7586_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
 
 	DRM_DEBUG_KMS("Flushing [FB:%d] " DRM_RECT_FMT "\n", fb->base.id, DRM_RECT_ARG(rect));
 
-	ret = st7586_buf_copy(dbidev->tx_buf, fb, rect);
-	if (ret)
-		goto err_msg;
+	st7586_buf_copy(dbidev->tx_buf, fb, rect);
 
 	/* Pixels are packed 3 per byte */
 	start = rect->x1 / 3;
@@ -143,7 +132,6 @@ static void st7586_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
 	ret = mipi_dbi_command_buf(dbi, MIPI_DCS_WRITE_MEMORY_START,
 				   (u8 *)dbidev->tx_buf,
 				   (end - start) * (rect->y2 - rect->y1));
-err_msg:
 	if (ret)
 		dev_err_once(fb->dev->dev, "Failed to update display %d\n", ret);
 
@@ -258,6 +246,28 @@ static void st7586_pipe_disable(struct drm_simple_display_pipe *pipe)
 	mipi_dbi_command(&dbidev->dbi, MIPI_DCS_SET_DISPLAY_OFF);
 }
 
+static int st7586_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 st7586_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 u32 st7586_formats[] = {
 	DRM_FORMAT_XRGB8888,
 };
@@ -266,6 +276,8 @@ static const struct drm_simple_display_pipe_funcs st7586_pipe_funcs = {
 	.enable		= st7586_pipe_enable,
 	.disable	= st7586_pipe_disable,
 	.update		= st7586_pipe_update,
+	.begin_fb_access = st7586_pipe_begin_fb_access,
+	.end_fb_access	= st7586_pipe_end_fb_access,
 };
 
 static const struct drm_display_mode st7586_mode = {
-- 
2.38.0



More information about the dri-devel mailing list