All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.