qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>, qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>
Subject: Re: [Qemu-devel] [PULL 13/42] virtio-pci: initial virtio 1.0 support
Date: Sat, 20 Jun 2015 23:08:59 +0200	[thread overview]
Message-ID: <5585D66B.9080105@redhat.com> (raw)
In-Reply-To: <1434023714-30366-14-git-send-email-mst@redhat.com>



On 11/06/2015 13:58, Michael S. Tsirkin wrote:
> This is somewhat functional.  With this, and linux driver from my tree,
> I was able to use virtio net as virtio 1.0 device for light browsing.
> 
> At the moment, dataplane and vhost code is
> still missing.
> 
> Based on Cornelia's virtio 1.0 patchset:
>     Date: Thu, 11 Dec 2014 14:25:02 +0100
>     From: Cornelia Huck <cornelia.huck@de.ibm.com>
>     To: virtualization@lists.linux-foundation.org, qemu-devel@nongnu.org
>     Cc: rusty@rustcorp.com.au, thuth@linux.vnet.ibm.com, mst@redhat.com,
>     Cornelia Huck <cornelia.huck@de.ibm.com>
>     Subject: [PATCH RFC v6 00/20] qemu: towards virtio-1 host support
>     Message-Id: <1418304322-7546-1-git-send-email-cornelia.huck@de.ibm.com>
> 
> which is itself still missing some core bits.
> 
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> ---
>  hw/virtio/virtio-pci.h |  16 +++
>  hw/virtio/virtio-pci.c | 379 +++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 395 insertions(+)
> 
> diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
> index de39468..7a6481f 100644
> --- a/hw/virtio/virtio-pci.h
> +++ b/hw/virtio/virtio-pci.h
> @@ -88,9 +88,25 @@ typedef struct VirtioPCIClass {
>  struct VirtIOPCIProxy {
>      PCIDevice pci_dev;
>      MemoryRegion bar;
> +    MemoryRegion common;
> +    MemoryRegion isr;
> +    MemoryRegion device;
> +    MemoryRegion notify;
> +    MemoryRegion modern_bar;
>      uint32_t flags;
>      uint32_t class_code;
>      uint32_t nvectors;
> +    uint32_t dfselect;
> +    uint32_t gfselect;
> +    uint32_t guest_features[2];
> +    struct {
> +        uint16_t num;
> +        bool enabled;
> +        uint32_t desc[2];
> +        uint32_t avail[2];
> +        uint32_t used[2];
> +    } vqs[VIRTIO_QUEUE_MAX];
> +
>      bool ioeventfd_disabled;
>      bool ioeventfd_started;
>      VirtIOIRQFD *vector_irqfd;
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 8dca87c..8fc3c4e 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -920,6 +920,278 @@ static int virtio_pci_query_nvectors(DeviceState *d)
>      return proxy->nvectors;
>  }
>  
> +static void virtio_pci_add_mem_cap(VirtIOPCIProxy *proxy,
> +                                   struct virtio_pci_cap *cap)
> +{
> +    PCIDevice *dev = &proxy->pci_dev;
> +    int offset;
> +
> +    cap->bar = 2;
> +
> +    offset = pci_add_capability(dev, PCI_CAP_ID_VNDR, 0, cap->cap_len);
> +    assert(offset > 0);
> +
> +    assert(cap->cap_len >= sizeof *cap);
> +    memcpy(dev->config + offset + PCI_CAP_FLAGS, &cap->cap_len,
> +           cap->cap_len - PCI_CAP_FLAGS);
> +}
> +
> +#define QEMU_VIRTIO_PCI_QUEUE_MEM_MULT 0x10000
> +
> +static uint64_t virtio_pci_common_read(void *opaque, hwaddr addr,
> +                                       unsigned size)
> +{
> +    VirtIOPCIProxy *proxy = opaque;
> +    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
> +    uint32_t val = 0;
> +    int i;
> +
> +    switch (addr) {
> +    case VIRTIO_PCI_COMMON_DFSELECT:
> +        val = proxy->dfselect;
> +        break;
> +    case VIRTIO_PCI_COMMON_DF:
> +        if (proxy->dfselect <= 1) {
> +            val = vdev->host_features >> (32 * proxy->dfselect);
> +        }
> +        break;
> +    case VIRTIO_PCI_COMMON_GFSELECT:
> +        val = proxy->gfselect;
> +        break;
> +    case VIRTIO_PCI_COMMON_GF:
> +        if (proxy->gfselect <= ARRAY_SIZE(proxy->guest_features)) {

Off-by-one error: < instead of <= is required here.  Bonus for patching
checkpatch.pl...

Paolo

> +            val = proxy->guest_features[proxy->gfselect];
> +        }
> +        break;
> +    case VIRTIO_PCI_COMMON_MSIX:
> +        val = vdev->config_vector;
> +        break;
> +    case VIRTIO_PCI_COMMON_NUMQ:
> +        for (i = 0; i < VIRTIO_QUEUE_MAX; ++i) {
> +            if (virtio_queue_get_num(vdev, i)) {
> +                val = i + 1;
> +            }
> +        }
> +        break;
> +    case VIRTIO_PCI_COMMON_STATUS:
> +        val = vdev->status;
> +        break;
> +    case VIRTIO_PCI_COMMON_CFGGENERATION:
> +        val = 0; /* TODO */
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_SELECT:
> +        val = vdev->queue_sel;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_SIZE:
> +        val = virtio_queue_get_num(vdev, vdev->queue_sel);
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_MSIX:
> +        val = virtio_queue_vector(vdev, vdev->queue_sel);
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_ENABLE:
> +        val = proxy->vqs[vdev->queue_sel].enabled;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_NOFF:
> +        /* Simply map queues in order */
> +        val = vdev->queue_sel;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_DESCLO:
> +        val = proxy->vqs[vdev->queue_sel].desc[0];
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_DESCHI:
> +        val = proxy->vqs[vdev->queue_sel].desc[1];
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_AVAILLO:
> +        val = proxy->vqs[vdev->queue_sel].avail[0];
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_AVAILHI:
> +        val = proxy->vqs[vdev->queue_sel].avail[1];
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_USEDLO:
> +        val = proxy->vqs[vdev->queue_sel].used[0];
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_USEDHI:
> +        val = proxy->vqs[vdev->queue_sel].used[1];
> +        break;
> +    default:
> +        val = 0;
> +    }
> +
> +    return val;
> +}
> +
> +static void virtio_pci_common_write(void *opaque, hwaddr addr,
> +                                    uint64_t val, unsigned size)
> +{
> +    VirtIOPCIProxy *proxy = opaque;
> +    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
> +
> +    switch (addr) {
> +    case VIRTIO_PCI_COMMON_DFSELECT:
> +        proxy->dfselect = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_GFSELECT:
> +        proxy->gfselect = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_GF:
> +        if (proxy->gfselect <= ARRAY_SIZE(proxy->guest_features)) {
> +            proxy->guest_features[proxy->gfselect] = val;
> +            virtio_set_features(vdev,
> +                                (((uint64_t)proxy->guest_features[1]) << 32) |
> +                                proxy->guest_features[0]);
> +        }
> +        break;
> +    case VIRTIO_PCI_COMMON_MSIX:
> +        msix_vector_unuse(&proxy->pci_dev, vdev->config_vector);
> +        /* Make it possible for guest to discover an error took place. */
> +        if (msix_vector_use(&proxy->pci_dev, val) < 0) {
> +            val = VIRTIO_NO_VECTOR;
> +        }
> +        vdev->config_vector = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_STATUS:
> +        if (!(val & VIRTIO_CONFIG_S_DRIVER_OK)) {
> +            virtio_pci_stop_ioeventfd(proxy);
> +        }
> +
> +        virtio_set_status(vdev, val & 0xFF);
> +
> +        if (val & VIRTIO_CONFIG_S_DRIVER_OK) {
> +            virtio_pci_start_ioeventfd(proxy);
> +        }
> +
> +        if (vdev->status == 0) {
> +            virtio_reset(vdev);
> +            msix_unuse_all_vectors(&proxy->pci_dev);
> +        }
> +
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_SELECT:
> +        if (val < VIRTIO_QUEUE_MAX) {
> +            vdev->queue_sel = val;
> +        }
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_SIZE:
> +        proxy->vqs[vdev->queue_sel].num = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_MSIX:
> +        msix_vector_unuse(&proxy->pci_dev,
> +                          virtio_queue_vector(vdev, vdev->queue_sel));
> +        /* Make it possible for guest to discover an error took place. */
> +        if (msix_vector_use(&proxy->pci_dev, val) < 0) {
> +            val = VIRTIO_NO_VECTOR;
> +        }
> +        virtio_queue_set_vector(vdev, vdev->queue_sel, val);
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_ENABLE:
> +        /* TODO: need a way to put num back on reset. */
> +        virtio_queue_set_num(vdev, vdev->queue_sel,
> +                             proxy->vqs[vdev->queue_sel].num);
> +        virtio_queue_set_rings(vdev, vdev->queue_sel,
> +                       ((uint64_t)proxy->vqs[vdev->queue_sel].desc[1]) << 32 |
> +                       proxy->vqs[vdev->queue_sel].desc[0],
> +                       ((uint64_t)proxy->vqs[vdev->queue_sel].avail[1]) << 32 |
> +                       proxy->vqs[vdev->queue_sel].avail[0],
> +                       ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 |
> +                       proxy->vqs[vdev->queue_sel].used[0]);
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_DESCLO:
> +        proxy->vqs[vdev->queue_sel].desc[0] = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_DESCHI:
> +        proxy->vqs[vdev->queue_sel].desc[1] = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_AVAILLO:
> +        proxy->vqs[vdev->queue_sel].avail[0] = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_AVAILHI:
> +        proxy->vqs[vdev->queue_sel].avail[1] = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_USEDLO:
> +        proxy->vqs[vdev->queue_sel].used[0] = val;
> +        break;
> +    case VIRTIO_PCI_COMMON_Q_USEDHI:
> +        proxy->vqs[vdev->queue_sel].used[1] = val;
> +        break;
> +    default:
> +        break;
> +    }
> +}
> +
> +
> +static uint64_t virtio_pci_notify_read(void *opaque, hwaddr addr,
> +                                       unsigned size)
> +{
> +    return 0;
> +}
> +
> +static void virtio_pci_notify_write(void *opaque, hwaddr addr,
> +                                    uint64_t val, unsigned size)
> +{
> +    VirtIODevice *vdev = opaque;
> +    unsigned queue = addr / QEMU_VIRTIO_PCI_QUEUE_MEM_MULT;
> +
> +    if (queue < VIRTIO_QUEUE_MAX) {
> +        virtio_queue_notify(vdev, queue);
> +    }
> +}
> +
> +static uint64_t virtio_pci_isr_read(void *opaque, hwaddr addr,
> +                                    unsigned size)
> +{
> +    VirtIOPCIProxy *proxy = opaque;
> +    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
> +    uint64_t val = vdev->isr;
> +
> +    vdev->isr = 0;
> +    pci_irq_deassert(&proxy->pci_dev);
> +
> +    return val;
> +}
> +
> +static void virtio_pci_isr_write(void *opaque, hwaddr addr,
> +                                 uint64_t val, unsigned size)
> +{
> +}
> +
> +static uint64_t virtio_pci_device_read(void *opaque, hwaddr addr,
> +                                       unsigned size)
> +{
> +    VirtIODevice *vdev = opaque;
> +    uint64_t val = 0;
> +
> +    switch (size) {
> +    case 1:
> +        val = virtio_config_readb(vdev, addr);
> +        break;
> +    case 2:
> +        val = virtio_config_readw(vdev, addr);
> +        break;
> +    case 4:
> +        val = virtio_config_readl(vdev, addr);
> +        break;
> +    }
> +    return val;
> +}
> +
> +static void virtio_pci_device_write(void *opaque, hwaddr addr,
> +                                    uint64_t val, unsigned size)
> +{
> +    VirtIODevice *vdev = opaque;
> +    switch (size) {
> +    case 1:
> +        virtio_config_writeb(vdev, addr, val);
> +        break;
> +    case 2:
> +        virtio_config_writew(vdev, addr, val);
> +        break;
> +    case 4:
> +        virtio_config_writel(vdev, addr, val);
> +        break;
> +    }
> +}
> +
> +
>  /* This is called by virtio-bus just after the device is plugged. */
>  static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
>  {
> @@ -938,6 +1210,112 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
>      pci_set_word(config + PCI_SUBSYSTEM_ID, virtio_bus_get_vdev_id(bus));
>      config[PCI_INTERRUPT_PIN] = 1;
>  
> +
> +    if (1) { /* TODO: Make this optional, dependent on virtio 1.0 */
> +        struct virtio_pci_cap common = {
> +            .cfg_type = VIRTIO_PCI_CAP_COMMON_CFG,
> +            .cap_len = sizeof common,
> +            .offset = cpu_to_le32(0x0),
> +            .length = cpu_to_le32(0x1000),
> +        };
> +        struct virtio_pci_cap isr = {
> +            .cfg_type = VIRTIO_PCI_CAP_ISR_CFG,
> +            .cap_len = sizeof isr,
> +            .offset = cpu_to_le32(0x1000),
> +            .length = cpu_to_le32(0x1000),
> +        };
> +        struct virtio_pci_cap device = {
> +            .cfg_type = VIRTIO_PCI_CAP_DEVICE_CFG,
> +            .cap_len = sizeof device,
> +            .offset = cpu_to_le32(0x2000),
> +            .length = cpu_to_le32(0x1000),
> +        };
> +        struct virtio_pci_notify_cap notify = {
> +            .cap.cfg_type = VIRTIO_PCI_CAP_NOTIFY_CFG,
> +            .cap.cap_len = sizeof notify,
> +            .cap.offset = cpu_to_le32(0x3000),
> +            .cap.length = cpu_to_le32(QEMU_VIRTIO_PCI_QUEUE_MEM_MULT *
> +                                      VIRTIO_QUEUE_MAX),
> +            .notify_off_multiplier =
> +                cpu_to_le32(QEMU_VIRTIO_PCI_QUEUE_MEM_MULT),
> +        };
> +
> +        static const MemoryRegionOps common_ops = {
> +            .read = virtio_pci_common_read,
> +            .write = virtio_pci_common_write,
> +            .impl = {
> +                .min_access_size = 1,
> +                .max_access_size = 4,
> +            },
> +            .endianness = DEVICE_LITTLE_ENDIAN,
> +        };
> +
> +        static const MemoryRegionOps isr_ops = {
> +            .read = virtio_pci_isr_read,
> +            .write = virtio_pci_isr_write,
> +            .impl = {
> +                .min_access_size = 1,
> +                .max_access_size = 4,
> +            },
> +            .endianness = DEVICE_LITTLE_ENDIAN,
> +        };
> +
> +        static const MemoryRegionOps device_ops = {
> +            .read = virtio_pci_device_read,
> +            .write = virtio_pci_device_write,
> +            .impl = {
> +                .min_access_size = 1,
> +                .max_access_size = 4,
> +            },
> +            .endianness = DEVICE_LITTLE_ENDIAN,
> +        };
> +
> +        static const MemoryRegionOps notify_ops = {
> +            .read = virtio_pci_notify_read,
> +            .write = virtio_pci_notify_write,
> +            .impl = {
> +                .min_access_size = 1,
> +                .max_access_size = 4,
> +            },
> +            .endianness = DEVICE_LITTLE_ENDIAN,
> +        };
> +
> +        /* TODO: add io access for speed */
> +        virtio_pci_add_mem_cap(proxy, &common);
> +        virtio_pci_add_mem_cap(proxy, &isr);
> +        virtio_pci_add_mem_cap(proxy, &device);
> +        virtio_pci_add_mem_cap(proxy, &notify.cap);
> +
> +        virtio_add_feature(&vdev->host_features, VIRTIO_F_VERSION_1);
> +        memory_region_init(&proxy->modern_bar, OBJECT(proxy), "virtio-pci",
> +                           2 * QEMU_VIRTIO_PCI_QUEUE_MEM_MULT *
> +                           VIRTIO_QUEUE_MAX);
> +        memory_region_init_io(&proxy->common, OBJECT(proxy),
> +                              &common_ops,
> +                              proxy,
> +                              "virtio-pci-common", 0x1000);
> +        memory_region_add_subregion(&proxy->modern_bar, 0, &proxy->common);
> +        memory_region_init_io(&proxy->isr, OBJECT(proxy),
> +                              &isr_ops,
> +                              proxy,
> +                              "virtio-pci-isr", 0x1000);
> +        memory_region_add_subregion(&proxy->modern_bar, 0x1000, &proxy->isr);
> +        memory_region_init_io(&proxy->device, OBJECT(proxy),
> +                              &device_ops,
> +                              virtio_bus_get_device(&proxy->bus),
> +                              "virtio-pci-device", 0x1000);
> +        memory_region_add_subregion(&proxy->modern_bar, 0x2000, &proxy->device);
> +        memory_region_init_io(&proxy->notify, OBJECT(proxy),
> +                              &notify_ops,
> +                              virtio_bus_get_device(&proxy->bus),
> +                              "virtio-pci-notify",
> +                              QEMU_VIRTIO_PCI_QUEUE_MEM_MULT *
> +                              VIRTIO_QUEUE_MAX);
> +        memory_region_add_subregion(&proxy->modern_bar, 0x3000, &proxy->notify);
> +        pci_register_bar(&proxy->pci_dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY,
> +                         &proxy->modern_bar);
> +    }
> +
>      if (proxy->nvectors &&
>          msix_init_exclusive_bar(&proxy->pci_dev, proxy->nvectors, 1)) {
>          error_report("unable to init msix vectors to %" PRIu32,
> @@ -955,6 +1333,7 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
>  
>      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);
>  
> 

  reply	other threads:[~2015-06-20 21:09 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-11 11:57 [Qemu-devel] [PULL 00/42] pc, acpi, virtio Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 01/42] vhost: put log correctly in vhost_dev_start() Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 02/42] virtio: endianness checks for virtio 1.0 devices Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 03/42] virtio: allow virtio-1 queue layout Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 04/42] dataplane: allow virtio-1 devices Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 05/42] virtio: disallow late feature changes for virtio-1 Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 06/42] virtio: allow to fail setting status Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 07/42] virtio-net: no writeable mac for virtio-1 Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 08/42] virtio-net: support longer header Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 09/42] virtio-net: enable virtio 1.0 Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 10/42] vhost_net: add version_1 feature Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 11/42] vhost: 64 bit features Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 12/42] linux-headers: add virtio_pci Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 13/42] virtio-pci: initial virtio 1.0 support Michael S. Tsirkin
2015-06-20 21:08   ` Paolo Bonzini [this message]
2015-06-11 11:58 ` [Qemu-devel] [PULL 14/42] virtio: generation counter support Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 15/42] virtio: add modern config accessors Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 16/42] virtio-pci: switch to modern accessors for 1.0 Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 17/42] virtio-pci: add flags to enable/disable legacy/modern Michael S. Tsirkin
2015-06-11 11:58 ` [Qemu-devel] [PULL 18/42] virtio-pci: make QEMU_VIRTIO_PCI_QUEUE_MEM_MULT smaller Michael S. Tsirkin
2015-06-11 11:59 ` [Qemu-devel] [PULL 19/42] virtio-pci: change & document virtio pci bar layout Michael S. Tsirkin
2015-06-11 11:59 ` [Qemu-devel] [PULL 20/42] virtio-pci: make modern bar 64bit + prefetchable Michael S. Tsirkin
2015-06-11 11:59 ` [Qemu-devel] [PULL 21/42] virtio-pci: correctly set host notifiers for modern bar Michael S. Tsirkin
2015-06-11 11:59 ` [Qemu-devel] [PULL 22/42] virtio_balloon: header update Michael S. Tsirkin
2015-06-11 11:59 ` [Qemu-devel] [PULL 23/42] virtio-balloon: switch to virtio_add_feature Michael S. Tsirkin
2015-06-11 11:59 ` [Qemu-devel] [PULL 24/42] virtio-pci: add struct VirtIOPCIRegion for virtio-1 regions Michael S. Tsirkin
2015-06-11 11:59 ` [Qemu-devel] [PULL 25/42] virtio-pci: add virtio_pci_modern_regions_init() Michael S. Tsirkin
2015-06-11 11:59 ` [Qemu-devel] [PULL 26/42] virtio-pci: add virtio_pci_modern_region_map() Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 27/42] virtio-pci: move virtio_pci_add_mem_cap call to virtio_pci_modern_region_map Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 28/42] virtio-pci: move cap type to VirtIOPCIRegion Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 29/42] virtio-pci: drop identical virtio_pci_cap Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 30/42] virtio-pci: fill VirtIOPCIRegions early Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 31/42] pci: add PCI_CLASS_INPUT_* Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 32/42] virtio-input: core code & base class [pci] Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 33/42] virtio-input: emulated devices [pci] Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 34/42] virtio-net: move qdev properties into virtio-net.c Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 35/42] virtio-net.h: Remove unsed DEFINE_VIRTIO_NET_PROPERTIES Michael S. Tsirkin
2015-06-11 12:00 ` [Qemu-devel] [PULL 36/42] virtio-scsi: move qdev properties into virtio-scsi.c Michael S. Tsirkin
2015-06-11 12:01 ` [Qemu-devel] [PULL 37/42] virtio-rng: move qdev properties into virtio-rng.c Michael S. Tsirkin
2015-06-11 12:01 ` [Qemu-devel] [PULL 38/42] virtio-serial-bus: move qdev properties into virtio-serial-bus.c Michael S. Tsirkin
2015-06-11 12:01 ` [Qemu-devel] [PULL 39/42] virtio-9p-device: move qdev properties into virtio-9p-device.c Michael S. Tsirkin
2015-06-11 12:01 ` [Qemu-devel] [PULL 40/42] vhost-scsi: move qdev properties into vhost-scsi.c Michael S. Tsirkin
2015-06-11 12:01 ` [Qemu-devel] [PULL 41/42] i386/acpi-build: more traditional _UID and _HID for PXB root buses Michael S. Tsirkin
2015-06-11 12:01 ` [Qemu-devel] [PULL 42/42] i386/acpi-build: fix PXB workarounds for unsupported BIOSes Michael S. Tsirkin
2015-06-11 15:44 ` [Qemu-devel] [PULL 00/42] pc, acpi, virtio Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5585D66B.9080105@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=mst@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).