Merge tag 'drm-misc-next-2020-10-27' of git://anongit.freedesktop.org/drm/drm-misc...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / virtio / virtgpu_object.c
index 00d6b95e259d66ff1e1c258397f8b1f05454b41f..2d3aa7baffe4013a46966460ddd19a276d887d7f 100644 (file)
@@ -31,8 +31,7 @@
 static int virtio_gpu_virglrenderer_workaround = 1;
 module_param_named(virglhack, virtio_gpu_virglrenderer_workaround, int, 0400);
 
-static int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
-                                      uint32_t *resid)
+int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev, uint32_t *resid)
 {
        if (virtio_gpu_virglrenderer_workaround) {
                /*
@@ -84,6 +83,18 @@ void virtio_gpu_cleanup_object(struct virtio_gpu_object *bo)
                }
 
                drm_gem_shmem_free_object(&bo->base.base);
+       } else if (virtio_gpu_is_vram(bo)) {
+               struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo);
+
+               spin_lock(&vgdev->host_visible_lock);
+               if (drm_mm_node_allocated(&vram->vram_node))
+                       drm_mm_remove_node(&vram->vram_node);
+
+               spin_unlock(&vgdev->host_visible_lock);
+
+               drm_gem_free_mmap_offset(&vram->base.base.base);
+               drm_gem_object_release(&vram->base.base.base);
+               kfree(vram);
        }
 }
 
@@ -107,6 +118,7 @@ static const struct drm_gem_object_funcs virtio_gpu_shmem_funcs = {
        .close = virtio_gpu_gem_object_close,
 
        .print_info = drm_gem_shmem_print_info,
+       .export = virtgpu_gem_prime_export,
        .pin = drm_gem_shmem_pin,
        .unpin = drm_gem_shmem_unpin,
        .get_sg_table = drm_gem_shmem_get_sg_table,
@@ -234,21 +246,24 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
                        goto err_put_objs;
        }
 
-       if (params->virgl) {
-               virtio_gpu_cmd_resource_create_3d(vgdev, bo, params,
-                                                 objs, fence);
-       } else {
-               virtio_gpu_cmd_create_resource(vgdev, bo, params,
-                                              objs, fence);
-       }
-
        ret = virtio_gpu_object_shmem_init(vgdev, bo, &ents, &nents);
        if (ret != 0) {
                virtio_gpu_free_object(&shmem_obj->base);
                return ret;
        }
 
-       virtio_gpu_object_attach(vgdev, bo, ents, nents);
+       if (params->blob) {
+               virtio_gpu_cmd_resource_create_blob(vgdev, bo, params,
+                                                   ents, nents);
+       } else if (params->virgl) {
+               virtio_gpu_cmd_resource_create_3d(vgdev, bo, params,
+                                                 objs, fence);
+               virtio_gpu_object_attach(vgdev, bo, ents, nents);
+       } else {
+               virtio_gpu_cmd_create_resource(vgdev, bo, params,
+                                              objs, fence);
+               virtio_gpu_object_attach(vgdev, bo, ents, nents);
+       }
 
        *bo_ptr = bo;
        return 0;