drm/virtio: track virtual output state
authorGerd Hoffmann <kraxel@redhat.com>
Mon, 13 Aug 2018 15:28:55 +0000 (17:28 +0200)
committerGerd Hoffmann <kraxel@redhat.com>
Wed, 5 Sep 2018 06:26:24 +0000 (08:26 +0200)
Track whenever an virtual output (crtc) is enabled or disabled.

On atomic updates check for both framebuffer being present and crtc
being enabled to figure whenever the output is active or not.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20180813152855.12863-1-kraxel@redhat.com
drivers/gpu/drm/virtio/virtgpu_display.c
drivers/gpu/drm/virtio/virtgpu_drv.h
drivers/gpu/drm/virtio/virtgpu_plane.c

index 25503b93359910f16caa1c64cbe14f7030c2a7c6..9f1e0a669d4c0a2ad07438472c03d806bbbb3bee 100644 (file)
@@ -109,6 +109,9 @@ static void virtio_gpu_crtc_mode_set_nofb(struct drm_crtc *crtc)
 static void virtio_gpu_crtc_atomic_enable(struct drm_crtc *crtc,
                                          struct drm_crtc_state *old_state)
 {
+       struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc);
+
+       output->enabled = true;
 }
 
 static void virtio_gpu_crtc_atomic_disable(struct drm_crtc *crtc,
@@ -119,6 +122,7 @@ static void virtio_gpu_crtc_atomic_disable(struct drm_crtc *crtc,
        struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc);
 
        virtio_gpu_cmd_set_scanout(vgdev, output->index, 0, 0, 0, 0, 0);
+       output->enabled = false;
 }
 
 static int virtio_gpu_crtc_atomic_check(struct drm_crtc *crtc,
index 61767f9589f4ed9024d2e0849374ef56b2278191..b6b5768773e628fdda54e1bc7f9d79907d5ef278 100644 (file)
@@ -114,6 +114,7 @@ struct virtio_gpu_output {
        struct virtio_gpu_update_cursor cursor;
        int cur_x;
        int cur_y;
+       bool enabled;
 };
 #define drm_crtc_to_virtio_gpu_output(x) \
        container_of(x, struct virtio_gpu_output, crtc)
index dc5b5b2b7aab3f470ed9c3035cc7edc62790d478..88f2fb8c61c48dfacf430b3265dac74e645a9539 100644 (file)
@@ -152,7 +152,7 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
        if (WARN_ON(!output))
                return;
 
-       if (plane->state->fb) {
+       if (plane->state->fb && output->enabled) {
                vgfb = to_virtio_gpu_framebuffer(plane->state->fb);
                bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
                handle = bo->hw_res_handle;