From 6575bb5d0d3c7db0d7d293428ecc07cb38e46ecc Mon Sep 17 00:00:00 2001 From: Icenowy Zheng Date: Wed, 12 Aug 2026 23:48:29 +0800 Subject: [PATCH] drm: verisilicon: fix cursor offset field update The 4th argument of regmap_update_bits() expects a pre-shifted register value instead of the field value when it's used to set a single field, however I forgot this when writing the code setting the cursor X/Y offset fields, thus the write operation doesn't happen at all (because of the non-shifted values being masked by regmap_update_bits()). Fix this problem so the cursor is correctly clipped. The framebuffer address is also clipped so the cursor offset problem was previously not discovered, and the framebuffer address deserves another fix for proper cursor behavior when it's clipped. Fixes: 8c4ae2189125 ("drm: verisilicon: add support for cursor planes") Signed-off-by: Icenowy Zheng Reviewed-by: Chen-Yu Tsai Link: https://patch.msgid.link/20260812154829.671777-1-zhengxingda@iscas.ac.cn Signed-off-by: Chen-Yu Tsai --- drivers/gpu/drm/verisilicon/vs_cursor_plane.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/verisilicon/vs_cursor_plane.c b/drivers/gpu/drm/verisilicon/vs_cursor_plane.c index fa4f601dd0c8..4ce311ae4882 100644 --- a/drivers/gpu/drm/verisilicon/vs_cursor_plane.c +++ b/drivers/gpu/drm/verisilicon/vs_cursor_plane.c @@ -199,7 +199,7 @@ static void vs_cursor_plane_atomic_update(struct drm_plane *plane, } else { regmap_update_bits(dc->regs, VSDC_CURSOR_CONFIG(output), VSDC_CURSOR_CONFIG_X_OFF_MASK, - -state->crtc_x); + VSDC_CURSOR_CONFIG_X_OFF(-state->crtc_x)); regmap_update_bits(dc->regs, VSDC_CURSOR_LOCATION(output), VSDC_CURSOR_LOCATION_X_MASK, 0); } @@ -213,7 +213,7 @@ static void vs_cursor_plane_atomic_update(struct drm_plane *plane, } else { regmap_update_bits(dc->regs, VSDC_CURSOR_CONFIG(output), VSDC_CURSOR_CONFIG_Y_OFF_MASK, - -state->crtc_y); + VSDC_CURSOR_CONFIG_Y_OFF(-state->crtc_y)); regmap_update_bits(dc->regs, VSDC_CURSOR_LOCATION(output), VSDC_CURSOR_LOCATION_Y_MASK, 0); }