Lines Matching +full:- +full:- +full:-

10  * the COPYING file in the top-level directory.
17 #include "qemu/error-report.h"
21 #include "vfio-display.h"
30 (sizeof(_ptr->_fld) != \
31 pread(_fd, &(_ptr->_fld), sizeof(_ptr->_fld), \
32 _reg->offset + offsetof(typeof(*_ptr), _fld)))
35 (sizeof(_ptr->_fld) != \
36 pwrite(_fd, &(_ptr->_fld), sizeof(_ptr->_fld), \
37 _reg->offset + offsetof(typeof(*_ptr), _fld)))
43 VFIODisplay *dpy = vdev->dpy; in vfio_display_edid_link_up()
44 int fd = vdev->vbasedev.fd; in vfio_display_edid_link_up()
46 dpy->edid_regs->link_state = VFIO_DEVICE_GFX_LINK_STATE_UP; in vfio_display_edid_link_up()
47 if (pwrite_field(fd, dpy->edid_info, dpy->edid_regs, link_state)) { in vfio_display_edid_link_up()
60 VFIODisplay *dpy = vdev->dpy; in vfio_display_edid_update()
61 int fd = vdev->vbasedev.fd; in vfio_display_edid_update()
63 .maxx = dpy->edid_regs->max_xres, in vfio_display_edid_update()
64 .maxy = dpy->edid_regs->max_yres, in vfio_display_edid_update()
65 .prefx = prefx ?: vdev->display_xres, in vfio_display_edid_update()
66 .prefy = prefy ?: vdev->display_yres, in vfio_display_edid_update()
69 timer_del(dpy->edid_link_timer); in vfio_display_edid_update()
70 dpy->edid_regs->link_state = VFIO_DEVICE_GFX_LINK_STATE_DOWN; in vfio_display_edid_update()
71 if (pwrite_field(fd, dpy->edid_info, dpy->edid_regs, link_state)) { in vfio_display_edid_update()
86 qemu_edid_generate(dpy->edid_blob, in vfio_display_edid_update()
87 dpy->edid_regs->edid_max_size, in vfio_display_edid_update()
91 dpy->edid_regs->edid_size = qemu_edid_size(dpy->edid_blob); in vfio_display_edid_update()
92 if (pwrite_field(fd, dpy->edid_info, dpy->edid_regs, edid_size)) { in vfio_display_edid_update()
95 if (pwrite(fd, dpy->edid_blob, dpy->edid_regs->edid_size, in vfio_display_edid_update()
96 dpy->edid_info->offset + dpy->edid_regs->edid_offset) in vfio_display_edid_update()
97 != dpy->edid_regs->edid_size) { in vfio_display_edid_update()
101 timer_mod(dpy->edid_link_timer, in vfio_display_edid_update()
113 VFIODisplay *dpy = vdev->dpy; in vfio_display_edid_ui_info()
115 if (!dpy->edid_regs) { in vfio_display_edid_ui_info()
119 if (info->width && info->height) { in vfio_display_edid_ui_info()
120 vfio_display_edid_update(vdev, true, info->width, info->height); in vfio_display_edid_ui_info()
128 VFIODisplay *dpy = vdev->dpy; in vfio_display_edid_init()
129 int fd = vdev->vbasedev.fd; in vfio_display_edid_init()
132 ret = vfio_device_get_region_info_type(&vdev->vbasedev, in vfio_display_edid_init()
135 &dpy->edid_info); in vfio_display_edid_init()
142 dpy->edid_regs = g_new0(struct vfio_region_gfx_edid, 1); in vfio_display_edid_init()
143 if (pread_field(fd, dpy->edid_info, dpy->edid_regs, edid_offset)) { in vfio_display_edid_init()
146 if (pread_field(fd, dpy->edid_info, dpy->edid_regs, edid_max_size)) { in vfio_display_edid_init()
149 if (pread_field(fd, dpy->edid_info, dpy->edid_regs, max_xres)) { in vfio_display_edid_init()
152 if (pread_field(fd, dpy->edid_info, dpy->edid_regs, max_yres)) { in vfio_display_edid_init()
156 dpy->edid_blob = g_malloc0(dpy->edid_regs->edid_max_size); in vfio_display_edid_init()
159 if (!vdev->display_xres) { in vfio_display_edid_init()
160 vdev->display_xres = dpy->edid_regs->max_xres; in vfio_display_edid_init()
162 if (!vdev->display_yres) { in vfio_display_edid_init()
163 vdev->display_yres = dpy->edid_regs->max_yres; in vfio_display_edid_init()
166 dpy->edid_link_timer = timer_new_ms(QEMU_CLOCK_REALTIME, in vfio_display_edid_init()
175 g_free(dpy->edid_info); in vfio_display_edid_init()
176 g_free(dpy->edid_regs); in vfio_display_edid_init()
177 dpy->edid_info = NULL; in vfio_display_edid_init()
178 dpy->edid_regs = NULL; in vfio_display_edid_init()
184 if (!dpy->edid_regs) { in vfio_display_edid_exit()
188 g_free(dpy->edid_info); in vfio_display_edid_exit()
189 g_free(dpy->edid_regs); in vfio_display_edid_exit()
190 g_free(dpy->edid_blob); in vfio_display_edid_exit()
191 timer_free(dpy->edid_link_timer); in vfio_display_edid_exit()
197 if (dmabuf->pos_x != plane->x_pos || dmabuf->pos_y != plane->y_pos) { in vfio_display_update_cursor()
198 dmabuf->pos_x = plane->x_pos; in vfio_display_update_cursor()
199 dmabuf->pos_y = plane->y_pos; in vfio_display_update_cursor()
200 dmabuf->pos_updates++; in vfio_display_update_cursor()
202 if (dmabuf->hot_x != plane->x_hot || dmabuf->hot_y != plane->y_hot) { in vfio_display_update_cursor()
203 dmabuf->hot_x = plane->x_hot; in vfio_display_update_cursor()
204 dmabuf->hot_y = plane->y_hot; in vfio_display_update_cursor()
205 dmabuf->hot_updates++; in vfio_display_update_cursor()
212 VFIODisplay *dpy = vdev->dpy; in vfio_display_get_dmabuf()
222 ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_QUERY_GFX_PLANE, &plane); in vfio_display_get_dmabuf()
230 QTAILQ_FOREACH(dmabuf, &dpy->dmabuf.bufs, next) { in vfio_display_get_dmabuf()
231 if (dmabuf->dmabuf_id == plane.dmabuf_id) { in vfio_display_get_dmabuf()
233 QTAILQ_REMOVE(&dpy->dmabuf.bufs, dmabuf, next); in vfio_display_get_dmabuf()
234 QTAILQ_INSERT_HEAD(&dpy->dmabuf.bufs, dmabuf, next); in vfio_display_get_dmabuf()
242 fd = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_GET_GFX_DMABUF, &plane.dmabuf_id); in vfio_display_get_dmabuf()
248 dmabuf->dmabuf_id = plane.dmabuf_id; in vfio_display_get_dmabuf()
249 dmabuf->buf = qemu_dmabuf_new(plane.width, plane.height, &offset, in vfio_display_get_dmabuf()
258 QTAILQ_INSERT_HEAD(&dpy->dmabuf.bufs, dmabuf, next); in vfio_display_get_dmabuf()
264 QTAILQ_REMOVE(&dpy->dmabuf.bufs, dmabuf, next); in vfio_display_free_one_dmabuf()
266 qemu_dmabuf_close(dmabuf->buf); in vfio_display_free_one_dmabuf()
267 dpy_gl_release_dmabuf(dpy->con, dmabuf->buf); in vfio_display_free_one_dmabuf()
268 g_clear_pointer(&dmabuf->buf, qemu_dmabuf_free); in vfio_display_free_one_dmabuf()
274 VFIODisplay *dpy = vdev->dpy; in vfio_display_free_dmabufs()
278 QTAILQ_FOREACH_SAFE(dmabuf, &dpy->dmabuf.bufs, next, tmp) { in vfio_display_free_dmabufs()
280 keep--; in vfio_display_free_dmabufs()
283 assert(dmabuf != dpy->dmabuf.primary); in vfio_display_free_dmabufs()
291 VFIODisplay *dpy = vdev->dpy; in vfio_display_dmabuf_update()
298 if (dpy->ramfb) { in vfio_display_dmabuf_update()
299 ramfb_display_update(dpy->con, dpy->ramfb); in vfio_display_dmabuf_update()
304 width = qemu_dmabuf_get_width(primary->buf); in vfio_display_dmabuf_update()
305 height = qemu_dmabuf_get_height(primary->buf); in vfio_display_dmabuf_update()
307 if (dpy->dmabuf.primary != primary) { in vfio_display_dmabuf_update()
308 dpy->dmabuf.primary = primary; in vfio_display_dmabuf_update()
309 qemu_console_resize(dpy->con, width, height); in vfio_display_dmabuf_update()
310 dpy_gl_scanout_dmabuf(dpy->con, primary->buf); in vfio_display_dmabuf_update()
315 if (dpy->dmabuf.cursor != cursor) { in vfio_display_dmabuf_update()
316 dpy->dmabuf.cursor = cursor; in vfio_display_dmabuf_update()
321 if (cursor && (new_cursor || cursor->hot_updates)) { in vfio_display_dmabuf_update()
322 bool have_hot = (cursor->hot_x != 0xffffffff && in vfio_display_dmabuf_update()
323 cursor->hot_y != 0xffffffff); in vfio_display_dmabuf_update()
324 dpy_gl_cursor_dmabuf(dpy->con, cursor->buf, have_hot, in vfio_display_dmabuf_update()
325 cursor->hot_x, cursor->hot_y); in vfio_display_dmabuf_update()
326 cursor->hot_updates = 0; in vfio_display_dmabuf_update()
328 dpy_gl_cursor_dmabuf(dpy->con, NULL, false, 0, 0); in vfio_display_dmabuf_update()
331 if (cursor && cursor->pos_updates) { in vfio_display_dmabuf_update()
332 dpy_gl_cursor_position(dpy->con, in vfio_display_dmabuf_update()
333 cursor->pos_x, in vfio_display_dmabuf_update()
334 cursor->pos_y); in vfio_display_dmabuf_update()
335 cursor->pos_updates = 0; in vfio_display_dmabuf_update()
338 dpy_gl_update(dpy->con, 0, 0, width, height); in vfio_display_dmabuf_update()
359 error_setg(errp, "vfio-display-dmabuf: opengl not available"); in vfio_display_dmabuf_init()
363 vdev->dpy = g_new0(VFIODisplay, 1); in vfio_display_dmabuf_init()
364 vdev->dpy->con = graphic_console_init(DEVICE(vdev), 0, in vfio_display_dmabuf_init()
367 if (vdev->enable_ramfb) { in vfio_display_dmabuf_init()
368 vdev->dpy->ramfb = ramfb_setup(errp); in vfio_display_dmabuf_init()
369 if (!vdev->dpy->ramfb) { in vfio_display_dmabuf_init()
380 if (QTAILQ_EMPTY(&dpy->dmabuf.bufs)) { in vfio_display_dmabuf_exit()
384 while ((dmabuf = QTAILQ_FIRST(&dpy->dmabuf.bufs)) != NULL) { in vfio_display_dmabuf_exit()
389 /* ---------------------------------------------------------------------- */
392 if (!vdev || !vdev->dpy || !vdev->dpy->con || in vfio_display_reset()
393 !vdev->dpy->dmabuf.primary) { in vfio_display_reset()
397 dpy_gl_scanout_disable(vdev->dpy->con); in vfio_display_reset()
398 vfio_display_dmabuf_exit(vdev->dpy); in vfio_display_reset()
399 dpy_gfx_update_full(vdev->dpy->con); in vfio_display_reset()
405 VFIODisplay *dpy = vdev->dpy; in vfio_display_region_update()
413 ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_QUERY_GFX_PLANE, &plane); in vfio_display_region_update()
420 if (dpy->ramfb) { in vfio_display_region_update()
421 ramfb_display_update(dpy->con, dpy->ramfb); in vfio_display_region_update()
422 dpy->region.surface = NULL; in vfio_display_region_update()
431 if (dpy->region.buffer.size && in vfio_display_region_update()
432 dpy->region.buffer.nr != plane.region_index) { in vfio_display_region_update()
434 vfio_region_exit(&dpy->region.buffer); in vfio_display_region_update()
435 vfio_region_finalize(&dpy->region.buffer); in vfio_display_region_update()
436 dpy->region.surface = NULL; in vfio_display_region_update()
439 if (dpy->region.surface && in vfio_display_region_update()
440 (surface_width(dpy->region.surface) != plane.width || in vfio_display_region_update()
441 surface_height(dpy->region.surface) != plane.height || in vfio_display_region_update()
442 surface_format(dpy->region.surface) != format)) { in vfio_display_region_update()
444 dpy->region.surface = NULL; in vfio_display_region_update()
447 if (!dpy->region.buffer.size) { in vfio_display_region_update()
449 ret = vfio_region_setup(OBJECT(vdev), &vdev->vbasedev, in vfio_display_region_update()
450 &dpy->region.buffer, in vfio_display_region_update()
455 __func__, plane.region_index, strerror(-ret)); in vfio_display_region_update()
458 ret = vfio_region_mmap(&dpy->region.buffer); in vfio_display_region_update()
461 plane.region_index, strerror(-ret)); in vfio_display_region_update()
464 assert(dpy->region.buffer.mmaps[0].mmap != NULL); in vfio_display_region_update()
467 if (dpy->region.surface == NULL) { in vfio_display_region_update()
469 dpy->region.surface = qemu_create_displaysurface_from in vfio_display_region_update()
471 plane.stride, dpy->region.buffer.mmaps[0].mmap); in vfio_display_region_update()
472 dpy_gfx_replace_surface(dpy->con, dpy->region.surface); in vfio_display_region_update()
476 dpy_gfx_update(dpy->con, 0, 0, in vfio_display_region_update()
477 surface_width(dpy->region.surface), in vfio_display_region_update()
478 surface_height(dpy->region.surface)); in vfio_display_region_update()
482 vfio_region_exit(&dpy->region.buffer); in vfio_display_region_update()
483 vfio_region_finalize(&dpy->region.buffer); in vfio_display_region_update()
492 vdev->dpy = g_new0(VFIODisplay, 1); in vfio_display_region_init()
493 vdev->dpy->con = graphic_console_init(DEVICE(vdev), 0, in vfio_display_region_init()
496 if (vdev->enable_ramfb) { in vfio_display_region_init()
497 vdev->dpy->ramfb = ramfb_setup(errp); in vfio_display_region_init()
498 if (!vdev->dpy->ramfb) { in vfio_display_region_init()
507 if (!dpy->region.buffer.size) { in vfio_display_region_exit()
511 vfio_region_exit(&dpy->region.buffer); in vfio_display_region_exit()
512 vfio_region_finalize(&dpy->region.buffer); in vfio_display_region_exit()
515 /* ---------------------------------------------------------------------- */
525 ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_QUERY_GFX_PLANE, &probe); in vfio_display_probe()
533 ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_QUERY_GFX_PLANE, &probe); in vfio_display_probe()
538 if (vdev->display == ON_OFF_AUTO_AUTO) { in vfio_display_probe()
549 if (!vdev->dpy) { in vfio_display_finalize()
553 graphic_console_close(vdev->dpy->con); in vfio_display_finalize()
554 vfio_display_dmabuf_exit(vdev->dpy); in vfio_display_finalize()
555 vfio_display_region_exit(vdev->dpy); in vfio_display_finalize()
556 vfio_display_edid_exit(vdev->dpy); in vfio_display_finalize()
557 g_free(vdev->dpy); in vfio_display_finalize()
563 bool ramfb_exists = dpy->ramfb != NULL; in migrate_needed()