Lines Matching refs:vgdev

41 void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,  in virtio_gpu_resource_id_get()  argument
47 spin_lock(&vgdev->resource_idr_lock); in virtio_gpu_resource_id_get()
48 handle = idr_alloc(&vgdev->resource_idr, NULL, 1, 0, GFP_NOWAIT); in virtio_gpu_resource_id_get()
49 spin_unlock(&vgdev->resource_idr_lock); in virtio_gpu_resource_id_get()
54 void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id) in virtio_gpu_resource_id_put() argument
56 spin_lock(&vgdev->resource_idr_lock); in virtio_gpu_resource_id_put()
57 idr_remove(&vgdev->resource_idr, id); in virtio_gpu_resource_id_put()
58 spin_unlock(&vgdev->resource_idr_lock); in virtio_gpu_resource_id_put()
64 struct virtio_gpu_device *vgdev = dev->dev_private; in virtio_gpu_ctrl_ack() local
66 schedule_work(&vgdev->ctrlq.dequeue_work); in virtio_gpu_ctrl_ack()
72 struct virtio_gpu_device *vgdev = dev->dev_private; in virtio_gpu_cursor_ack() local
74 schedule_work(&vgdev->cursorq.dequeue_work); in virtio_gpu_cursor_ack()
77 int virtio_gpu_alloc_vbufs(struct virtio_gpu_device *vgdev) in virtio_gpu_alloc_vbufs() argument
79 vgdev->vbufs = kmem_cache_create("virtio-gpu-vbufs", in virtio_gpu_alloc_vbufs()
83 if (!vgdev->vbufs) in virtio_gpu_alloc_vbufs()
88 void virtio_gpu_free_vbufs(struct virtio_gpu_device *vgdev) in virtio_gpu_free_vbufs() argument
90 kmem_cache_destroy(vgdev->vbufs); in virtio_gpu_free_vbufs()
91 vgdev->vbufs = NULL; in virtio_gpu_free_vbufs()
95 virtio_gpu_get_vbuf(struct virtio_gpu_device *vgdev, in virtio_gpu_get_vbuf() argument
101 vbuf = kmem_cache_alloc(vgdev->vbufs, GFP_KERNEL); in virtio_gpu_get_vbuf()
120 static void *virtio_gpu_alloc_cmd(struct virtio_gpu_device *vgdev, in virtio_gpu_alloc_cmd() argument
126 vbuf = virtio_gpu_get_vbuf(vgdev, size, in virtio_gpu_alloc_cmd()
138 virtio_gpu_alloc_cursor(struct virtio_gpu_device *vgdev, in virtio_gpu_alloc_cursor() argument
144 (vgdev, sizeof(struct virtio_gpu_update_cursor), in virtio_gpu_alloc_cursor()
154 static void *virtio_gpu_alloc_cmd_resp(struct virtio_gpu_device *vgdev, in virtio_gpu_alloc_cmd_resp() argument
162 vbuf = virtio_gpu_get_vbuf(vgdev, cmd_size, in virtio_gpu_alloc_cmd_resp()
172 static void free_vbuf(struct virtio_gpu_device *vgdev, in free_vbuf() argument
178 kmem_cache_free(vgdev->vbufs, vbuf); in free_vbuf()
197 struct virtio_gpu_device *vgdev = in virtio_gpu_dequeue_ctrl_func() local
206 spin_lock(&vgdev->ctrlq.qlock); in virtio_gpu_dequeue_ctrl_func()
208 virtqueue_disable_cb(vgdev->ctrlq.vq); in virtio_gpu_dequeue_ctrl_func()
209 reclaim_vbufs(vgdev->ctrlq.vq, &reclaim_list); in virtio_gpu_dequeue_ctrl_func()
211 } while (!virtqueue_enable_cb(vgdev->ctrlq.vq)); in virtio_gpu_dequeue_ctrl_func()
212 spin_unlock(&vgdev->ctrlq.qlock); in virtio_gpu_dequeue_ctrl_func()
229 entry->resp_cb(vgdev, entry); in virtio_gpu_dequeue_ctrl_func()
232 free_vbuf(vgdev, entry); in virtio_gpu_dequeue_ctrl_func()
234 wake_up(&vgdev->ctrlq.ack_queue); in virtio_gpu_dequeue_ctrl_func()
237 virtio_gpu_fence_event_process(vgdev, fence_id); in virtio_gpu_dequeue_ctrl_func()
242 struct virtio_gpu_device *vgdev = in virtio_gpu_dequeue_cursor_func() local
249 spin_lock(&vgdev->cursorq.qlock); in virtio_gpu_dequeue_cursor_func()
251 virtqueue_disable_cb(vgdev->cursorq.vq); in virtio_gpu_dequeue_cursor_func()
252 reclaim_vbufs(vgdev->cursorq.vq, &reclaim_list); in virtio_gpu_dequeue_cursor_func()
253 } while (!virtqueue_enable_cb(vgdev->cursorq.vq)); in virtio_gpu_dequeue_cursor_func()
254 spin_unlock(&vgdev->cursorq.qlock); in virtio_gpu_dequeue_cursor_func()
258 free_vbuf(vgdev, entry); in virtio_gpu_dequeue_cursor_func()
260 wake_up(&vgdev->cursorq.ack_queue); in virtio_gpu_dequeue_cursor_func()
263 static int virtio_gpu_queue_ctrl_buffer_locked(struct virtio_gpu_device *vgdev, in virtio_gpu_queue_ctrl_buffer_locked() argument
265 __releases(&vgdev->ctrlq.qlock) in virtio_gpu_queue_ctrl_buffer_locked()
266 __acquires(&vgdev->ctrlq.qlock) in virtio_gpu_queue_ctrl_buffer_locked()
268 struct virtqueue *vq = vgdev->ctrlq.vq; in virtio_gpu_queue_ctrl_buffer_locked()
273 if (!vgdev->vqs_ready) in virtio_gpu_queue_ctrl_buffer_locked()
295 spin_unlock(&vgdev->ctrlq.qlock); in virtio_gpu_queue_ctrl_buffer_locked()
296 wait_event(vgdev->ctrlq.ack_queue, vq->num_free >= outcnt + incnt); in virtio_gpu_queue_ctrl_buffer_locked()
297 spin_lock(&vgdev->ctrlq.qlock); in virtio_gpu_queue_ctrl_buffer_locked()
308 static int virtio_gpu_queue_ctrl_buffer(struct virtio_gpu_device *vgdev, in virtio_gpu_queue_ctrl_buffer() argument
313 spin_lock(&vgdev->ctrlq.qlock); in virtio_gpu_queue_ctrl_buffer()
314 rc = virtio_gpu_queue_ctrl_buffer_locked(vgdev, vbuf); in virtio_gpu_queue_ctrl_buffer()
315 spin_unlock(&vgdev->ctrlq.qlock); in virtio_gpu_queue_ctrl_buffer()
319 static int virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev, in virtio_gpu_queue_fenced_ctrl_buffer() argument
324 struct virtqueue *vq = vgdev->ctrlq.vq; in virtio_gpu_queue_fenced_ctrl_buffer()
328 spin_lock(&vgdev->ctrlq.qlock); in virtio_gpu_queue_fenced_ctrl_buffer()
339 spin_unlock(&vgdev->ctrlq.qlock); in virtio_gpu_queue_fenced_ctrl_buffer()
340 wait_event(vgdev->ctrlq.ack_queue, vq->num_free >= 3); in virtio_gpu_queue_fenced_ctrl_buffer()
345 virtio_gpu_fence_emit(vgdev, hdr, fence); in virtio_gpu_queue_fenced_ctrl_buffer()
346 rc = virtio_gpu_queue_ctrl_buffer_locked(vgdev, vbuf); in virtio_gpu_queue_fenced_ctrl_buffer()
347 spin_unlock(&vgdev->ctrlq.qlock); in virtio_gpu_queue_fenced_ctrl_buffer()
351 static int virtio_gpu_queue_cursor(struct virtio_gpu_device *vgdev, in virtio_gpu_queue_cursor() argument
354 struct virtqueue *vq = vgdev->cursorq.vq; in virtio_gpu_queue_cursor()
359 if (!vgdev->vqs_ready) in virtio_gpu_queue_cursor()
366 spin_lock(&vgdev->cursorq.qlock); in virtio_gpu_queue_cursor()
370 spin_unlock(&vgdev->cursorq.qlock); in virtio_gpu_queue_cursor()
371 wait_event(vgdev->cursorq.ack_queue, vq->num_free >= outcnt); in virtio_gpu_queue_cursor()
372 spin_lock(&vgdev->cursorq.qlock); in virtio_gpu_queue_cursor()
378 spin_unlock(&vgdev->cursorq.qlock); in virtio_gpu_queue_cursor()
390 void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_create_resource() argument
399 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_create_resource()
408 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_create_resource()
411 void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_unref_resource() argument
417 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_unref_resource()
423 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_unref_resource()
426 void virtio_gpu_cmd_resource_inval_backing(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_resource_inval_backing() argument
432 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_resource_inval_backing()
438 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_resource_inval_backing()
441 void virtio_gpu_cmd_set_scanout(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_set_scanout() argument
449 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_set_scanout()
460 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_set_scanout()
463 void virtio_gpu_cmd_resource_flush(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_resource_flush() argument
471 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_resource_flush()
481 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_resource_flush()
484 void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_transfer_to_host_2d() argument
493 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_transfer_to_host_2d()
504 virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence); in virtio_gpu_cmd_transfer_to_host_2d()
508 virtio_gpu_cmd_resource_attach_backing(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_resource_attach_backing() argument
517 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_resource_attach_backing()
527 virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence); in virtio_gpu_cmd_resource_attach_backing()
530 static void virtio_gpu_cmd_get_display_info_cb(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_get_display_info_cb() argument
537 spin_lock(&vgdev->display_info_lock); in virtio_gpu_cmd_get_display_info_cb()
538 for (i = 0; i < vgdev->num_scanouts; i++) { in virtio_gpu_cmd_get_display_info_cb()
539 vgdev->outputs[i].info = resp->pmodes[i]; in virtio_gpu_cmd_get_display_info_cb()
551 vgdev->display_info_pending = false; in virtio_gpu_cmd_get_display_info_cb()
552 spin_unlock(&vgdev->display_info_lock); in virtio_gpu_cmd_get_display_info_cb()
553 wake_up(&vgdev->resp_wq); in virtio_gpu_cmd_get_display_info_cb()
555 if (!drm_helper_hpd_irq_event(vgdev->ddev)) in virtio_gpu_cmd_get_display_info_cb()
556 drm_kms_helper_hotplug_event(vgdev->ddev); in virtio_gpu_cmd_get_display_info_cb()
559 static void virtio_gpu_cmd_get_capset_info_cb(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_get_capset_info_cb() argument
568 spin_lock(&vgdev->display_info_lock); in virtio_gpu_cmd_get_capset_info_cb()
569 vgdev->capsets[i].id = le32_to_cpu(resp->capset_id); in virtio_gpu_cmd_get_capset_info_cb()
570 vgdev->capsets[i].max_version = le32_to_cpu(resp->capset_max_version); in virtio_gpu_cmd_get_capset_info_cb()
571 vgdev->capsets[i].max_size = le32_to_cpu(resp->capset_max_size); in virtio_gpu_cmd_get_capset_info_cb()
572 spin_unlock(&vgdev->display_info_lock); in virtio_gpu_cmd_get_capset_info_cb()
573 wake_up(&vgdev->resp_wq); in virtio_gpu_cmd_get_capset_info_cb()
576 static void virtio_gpu_cmd_capset_cb(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_capset_cb() argument
585 spin_lock(&vgdev->display_info_lock); in virtio_gpu_cmd_capset_cb()
586 list_for_each_entry(cache_ent, &vgdev->cap_cache, head) { in virtio_gpu_cmd_capset_cb()
595 spin_unlock(&vgdev->display_info_lock); in virtio_gpu_cmd_capset_cb()
596 wake_up(&vgdev->resp_wq); in virtio_gpu_cmd_capset_cb()
599 int virtio_gpu_cmd_get_display_info(struct virtio_gpu_device *vgdev) in virtio_gpu_cmd_get_display_info() argument
611 (vgdev, &virtio_gpu_cmd_get_display_info_cb, &vbuf, in virtio_gpu_cmd_get_display_info()
616 vgdev->display_info_pending = true; in virtio_gpu_cmd_get_display_info()
618 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_get_display_info()
622 int virtio_gpu_cmd_get_capset_info(struct virtio_gpu_device *vgdev, int idx) in virtio_gpu_cmd_get_capset_info() argument
634 (vgdev, &virtio_gpu_cmd_get_capset_info_cb, &vbuf, in virtio_gpu_cmd_get_capset_info()
641 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_get_capset_info()
645 int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_get_capset() argument
651 int max_size = vgdev->capsets[idx].max_size; in virtio_gpu_cmd_get_capset()
655 if (idx > vgdev->num_capsets) in virtio_gpu_cmd_get_capset()
658 if (version > vgdev->capsets[idx].max_version) in virtio_gpu_cmd_get_capset()
680 cache_ent->id = vgdev->capsets[idx].id; in virtio_gpu_cmd_get_capset()
683 spin_lock(&vgdev->display_info_lock); in virtio_gpu_cmd_get_capset()
684 list_add_tail(&cache_ent->head, &vgdev->cap_cache); in virtio_gpu_cmd_get_capset()
685 spin_unlock(&vgdev->display_info_lock); in virtio_gpu_cmd_get_capset()
688 (vgdev, &virtio_gpu_cmd_capset_cb, &vbuf, sizeof(*cmd_p), in virtio_gpu_cmd_get_capset()
692 cmd_p->capset_id = cpu_to_le32(vgdev->capsets[idx].id); in virtio_gpu_cmd_get_capset()
695 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_get_capset()
700 void virtio_gpu_cmd_context_create(struct virtio_gpu_device *vgdev, uint32_t id, in virtio_gpu_cmd_context_create() argument
706 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_context_create()
714 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_context_create()
717 void virtio_gpu_cmd_context_destroy(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_context_destroy() argument
723 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_context_destroy()
728 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_context_destroy()
731 void virtio_gpu_cmd_context_attach_resource(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_context_attach_resource() argument
738 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_context_attach_resource()
744 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_context_attach_resource()
748 void virtio_gpu_cmd_context_detach_resource(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_context_detach_resource() argument
755 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_context_detach_resource()
761 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf); in virtio_gpu_cmd_context_detach_resource()
765 virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_resource_create_3d() argument
772 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_resource_create_3d()
779 virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence); in virtio_gpu_cmd_resource_create_3d()
782 void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_transfer_to_host_3d() argument
791 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_transfer_to_host_3d()
801 virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence); in virtio_gpu_cmd_transfer_to_host_3d()
804 void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_transfer_from_host_3d() argument
813 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_transfer_from_host_3d()
823 virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence); in virtio_gpu_cmd_transfer_from_host_3d()
826 void virtio_gpu_cmd_submit(struct virtio_gpu_device *vgdev, in virtio_gpu_cmd_submit() argument
833 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); in virtio_gpu_cmd_submit()
843 virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence); in virtio_gpu_cmd_submit()
846 int virtio_gpu_object_attach(struct virtio_gpu_device *vgdev, in virtio_gpu_object_attach() argument
858 ret = virtio_gpu_object_get_sg_table(vgdev, obj); in virtio_gpu_object_attach()
878 virtio_gpu_cmd_resource_attach_backing(vgdev, resource_id, in virtio_gpu_object_attach()
885 void virtio_gpu_cursor_ping(struct virtio_gpu_device *vgdev, in virtio_gpu_cursor_ping() argument
892 cur_p = virtio_gpu_alloc_cursor(vgdev, &vbuf); in virtio_gpu_cursor_ping()
894 virtio_gpu_queue_cursor(vgdev, vbuf); in virtio_gpu_cursor_ping()