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

From: wuqianhai

Date: Fri Oct 09 2026 - 21:36:03 EST


Reviewed-by: Qianhai Wu <wuqianhai@xxxxxxxxxxx>

The fix is correct.

Thanks,
Qianhai Wu

在 2026/10/9 16:33, Icenowy Zheng 写道:
(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