Lines Matching full:g
39 virtio_gpu_find_check_resource(VirtIOGPU *g, uint32_t resource_id,
45 void virtio_gpu_update_cursor_data(VirtIOGPU *g, in virtio_gpu_update_cursor_data() argument
53 res = virtio_gpu_find_check_resource(g, resource_id, false, in virtio_gpu_update_cursor_data()
78 static void update_cursor(VirtIOGPU *g, struct virtio_gpu_update_cursor *cursor) in update_cursor() argument
81 VirtIOGPUClass *vgc = VIRTIO_GPU_GET_CLASS(g); in update_cursor()
84 if (cursor->pos.scanout_id >= g->parent_obj.conf.max_outputs) { in update_cursor()
87 s = &g->parent_obj.scanout[cursor->pos.scanout_id]; in update_cursor()
104 vgc->update_cursor_data(g, s, cursor->resource_id); in update_cursor()
117 virtio_gpu_find_resource(VirtIOGPU *g, uint32_t resource_id) in virtio_gpu_find_resource() argument
121 QTAILQ_FOREACH(res, &g->reslist, next) { in virtio_gpu_find_resource()
130 virtio_gpu_find_check_resource(VirtIOGPU *g, uint32_t resource_id, in virtio_gpu_find_check_resource() argument
136 res = virtio_gpu_find_resource(g, resource_id); in virtio_gpu_find_check_resource()
160 void virtio_gpu_ctrl_response(VirtIOGPU *g, in virtio_gpu_ctrl_response() argument
180 virtio_notify(VIRTIO_DEVICE(g), cmd->vq); in virtio_gpu_ctrl_response()
184 void virtio_gpu_ctrl_response_nodata(VirtIOGPU *g, in virtio_gpu_ctrl_response_nodata() argument
192 virtio_gpu_ctrl_response(g, cmd, &resp, sizeof(resp)); in virtio_gpu_ctrl_response_nodata()
195 void virtio_gpu_get_display_info(VirtIOGPU *g, in virtio_gpu_get_display_info() argument
203 virtio_gpu_base_fill_display_info(VIRTIO_GPU_BASE(g), &display_info); in virtio_gpu_get_display_info()
204 virtio_gpu_ctrl_response(g, cmd, &display_info.hdr, in virtio_gpu_get_display_info()
208 void virtio_gpu_get_edid(VirtIOGPU *g, in virtio_gpu_get_edid() argument
213 VirtIOGPUBase *b = VIRTIO_GPU_BASE(g); in virtio_gpu_get_edid()
226 virtio_gpu_base_generate_edid(VIRTIO_GPU_BASE(g), get_edid.scanout, &edid); in virtio_gpu_get_edid()
227 virtio_gpu_ctrl_response(g, cmd, &edid.hdr, sizeof(edid)); in virtio_gpu_get_edid()
242 static void virtio_gpu_resource_create_2d(VirtIOGPU *g, in virtio_gpu_resource_create_2d() argument
261 res = virtio_gpu_find_resource(g, c2d.resource_id); in virtio_gpu_resource_create_2d()
287 if (res->hostmem + g->hostmem < g->conf_max_hostmem) { in virtio_gpu_resource_create_2d()
311 QTAILQ_INSERT_HEAD(&g->reslist, res, next); in virtio_gpu_resource_create_2d()
312 g->hostmem += res->hostmem; in virtio_gpu_resource_create_2d()
315 static void virtio_gpu_resource_create_blob(VirtIOGPU *g, in virtio_gpu_resource_create_blob() argument
341 if (virtio_gpu_find_resource(g, cblob.resource_id)) { in virtio_gpu_resource_create_blob()
352 ret = virtio_gpu_create_mapping_iov(g, cblob.nr_entries, sizeof(cblob), in virtio_gpu_resource_create_blob()
362 QTAILQ_INSERT_HEAD(&g->reslist, res, next); in virtio_gpu_resource_create_blob()
365 void virtio_gpu_disable_scanout(VirtIOGPU *g, int scanout_id) in virtio_gpu_disable_scanout() argument
367 struct virtio_gpu_scanout *scanout = &g->parent_obj.scanout[scanout_id]; in virtio_gpu_disable_scanout()
374 res = virtio_gpu_find_resource(g, scanout->resource_id); in virtio_gpu_disable_scanout()
386 static void virtio_gpu_resource_destroy(VirtIOGPU *g, in virtio_gpu_resource_destroy() argument
393 for (i = 0; i < g->parent_obj.conf.max_outputs; i++) { in virtio_gpu_resource_destroy()
395 virtio_gpu_disable_scanout(g, i); in virtio_gpu_resource_destroy()
401 virtio_gpu_cleanup_mapping(g, res); in virtio_gpu_resource_destroy()
402 QTAILQ_REMOVE(&g->reslist, res, next); in virtio_gpu_resource_destroy()
403 g->hostmem -= res->hostmem; in virtio_gpu_resource_destroy()
407 static void virtio_gpu_resource_unref(VirtIOGPU *g, in virtio_gpu_resource_unref() argument
417 res = virtio_gpu_find_resource(g, unref.resource_id); in virtio_gpu_resource_unref()
428 virtio_gpu_resource_destroy(g, res, NULL); in virtio_gpu_resource_unref()
431 static void virtio_gpu_transfer_to_host_2d(VirtIOGPU *g, in virtio_gpu_transfer_to_host_2d() argument
445 res = virtio_gpu_find_check_resource(g, t2d.resource_id, true, in virtio_gpu_transfer_to_host_2d()
488 static void virtio_gpu_resource_flush(VirtIOGPU *g, in virtio_gpu_resource_flush() argument
504 res = virtio_gpu_find_check_resource(g, rf.resource_id, false, in virtio_gpu_resource_flush()
511 for (i = 0; i < g->parent_obj.conf.max_outputs; i++) { in virtio_gpu_resource_flush()
512 scanout = &g->parent_obj.scanout[i]; in virtio_gpu_resource_flush()
557 for (i = 0; i < g->parent_obj.conf.max_outputs; i++) { in virtio_gpu_resource_flush()
563 scanout = &g->parent_obj.scanout[i]; in virtio_gpu_resource_flush()
571 dpy_gfx_update(g->parent_obj.scanout[i].con, in virtio_gpu_resource_flush()
582 void virtio_gpu_update_scanout(VirtIOGPU *g, in virtio_gpu_update_scanout() argument
591 scanout = &g->parent_obj.scanout[scanout_id]; in virtio_gpu_update_scanout()
592 ores = virtio_gpu_find_resource(g, scanout->resource_id); in virtio_gpu_update_scanout()
606 static bool virtio_gpu_do_set_scanout(VirtIOGPU *g, in virtio_gpu_do_set_scanout() argument
616 scanout = &g->parent_obj.scanout[scanout_id]; in virtio_gpu_do_set_scanout()
635 g->parent_obj.enable = 1; in virtio_gpu_do_set_scanout()
639 if (!virtio_gpu_update_dmabuf(g, scanout_id, res, fb, r)) { in virtio_gpu_do_set_scanout()
640 virtio_gpu_update_scanout(g, scanout_id, res, fb, r); in virtio_gpu_do_set_scanout()
675 dpy_gfx_replace_surface(g->parent_obj.scanout[scanout_id].con, in virtio_gpu_do_set_scanout()
679 virtio_gpu_update_scanout(g, scanout_id, res, fb, r); in virtio_gpu_do_set_scanout()
683 static void virtio_gpu_set_scanout(VirtIOGPU *g, in virtio_gpu_set_scanout() argument
695 if (ss.scanout_id >= g->parent_obj.conf.max_outputs) { in virtio_gpu_set_scanout()
703 virtio_gpu_disable_scanout(g, ss.scanout_id); in virtio_gpu_set_scanout()
707 res = virtio_gpu_find_check_resource(g, ss.resource_id, true, in virtio_gpu_set_scanout()
720 virtio_gpu_do_set_scanout(g, ss.scanout_id, in virtio_gpu_set_scanout()
759 static void virtio_gpu_set_scanout_blob(VirtIOGPU *g, in virtio_gpu_set_scanout_blob() argument
772 if (ss.scanout_id >= g->parent_obj.conf.max_outputs) { in virtio_gpu_set_scanout_blob()
780 virtio_gpu_disable_scanout(g, ss.scanout_id); in virtio_gpu_set_scanout_blob()
784 res = virtio_gpu_find_check_resource(g, ss.resource_id, true, in virtio_gpu_set_scanout_blob()
795 virtio_gpu_do_set_scanout(g, ss.scanout_id, in virtio_gpu_set_scanout_blob()
799 int virtio_gpu_create_mapping_iov(VirtIOGPU *g, in virtio_gpu_create_mapping_iov() argument
840 map = dma_memory_map(VIRTIO_DEVICE(g)->dma_as, a, &len, in virtio_gpu_create_mapping_iov()
846 virtio_gpu_cleanup_mapping_iov(g, *iov, v); in virtio_gpu_create_mapping_iov()
879 void virtio_gpu_cleanup_mapping_iov(VirtIOGPU *g, in virtio_gpu_cleanup_mapping_iov() argument
885 dma_memory_unmap(VIRTIO_DEVICE(g)->dma_as, in virtio_gpu_cleanup_mapping_iov()
893 void virtio_gpu_cleanup_mapping(VirtIOGPU *g, in virtio_gpu_cleanup_mapping() argument
896 virtio_gpu_cleanup_mapping_iov(g, res->iov, res->iov_cnt); in virtio_gpu_cleanup_mapping()
908 virtio_gpu_resource_attach_backing(VirtIOGPU *g, in virtio_gpu_resource_attach_backing() argument
919 res = virtio_gpu_find_resource(g, ab.resource_id); in virtio_gpu_resource_attach_backing()
932 ret = virtio_gpu_create_mapping_iov(g, ab.nr_entries, sizeof(ab), cmd, in virtio_gpu_resource_attach_backing()
941 virtio_gpu_resource_detach_backing(VirtIOGPU *g, in virtio_gpu_resource_detach_backing() argument
951 res = virtio_gpu_find_check_resource(g, detach.resource_id, true, in virtio_gpu_resource_detach_backing()
956 virtio_gpu_cleanup_mapping(g, res); in virtio_gpu_resource_detach_backing()
959 void virtio_gpu_simple_process_cmd(VirtIOGPU *g, in virtio_gpu_simple_process_cmd() argument
967 virtio_gpu_get_display_info(g, cmd); in virtio_gpu_simple_process_cmd()
970 virtio_gpu_get_edid(g, cmd); in virtio_gpu_simple_process_cmd()
973 virtio_gpu_resource_create_2d(g, cmd); in virtio_gpu_simple_process_cmd()
976 if (!virtio_gpu_blob_enabled(g->parent_obj.conf)) { in virtio_gpu_simple_process_cmd()
980 virtio_gpu_resource_create_blob(g, cmd); in virtio_gpu_simple_process_cmd()
983 virtio_gpu_resource_unref(g, cmd); in virtio_gpu_simple_process_cmd()
986 virtio_gpu_resource_flush(g, cmd); in virtio_gpu_simple_process_cmd()
989 virtio_gpu_transfer_to_host_2d(g, cmd); in virtio_gpu_simple_process_cmd()
992 virtio_gpu_set_scanout(g, cmd); in virtio_gpu_simple_process_cmd()
995 if (!virtio_gpu_blob_enabled(g->parent_obj.conf)) { in virtio_gpu_simple_process_cmd()
999 virtio_gpu_set_scanout_blob(g, cmd); in virtio_gpu_simple_process_cmd()
1002 virtio_gpu_resource_attach_backing(g, cmd); in virtio_gpu_simple_process_cmd()
1005 virtio_gpu_resource_detach_backing(g, cmd); in virtio_gpu_simple_process_cmd()
1012 if (!g->parent_obj.renderer_blocked) { in virtio_gpu_simple_process_cmd()
1013 virtio_gpu_ctrl_response_nodata(g, cmd, cmd->error ? cmd->error : in virtio_gpu_simple_process_cmd()
1021 VirtIOGPU *g = VIRTIO_GPU(vdev); in virtio_gpu_handle_ctrl_cb() local
1022 qemu_bh_schedule(g->ctrl_bh); in virtio_gpu_handle_ctrl_cb()
1027 VirtIOGPU *g = VIRTIO_GPU(vdev); in virtio_gpu_handle_cursor_cb() local
1028 qemu_bh_schedule(g->cursor_bh); in virtio_gpu_handle_cursor_cb()
1031 void virtio_gpu_process_cmdq(VirtIOGPU *g) in virtio_gpu_process_cmdq() argument
1034 VirtIOGPUClass *vgc = VIRTIO_GPU_GET_CLASS(g); in virtio_gpu_process_cmdq()
1036 if (g->processing_cmdq) { in virtio_gpu_process_cmdq()
1039 g->processing_cmdq = true; in virtio_gpu_process_cmdq()
1040 while (!QTAILQ_EMPTY(&g->cmdq)) { in virtio_gpu_process_cmdq()
1041 cmd = QTAILQ_FIRST(&g->cmdq); in virtio_gpu_process_cmdq()
1043 if (g->parent_obj.renderer_blocked) { in virtio_gpu_process_cmdq()
1048 vgc->process_cmd(g, cmd); in virtio_gpu_process_cmdq()
1056 QTAILQ_REMOVE(&g->cmdq, cmd, next); in virtio_gpu_process_cmdq()
1057 if (virtio_gpu_stats_enabled(g->parent_obj.conf)) { in virtio_gpu_process_cmdq()
1058 g->stats.requests++; in virtio_gpu_process_cmdq()
1062 QTAILQ_INSERT_TAIL(&g->fenceq, cmd, next); in virtio_gpu_process_cmdq()
1063 g->inflight++; in virtio_gpu_process_cmdq()
1064 if (virtio_gpu_stats_enabled(g->parent_obj.conf)) { in virtio_gpu_process_cmdq()
1065 if (g->stats.max_inflight < g->inflight) { in virtio_gpu_process_cmdq()
1066 g->stats.max_inflight = g->inflight; in virtio_gpu_process_cmdq()
1068 trace_virtio_gpu_inc_inflight_fences(g->inflight); in virtio_gpu_process_cmdq()
1074 g->processing_cmdq = false; in virtio_gpu_process_cmdq()
1077 static void virtio_gpu_process_fenceq(VirtIOGPU *g) in virtio_gpu_process_fenceq() argument
1081 QTAILQ_FOREACH_SAFE(cmd, &g->fenceq, next, tmp) { in virtio_gpu_process_fenceq()
1083 virtio_gpu_ctrl_response_nodata(g, cmd, VIRTIO_GPU_RESP_OK_NODATA); in virtio_gpu_process_fenceq()
1084 QTAILQ_REMOVE(&g->fenceq, cmd, next); in virtio_gpu_process_fenceq()
1086 g->inflight--; in virtio_gpu_process_fenceq()
1087 if (virtio_gpu_stats_enabled(g->parent_obj.conf)) { in virtio_gpu_process_fenceq()
1088 trace_virtio_gpu_dec_inflight_fences(g->inflight); in virtio_gpu_process_fenceq()
1095 VirtIOGPU *g = container_of(b, VirtIOGPU, parent_obj); in virtio_gpu_handle_gl_flushed() local
1097 virtio_gpu_process_fenceq(g); in virtio_gpu_handle_gl_flushed()
1098 virtio_gpu_process_cmdq(g); in virtio_gpu_handle_gl_flushed()
1103 VirtIOGPU *g = VIRTIO_GPU(vdev); in virtio_gpu_handle_ctrl() local
1115 QTAILQ_INSERT_TAIL(&g->cmdq, cmd, next); in virtio_gpu_handle_ctrl()
1119 virtio_gpu_process_cmdq(g); in virtio_gpu_handle_ctrl()
1124 VirtIOGPU *g = opaque; in virtio_gpu_ctrl_bh() local
1125 VirtIOGPUClass *vgc = VIRTIO_GPU_GET_CLASS(g); in virtio_gpu_ctrl_bh()
1127 vgc->handle_ctrl(VIRTIO_DEVICE(g), g->ctrl_vq); in virtio_gpu_ctrl_bh()
1132 VirtIOGPU *g = VIRTIO_GPU(vdev); in virtio_gpu_handle_cursor() local
1154 update_cursor(g, &cursor_info); in virtio_gpu_handle_cursor()
1164 VirtIOGPU *g = opaque; in virtio_gpu_cursor_bh() local
1165 virtio_gpu_handle_cursor(&g->parent_obj.parent_obj, g->cursor_vq); in virtio_gpu_cursor_bh()
1224 VirtIOGPU *g = opaque; in virtio_gpu_save() local
1229 assert(QTAILQ_EMPTY(&g->cmdq)); in virtio_gpu_save()
1231 QTAILQ_FOREACH(res, &g->reslist, next) { in virtio_gpu_save()
1249 return vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL); in virtio_gpu_save()
1252 static bool virtio_gpu_load_restore_mapping(VirtIOGPU *g, in virtio_gpu_load_restore_mapping() argument
1260 dma_memory_map(VIRTIO_DEVICE(g)->dma_as, res->addrs[i], &len, in virtio_gpu_load_restore_mapping()
1266 dma_memory_unmap(VIRTIO_DEVICE(g)->dma_as, res->iov[i].iov_base, in virtio_gpu_load_restore_mapping()
1271 virtio_gpu_cleanup_mapping(g, res); in virtio_gpu_load_restore_mapping()
1276 QTAILQ_INSERT_HEAD(&g->reslist, res, next); in virtio_gpu_load_restore_mapping()
1277 g->hostmem += res->hostmem; in virtio_gpu_load_restore_mapping()
1284 VirtIOGPU *g = opaque; in virtio_gpu_load() local
1289 g->hostmem = 0; in virtio_gpu_load()
1293 res = virtio_gpu_find_resource(g, resource_id); in virtio_gpu_load()
1336 if (!virtio_gpu_load_restore_mapping(g, res)) { in virtio_gpu_load()
1346 vmstate_load_state(f, &vmstate_virtio_gpu_scanouts, g, 1); in virtio_gpu_load()
1354 VirtIOGPU *g = opaque; in virtio_gpu_blob_save() local
1359 assert(QTAILQ_EMPTY(&g->cmdq)); in virtio_gpu_blob_save()
1361 QTAILQ_FOREACH(res, &g->reslist, next) { in virtio_gpu_blob_save()
1382 VirtIOGPU *g = opaque; in virtio_gpu_blob_load() local
1389 res = virtio_gpu_find_resource(g, resource_id); in virtio_gpu_blob_load()
1407 if (!virtio_gpu_load_restore_mapping(g, res)) { in virtio_gpu_blob_load()
1422 VirtIOGPU *g = opaque; in virtio_gpu_post_load() local
1427 for (i = 0; i < g->parent_obj.conf.max_outputs; i++) { in virtio_gpu_post_load()
1428 scanout = &g->parent_obj.scanout[i]; in virtio_gpu_post_load()
1433 res = virtio_gpu_find_resource(g, scanout->resource_id); in virtio_gpu_post_load()
1447 if (!virtio_gpu_do_set_scanout(g, i, &scanout->fb, res, &r, &error)) { in virtio_gpu_post_load()
1462 update_cursor(g, &scanout->cursor); in virtio_gpu_post_load()
1473 VirtIOGPU *g = VIRTIO_GPU(qdev); in virtio_gpu_device_realize() local
1475 if (virtio_gpu_blob_enabled(g->parent_obj.conf)) { in virtio_gpu_device_realize()
1476 if (!virtio_gpu_rutabaga_enabled(g->parent_obj.conf) && in virtio_gpu_device_realize()
1477 !virtio_gpu_virgl_enabled(g->parent_obj.conf) && in virtio_gpu_device_realize()
1485 if (virtio_gpu_virgl_enabled(g->parent_obj.conf)) { in virtio_gpu_device_realize()
1493 if (virtio_gpu_venus_enabled(g->parent_obj.conf)) { in virtio_gpu_device_realize()
1496 if (!virtio_gpu_blob_enabled(g->parent_obj.conf) || in virtio_gpu_device_realize()
1497 !virtio_gpu_hostmem_enabled(g->parent_obj.conf)) { in virtio_gpu_device_realize()
1515 g->ctrl_vq = virtio_get_queue(vdev, 0); in virtio_gpu_device_realize()
1516 g->cursor_vq = virtio_get_queue(vdev, 1); in virtio_gpu_device_realize()
1517 g->ctrl_bh = virtio_bh_new_guarded(qdev, virtio_gpu_ctrl_bh, g); in virtio_gpu_device_realize()
1518 g->cursor_bh = virtio_bh_new_guarded(qdev, virtio_gpu_cursor_bh, g); in virtio_gpu_device_realize()
1519 g->reset_bh = qemu_bh_new(virtio_gpu_reset_bh, g); in virtio_gpu_device_realize()
1520 qemu_cond_init(&g->reset_cond); in virtio_gpu_device_realize()
1521 QTAILQ_INIT(&g->reslist); in virtio_gpu_device_realize()
1522 QTAILQ_INIT(&g->cmdq); in virtio_gpu_device_realize()
1523 QTAILQ_INIT(&g->fenceq); in virtio_gpu_device_realize()
1528 VirtIOGPU *g = VIRTIO_GPU(qdev); in virtio_gpu_device_unrealize() local
1530 g_clear_pointer(&g->ctrl_bh, qemu_bh_delete); in virtio_gpu_device_unrealize()
1531 g_clear_pointer(&g->cursor_bh, qemu_bh_delete); in virtio_gpu_device_unrealize()
1532 g_clear_pointer(&g->reset_bh, qemu_bh_delete); in virtio_gpu_device_unrealize()
1533 qemu_cond_destroy(&g->reset_cond); in virtio_gpu_device_unrealize()
1539 VirtIOGPU *g = VIRTIO_GPU(opaque); in virtio_gpu_reset_bh() local
1540 VirtIOGPUClass *vgc = VIRTIO_GPU_GET_CLASS(g); in virtio_gpu_reset_bh()
1546 QTAILQ_FOREACH_SAFE(res, &g->reslist, next, tmp) { in virtio_gpu_reset_bh()
1548 vgc->resource_destroy(g, res, &local_err); in virtio_gpu_reset_bh()
1552 __func__, object_get_typename(OBJECT(g)), in virtio_gpu_reset_bh()
1560 for (i = 0; i < g->parent_obj.conf.max_outputs; i++) { in virtio_gpu_reset_bh()
1561 dpy_gfx_replace_surface(g->parent_obj.scanout[i].con, NULL); in virtio_gpu_reset_bh()
1564 g->reset_finished = true; in virtio_gpu_reset_bh()
1565 qemu_cond_signal(&g->reset_cond); in virtio_gpu_reset_bh()
1570 VirtIOGPU *g = VIRTIO_GPU(vdev); in virtio_gpu_reset() local
1574 g->reset_finished = false; in virtio_gpu_reset()
1575 qemu_bh_schedule(g->reset_bh); in virtio_gpu_reset()
1576 while (!g->reset_finished) { in virtio_gpu_reset()
1577 qemu_cond_wait_bql(&g->reset_cond); in virtio_gpu_reset()
1580 aio_bh_call(g->reset_bh); in virtio_gpu_reset()
1583 while (!QTAILQ_EMPTY(&g->cmdq)) { in virtio_gpu_reset()
1584 cmd = QTAILQ_FIRST(&g->cmdq); in virtio_gpu_reset()
1585 QTAILQ_REMOVE(&g->cmdq, cmd, next); in virtio_gpu_reset()
1589 while (!QTAILQ_EMPTY(&g->fenceq)) { in virtio_gpu_reset()
1590 cmd = QTAILQ_FIRST(&g->fenceq); in virtio_gpu_reset()
1591 QTAILQ_REMOVE(&g->fenceq, cmd, next); in virtio_gpu_reset()
1592 g->inflight--; in virtio_gpu_reset()
1602 VirtIOGPUBase *g = VIRTIO_GPU_BASE(vdev); in virtio_gpu_get_config() local
1604 memcpy(config, &g->virtio_config, sizeof(g->virtio_config)); in virtio_gpu_get_config()
1610 VirtIOGPUBase *g = VIRTIO_GPU_BASE(vdev); in virtio_gpu_set_config() local
1615 g->virtio_config.events_read &= ~vgconfig->events_clear; in virtio_gpu_set_config()
1621 VirtIOGPU *g = VIRTIO_GPU(opaque); in virtio_gpu_blob_state_needed() local
1623 return virtio_gpu_blob_enabled(g->parent_obj.conf); in virtio_gpu_blob_state_needed()