Skip to content

Commit

Permalink
drm/virtio: wait for pageflip event for atomic disable
Browse files Browse the repository at this point in the history
make sure virtio gpu receive page flip event when doing atomic disable.

Tracked-On: OAM-130135
Signed-off-by: Xue, Bosheng <[email protected]>
  • Loading branch information
bosheng1 committed Feb 20, 2025
1 parent 201b713 commit 722ff55
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 0 deletions.
3 changes: 3 additions & 0 deletions drivers/gpu/drm/virtio/virtgpu_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,12 @@ static void virtio_gpu_crtc_atomic_disable(struct drm_crtc *crtc,
struct virtio_gpu_device *vgdev = dev->dev_private;
struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc);
const unsigned pipe = drm_crtc_index(crtc);
struct drm_vblank_crtc *vblank = &dev->vblank[pipe];

struct drm_pending_vblank_event *e = xchg(&vgdev->cache_event[pipe], NULL);
/* Send cached event even it's still premature. */
if (e) {
wait_for_completion_interruptible_timeout(&vgdev->notify[pipe], nsecs_to_jiffies(vblank->framedur_ns));
spin_lock_irq(&dev->event_lock);
drm_crtc_send_vblank_event(crtc, e);
spin_unlock_irq(&dev->event_lock);
Expand Down Expand Up @@ -172,6 +174,7 @@ static void virtio_gpu_crtc_atomic_begin(struct drm_crtc *crtc,
spin_unlock_irq(&drm->event_lock);
drm_crtc_vblank_put(crtc);
}
init_completion(&vgdev->notify[pipe]);
}
crtc->state->event = NULL;
}
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/virtio/virtgpu_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ struct virtio_gpu_device {

struct virtio_gpu_output outputs[VIRTIO_GPU_MAX_SCANOUTS];
struct drm_pending_vblank_event *cache_event[VIRTIO_GPU_MAX_SCANOUTS];
struct completion notify[VIRTIO_GPU_MAX_SCANOUTS];
atomic64_t flip_sequence[VIRTIO_GPU_MAX_SCANOUTS];
uint32_t num_scanouts;
uint32_t num_vblankq;
Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/virtio/virtgpu_vq.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,15 @@ void virtio_gpu_vblank_ack(struct virtqueue *vq)

if (drm_vblank_passed(atomic64_read(&vgdev->flip_sequence[target]),
e->sequence)) {
complete(&vgdev->notify[target]);
spin_lock_irqsave(&dev->event_lock, irqflags);
drm_crtc_send_vblank_event(&vgdev->outputs[target].crtc, e);
spin_unlock_irqrestore(&dev->event_lock, irqflags);
drm_crtc_vblank_put(&vgdev->outputs[target].crtc);
} else {
WARN_ON((e = xchg(&vgdev->cache_event[target], e)) != NULL);
if (e) {
complete(&vgdev->notify[target]);
/* Should not come here ever, just in case... */
spin_lock_irqsave(&dev->event_lock, irqflags);
drm_crtc_send_vblank_event(&vgdev->outputs[target].crtc, e);
Expand Down

0 comments on commit 722ff55

Please sign in to comment.