xref: /qemu/hw/display/virtio-gpu-pci.c (revision fc48ffc3)
1 /*
2  * Virtio video device
3  *
4  * Copyright Red Hat
5  *
6  * Authors:
7  *  Dave Airlie
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2.  See
10  * the COPYING file in the top-level directory.
11  *
12  */
13 #include "hw/pci/pci.h"
14 #include "hw/virtio/virtio.h"
15 #include "hw/virtio/virtio-bus.h"
16 #include "hw/virtio/virtio-pci.h"
17 #include "hw/virtio/virtio-gpu.h"
18 
19 static Property virtio_gpu_pci_properties[] = {
20     DEFINE_VIRTIO_GPU_PROPERTIES(VirtIOGPUPCI, vdev.conf),
21     DEFINE_VIRTIO_GPU_PCI_PROPERTIES(VirtIOPCIProxy),
22     DEFINE_PROP_END_OF_LIST(),
23 };
24 
25 static void virtio_gpu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
26 {
27     VirtIOGPUPCI *vgpu = VIRTIO_GPU_PCI(vpci_dev);
28     DeviceState *vdev = DEVICE(&vgpu->vdev);
29 
30     qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
31     /* force virtio-1.0 */
32     vpci_dev->flags &= ~VIRTIO_PCI_FLAG_DISABLE_MODERN;
33     vpci_dev->flags |= VIRTIO_PCI_FLAG_DISABLE_LEGACY;
34     object_property_set_bool(OBJECT(vdev), true, "realized", errp);
35 }
36 
37 static void virtio_gpu_pci_class_init(ObjectClass *klass, void *data)
38 {
39     DeviceClass *dc = DEVICE_CLASS(klass);
40     VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
41     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
42 
43     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
44     dc->props = virtio_gpu_pci_properties;
45     k->realize = virtio_gpu_pci_realize;
46     pcidev_k->class_id = PCI_CLASS_DISPLAY_OTHER;
47 }
48 
49 static void virtio_gpu_initfn(Object *obj)
50 {
51     VirtIOGPUPCI *dev = VIRTIO_GPU_PCI(obj);
52     object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_GPU);
53     object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
54 }
55 
56 static const TypeInfo virtio_gpu_pci_info = {
57     .name = TYPE_VIRTIO_GPU_PCI,
58     .parent = TYPE_VIRTIO_PCI,
59     .instance_size = sizeof(VirtIOGPUPCI),
60     .instance_init = virtio_gpu_initfn,
61     .class_init = virtio_gpu_pci_class_init,
62 };
63 
64 static void virtio_gpu_pci_register_types(void)
65 {
66     type_register_static(&virtio_gpu_pci_info);
67 }
68 type_init(virtio_gpu_pci_register_types)
69