From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35276) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YSPUj-0000s9-Fb for qemu-devel@nongnu.org; Mon, 02 Mar 2015 07:31:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YSPUY-0008DD-2R for qemu-devel@nongnu.org; Mon, 02 Mar 2015 07:30:45 -0500 Received: from mx1.redhat.com ([209.132.183.28]:49275) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YSPUX-0008CW-8g for qemu-devel@nongnu.org; Mon, 02 Mar 2015 07:30:33 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t22CUWQm013577 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 2 Mar 2015 07:30:32 -0500 Date: Mon, 2 Mar 2015 13:30:30 +0100 From: "Michael S. Tsirkin" Message-ID: <20150302123030.GA29257@redhat.com> References: <1424687012-18524-1-git-send-email-kraxel@redhat.com> <1424687012-18524-4-git-send-email-kraxel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424687012-18524-4-git-send-email-kraxel@redhat.com> Subject: Re: [Qemu-devel] [RfC PATCH 03/15] virtio-pci: make pci bars configurable List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gerd Hoffmann Cc: qemu-devel@nongnu.org On Mon, Feb 23, 2015 at 11:23:19AM +0100, Gerd Hoffmann wrote: > Add msix_bar and modern_mem_bar fields to VirtIOPCIProxy. They can be > used to configure which pci regions are used for the virtio 1.0 memory > bar and the msix bar. > > For legacy/transitional devices the legacy bar is region 0 and the msix > bar is region 1. Only the modern bar can be configured, and it must be > 2 or larger. Default is 2. > > For legacy-free devices the modern bar is region 0 by default and the > msix bar is 2 by default. > > Use case: For VirtIOPCIProxy subclasses which need additional pci bars, > such as virtio-vga. With the new fields they can make sure the regions > do not conflict. > > Signed-off-by: Gerd Hoffmann Hmm, I'd rather add an API to register a free BAR. What's wrong with that? > --- > hw/virtio/virtio-pci.c | 25 +++++++++++++++++++++---- > hw/virtio/virtio-pci.h | 2 ++ > 2 files changed, 23 insertions(+), 4 deletions(-) > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index cd7c777..f97baf2 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -965,8 +965,6 @@ static void virtio_pci_add_mem_cap(VirtIOPCIProxy *proxy, > 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); > > @@ -1243,11 +1241,21 @@ static void virtio_pci_device_plugged(DeviceState *d) > pci_config_set_class(config, proxy->class_code); > } > > + if (proxy->modern_mem_bar > 5) { > + proxy->modern_mem_bar = 5; > + } > + if (proxy->msix_bar > 5) { > + proxy->msix_bar = 5; > + } > 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)); > + proxy->msix_bar = 1; > + if (proxy->modern_mem_bar < 2) { > + proxy->modern_mem_bar = 2; > + } > } else { > /* pure virtio-1.0 */ > pci_set_word(config + PCI_VENDOR_ID, > @@ -1255,6 +1263,9 @@ static void virtio_pci_device_plugged(DeviceState *d) > pci_set_word(config + PCI_DEVICE_ID, > 0x1040 + virtio_bus_get_vdev_id(bus)); > pci_config_set_revision(config, 1); > + if (proxy->msix_bar == proxy->modern_mem_bar) { > + proxy->msix_bar = (proxy->msix_bar + 2) % 6; > + } > } > config[PCI_INTERRUPT_PIN] = 1; > > @@ -1263,24 +1274,28 @@ static void virtio_pci_device_plugged(DeviceState *d) > struct virtio_pci_cap common = { > .cfg_type = VIRTIO_PCI_CAP_COMMON_CFG, > .cap_len = sizeof common, > + .bar = proxy->modern_mem_bar, > .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, > + .bar = proxy->modern_mem_bar, > .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, > + .bar = proxy->modern_mem_bar, > .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.bar = proxy->modern_mem_bar, > .cap.offset = cpu_to_le32(0x3000), > .cap.length = cpu_to_le32(QEMU_VIRTIO_PCI_QUEUE_MEM_MULT * > VIRTIO_PCI_QUEUE_MAX), > @@ -1359,12 +1374,14 @@ static void virtio_pci_device_plugged(DeviceState *d) > QEMU_VIRTIO_PCI_QUEUE_MEM_MULT * > VIRTIO_PCI_QUEUE_MAX); > memory_region_add_subregion(&proxy->modern_bar, 0x3000, &proxy->notify); > - pci_register_bar(&proxy->pci_dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, > + pci_register_bar(&proxy->pci_dev, proxy->modern_mem_bar, > + PCI_BASE_ADDRESS_SPACE_MEMORY, > &proxy->modern_bar); > } > > if (proxy->nvectors && > - msix_init_exclusive_bar(&proxy->pci_dev, proxy->nvectors, 1)) { > + msix_init_exclusive_bar(&proxy->pci_dev, proxy->nvectors, > + proxy->msix_bar)) { > error_report("unable to init msix vectors to %" PRIu32, > proxy->nvectors); > proxy->nvectors = 0; > diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h > index 3068a63..a273c33 100644 > --- a/hw/virtio/virtio-pci.h > +++ b/hw/virtio/virtio-pci.h > @@ -102,6 +102,8 @@ struct VirtIOPCIProxy { > uint32_t flags; > uint32_t class_code; > uint32_t nvectors; > + uint32_t msix_bar; > + uint32_t modern_mem_bar; > uint64_t host_features; > uint32_t dfselect; > uint32_t gfselect; > -- > 1.8.3.1