xref: /qemu/hw/vfio/display.c (revision a9994687cb9b5f72399398a0985419f4d2b95dc5)
1*a9994687SGerd Hoffmann /*
2*a9994687SGerd Hoffmann  * display support for mdev based vgpu devices
3*a9994687SGerd Hoffmann  *
4*a9994687SGerd Hoffmann  * Copyright Red Hat, Inc. 2017
5*a9994687SGerd Hoffmann  *
6*a9994687SGerd Hoffmann  * Authors:
7*a9994687SGerd Hoffmann  *    Gerd Hoffmann
8*a9994687SGerd Hoffmann  *
9*a9994687SGerd Hoffmann  * This work is licensed under the terms of the GNU GPL, version 2.  See
10*a9994687SGerd Hoffmann  * the COPYING file in the top-level directory.
11*a9994687SGerd Hoffmann  */
12*a9994687SGerd Hoffmann 
13*a9994687SGerd Hoffmann #include "qemu/osdep.h"
14*a9994687SGerd Hoffmann #include <linux/vfio.h>
15*a9994687SGerd Hoffmann #include <sys/ioctl.h>
16*a9994687SGerd Hoffmann 
17*a9994687SGerd Hoffmann #include "sysemu/sysemu.h"
18*a9994687SGerd Hoffmann #include "ui/console.h"
19*a9994687SGerd Hoffmann #include "qapi/error.h"
20*a9994687SGerd Hoffmann #include "pci.h"
21*a9994687SGerd Hoffmann 
22*a9994687SGerd Hoffmann int vfio_display_probe(VFIOPCIDevice *vdev, Error **errp)
23*a9994687SGerd Hoffmann {
24*a9994687SGerd Hoffmann     struct vfio_device_gfx_plane_info probe;
25*a9994687SGerd Hoffmann     int ret;
26*a9994687SGerd Hoffmann 
27*a9994687SGerd Hoffmann     memset(&probe, 0, sizeof(probe));
28*a9994687SGerd Hoffmann     probe.argsz = sizeof(probe);
29*a9994687SGerd Hoffmann     probe.flags = VFIO_GFX_PLANE_TYPE_PROBE | VFIO_GFX_PLANE_TYPE_DMABUF;
30*a9994687SGerd Hoffmann     ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_QUERY_GFX_PLANE, &probe);
31*a9994687SGerd Hoffmann     if (ret == 0) {
32*a9994687SGerd Hoffmann         error_setg(errp, "vfio-display: dmabuf support not implemented yet");
33*a9994687SGerd Hoffmann         return -1;
34*a9994687SGerd Hoffmann     }
35*a9994687SGerd Hoffmann 
36*a9994687SGerd Hoffmann     memset(&probe, 0, sizeof(probe));
37*a9994687SGerd Hoffmann     probe.argsz = sizeof(probe);
38*a9994687SGerd Hoffmann     probe.flags = VFIO_GFX_PLANE_TYPE_PROBE | VFIO_GFX_PLANE_TYPE_REGION;
39*a9994687SGerd Hoffmann     ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_QUERY_GFX_PLANE, &probe);
40*a9994687SGerd Hoffmann     if (ret == 0) {
41*a9994687SGerd Hoffmann         error_setg(errp, "vfio-display: region support not implemented yet");
42*a9994687SGerd Hoffmann         return -1;
43*a9994687SGerd Hoffmann     }
44*a9994687SGerd Hoffmann 
45*a9994687SGerd Hoffmann     if (vdev->display == ON_OFF_AUTO_AUTO) {
46*a9994687SGerd Hoffmann         /* not an error in automatic mode */
47*a9994687SGerd Hoffmann         return 0;
48*a9994687SGerd Hoffmann     }
49*a9994687SGerd Hoffmann 
50*a9994687SGerd Hoffmann     error_setg(errp, "vfio: device doesn't support any (known) display method");
51*a9994687SGerd Hoffmann     return -1;
52*a9994687SGerd Hoffmann }
53*a9994687SGerd Hoffmann 
54*a9994687SGerd Hoffmann void vfio_display_finalize(VFIOPCIDevice *vdev)
55*a9994687SGerd Hoffmann {
56*a9994687SGerd Hoffmann }
57