Re: [PATCH] drm/loongson: Fix framebuffer selection in async cursor updates

From: Icenowy Zheng

Date: Fri Oct 09 2026 - 04:33:45 EST


(Cc'ing drm-misc maintainers)

在 2026-10-03六的 09:00 +0000,Evanshenf写道:
> An asynchronous cursor update swaps the new framebuffer into the live
> plane state. However, the driver reads both old_fb and new_fb from
> the
> live state before this swap. When an enabled cursor changes buffers,
> the
> address-update condition is therefore false and the hardware
> continues
> scanning the previous buffer.
>
> Read new_fb from the new plane state before swapping the framebuffer
> references. This updates the hardware address when the framebuffer
> changes while retaining the existing behavior for cursor movement.
>
> Verified on a Loongson 3A5000 with LS7A2000 using 32x32 and 64x64
> legacy
> cursor updates. Callback counters and read-only register observations
> confirmed the asynchronous path, the stale address before the change,
> and the new address afterward. Same-framebuffer movement and cursor
> disable/re-enable also passed, with the primary framebuffer and mode
> unchanged.
>
> AI assistance was used to investigate the existing report, prepare
> the
> fix and test tools, run the build and hardware comparison, and draft
> this message.
>
> Reported-by: kernel test robot <lkp@xxxxxxxxx>
> Closes:
> https://lore.kernel.org/r/202311152357.4KFS0M8f-lkp@xxxxxxxxx/
> Fixes: f39db26c5428 ("drm: Add kms driver for loongson display
> controller")
> Cc: stable@xxxxxxxxxxxxxxx
> Assisted-by: LLM
> Signed-off-by: Evanshenf <archwse@xxxxxxxxx>
> ---
>  drivers/gpu/drm/loongson/lsdc_plane.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/loongson/lsdc_plane.c
> b/drivers/gpu/drm/loongson/lsdc_plane.c
> index bcc0ffa..7b9c65c 100644
> --- a/drivers/gpu/drm/loongson/lsdc_plane.c
> +++ b/drivers/gpu/drm/loongson/lsdc_plane.c
> @@ -230,7 +230,7 @@ static void
> lsdc_cursor_plane_atomic_async_update(struct drm_plane *plane,
>  
>   new_state = drm_atomic_get_new_plane_state(state, plane);
>  
> - new_fb = plane->state->fb;
> + new_fb = new_state->fb;

This change looks okay, although I don't know whether the
atomic_async_update() hook should be implemented at all now.

```
Reviewed-by: Icenowy Zheng <zhengxingda@xxxxxxxxxxx>
```

However, please wait for further clarification of the function itself
from drm-misc maintainers.

Thanks,
Icenowy

>  
>   plane->state->crtc_x = new_state->crtc_x;
>   plane->state->crtc_y = new_state->crtc_y;
>
> base-commit: bca45af5998a05f34b13a2ef11e639bac9c62643