Thomas Zimmermann 715d67
From aa7c88650f705631f1e7ea03ea14171b0530b9ef Mon Sep 17 00:00:00 2001
Thomas Zimmermann 715d67
From: Thomas Zimmermann <tzimmermann@suse.de>
Thomas Zimmermann 715d67
Date: Thu, 13 Oct 2022 13:29:19 +0200
Thomas Zimmermann 715d67
Subject: drm/ast: Remove cursor double buffering
Thomas Zimmermann 715d67
Git-commit: aa7c88650f705631f1e7ea03ea14171b0530b9ef
Thomas Zimmermann 715d67
Patch-mainline: v6.2-rc1
Thomas Zimmermann 715d67
References: jsc#PED-1465
Thomas Zimmermann 715d67
Thomas Zimmermann 715d67
Update the cursor image via damage handling in-place. The cursor's
Thomas Zimmermann 715d67
double buffering has no visible effect on the output, so remove it.
Thomas Zimmermann 715d67
Thomas Zimmermann 715d67
Done in preparation of switching ast to GEM SHMEM helpers. Removing
Thomas Zimmermann 715d67
double buffering will allow us to use the same data structure for
Thomas Zimmermann 715d67
primary and cursor plane.
Thomas Zimmermann 715d67
Thomas Zimmermann 715d67
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Thomas Zimmermann 715d67
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Thomas Zimmermann 715d67
Tested-by: Jocelyn Falempe <jfalempe@redhat.com>
Thomas Zimmermann 715d67
Link: https://patchwork.freedesktop.org/patch/msgid/20221013112923.769-5-tzimmermann@suse.de
Thomas Zimmermann 715d67
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Thomas Zimmermann 715d67
---
Thomas Zimmermann 715d67
 drivers/gpu/drm/ast/ast_drv.h  | 12 ++---
Thomas Zimmermann 715d67
 drivers/gpu/drm/ast/ast_mode.c | 83 +++++++++++++---------------------
Thomas Zimmermann 715d67
 2 files changed, 35 insertions(+), 60 deletions(-)
Thomas Zimmermann 715d67
Thomas Zimmermann 715d67
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
Thomas Zimmermann 715d67
index 2e44b971c3a6..12294c74d0fc 100644
Thomas Zimmermann 715d67
--- a/drivers/gpu/drm/ast/ast_drv.h
Thomas Zimmermann 715d67
+++ b/drivers/gpu/drm/ast/ast_drv.h
Thomas Zimmermann 715d67
@@ -96,8 +96,6 @@ enum ast_tx_chip {
Thomas Zimmermann 715d67
 #define AST_HWC_SIZE		(AST_MAX_HWC_WIDTH * AST_MAX_HWC_HEIGHT * 2)
Thomas Zimmermann 715d67
 #define AST_HWC_SIGNATURE_SIZE	32
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
-#define AST_DEFAULT_HWC_NUM	2
Thomas Zimmermann 715d67
-
Thomas Zimmermann 715d67
 /* define for signature structure */
Thomas Zimmermann 715d67
 #define AST_HWC_SIGNATURE_CHECKSUM	0x00
Thomas Zimmermann 715d67
 #define AST_HWC_SIGNATURE_SizeX		0x04
Thomas Zimmermann 715d67
@@ -110,13 +108,9 @@ enum ast_tx_chip {
Thomas Zimmermann 715d67
 struct ast_cursor_plane {
Thomas Zimmermann 715d67
 	struct drm_plane base;
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
-	struct {
Thomas Zimmermann 715d67
-		struct drm_gem_vram_object *gbo;
Thomas Zimmermann 715d67
-		struct iosys_map map;
Thomas Zimmermann 715d67
-		u64 off;
Thomas Zimmermann 715d67
-	} hwc[AST_DEFAULT_HWC_NUM];
Thomas Zimmermann 715d67
-
Thomas Zimmermann 715d67
-	unsigned int next_hwc_index;
Thomas Zimmermann 715d67
+	struct drm_gem_vram_object *gbo;
Thomas Zimmermann 715d67
+	struct iosys_map map;
Thomas Zimmermann 715d67
+	u64 off;
Thomas Zimmermann 715d67
 };
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
 static inline struct ast_cursor_plane *
Thomas Zimmermann 715d67
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
Thomas Zimmermann 715d67
index 059e4906507d..06ee79ec86f1 100644
Thomas Zimmermann 715d67
--- a/drivers/gpu/drm/ast/ast_mode.c
Thomas Zimmermann 715d67
+++ b/drivers/gpu/drm/ast/ast_mode.c
Thomas Zimmermann 715d67
@@ -837,10 +837,8 @@ ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
Thomas Zimmermann 715d67
 	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(new_state);
Thomas Zimmermann 715d67
 	struct drm_framebuffer *fb = new_state->fb;
Thomas Zimmermann 715d67
 	struct ast_private *ast = to_ast_private(plane->dev);
Thomas Zimmermann 715d67
-	struct iosys_map dst_map =
Thomas Zimmermann 715d67
-		ast_cursor_plane->hwc[ast_cursor_plane->next_hwc_index].map;
Thomas Zimmermann 715d67
-	u64 dst_off =
Thomas Zimmermann 715d67
-		ast_cursor_plane->hwc[ast_cursor_plane->next_hwc_index].off;
Thomas Zimmermann 715d67
+	struct iosys_map dst_map = ast_cursor_plane->map;
Thomas Zimmermann 715d67
+	u64 dst_off = ast_cursor_plane->off;
Thomas Zimmermann 715d67
 	struct iosys_map src_map = shadow_plane_state->data[0];
Thomas Zimmermann 715d67
 	unsigned int offset_x, offset_y;
Thomas Zimmermann 715d67
 	u16 x, y;
Thomas Zimmermann 715d67
@@ -860,13 +858,9 @@ ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
 	ast_update_cursor_image(dst, src, fb->width, fb->height);
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
-	if (new_state->fb != old_state->fb) {
Thomas Zimmermann 715d67
+	if (new_state->fb != old_state->fb)
Thomas Zimmermann 715d67
 		ast_set_cursor_base(ast, dst_off);
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
-		++ast_cursor_plane->next_hwc_index;
Thomas Zimmermann 715d67
-		ast_cursor_plane->next_hwc_index %= ARRAY_SIZE(ast_cursor_plane->hwc);
Thomas Zimmermann 715d67
-	}
Thomas Zimmermann 715d67
-
Thomas Zimmermann 715d67
 	/*
Thomas Zimmermann 715d67
 	 * Update location in HWC signature and registers.
Thomas Zimmermann 715d67
 	 */
Thomas Zimmermann 715d67
@@ -917,17 +911,12 @@ static const struct drm_plane_helper_funcs ast_cursor_plane_helper_funcs = {
Thomas Zimmermann 715d67
 static void ast_cursor_plane_destroy(struct drm_plane *plane)
Thomas Zimmermann 715d67
 {
Thomas Zimmermann 715d67
 	struct ast_cursor_plane *ast_cursor_plane = to_ast_cursor_plane(plane);
Thomas Zimmermann 715d67
-	size_t i;
Thomas Zimmermann 715d67
-	struct drm_gem_vram_object *gbo;
Thomas Zimmermann 715d67
-	struct iosys_map map;
Thomas Zimmermann 715d67
+	struct drm_gem_vram_object *gbo = ast_cursor_plane->gbo;
Thomas Zimmermann 715d67
+	struct iosys_map map = ast_cursor_plane->map;
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
-	for (i = 0; i < ARRAY_SIZE(ast_cursor_plane->hwc); ++i) {
Thomas Zimmermann 715d67
-		gbo = ast_cursor_plane->hwc[i].gbo;
Thomas Zimmermann 715d67
-		map = ast_cursor_plane->hwc[i].map;
Thomas Zimmermann 715d67
-		drm_gem_vram_vunmap(gbo, &map);
Thomas Zimmermann 715d67
-		drm_gem_vram_unpin(gbo);
Thomas Zimmermann 715d67
-		drm_gem_vram_put(gbo);
Thomas Zimmermann 715d67
-	}
Thomas Zimmermann 715d67
+	drm_gem_vram_vunmap(gbo, &map);
Thomas Zimmermann 715d67
+	drm_gem_vram_unpin(gbo);
Thomas Zimmermann 715d67
+	drm_gem_vram_put(gbo);
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
 	drm_plane_cleanup(plane);
Thomas Zimmermann 715d67
 }
Thomas Zimmermann 715d67
@@ -944,7 +933,7 @@ static int ast_cursor_plane_init(struct ast_private *ast)
Thomas Zimmermann 715d67
 	struct drm_device *dev = &ast->base;
Thomas Zimmermann 715d67
 	struct ast_cursor_plane *ast_cursor_plane = &ast->cursor_plane;
Thomas Zimmermann 715d67
 	struct drm_plane *cursor_plane = &ast_cursor_plane->base;
Thomas Zimmermann 715d67
-	size_t size, i;
Thomas Zimmermann 715d67
+	size_t size;
Thomas Zimmermann 715d67
 	struct drm_gem_vram_object *gbo;
Thomas Zimmermann 715d67
 	struct iosys_map map;
Thomas Zimmermann 715d67
 	int ret;
Thomas Zimmermann 715d67
@@ -957,29 +946,27 @@ static int ast_cursor_plane_init(struct ast_private *ast)
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
 	size = roundup(AST_HWC_SIZE + AST_HWC_SIGNATURE_SIZE, PAGE_SIZE);
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
-	for (i = 0; i < ARRAY_SIZE(ast_cursor_plane->hwc); ++i) {
Thomas Zimmermann 715d67
-		gbo = drm_gem_vram_create(dev, size, 0);
Thomas Zimmermann 715d67
-		if (IS_ERR(gbo)) {
Thomas Zimmermann 715d67
-			ret = PTR_ERR(gbo);
Thomas Zimmermann 715d67
-			goto err_hwc;
Thomas Zimmermann 715d67
-		}
Thomas Zimmermann 715d67
-		ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM |
Thomas Zimmermann 715d67
-					    DRM_GEM_VRAM_PL_FLAG_TOPDOWN);
Thomas Zimmermann 715d67
-		if (ret)
Thomas Zimmermann 715d67
-			goto err_drm_gem_vram_put;
Thomas Zimmermann 715d67
-		ret = drm_gem_vram_vmap(gbo, &map);
Thomas Zimmermann 715d67
-		if (ret)
Thomas Zimmermann 715d67
-			goto err_drm_gem_vram_unpin;
Thomas Zimmermann 715d67
-		off = drm_gem_vram_offset(gbo);
Thomas Zimmermann 715d67
-		if (off < 0) {
Thomas Zimmermann 715d67
-			ret = off;
Thomas Zimmermann 715d67
-			goto err_drm_gem_vram_vunmap;
Thomas Zimmermann 715d67
-		}
Thomas Zimmermann 715d67
-		ast_cursor_plane->hwc[i].gbo = gbo;
Thomas Zimmermann 715d67
-		ast_cursor_plane->hwc[i].map = map;
Thomas Zimmermann 715d67
-		ast_cursor_plane->hwc[i].off = off;
Thomas Zimmermann 715d67
+	gbo = drm_gem_vram_create(dev, size, 0);
Thomas Zimmermann 715d67
+	if (IS_ERR(gbo))
Thomas Zimmermann 715d67
+		return PTR_ERR(gbo);
Thomas Zimmermann 715d67
+
Thomas Zimmermann 715d67
+	ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM |
Thomas Zimmermann 715d67
+				    DRM_GEM_VRAM_PL_FLAG_TOPDOWN);
Thomas Zimmermann 715d67
+	if (ret)
Thomas Zimmermann 715d67
+		goto err_drm_gem_vram_put;
Thomas Zimmermann 715d67
+	ret = drm_gem_vram_vmap(gbo, &map);
Thomas Zimmermann 715d67
+	if (ret)
Thomas Zimmermann 715d67
+		goto err_drm_gem_vram_unpin;
Thomas Zimmermann 715d67
+	off = drm_gem_vram_offset(gbo);
Thomas Zimmermann 715d67
+	if (off < 0) {
Thomas Zimmermann 715d67
+		ret = off;
Thomas Zimmermann 715d67
+		goto err_drm_gem_vram_vunmap;
Thomas Zimmermann 715d67
 	}
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
+	ast_cursor_plane->gbo = gbo;
Thomas Zimmermann 715d67
+	ast_cursor_plane->map = map;
Thomas Zimmermann 715d67
+	ast_cursor_plane->off = off;
Thomas Zimmermann 715d67
+
Thomas Zimmermann 715d67
 	/*
Thomas Zimmermann 715d67
 	 * Create the cursor plane. The plane's destroy callback will release
Thomas Zimmermann 715d67
 	 * the backing storages' BO memory.
Thomas Zimmermann 715d67
@@ -992,24 +979,18 @@ static int ast_cursor_plane_init(struct ast_private *ast)
Thomas Zimmermann 715d67
 				       NULL, DRM_PLANE_TYPE_CURSOR, NULL);
Thomas Zimmermann 715d67
 	if (ret) {
Thomas Zimmermann 715d67
 		drm_err(dev, "drm_universal_plane failed(): %d\n", ret);
Thomas Zimmermann 715d67
-		goto err_hwc;
Thomas Zimmermann 715d67
+		goto err_drm_gem_vram_vunmap;
Thomas Zimmermann 715d67
 	}
Thomas Zimmermann 715d67
 	drm_plane_helper_add(cursor_plane, &ast_cursor_plane_helper_funcs);
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
 	return 0;
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
-err_hwc:
Thomas Zimmermann 715d67
-	while (i) {
Thomas Zimmermann 715d67
-		--i;
Thomas Zimmermann 715d67
-		gbo = ast_cursor_plane->hwc[i].gbo;
Thomas Zimmermann 715d67
-		map = ast_cursor_plane->hwc[i].map;
Thomas Zimmermann 715d67
 err_drm_gem_vram_vunmap:
Thomas Zimmermann 715d67
-		drm_gem_vram_vunmap(gbo, &map);
Thomas Zimmermann 715d67
+	drm_gem_vram_vunmap(gbo, &map);
Thomas Zimmermann 715d67
 err_drm_gem_vram_unpin:
Thomas Zimmermann 715d67
-		drm_gem_vram_unpin(gbo);
Thomas Zimmermann 715d67
+	drm_gem_vram_unpin(gbo);
Thomas Zimmermann 715d67
 err_drm_gem_vram_put:
Thomas Zimmermann 715d67
-		drm_gem_vram_put(gbo);
Thomas Zimmermann 715d67
-	}
Thomas Zimmermann 715d67
+	drm_gem_vram_put(gbo);
Thomas Zimmermann 715d67
 	return ret;
Thomas Zimmermann 715d67
 }
Thomas Zimmermann 715d67
 
Thomas Zimmermann 715d67
-- 
Thomas Zimmermann 715d67
2.39.0
Thomas Zimmermann 715d67