|
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 |
|