diff options
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_display.c | 71 |
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 | ||
| 41 | static 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 | |||
| 86 | static const struct drm_crtc_funcs virtio_gpu_crtc_funcs = { | 41 | static 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 | ||
| 381 | static int vgdev_atomic_commit(struct drm_device *dev, | 337 | static 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 | ||
| 351 | struct drm_mode_config_helper_funcs virtio_mode_config_helpers = { | ||
| 352 | .atomic_commit_tail = vgdev_atomic_commit_tail, | ||
| 353 | }; | ||
| 354 | |||
| 401 | static const struct drm_mode_config_funcs virtio_gpu_mode_funcs = { | 355 | static 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 | ||
| 407 | int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev) | 361 | int 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; |
