From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49800) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a5qpa-0000AY-PD for qemu-devel@nongnu.org; Mon, 07 Dec 2015 03:07:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a5qpZ-0003Aa-DO for qemu-devel@nongnu.org; Mon, 07 Dec 2015 03:07:34 -0500 Received: from [59.151.112.132] (port=30237 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a5qpY-0003AG-E8 for qemu-devel@nongnu.org; Mon, 07 Dec 2015 03:07:33 -0500 From: Cao jin Date: Mon, 7 Dec 2015 16:08:45 +0800 Message-ID: <1449475725-16453-3-git-send-email-caoj.fnst@cn.fujitsu.com> In-Reply-To: <1449475725-16453-1-git-send-email-caoj.fnst@cn.fujitsu.com> References: <1449475725-16453-1-git-send-email-caoj.fnst@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH 2/2] Add param Error** to msix_init() & modify the callers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: jiri@resnulli.us, mst@redhat.com, jasowang@redhat.com, alex.williamson@redhat.com, sfeldma@gmail.com, hare@suse.de, dmitry@daynix.com, pbonzini@redhat.com, jsnow@redhat.com, emu-block@nongnu.org, kraxel@redhat.com msix_init() is a supporting function in PCI device initialization, in order to convert .init() to .realize(), it should be modified first. Also modify the callers. Signed-off-by: Cao jin --- hw/net/rocker/rocker.c | 3 ++- hw/net/vmxnet3.c | 4 +++- hw/pci/msix.c | 13 ++++++++++--- hw/scsi/megasas.c | 16 ++++++++++++---- hw/usb/hcd-xhci.c | 2 +- hw/vfio/pci.c | 4 +++- include/hw/pci/msix.h | 3 ++- 7 files changed, 33 insertions(+), 12 deletions(-) diff --git a/hw/net/rocker/rocker.c b/hw/net/rocker/rocker.c index c57f1a6..9faa117 100644 --- a/hw/net/rocker/rocker.c +++ b/hw/net/rocker/rocker.c @@ -1248,13 +1248,14 @@ static int rocker_msix_init(Rocker *r) { PCIDevice *dev = PCI_DEVICE(r); int err; + Error *local_err = NULL; err = msix_init(dev, ROCKER_MSIX_VEC_COUNT(r->fp_ports), &r->msix_bar, ROCKER_PCI_MSIX_BAR_IDX, ROCKER_PCI_MSIX_TABLE_OFFSET, &r->msix_bar, ROCKER_PCI_MSIX_BAR_IDX, ROCKER_PCI_MSIX_PBA_OFFSET, - 0); + 0, &local_err); if (err) { return err; } diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c index 4269141..fad783e 100644 --- a/hw/net/vmxnet3.c +++ b/hw/net/vmxnet3.c @@ -2098,12 +2098,14 @@ static bool vmxnet3_init_msix(VMXNET3State *s) { PCIDevice *d = PCI_DEVICE(s); + Error *local_err = NULL; + int res = msix_init(d, VMXNET3_MAX_INTRS, &s->msix_bar, VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_TABLE, &s->msix_bar, VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_PBA, - 0); + 0, &local_err); if (0 > res) { VMW_WRPRN("Failed to initialize MSI-X, error %d", res); diff --git a/hw/pci/msix.c b/hw/pci/msix.c index 64c93d8..28c14d1 100644 --- a/hw/pci/msix.c +++ b/hw/pci/msix.c @@ -233,7 +233,8 @@ static void msix_mask_all(struct PCIDevice *dev, unsigned nentries) int msix_init(struct PCIDevice *dev, unsigned short nentries, MemoryRegion *table_bar, uint8_t table_bar_nr, unsigned table_offset, MemoryRegion *pba_bar, - uint8_t pba_bar_nr, unsigned pba_offset, uint8_t cap_pos) + uint8_t pba_bar_nr, unsigned pba_offset, uint8_t cap_pos, + Error **errp) { int cap; unsigned table_size, pba_size; @@ -241,10 +242,13 @@ int msix_init(struct PCIDevice *dev, unsigned short nentries, /* Nothing to do if MSI is not supported by interrupt controller */ if (!msi_supported) { + error_setg(errp, "MSI-X is not supported by interrupt controller"); return -ENOTSUP; } if (nentries < 1 || nentries > PCI_MSIX_FLAGS_QSIZE + 1) { + error_setg(errp, "Vector number %d invalid, should be 1 ~ %d", + nentries, PCI_MSIX_FLAGS_QSIZE + 1); return -EINVAL; } @@ -257,10 +261,12 @@ int msix_init(struct PCIDevice *dev, unsigned short nentries, table_offset + table_size > memory_region_size(table_bar) || pba_offset + pba_size > memory_region_size(pba_bar) || (table_offset | pba_offset) & PCI_MSIX_FLAGS_BIRMASK) { + error_setg(errp, "Arguments invalid. please check them carefully"); return -EINVAL; } - cap = pci_add_capability(dev, PCI_CAP_ID_MSIX, cap_pos, MSIX_CAP_LENGTH); + cap = pci_add_capability2(dev, PCI_CAP_ID_MSIX, cap_pos, + MSIX_CAP_LENGTH, errp); if (cap < 0) { return cap; } @@ -304,6 +310,7 @@ int msix_init_exclusive_bar(PCIDevice *dev, unsigned short nentries, uint32_t bar_size = 4096; uint32_t bar_pba_offset = bar_size / 2; uint32_t bar_pba_size = (nentries / 8 + 1) * 8; + Error *local_err = NULL; /* * Migration compatibility dictates that this remains a 4k @@ -329,7 +336,7 @@ int msix_init_exclusive_bar(PCIDevice *dev, unsigned short nentries, ret = msix_init(dev, nentries, &dev->msix_exclusive_bar, bar_nr, 0, &dev->msix_exclusive_bar, bar_nr, bar_pba_offset, - 0); + 0, &local_err); if (ret) { return ret; } diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c index 4759fb5..ef52a85 100644 --- a/hw/scsi/megasas.c +++ b/hw/scsi/megasas.c @@ -2356,11 +2356,19 @@ static void megasas_scsi_realize(PCIDevice *dev, Error **errp) return; } } - if (megasas_use_msix(s) && - msix_init(dev, 15, &s->mmio_io, b->mmio_bar, 0x2000, - &s->mmio_io, b->mmio_bar, 0x3800, 0x68)) { - s->flags &= ~MEGASAS_MASK_USE_MSIX; + + if (megasas_use_msix(s)) { + int ret; + + ret = msix_init(dev, 15, &s->mmio_io, b->mmio_bar, 0x2000, + &s->mmio_io, b->mmio_bar, 0x3800, 0x68, errp); + if (ret > 0) { + s->flags &= ~MEGASAS_MASK_USE_MSIX; + } else { + return; + } } + if (pci_is_express(dev)) { pcie_endpoint_cap_init(dev, 0xa0); } diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index b452c52..26e81d5 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -3652,7 +3652,7 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp) msix_init(dev, xhci->numintrs, &xhci->mem, 0, OFF_MSIX_TABLE, &xhci->mem, 0, OFF_MSIX_PBA, - 0x90); + 0x90, errp); } } diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 8559950..6b2bf5c 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -1251,12 +1251,14 @@ static int vfio_msix_early_setup(VFIOPCIDevice *vdev) static int vfio_msix_setup(VFIOPCIDevice *vdev, int pos) { int ret; + Error *local_err = NULL; ret = msix_init(&vdev->pdev, vdev->msix->entries, &vdev->bars[vdev->msix->table_bar].region.mem, vdev->msix->table_bar, vdev->msix->table_offset, &vdev->bars[vdev->msix->pba_bar].region.mem, - vdev->msix->pba_bar, vdev->msix->pba_offset, pos); + vdev->msix->pba_bar, vdev->msix->pba_offset, pos, + &local_err); if (ret < 0) { if (ret == -ENOTSUP) { return 0; diff --git a/include/hw/pci/msix.h b/include/hw/pci/msix.h index 72e5f93..6535a6c 100644 --- a/include/hw/pci/msix.h +++ b/include/hw/pci/msix.h @@ -9,7 +9,8 @@ MSIMessage msix_get_message(PCIDevice *dev, unsigned int vector); int msix_init(PCIDevice *dev, unsigned short nentries, MemoryRegion *table_bar, uint8_t table_bar_nr, unsigned table_offset, MemoryRegion *pba_bar, - uint8_t pba_bar_nr, unsigned pba_offset, uint8_t cap_pos); + uint8_t pba_bar_nr, unsigned pba_offset, uint8_t cap_pos, + Error **errp); int msix_init_exclusive_bar(PCIDevice *dev, unsigned short nentries, uint8_t bar_nr); -- 2.1.0