summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2009-07-07 12:09:58 +0100
committerAnthony Liguori <aliguori@us.ibm.com>2009-07-16 08:28:10 -0500
commit21d58b575e79c5d0739b695b272ea89bb052a7bf (patch)
tree4df2e3d4e8fbc2fe53cf3ef13007b83ad41c73c3 /hw/virtio-pci.c
parentChange default PCI class of virtio-blk to PCI_CLASS_STORAGE_SCSI (diff)
downloadqemu-kvm-21d58b575e79c5d0739b695b272ea89bb052a7bf.tar.gz
qemu-kvm-21d58b575e79c5d0739b695b272ea89bb052a7bf.tar.bz2
qemu-kvm-21d58b575e79c5d0739b695b272ea89bb052a7bf.zip
Change default PCI class of virtio-console to PCI_CLASS_SERIAL_OTHER
We're using PCI_CLASS_DISPLAY_OTHER now, but qemu-kvm.git is using PCI_CLASS_OTHERS because: "As a PCI_CLASS_DISPLAY_OTHER, it reduces primary display somehow on Windows XP (possibly Windows disables acceleration since it fails to find a driver)." While this is valid, many versions of X will get confused by it. Class major number of 0 gets treated as a possibly prehistoric VGA device, and then the autoconfig logic gets confused trying to figure out whether the virtio console or the pv vga device are the real VGA. We should really set a proper class ID. 0x0780 (serial / other) seems most appropriate. This shouldn't require any kernel changes, the modalias for virtio looks like: alias: pci:v00001AF4d*sv*sd*bc*sc*i* so won't care what the base class or subclass are. It shows up in the guest as: 00:05.0 Communication controller: Qumranet, Inc. Virtio console A new qdev type is introduced to allow devices using the old class to be created for compatibility with qemu-0.10.x. Reported-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/virtio-pci.c')
-rw-r--r--hw/virtio-pci.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index 6052c1671..d605b5fb1 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -449,7 +449,8 @@ static void virtio_blk_init_pci_0_10(PCIDevice *pci_dev)
virtio_blk_init_pci_with_class(pci_dev, PCI_CLASS_STORAGE_OTHER);
}
-static void virtio_console_init_pci(PCIDevice *pci_dev)
+static void virtio_console_init_pci_with_class(PCIDevice *pci_dev,
+ uint16_t class_code)
{
VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
VirtIODevice *vdev;
@@ -458,8 +459,17 @@ static void virtio_console_init_pci(PCIDevice *pci_dev)
virtio_init_pci(proxy, vdev,
PCI_VENDOR_ID_REDHAT_QUMRANET,
PCI_DEVICE_ID_VIRTIO_CONSOLE,
- PCI_CLASS_DISPLAY_OTHER,
- 0x00);
+ class_code, 0x00);
+}
+
+static void virtio_console_init_pci(PCIDevice *pci_dev)
+{
+ virtio_console_init_pci_with_class(pci_dev, PCI_CLASS_SERIAL_OTHER);
+}
+
+static void virtio_console_init_pci_0_10(PCIDevice *pci_dev)
+{
+ virtio_console_init_pci_with_class(pci_dev, PCI_CLASS_DISPLAY_OTHER);
}
static void virtio_net_init_pci(PCIDevice *pci_dev)
@@ -511,6 +521,10 @@ static PCIDeviceInfo virtio_info[] = {
.qdev.size = sizeof(VirtIOPCIProxy),
.init = virtio_blk_init_pci_0_10,
},{
+ .qdev.name = "virtio-console-pci-0-10",
+ .qdev.size = sizeof(VirtIOPCIProxy),
+ .init = virtio_console_init_pci_0_10,
+ },{
/* end of list */
}
};