drm/qxl: track primary bo
authorGerd Hoffmann <kraxel@redhat.com>
Fri, 18 Jan 2019 12:20:09 +0000 (13:20 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Mon, 28 Jan 2019 13:24:53 +0000 (14:24 +0100)
Track which bo is used as primary surface.  With that in place we don't
need the primary_created flag any more, we can just check the primary bo
pointer instead.

Also verify we don't already have a primary surface in
qxl_io_create_primary().

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20190118122020.27596-13-kraxel@redhat.com
drivers/gpu/drm/qxl/qxl_cmd.c
drivers/gpu/drm/qxl/qxl_display.c
drivers/gpu/drm/qxl/qxl_drv.h

index bc13539249fc08d8f949b0656154a4d7765fa1b5..8e64127259465dd2dc8317425fd92a8a6f75a617 100644 (file)
@@ -374,13 +374,16 @@ void qxl_io_flush_surfaces(struct qxl_device *qdev)
 void qxl_io_destroy_primary(struct qxl_device *qdev)
 {
        wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC);
-       qdev->primary_created = false;
+       qdev->primary_bo = NULL;
 }
 
 void qxl_io_create_primary(struct qxl_device *qdev, struct qxl_bo *bo)
 {
        struct qxl_surface_create *create;
 
+       if (WARN_ON(qdev->primary_bo))
+               return;
+
        DRM_DEBUG_DRIVER("qdev %p, ram_header %p\n", qdev, qdev->ram_header);
        create = &qdev->ram_header->create_surface;
        create->format = bo->surf.format;
@@ -399,7 +402,7 @@ void qxl_io_create_primary(struct qxl_device *qdev, struct qxl_bo *bo)
        create->type = QXL_SURF_TYPE_PRIMARY;
 
        wait_for_io_cmd(qdev, 0, QXL_IO_CREATE_PRIMARY_ASYNC);
-       qdev->primary_created = true;
+       qdev->primary_bo = bo;
 }
 
 void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id)
index 8153e9e478d39dda59d64d93fcf882d57410f662..a0db9078882437be549f5ca0d392744d03cfdd21 100644 (file)
@@ -302,7 +302,7 @@ static void qxl_crtc_update_monitors_config(struct drm_crtc *crtc,
        struct qxl_head head;
        int oldcount, i = qcrtc->index;
 
-       if (!qdev->primary_created) {
+       if (!qdev->primary_bo) {
                DRM_DEBUG_KMS("no primary surface, skip (%s)\n", reason);
                return;
        }
index cb767aaef63047222f45e03c3a8b036a50dd9d07..150b1a4f667a17abdcdc78442f53896df1d7b682 100644 (file)
@@ -229,7 +229,7 @@ struct qxl_device {
 
        struct qxl_ram_header *ram_header;
 
-       unsigned int primary_created:1;
+       struct qxl_bo *primary_bo;
 
        struct qxl_memslot main_slot;
        struct qxl_memslot surfaces_slot;