aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_display.c71
1 files changed, 13 insertions, 58 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
index ac8ea7dbf7b0..ac758cdbc1bc 100644
--- a/drivers/gpu/drm/virtio/virtgpu_display.c
+++ b/drivers/gpu/drm/virtio/virtgpu_display.c
@@ -38,56 +38,11 @@
38#define XRES_MAX 8192 38#define XRES_MAX 8192
39#define YRES_MAX 8192 39#define YRES_MAX 8192
40 40
41static int virtio_gpu_page_flip(struct drm_crtc *crtc,
42 struct drm_framebuffer *fb,
43 struct drm_pending_vblank_event *event,
44 uint32_t flags)
45{
46 struct virtio_gpu_device *vgdev = crtc->dev->dev_private;
47 struct virtio_gpu_output *output =
48 container_of(crtc, struct virtio_gpu_output, crtc);
49 struct drm_plane *plane = crtc->primary;
50 struct virtio_gpu_framebuffer *vgfb;
51 struct virtio_gpu_object *bo;
52 unsigned long irqflags;
53 uint32_t handle;
54
55 plane->fb = fb;
56 vgfb = to_virtio_gpu_framebuffer(plane->fb);
57 bo = gem_to_virtio_gpu_obj(vgfb->obj);
58 handle = bo->hw_res_handle;
59
60 DRM_DEBUG("handle 0x%x%s, crtc %dx%d\n", handle,
61 bo->dumb ? ", dumb" : "",
62 crtc->mode.hdisplay, crtc->mode.vdisplay);
63 if (bo->dumb) {
64 virtio_gpu_cmd_transfer_to_host_2d
65 (vgdev, handle, 0,
66 cpu_to_le32(crtc->mode.hdisplay),
67 cpu_to_le32(crtc->mode.vdisplay),
68 0, 0, NULL);
69 }
70 virtio_gpu_cmd_set_scanout(vgdev, output->index, handle,
71 crtc->mode.hdisplay,
72 crtc->mode.vdisplay, 0, 0);
73 virtio_gpu_cmd_resource_flush(vgdev, handle, 0, 0,
74 crtc->mode.hdisplay,
75 crtc->mode.vdisplay);
76
77 if (event) {
78 spin_lock_irqsave(&crtc->dev->event_lock, irqflags);
79 drm_crtc_send_vblank_event(crtc, event);
80 spin_unlock_irqrestore(&crtc->dev->event_lock, irqflags);
81 }
82
83 return 0;
84}
85
86static const struct drm_crtc_funcs virtio_gpu_crtc_funcs = { 41static const struct drm_crtc_funcs virtio_gpu_crtc_funcs = {
87 .set_config = drm_atomic_helper_set_config, 42 .set_config = drm_atomic_helper_set_config,
88 .destroy = drm_crtc_cleanup, 43 .destroy = drm_crtc_cleanup,
89 44
90 .page_flip = virtio_gpu_page_flip, 45 .page_flip = drm_atomic_helper_page_flip,
91 .reset = drm_atomic_helper_crtc_reset, 46 .reset = drm_atomic_helper_crtc_reset,
92 .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, 47 .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
93 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, 48 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
@@ -185,6 +140,7 @@ static void virtio_gpu_crtc_atomic_flush(struct drm_crtc *crtc,
185 spin_lock_irqsave(&crtc->dev->event_lock, flags); 140 spin_lock_irqsave(&crtc->dev->event_lock, flags);
186 if (crtc->state->event) 141 if (crtc->state->event)
187 drm_crtc_send_vblank_event(crtc, crtc->state->event); 142 drm_crtc_send_vblank_event(crtc, crtc->state->event);
143 crtc->state->event = NULL;
188 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 144 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
189} 145}
190 146
@@ -378,30 +334,28 @@ virtio_gpu_user_framebuffer_create(struct drm_device *dev,
378 return &virtio_gpu_fb->base; 334 return &virtio_gpu_fb->base;
379} 335}
380 336
381static int vgdev_atomic_commit(struct drm_device *dev, 337static void vgdev_atomic_commit_tail(struct drm_atomic_state *state)
382 struct drm_atomic_state *state,
383 bool nonblock)
384{ 338{
385 if (nonblock) 339 struct drm_device *dev = state->dev;
386 return -EBUSY;
387
388 drm_atomic_helper_swap_state(state, true);
389 drm_atomic_helper_wait_for_fences(dev, state);
390 340
391 drm_atomic_helper_commit_modeset_disables(dev, state); 341 drm_atomic_helper_commit_modeset_disables(dev, state);
392 drm_atomic_helper_commit_modeset_enables(dev, state); 342 drm_atomic_helper_commit_modeset_enables(dev, state);
393 drm_atomic_helper_commit_planes(dev, state, true); 343 drm_atomic_helper_commit_planes(dev, state, true);
394 344
345 drm_atomic_helper_commit_hw_done(state);
346
395 drm_atomic_helper_wait_for_vblanks(dev, state); 347 drm_atomic_helper_wait_for_vblanks(dev, state);
396 drm_atomic_helper_cleanup_planes(dev, state); 348 drm_atomic_helper_cleanup_planes(dev, state);
397 drm_atomic_state_free(state);
398 return 0;
399} 349}
400 350
351struct drm_mode_config_helper_funcs virtio_mode_config_helpers = {
352 .atomic_commit_tail = vgdev_atomic_commit_tail,
353};
354
401static const struct drm_mode_config_funcs virtio_gpu_mode_funcs = { 355static const struct drm_mode_config_funcs virtio_gpu_mode_funcs = {
402 .fb_create = virtio_gpu_user_framebuffer_create, 356 .fb_create = virtio_gpu_user_framebuffer_create,
403 .atomic_check = drm_atomic_helper_check, 357 .atomic_check = drm_atomic_helper_check,
404 .atomic_commit = vgdev_atomic_commit, 358 .atomic_commit = drm_atomic_helper_commit,
405}; 359};
406 360
407int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev) 361int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev)
@@ -409,7 +363,8 @@ int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev)
409 int i; 363 int i;
410 364
411 drm_mode_config_init(vgdev->ddev); 365 drm_mode_config_init(vgdev->ddev);
412 vgdev->ddev->mode_config.funcs = (void *)&virtio_gpu_mode_funcs; 366 vgdev->ddev->mode_config.funcs = &virtio_gpu_mode_funcs;
367 vgdev->ddev->mode_config.helper_private = &virtio_mode_config_helpers;
413 368
414 /* modes will be validated against the framebuffer size */ 369 /* modes will be validated against the framebuffer size */
415 vgdev->ddev->mode_config.min_width = XRES_MIN; 370 vgdev->ddev->mode_config.min_width = XRES_MIN;