From patchwork Thu Jul 22 22:00:42 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Blue Swirl X-Patchwork-Id: 59653 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 3CCC01007D2 for ; Fri, 23 Jul 2010 08:13:53 +1000 (EST) Received: from localhost ([127.0.0.1]:49079 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Oc41V-0005OD-0f for incoming@patchwork.ozlabs.org; Thu, 22 Jul 2010 18:13:49 -0400 Received: from [140.186.70.92] (port=42713 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Oc3ws-00031d-00 for qemu-devel@nongnu.org; Thu, 22 Jul 2010 18:09:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Oc3pA-0003BM-1c for qemu-devel@nongnu.org; Thu, 22 Jul 2010 18:01:05 -0400 Received: from mail-vw0-f45.google.com ([209.85.212.45]:59532) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Oc3p9-00038R-UP for qemu-devel@nongnu.org; Thu, 22 Jul 2010 18:01:04 -0400 Received: by mail-vw0-f45.google.com with SMTP id 19so697810vws.4 for ; Thu, 22 Jul 2010 15:01:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:mime-version:received:from:date :message-id:subject:to:content-type; bh=3v1mOchci8hYyV1rLiYJiXnzMMkayiO8xMqC7NLFm/s=; b=KhH5qo0NM8tTImk6+VAFCVc/DlrTJ2TvDCjHfXWhO2MkUrX75PtP5cKPkQakIWkrhu kotPkodTdE84Vimdh6x3YbPenyHrMbmsFrzIlVcrAv2ktGX+Onj2+C9SlqJvXpNdOKuN bNkjaoo4uqabZ60yWahqa/Gj/fPT9gc/UpQTw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=Y2MCWyv7x0bEsLEIfFDsCUJtdkrsO4wfL2nLtLvyPR+WJOzQgwLUiaMJ5VZU1cabQS tdZoHQIICjKBG0hvCsFSrVtYDGDcjpC08DEvsq0ziaZlAzubuLiRPk/XrVCVzhfNQoaX 7va6SCYCUsxZPXyy8DpVtDuBNx0JQaekoGYNU= Received: by 10.224.28.213 with SMTP id n21mr1790426qac.53.1279836063272; Thu, 22 Jul 2010 15:01:03 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.185.146 with HTTP; Thu, 22 Jul 2010 15:00:42 -0700 (PDT) From: Blue Swirl Date: Thu, 22 Jul 2010 22:00:42 +0000 Message-ID: To: qemu-devel X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [Qemu-devel] [PATCH 23/34] virtio-pci: convert to pci_bar_map X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Use pci_bar_map() and post_map_func instead of a mapping function. Remove unused msix_mmio_map(). Signed-off-by: Blue Swirl --- hw/msix.c | 21 +-------------------- hw/msix.h | 3 --- hw/virtio-pci.c | 47 +++++++++++++++++++++++++++++++---------------- 3 files changed, 32 insertions(+), 39 deletions(-) static void virtio_write_config(PCIDevice *pci_dev, uint32_t address, uint32_t val, int len) { @@ -495,6 +499,7 @@ static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev, { uint8_t *config; uint32_t size; + int io_index; proxy->vdev = vdev; @@ -514,13 +519,19 @@ static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev, config[0x3d] = 1; - if (vdev->nvectors && !msix_init(&proxy->pci_dev, vdev->nvectors, 1, 0)) { - pci_register_bar(&proxy->pci_dev, 1, - msix_bar_size(&proxy->pci_dev), - PCI_BASE_ADDRESS_SPACE_MEMORY, - msix_mmio_map, NULL); - } else - vdev->nvectors = 0; + if (vdev->nvectors) { + io_index = msix_init(&proxy->pci_dev, vdev->nvectors, 1, 0); + if (io_index < 0) { + vdev->nvectors = 0; + } else { + pci_register_bar(&proxy->pci_dev, 1, + msix_bar_size(&proxy->pci_dev), + PCI_BASE_ADDRESS_SPACE_MEMORY, + NULL, NULL); + pci_bar_map(&proxy->pci_dev, 1, 0, 0, + msix_bar_size(&proxy->pci_dev), io_index); + } + } proxy->pci_dev.config_write = virtio_write_config; @@ -529,7 +540,11 @@ static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev, size = 1 << qemu_fls(size); pci_register_bar(&proxy->pci_dev, 0, size, PCI_BASE_ADDRESS_SPACE_IO, - virtio_map, NULL); + NULL, virtio_map); + io_index = cpu_register_io(virtio_pci_config_io_reads, + virtio_pci_config_io_writes, + size, &proxy->pci_dev); + pci_bar_map(&proxy->pci_dev, 0, 0, 0, size, io_index); virtio_bind_device(vdev, &virtio_pci_bindings, proxy); proxy->host_features |= 0x1 << VIRTIO_F_NOTIFY_ON_EMPTY; diff --git a/hw/msix.c b/hw/msix.c index d99403a..71ed728 100644 --- a/hw/msix.c +++ b/hw/msix.c @@ -201,25 +201,6 @@ static CPUReadMemoryFunc * const msix_mmio_read[] = { msix_mmio_read_unallowed, msix_mmio_read_unallowed, msix_mmio_readl }; -/* Should be called from device's map method. */ -void msix_mmio_map(PCIDevice *d, int region_num, - pcibus_t addr, pcibus_t size, int type) -{ - uint8_t *config = d->config + d->msix_cap; - uint32_t table = pci_get_long(config + MSIX_TABLE_OFFSET); - uint32_t offset = table & ~(MSIX_PAGE_SIZE - 1); - /* TODO: for assigned devices, we'll want to make it possible to map - * pending bits separately in case they are in a separate bar. */ - int table_bir = table & PCI_MSIX_FLAGS_BIRMASK; - - if (table_bir != region_num) - return; - if (size <= offset) - return; - cpu_register_physical_memory(addr + offset, size - offset, - d->msix_mmio_index); -} - static void msix_mask_all(struct PCIDevice *dev, unsigned nentries) { int vector; @@ -261,7 +242,7 @@ int msix_init(struct PCIDevice *dev, unsigned short nentries, goto err_config; dev->cap_present |= QEMU_PCI_CAP_MSIX; - return 0; + return dev->msix_mmio_index; err_config: dev->msix_entries_nr = 0; diff --git a/hw/msix.h b/hw/msix.h index a9f7993..93b0c26 100644 --- a/hw/msix.h +++ b/hw/msix.h @@ -10,9 +10,6 @@ int msix_init(PCIDevice *pdev, unsigned short nentries, void msix_write_config(PCIDevice *pci_dev, uint32_t address, uint32_t val, int len); -void msix_mmio_map(PCIDevice *pci_dev, int region_num, - pcibus_t addr, pcibus_t size, int type); - int msix_uninit(PCIDevice *d); void msix_save(PCIDevice *dev, QEMUFile *f); diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 781d83c..7e33932 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -379,21 +379,25 @@ static void virtio_map(PCIDevice *pci_dev, int region_num, { VirtIOPCIProxy *proxy = container_of(pci_dev, VirtIOPCIProxy, pci_dev); VirtIODevice *vdev = proxy->vdev; - unsigned config_len = VIRTIO_PCI_REGION_SIZE(pci_dev) + vdev->config_len; proxy->addr = addr; - register_ioport_write(addr, config_len, 1, virtio_pci_config_writeb, proxy); - register_ioport_write(addr, config_len, 2, virtio_pci_config_writew, proxy); - register_ioport_write(addr, config_len, 4, virtio_pci_config_writel, proxy); - register_ioport_read(addr, config_len, 1, virtio_pci_config_readb, proxy); - register_ioport_read(addr, config_len, 2, virtio_pci_config_readw, proxy); - register_ioport_read(addr, config_len, 4, virtio_pci_config_readl, proxy); - if (vdev->config_len) vdev->get_config(vdev, vdev->config); } +static IOPortWriteFunc * const virtio_pci_config_io_writes[] = { + virtio_pci_config_writeb, + virtio_pci_config_writew, + virtio_pci_config_writel, +}; + +static IOPortReadFunc * const virtio_pci_config_io_reads[] = { + virtio_pci_config_readb, + virtio_pci_config_readw, + virtio_pci_config_readl, +}; +