GlobalProperty hw_compat_2_6[] = {
{ "virtio-mmio", "format_transport_address", "off" },
- /*
- * don't include devices which are modern-only
- * ie keyboard, mouse, tablet, gpu, vga & crypto
- */
- { "virtio-9p-pci", "disable-modern", "on" },
- { "virtio-9p-pci", "disable-legacy", "off" },
- { "virtio-balloon-pci", "disable-modern", "on" },
- { "virtio-balloon-pci", "disable-legacy", "off" },
- { "virtio-blk-pci", "disable-modern", "on" },
- { "virtio-blk-pci", "disable-legacy", "off" },
- { "virtio-input-host-pci", "disable-modern", "on" },
- { "virtio-input-host-pci", "disable-legacy", "off" },
- { "virtio-net-pci", "disable-modern", "on" },
- { "virtio-net-pci", "disable-legacy", "off" },
- { "virtio-rng-pci", "disable-modern", "on" },
- { "virtio-rng-pci", "disable-legacy", "off" },
- { "virtio-scsi-pci", "disable-modern", "on" },
- { "virtio-scsi-pci", "disable-legacy", "off" },
- { "virtio-serial-pci", "disable-modern", "on" },
- { "virtio-serial-pci", "disable-legacy", "off" },
+ /* Optional because not all virtio-pci devices support legacy mode */
+ { "virtio-pci", "disable-modern", "on", .optional = true },
+ { "virtio-pci", "disable-legacy", "off", .optional = true },
};
const size_t hw_compat_2_6_len = G_N_ELEMENTS(hw_compat_2_6);
Error *local_error = NULL;
qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
- if (!virtio_pci_force_virtio_1(vpci_dev, errp)) {
- return;
- }
+ virtio_pci_force_virtio_1(vpci_dev);
object_property_set_bool(OBJECT(vdev), true, "realized", &local_error);
if (local_error) {
/* init virtio bits */
qdev_set_parent_bus(DEVICE(g), BUS(&vpci_dev->bus));
- if (!virtio_pci_force_virtio_1(vpci_dev, errp)) {
- return;
- }
+ virtio_pci_force_virtio_1(vpci_dev);
object_property_set_bool(OBJECT(g), true, "realized", &err);
if (err) {
error_propagate(errp, err);
}
qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
- if (!virtio_pci_force_virtio_1(vpci_dev, errp)) {
- return;
- }
+ virtio_pci_force_virtio_1(vpci_dev);
object_property_set_bool(OBJECT(vdev), true, "realized", errp);
object_property_set_link(OBJECT(vcrypto),
OBJECT(vcrypto->vdev.conf.cryptodev), "cryptodev",
DeviceState *vdev = DEVICE(&vinput->vdev);
qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
- if (!virtio_pci_force_virtio_1(vpci_dev, errp)) {
- return;
- }
+ virtio_pci_force_virtio_1(vpci_dev);
object_property_set_bool(OBJECT(vdev), true, "realized", errp);
}
/* PCI BAR regions must be powers of 2 */
pow2ceil(proxy->notify.offset + proxy->notify.size));
- if ((proxy->disable_legacy == ON_OFF_AUTO_ON) ||
- ((proxy->disable_legacy == ON_OFF_AUTO_AUTO) && pcie_port)) {
- if (proxy->disable_modern) {
- error_setg(errp, "device cannot work as neither modern nor "
- "legacy mode is enabled");
- error_append_hint(errp, "Set either disable-modern or "
- "disable-legacy to off\n");
- return;
- }
- proxy->mode = VIRTIO_PCI_MODE_MODERN;
- } else {
- if (proxy->disable_modern) {
- proxy->mode = VIRTIO_PCI_MODE_LEGACY;
- } else {
- proxy->mode = VIRTIO_PCI_MODE_TRANSITIONAL;
- }
+ if (proxy->disable_legacy == ON_OFF_AUTO_AUTO) {
+ proxy->disable_legacy = pcie_port ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
+ }
+
+ if (!virtio_pci_modern(proxy) && !virtio_pci_legacy(proxy)) {
+ error_setg(errp, "device cannot work as neither modern nor legacy mode"
+ " is enabled");
+ error_append_hint(errp, "Set either disable-modern or disable-legacy"
+ " to off\n");
+ return;
}
if (pcie_port && pci_is_express(pci_dev)) {
#ifndef QEMU_VIRTIO_PCI_H
#define QEMU_VIRTIO_PCI_H
-#include "qapi/error.h"
#include "hw/pci/msi.h"
#include "hw/virtio/virtio-bus.h"
uint32_t used[2];
} VirtIOPCIQueue;
-typedef enum {
- VIRTIO_PCI_MODE_LEGACY,
- VIRTIO_PCI_MODE_TRANSITIONAL,
- VIRTIO_PCI_MODE_MODERN,
-} VirtIOPCIMode;
-
struct VirtIOPCIProxy {
PCIDevice pci_dev;
MemoryRegion bar;
bool disable_modern;
bool ignore_backend_features;
OnOffAuto disable_legacy;
- VirtIOPCIMode mode;
uint32_t class_code;
uint32_t nvectors;
uint32_t dfselect;
static inline bool virtio_pci_modern(VirtIOPCIProxy *proxy)
{
- return proxy->mode != VIRTIO_PCI_MODE_LEGACY;
+ return !proxy->disable_modern;
}
static inline bool virtio_pci_legacy(VirtIOPCIProxy *proxy)
{
- return proxy->mode != VIRTIO_PCI_MODE_MODERN;
+ return proxy->disable_legacy == ON_OFF_AUTO_OFF;
}
-static inline bool virtio_pci_force_virtio_1(VirtIOPCIProxy *proxy,
- Error **errp)
+static inline void virtio_pci_force_virtio_1(VirtIOPCIProxy *proxy)
{
- if (proxy->disable_legacy == ON_OFF_AUTO_OFF) {
- error_setg(errp, "Unable to set disable-legacy=off on a virtio-1.0 "
- "only device");
- return false;
- }
- if (proxy->disable_modern == true) {
- error_setg(errp, "Unable to set disable-modern=on on a virtio-1.0 "
- "only device");
- return false;
- }
- proxy->mode = VIRTIO_PCI_MODE_MODERN;
- return true;
+ proxy->disable_modern = false;
+ proxy->disable_legacy = ON_OFF_AUTO_ON;
}
static inline void virtio_pci_disable_modern(VirtIOPCIProxy *proxy)
{
- proxy->mode = VIRTIO_PCI_MODE_LEGACY;
+ proxy->disable_modern = true;
}
/*