Merge v5.9-rc1 into drm-misc-next
[sfrench/cifs-2.6.git] / drivers / gpu / drm / virtio / virtgpu_vq.c
index 73854915ec349b6b405cebd2813c2fd63c85711a..c93c2db35aaf318d601ee90f23ee42fbf82b647a 100644 (file)
@@ -599,7 +599,7 @@ void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev,
        struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(objs->objs[0]);
        struct virtio_gpu_transfer_to_host_2d *cmd_p;
        struct virtio_gpu_vbuffer *vbuf;
-       bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev);
+       bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev);
        struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo);
 
        if (use_dma_api)
@@ -1015,7 +1015,7 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
        struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(objs->objs[0]);
        struct virtio_gpu_transfer_host_3d *cmd_p;
        struct virtio_gpu_vbuffer *vbuf;
-       bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev);
+       bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev);
        struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo);
 
        if (use_dma_api)
@@ -1087,14 +1087,13 @@ void virtio_gpu_cmd_submit(struct virtio_gpu_device *vgdev,
        virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, fence);
 }
 
-int virtio_gpu_object_attach(struct virtio_gpu_device *vgdev,
-                            struct virtio_gpu_object *obj,
-                            struct virtio_gpu_mem_entry *ents,
-                            unsigned int nents)
+void virtio_gpu_object_attach(struct virtio_gpu_device *vgdev,
+                             struct virtio_gpu_object *obj,
+                             struct virtio_gpu_mem_entry *ents,
+                             unsigned int nents)
 {
        virtio_gpu_cmd_resource_attach_backing(vgdev, obj->hw_res_handle,
                                               ents, nents, NULL);
-       return 0;
 }
 
 void virtio_gpu_cursor_ping(struct virtio_gpu_device *vgdev,
@@ -1108,3 +1107,58 @@ void virtio_gpu_cursor_ping(struct virtio_gpu_device *vgdev,
        memcpy(cur_p, &output->cursor, sizeof(output->cursor));
        virtio_gpu_queue_cursor(vgdev, vbuf);
 }
+
+static void virtio_gpu_cmd_resource_uuid_cb(struct virtio_gpu_device *vgdev,
+                                           struct virtio_gpu_vbuffer *vbuf)
+{
+       struct virtio_gpu_object *obj =
+               gem_to_virtio_gpu_obj(vbuf->objs->objs[0]);
+       struct virtio_gpu_resp_resource_uuid *resp =
+               (struct virtio_gpu_resp_resource_uuid *)vbuf->resp_buf;
+       uint32_t resp_type = le32_to_cpu(resp->hdr.type);
+
+       spin_lock(&vgdev->resource_export_lock);
+       WARN_ON(obj->uuid_state != UUID_INITIALIZING);
+
+       if (resp_type == VIRTIO_GPU_RESP_OK_RESOURCE_UUID &&
+           obj->uuid_state == UUID_INITIALIZING) {
+               memcpy(&obj->uuid.b, resp->uuid, sizeof(obj->uuid.b));
+               obj->uuid_state = UUID_INITIALIZED;
+       } else {
+               obj->uuid_state = UUID_INITIALIZATION_FAILED;
+       }
+       spin_unlock(&vgdev->resource_export_lock);
+
+       wake_up_all(&vgdev->resp_wq);
+}
+
+int
+virtio_gpu_cmd_resource_assign_uuid(struct virtio_gpu_device *vgdev,
+                                   struct virtio_gpu_object_array *objs)
+{
+       struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(objs->objs[0]);
+       struct virtio_gpu_resource_assign_uuid *cmd_p;
+       struct virtio_gpu_vbuffer *vbuf;
+       struct virtio_gpu_resp_resource_uuid *resp_buf;
+
+       resp_buf = kzalloc(sizeof(*resp_buf), GFP_KERNEL);
+       if (!resp_buf) {
+               spin_lock(&vgdev->resource_export_lock);
+               bo->uuid_state = UUID_INITIALIZATION_FAILED;
+               spin_unlock(&vgdev->resource_export_lock);
+               virtio_gpu_array_put_free(objs);
+               return -ENOMEM;
+       }
+
+       cmd_p = virtio_gpu_alloc_cmd_resp
+               (vgdev, virtio_gpu_cmd_resource_uuid_cb, &vbuf, sizeof(*cmd_p),
+                sizeof(struct virtio_gpu_resp_resource_uuid), resp_buf);
+       memset(cmd_p, 0, sizeof(*cmd_p));
+
+       cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID);
+       cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
+
+       vbuf->objs = objs;
+       virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+       return 0;
+}