[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable lega
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable legacy/modern |
Date: |
Mon, 16 Feb 2015 17:33:22 +0100 |
Add VIRTIO_PCI_FLAG_DISABLE_LEGACY and VIRTIO_PCI_FLAG_DISABLE_MODERN
for VirtIOPCIProxy->flags. Also add properties for them. They can be
used to disable modern (virtio 1.0) or legacy (virtio 0.9) modes. By
default both are advertized and the guest driver can choose.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/virtio/virtio-pci.c | 46 +++++++++++++++++++++++++++++++++-------------
hw/virtio/virtio-pci.h | 6 ++++++
2 files changed, 39 insertions(+), 13 deletions(-)
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 4c9a0b8..6c0c650 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1233,6 +1233,8 @@ static void virtio_pci_device_plugged(DeviceState *d)
{
VirtIOPCIProxy *proxy = VIRTIO_PCI(d);
VirtioBusState *bus = &proxy->bus;
+ bool legacy = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_LEGACY);
+ bool modern = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_MODERN);
uint8_t *config;
uint32_t size;
@@ -1240,13 +1242,24 @@ static void virtio_pci_device_plugged(DeviceState *d)
if (proxy->class_code) {
pci_config_set_class(config, proxy->class_code);
}
- pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID,
- pci_get_word(config + PCI_VENDOR_ID));
- pci_set_word(config + PCI_SUBSYSTEM_ID, virtio_bus_get_vdev_id(bus));
+
+ if (legacy) {
+ /* legacy and transitional */
+ pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID,
+ pci_get_word(config + PCI_VENDOR_ID));
+ pci_set_word(config + PCI_SUBSYSTEM_ID, virtio_bus_get_vdev_id(bus));
+ } else {
+ /* pure virtio-1.0 */
+ pci_set_word(config + PCI_VENDOR_ID,
+ PCI_VENDOR_ID_REDHAT_QUMRANET);
+ pci_set_word(config + PCI_DEVICE_ID,
+ 0x1040 + virtio_bus_get_vdev_id(bus));
+ pci_config_set_revision(config, 1);
+ }
config[PCI_INTERRUPT_PIN] = 1;
- if (1) { /* TODO: Make this optional, dependent on virtio 1.0 */
+ if (modern) {
struct virtio_pci_cap common = {
.cfg_type = VIRTIO_PCI_CAP_COMMON_CFG,
.cap_len = sizeof common,
@@ -1359,17 +1372,20 @@ static void virtio_pci_device_plugged(DeviceState *d)
proxy->pci_dev.config_write = virtio_write_config;
- size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev)
- + virtio_bus_get_vdev_config_len(bus);
- if (size & (size - 1)) {
- size = 1 << qemu_fls(size);
- }
+ if (legacy) {
+ size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev)
+ + virtio_bus_get_vdev_config_len(bus);
+ if (size & (size - 1)) {
+ size = 1 << qemu_fls(size);
+ }
- memory_region_init_io(&proxy->bar, OBJECT(proxy), &virtio_pci_config_ops,
- proxy, "virtio-pci", size);
+ memory_region_init_io(&proxy->bar, OBJECT(proxy),
+ &virtio_pci_config_ops,
+ proxy, "virtio-pci", size);
- pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
- &proxy->bar);
+ pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
+ &proxy->bar);
+ }
if (!kvm_has_many_ioeventfds()) {
proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD;
@@ -1416,6 +1432,10 @@ static void virtio_pci_reset(DeviceState *qdev)
static Property virtio_pci_properties[] = {
DEFINE_PROP_BIT("virtio-pci-bus-master-bug-migration", VirtIOPCIProxy,
flags,
VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT, false),
+ DEFINE_PROP_BIT("disable-legacy", VirtIOPCIProxy, flags,
+ VIRTIO_PCI_FLAG_DISABLE_LEGACY_BIT, false),
+ DEFINE_PROP_BIT("disable-modern", VirtIOPCIProxy, flags,
+ VIRTIO_PCI_FLAG_DISABLE_MODERN_BIT, false),
DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
DEFINE_PROP_END_OF_LIST(),
};
diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
index 2cddd6a..3068a63 100644
--- a/hw/virtio/virtio-pci.h
+++ b/hw/virtio/virtio-pci.h
@@ -63,6 +63,12 @@ typedef struct VirtioBusClass VirtioPCIBusClass;
#define VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT 1
#define VIRTIO_PCI_FLAG_USE_IOEVENTFD (1 <<
VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT)
+/* virtio version flags */
+#define VIRTIO_PCI_FLAG_DISABLE_LEGACY_BIT 2
+#define VIRTIO_PCI_FLAG_DISABLE_MODERN_BIT 3
+#define VIRTIO_PCI_FLAG_DISABLE_LEGACY (1 <<
VIRTIO_PCI_FLAG_DISABLE_LEGACY_BIT)
+#define VIRTIO_PCI_FLAG_DISABLE_MODERN (1 <<
VIRTIO_PCI_FLAG_DISABLE_MODERN_BIT)
+
typedef struct {
MSIMessage msg;
int virq;
--
1.8.3.1
- [Qemu-devel] [PATCH v2 0/4] virtio-pci: a few proxy tweaks, Gerd Hoffmann, 2015/02/16
- [Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable legacy/modern,
Gerd Hoffmann <=
- Re: [Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable legacy/modern, Fam Zheng, 2015/02/17
- Re: [Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable legacy/modern, Gerd Hoffmann, 2015/02/17
- Re: [Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable legacy/modern, Michael S. Tsirkin, 2015/02/17
- Re: [Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable legacy/modern, Gerd Hoffmann, 2015/02/17
- Re: [Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable legacy/modern, Gerd Hoffmann, 2015/02/18
- Re: [Qemu-devel] [PATCH v2 1/4] virtio-pci: add flags to enable/disable legacy/modern, Michael S. Tsirkin, 2015/02/18
[Qemu-devel] [PATCH v2 2/4] virtio-pci: make QEMU_VIRTIO_PCI_QUEUE_MEM_MULT smaller, Gerd Hoffmann, 2015/02/16
[Qemu-devel] [PATCH v2 4/4] virtio-pci: make modern bar 64bit prefetchable, Gerd Hoffmann, 2015/02/16
[Qemu-devel] [PATCH v2 3/4] virtio-pci: make pci bars configurable, Gerd Hoffmann, 2015/02/16