Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/virtio: batch plane updates (pageflip)

Move virtio_gpu_notify() to higher-level functions for
virtio_gpu_cmd_resource_flush(), virtio_gpu_cmd_set_scanout() and
virtio_gpu_cmd_transfer_to_host_{2d,3d}().

virtio_gpu_primary_plane_update() will notify only once for a series
of commands (restores plane update command batching).

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20200214125535.26349-4-kraxel@redhat.com

+6 -4
+2
drivers/gpu/drm/virtio/virtgpu_display.c
··· 90 90 virtio_gpu_cmd_set_scanout(vgdev, output->index, 0, 91 91 crtc->mode.hdisplay, 92 92 crtc->mode.vdisplay, 0, 0); 93 + virtio_gpu_notify(vgdev); 93 94 } 94 95 95 96 static void virtio_gpu_crtc_atomic_enable(struct drm_crtc *crtc, ··· 109 108 struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc); 110 109 111 110 virtio_gpu_cmd_set_scanout(vgdev, output->index, 0, 0, 0, 0, 0); 111 + virtio_gpu_notify(vgdev); 112 112 output->enabled = false; 113 113 } 114 114
+1
drivers/gpu/drm/virtio/virtgpu_ioctl.c
··· 359 359 args->level, &args->box, objs, fence); 360 360 dma_fence_put(&fence->f); 361 361 } 362 + virtio_gpu_notify(vgdev); 362 363 return 0; 363 364 364 365 err_unlock:
+3
drivers/gpu/drm/virtio/virtgpu_plane.c
··· 148 148 plane->state->src_w >> 16, 149 149 plane->state->src_h >> 16, 150 150 0, 0); 151 + virtio_gpu_notify(vgdev); 151 152 return; 152 153 } 153 154 ··· 185 184 rect.y1, 186 185 rect.x2 - rect.x1, 187 186 rect.y2 - rect.y1); 187 + virtio_gpu_notify(vgdev); 188 188 } 189 189 190 190 static int virtio_gpu_cursor_prepare_fb(struct drm_plane *plane, ··· 264 262 plane->state->crtc_w, 265 263 plane->state->crtc_h, 266 264 0, 0, objs, vgfb->fence); 265 + virtio_gpu_notify(vgdev); 267 266 dma_fence_wait(&vgfb->fence->f, true); 268 267 dma_fence_put(&vgfb->fence->f); 269 268 vgfb->fence = NULL;
-4
drivers/gpu/drm/virtio/virtgpu_vq.c
··· 568 568 cmd_p->r.y = cpu_to_le32(y); 569 569 570 570 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); 571 - virtio_gpu_notify(vgdev); 572 571 } 573 572 574 573 void virtio_gpu_cmd_resource_flush(struct virtio_gpu_device *vgdev, ··· 589 590 cmd_p->r.y = cpu_to_le32(y); 590 591 591 592 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); 592 - virtio_gpu_notify(vgdev); 593 593 } 594 594 595 595 void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, ··· 621 623 cmd_p->r.y = cpu_to_le32(y); 622 624 623 625 virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, fence); 624 - virtio_gpu_notify(vgdev); 625 626 } 626 627 627 628 static void ··· 1046 1049 cmd_p->level = cpu_to_le32(level); 1047 1050 1048 1051 virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, fence); 1049 - virtio_gpu_notify(vgdev); 1050 1052 } 1051 1053 1052 1054 void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev,