From 4ee3229bbe6cb0e80f1dedcddda8072bb9cc884f Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Wed, 5 Mar 2025 17:30:43 +0100 Subject: [PATCH] drm/ast: cursor: Add helpers for computing location in video memory The ast drivers stores the cursor image at the end of the video memory. Add helpers to calculate the offset and size. Signed-off-by: Thomas Zimmermann Reviewed-by: Jocelyn Falempe Link: https://patchwork.freedesktop.org/patch/msgid/20250305163207.267650-5-tzimmermann@suse.de --- drivers/gpu/drm/ast/ast_cursor.c | 21 +++++++++++++++++++-- drivers/gpu/drm/ast/ast_drv.h | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/ast/ast_cursor.c b/drivers/gpu/drm/ast/ast_cursor.c index 139ab00dee8f..05e297f30b4e 100644 --- a/drivers/gpu/drm/ast/ast_cursor.c +++ b/drivers/gpu/drm/ast/ast_cursor.c @@ -45,6 +45,21 @@ #define AST_HWC_SIGNATURE_HOTSPOTX 0x14 #define AST_HWC_SIGNATURE_HOTSPOTY 0x18 +static unsigned long ast_cursor_vram_size(void) +{ + return AST_HWC_SIZE + AST_HWC_SIGNATURE_SIZE; +} + +long ast_cursor_vram_offset(struct ast_device *ast) +{ + unsigned long size = ast_cursor_vram_size(); + + if (size > ast->vram_size) + return -EINVAL; + + return PAGE_ALIGN_DOWN(ast->vram_size - size); +} + static u32 ast_cursor_calculate_checksum(const void *src, unsigned int width, unsigned int height) { u32 csum = 0; @@ -276,7 +291,7 @@ int ast_cursor_plane_init(struct ast_device *ast) struct drm_plane *cursor_plane = &ast_plane->base; size_t size; void __iomem *vaddr; - u64 offset; + long offset; int ret; /* @@ -290,7 +305,9 @@ int ast_cursor_plane_init(struct ast_device *ast) return -ENOMEM; vaddr = ast->vram + ast->vram_fb_available - size; - offset = ast->vram_fb_available - size; + offset = ast_cursor_vram_offset(ast); + if (offset < 0) + return offset; ret = ast_plane_init(dev, ast_plane, vaddr, offset, size, 0x01, &ast_cursor_plane_funcs, diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h index 2c7861835cfb..ec9ec77260e9 100644 --- a/drivers/gpu/drm/ast/ast_drv.h +++ b/drivers/gpu/drm/ast/ast_drv.h @@ -432,6 +432,7 @@ int ast_vga_output_init(struct ast_device *ast); int ast_sil164_output_init(struct ast_device *ast); /* ast_cursor.c */ +long ast_cursor_vram_offset(struct ast_device *ast); int ast_cursor_plane_init(struct ast_device *ast); /* ast dp501 */ -- 2.50.1