@@ -32,7 +32,8 @@
#define KVM_IRQ_OFFSET GIC_SPI_IRQ_BASE
-#define VIRTIO_DEFAULT_TRANS VIRTIO_MMIO
+#define VIRTIO_DEFAULT_TRANS(kvm) \
+ ((kvm)->cfg.arch.virtio_trans_pci ? VIRTIO_PCI : VIRTIO_MMIO)
static inline bool arm_addr_in_ioport_region(u64 phys_addr)
{
@@ -4,9 +4,10 @@
#include "kvm/parse-options.h"
struct kvm_config_arch {
- const char *dump_dtb_filename;
- unsigned int force_cntfrq;
- bool aarch32_guest;
+ const char *dump_dtb_filename;
+ unsigned int force_cntfrq;
+ bool virtio_trans_pci;
+ bool aarch32_guest;
};
#define OPT_ARCH_RUN(pfx, cfg) \
@@ -17,6 +18,9 @@ struct kvm_config_arch {
OPT_UINTEGER('\0', "override-bad-firmware-cntfrq", &(cfg)->force_cntfrq,\
"Specify Generic Timer frequency in guest DT to " \
"work around buggy secure firmware *Firmware should be " \
- "updated to program CNTFRQ correctly*"),
+ "updated to program CNTFRQ correctly*"), \
+ OPT_BOOLEAN('\0', "force-pci", &(cfg)->virtio_trans_pci, \
+ "Force virtio devices to use PCI as their default " \
+ "transport"),
#endif /* ARM_COMMON__KVM_CONFIG_ARCH_H */
@@ -44,7 +44,7 @@
#define KVM_IRQ_OFFSET 16
-#define VIRTIO_DEFAULT_TRANS VIRTIO_PCI
+#define VIRTIO_DEFAULT_TRANS(kvm) VIRTIO_PCI
struct spapr_phb;
@@ -1392,7 +1392,7 @@ int virtio_9p__init(struct kvm *kvm)
list_for_each_entry(p9dev, &devs, list) {
virtio_init(kvm, p9dev, &p9dev->vdev, &p9_dev_virtio_ops,
- VIRTIO_DEFAULT_TRANS, PCI_DEVICE_ID_VIRTIO_9P,
+ VIRTIO_DEFAULT_TRANS(kvm), PCI_DEVICE_ID_VIRTIO_9P,
VIRTIO_ID_9P, PCI_CLASS_9P);
}
@@ -262,7 +262,7 @@ int virtio_bln__init(struct kvm *kvm)
memset(&bdev.config, 0, sizeof(struct virtio_balloon_config));
virtio_init(kvm, &bdev, &bdev.vdev, &bln_dev_virtio_ops,
- VIRTIO_DEFAULT_TRANS, PCI_DEVICE_ID_VIRTIO_BLN,
+ VIRTIO_DEFAULT_TRANS(kvm), PCI_DEVICE_ID_VIRTIO_BLN,
VIRTIO_ID_BALLOON, PCI_CLASS_BLN);
if (compat_id == -1)
@@ -260,7 +260,7 @@ static int virtio_blk__init_one(struct kvm *kvm, struct disk_image *disk)
};
virtio_init(kvm, bdev, &bdev->vdev, &blk_dev_virtio_ops,
- VIRTIO_DEFAULT_TRANS, PCI_DEVICE_ID_VIRTIO_BLK,
+ VIRTIO_DEFAULT_TRANS(kvm), PCI_DEVICE_ID_VIRTIO_BLK,
VIRTIO_ID_BLOCK, PCI_CLASS_BLK);
list_add_tail(&bdev->list, &bdevs);
@@ -210,7 +210,7 @@ int virtio_console__init(struct kvm *kvm)
pthread_cond_init(&cdev.poll_cond, NULL);
virtio_init(kvm, &cdev, &cdev.vdev, &con_dev_virtio_ops,
- VIRTIO_DEFAULT_TRANS, PCI_DEVICE_ID_VIRTIO_CONSOLE,
+ VIRTIO_DEFAULT_TRANS(kvm), PCI_DEVICE_ID_VIRTIO_CONSOLE,
VIRTIO_ID_CONSOLE, PCI_CLASS_CONSOLE);
if (compat_id == -1)
compat_id = virtio_compat_add_message("virtio-console", "CONFIG_VIRTIO_CONSOLE");
@@ -171,7 +171,7 @@ int virtio_rng__init(struct kvm *kvm)
}
r = virtio_init(kvm, rdev, &rdev->vdev, &rng_dev_virtio_ops,
- VIRTIO_DEFAULT_TRANS, PCI_DEVICE_ID_VIRTIO_RNG,
+ VIRTIO_DEFAULT_TRANS(kvm), PCI_DEVICE_ID_VIRTIO_RNG,
VIRTIO_ID_RNG, PCI_CLASS_RNG);
if (r < 0)
goto cleanup;
@@ -252,7 +252,7 @@ static int virtio_scsi_init_one(struct kvm *kvm, struct disk_image *disk)
sdev->target.vhost_tpgt = strtol(disk->tpgt, NULL, 0);
virtio_init(kvm, sdev, &sdev->vdev, &scsi_dev_virtio_ops,
- VIRTIO_DEFAULT_TRANS, PCI_DEVICE_ID_VIRTIO_SCSI,
+ VIRTIO_DEFAULT_TRANS(kvm), PCI_DEVICE_ID_VIRTIO_SCSI,
VIRTIO_ID_SCSI, PCI_CLASS_BLK);
list_add_tail(&sdev->list, &sdevs);
@@ -27,7 +27,7 @@
#define KVM_IRQ_OFFSET 5
-#define VIRTIO_DEFAULT_TRANS VIRTIO_PCI
+#define VIRTIO_DEFAULT_TRANS(kvm) VIRTIO_PCI
struct kvm_arch {
u16 boot_selector;
This patch changes VIRTIO_DEFAULT_TRANS to take a struct kvm parameter, allowing architectures to choose the default transport dynamically. For ARM, this is driven by an arch-specific cmdline option. Signed-off-by: Will Deacon <will.deacon@arm.com> --- tools/kvm/arm/include/arm-common/kvm-arch.h | 3 ++- tools/kvm/arm/include/arm-common/kvm-config-arch.h | 12 ++++++++---- tools/kvm/powerpc/include/kvm/kvm-arch.h | 2 +- tools/kvm/virtio/9p.c | 2 +- tools/kvm/virtio/balloon.c | 2 +- tools/kvm/virtio/blk.c | 2 +- tools/kvm/virtio/console.c | 2 +- tools/kvm/virtio/rng.c | 2 +- tools/kvm/virtio/scsi.c | 2 +- tools/kvm/x86/include/kvm/kvm-arch.h | 2 +- 10 files changed, 18 insertions(+), 13 deletions(-)