mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
virtio-vga: fix reset.
Store reset handler of the parent class and just call that for a complete virtio reset. When taking the shortcut and calling virtio_gpu_reset() directly the generic virtio reset code (for virtqueues etc) will not be executed. Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1597621 Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Message-id: 20190307080244.9011-3-kraxel@redhat.com
This commit is contained in:
parent
8ea90ee690
commit
3912e66a3f
1 changed files with 15 additions and 2 deletions
|
@ -12,6 +12,10 @@
|
||||||
#define TYPE_VIRTIO_VGA "virtio-vga"
|
#define TYPE_VIRTIO_VGA "virtio-vga"
|
||||||
#define VIRTIO_VGA(obj) \
|
#define VIRTIO_VGA(obj) \
|
||||||
OBJECT_CHECK(VirtIOVGA, (obj), TYPE_VIRTIO_VGA)
|
OBJECT_CHECK(VirtIOVGA, (obj), TYPE_VIRTIO_VGA)
|
||||||
|
#define VIRTIO_VGA_GET_CLASS(obj) \
|
||||||
|
OBJECT_GET_CLASS(VirtIOVGAClass, obj, TYPE_VIRTIO_VGA)
|
||||||
|
#define VIRTIO_VGA_CLASS(klass) \
|
||||||
|
OBJECT_CLASS_CHECK(VirtIOVGAClass, klass, TYPE_VIRTIO_VGA)
|
||||||
|
|
||||||
typedef struct VirtIOVGA {
|
typedef struct VirtIOVGA {
|
||||||
VirtIOPCIProxy parent_obj;
|
VirtIOPCIProxy parent_obj;
|
||||||
|
@ -20,6 +24,11 @@ typedef struct VirtIOVGA {
|
||||||
MemoryRegion vga_mrs[3];
|
MemoryRegion vga_mrs[3];
|
||||||
} VirtIOVGA;
|
} VirtIOVGA;
|
||||||
|
|
||||||
|
typedef struct VirtIOVGAClass {
|
||||||
|
VirtioPCIClass parent_class;
|
||||||
|
DeviceReset parent_reset;
|
||||||
|
} VirtIOVGAClass;
|
||||||
|
|
||||||
static void virtio_vga_invalidate_display(void *opaque)
|
static void virtio_vga_invalidate_display(void *opaque)
|
||||||
{
|
{
|
||||||
VirtIOVGA *vvga = opaque;
|
VirtIOVGA *vvga = opaque;
|
||||||
|
@ -168,10 +177,11 @@ static void virtio_vga_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
|
||||||
|
|
||||||
static void virtio_vga_reset(DeviceState *dev)
|
static void virtio_vga_reset(DeviceState *dev)
|
||||||
{
|
{
|
||||||
|
VirtIOVGAClass *klass = VIRTIO_VGA_GET_CLASS(dev);
|
||||||
VirtIOVGA *vvga = VIRTIO_VGA(dev);
|
VirtIOVGA *vvga = VIRTIO_VGA(dev);
|
||||||
|
|
||||||
/* reset virtio-gpu */
|
/* reset virtio-gpu */
|
||||||
virtio_gpu_reset(VIRTIO_DEVICE(&vvga->vdev));
|
klass->parent_reset(dev);
|
||||||
|
|
||||||
/* reset vga */
|
/* reset vga */
|
||||||
vga_common_reset(&vvga->vga);
|
vga_common_reset(&vvga->vga);
|
||||||
|
@ -187,13 +197,15 @@ static void virtio_vga_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
|
VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
|
||||||
|
VirtIOVGAClass *v = VIRTIO_VGA_CLASS(klass);
|
||||||
PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
|
PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
|
||||||
|
|
||||||
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
||||||
dc->props = virtio_vga_properties;
|
dc->props = virtio_vga_properties;
|
||||||
dc->reset = virtio_vga_reset;
|
|
||||||
dc->vmsd = &vmstate_virtio_vga;
|
dc->vmsd = &vmstate_virtio_vga;
|
||||||
dc->hotpluggable = false;
|
dc->hotpluggable = false;
|
||||||
|
device_class_set_parent_reset(dc, virtio_vga_reset,
|
||||||
|
&v->parent_reset);
|
||||||
|
|
||||||
k->realize = virtio_vga_realize;
|
k->realize = virtio_vga_realize;
|
||||||
pcidev_k->romfile = "vgabios-virtio.bin";
|
pcidev_k->romfile = "vgabios-virtio.bin";
|
||||||
|
@ -212,6 +224,7 @@ static VirtioPCIDeviceTypeInfo virtio_vga_info = {
|
||||||
.generic_name = TYPE_VIRTIO_VGA,
|
.generic_name = TYPE_VIRTIO_VGA,
|
||||||
.instance_size = sizeof(struct VirtIOVGA),
|
.instance_size = sizeof(struct VirtIOVGA),
|
||||||
.instance_init = virtio_vga_inst_initfn,
|
.instance_init = virtio_vga_inst_initfn,
|
||||||
|
.class_size = sizeof(struct VirtIOVGAClass),
|
||||||
.class_init = virtio_vga_class_init,
|
.class_init = virtio_vga_class_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue