DPDK patches and discussions
 help / color / mirror / Atom feed
* Re: [dpdk-dev] [PATCH v2 05/16] Moved interrupt type out of igb_uio
@ 2014-05-27  2:46 Xu, HuilongX
  0 siblings, 0 replies; 6+ messages in thread
From: Xu, HuilongX @ 2014-05-27  2:46 UTC (permalink / raw)
  To: dev, Burakov, Anatoly

Moving interrupt type enum out of igb_uio and renaming it to be more
generic. Such a strange header naming and separation is done mostly to
make coming virtio patches easier to port to dpdk.org tree.

Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
Test-by: HuilongX Xu <huilongx.xu at intel.com>
Compile pass
     >>Compile OS: FC20 x86_64
     >>Kernel version: 3.13.6-200
     >>GCC version: 4.8.2
     >>Server: Crownpass
---
lib/librte_eal/common/Makefile                     |    1 +
lib/librte_eal/common/include/rte_pci.h            |    1 +
.../common/include/rte_pci_dev_feature_defs.h      |   46 ++++++++++++++++++
.../common/include/rte_pci_dev_features.h          |   40 ++++++++++++++++
lib/librte_eal/linuxapp/igb_uio/igb_uio.c          |   49 ++++++++-----------
5 files changed, 109 insertions(+), 28 deletions(-)
create mode 100644 lib/librte_eal/common/include/rte_pci_dev_feature_defs.h
create mode 100644 lib/librte_eal/common/include/rte_pci_dev_features.h

diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 2f99bf4..7daf38c 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -39,6 +39,7 @@ INC += rte_rwlock.h rte_spinlock.h rte_tailq.h rte_interrupts.h rte_alarm.h
INC += rte_string_fns.h rte_cpuflags.h rte_version.h rte_tailq_elem.h
INC += rte_eal_memconfig.h rte_malloc_heap.h
INC += rte_hexdump.h rte_devargs.h rte_vdev.h
+INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
 ifeq ($(CONFIG_RTE_INSECURE_FUNCTION_WARNING),y)
INC += rte_warnings.h
diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index 84d7b42..d364cee 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -80,6 +80,7 @@ extern "C" {
#include <sys/queue.h>
#include <stdint.h>
#include <inttypes.h>
+
#include <rte_interrupts.h>
 TAILQ_HEAD(pci_device_list, rte_pci_device); /**< PCI devices in D-linked Q. */
diff --git a/lib/librte_eal/common/include/rte_pci_dev_feature_defs.h b/lib/librte_eal/common/include/rte_pci_dev_feature_defs.h
new file mode 100644
index 0000000..82f2c00
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_pci_dev_feature_defs.h
@@ -0,0 +1,46 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_PCI_DEV_DEFS_H_
+#define _RTE_PCI_DEV_DEFS_H_
+
+/* interrupt mode */
+enum rte_intr_mode {
+             RTE_INTR_MODE_NONE = 0,
+             RTE_INTR_MODE_LEGACY,
+             RTE_INTR_MODE_MSI,
+             RTE_INTR_MODE_MSIX,
+             RTE_INTR_MODE_MAX
+};
+
+#endif /* _RTE_PCI_DEV_DEFS_H_ */
diff --git a/lib/librte_eal/common/include/rte_pci_dev_features.h b/lib/librte_eal/common/include/rte_pci_dev_features.h
new file mode 100644
index 0000000..61f271a
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_pci_dev_features.h
@@ -0,0 +1,40 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <rte_pci_dev_feature_defs.h>
+
+#define RTE_INTR_MODE_NONE_NAME "none"
+#define RTE_INTR_MODE_LEGACY_NAME "legacy"
+#define RTE_INTR_MODE_MSI_NAME "msi"
+#define RTE_INTR_MODE_MSIX_NAME "msix"
+#define RTE_INTR_MODE_MAX_MAX "max"
diff --git a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
index 09c40bf..043c0f6 100644
--- a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
+++ b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
@@ -33,6 +33,7 @@
#ifdef CONFIG_XEN_DOM0
 #include <xen/xen.h>
#endif
+#include <rte_pci_dev_features.h>
 /**
  * MSI-X related macros, copy from linux/pci_regs.h in kernel 2.6.39,
@@ -49,14 +50,6 @@
 #define IGBUIO_NUM_MSI_VECTORS 1
-/* interrupt mode */
-enum igbuio_intr_mode {
-              IGBUIO_LEGACY_INTR_MODE = 0,
-              IGBUIO_MSI_INTR_MODE,
-              IGBUIO_MSIX_INTR_MODE,
-              IGBUIO_INTR_MODE_MAX
-};
-
/**
  * A structure describing the private information for a uio device.
  */
@@ -64,13 +57,13 @@ struct rte_uio_pci_dev {
               struct uio_info info;
               struct pci_dev *pdev;
               spinlock_t lock; /* spinlock for accessing PCI config space or msix data in multi tasks/isr */
-              enum igbuio_intr_mode mode;
+             enum rte_intr_mode mode;
               struct msix_entry \
                               msix_entries[IGBUIO_NUM_MSI_VECTORS]; /* pointer to the msix vectors to be allocated later */
};
 static char *intr_mode = NULL;
-static enum igbuio_intr_mode igbuio_intr_mode_preferred = IGBUIO_MSIX_INTR_MODE;
+static enum rte_intr_mode igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX;
 /* PCI device id table */
static struct pci_device_id igbuio_pci_ids[] = {
@@ -222,14 +215,14 @@ igbuio_set_interrupt_mask(struct rte_uio_pci_dev *udev, int32_t state)
{
               struct pci_dev *pdev = udev->pdev;
-              if (udev->mode == IGBUIO_MSIX_INTR_MODE) {
+             if (udev->mode == RTE_INTR_MODE_MSIX) {
                               struct msi_desc *desc;
                                list_for_each_entry(desc, &pdev->msi_list, list) {
                                               igbuio_msix_mask_irq(desc, state);
                               }
               }
-              else if (udev->mode == IGBUIO_LEGACY_INTR_MODE) {
+             else if (udev->mode == RTE_INTR_MODE_LEGACY) {
                               uint32_t status;
                               uint16_t old, new;
@@ -301,7 +294,7 @@ igbuio_pci_irqhandler(int irq, struct uio_info *info)
                               goto spin_unlock;
                /* for legacy mode, interrupt maybe shared */
-              if (udev->mode == IGBUIO_LEGACY_INTR_MODE) {
+             if (udev->mode == RTE_INTR_MODE_LEGACY) {
                               pci_read_config_dword(pdev, PCI_COMMAND, &cmd_status_dword);
                               status = cmd_status_dword >> 16;
                               /* interrupt is not ours, goes to out */
@@ -520,18 +513,18 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
#endif
               udev->info.priv = udev;
               udev->pdev = dev;
-              udev->mode = 0; /* set the default value for interrupt mode */
+             udev->mode = RTE_INTR_MODE_LEGACY;
               spin_lock_init(&udev->lock);
                /* check if it need to try msix first */
-              if (igbuio_intr_mode_preferred == IGBUIO_MSIX_INTR_MODE) {
+             if (igbuio_intr_mode_preferred == RTE_INTR_MODE_MSIX) {
                               int vector;
                                for (vector = 0; vector < IGBUIO_NUM_MSI_VECTORS; vector ++)
                                               udev->msix_entries[vector].entry = vector;
                                if (pci_enable_msix(udev->pdev, udev->msix_entries, IGBUIO_NUM_MSI_VECTORS) == 0) {
-                                              udev->mode = IGBUIO_MSIX_INTR_MODE;
+                                             udev->mode = RTE_INTR_MODE_MSIX;
                               }
                               else {
                                               pci_disable_msix(udev->pdev);
@@ -539,13 +532,13 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
                               }
               }
               switch (udev->mode) {
-              case IGBUIO_MSIX_INTR_MODE:
+             case RTE_INTR_MODE_MSIX:
                               udev->info.irq_flags = 0;
                               udev->info.irq = udev->msix_entries[0].vector;
                               break;
-              case IGBUIO_MSI_INTR_MODE:
+             case RTE_INTR_MODE_MSI:
                               break;
-              case IGBUIO_LEGACY_INTR_MODE:
+             case RTE_INTR_MODE_LEGACY:
                               udev->info.irq_flags = IRQF_SHARED;
                               udev->info.irq = dev->irq;
                               break;
@@ -570,7 +563,7 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
fail_release_iomem:
               sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
               igbuio_pci_release_iomem(&udev->info);
-              if (udev->mode == IGBUIO_MSIX_INTR_MODE)
+             if (udev->mode == RTE_INTR_MODE_MSIX)
                               pci_disable_msix(udev->pdev);
               pci_release_regions(dev);
fail_disable:
@@ -595,8 +588,8 @@ igbuio_pci_remove(struct pci_dev *dev)
               uio_unregister_device(info);
               igbuio_pci_release_iomem(info);
               if (((struct rte_uio_pci_dev *)info->priv)->mode ==
-                                                                              IGBUIO_MSIX_INTR_MODE)
-                              pci_disable_msix(dev);
+                                             RTE_INTR_MODE_MSIX)
+             pci_disable_msix(dev);
               pci_release_regions(dev);
               pci_disable_device(dev);
               pci_set_drvdata(dev, NULL);
@@ -611,11 +604,11 @@ igbuio_config_intr_mode(char *intr_str)
                               return 0;
               }
-              if (!strcmp(intr_str, "msix")) {
-                              igbuio_intr_mode_preferred = IGBUIO_MSIX_INTR_MODE;
+             if (!strcmp(intr_str, RTE_INTR_MODE_MSIX_NAME)) {
+                             igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX;
                               printk(KERN_INFO "Use MSIX interrupt\n");
-              } else if (!strcmp(intr_str, "legacy")) {
-                              igbuio_intr_mode_preferred = IGBUIO_LEGACY_INTR_MODE;
+             } else if (!strcmp(intr_str, RTE_INTR_MODE_LEGACY_NAME)) {
+                             igbuio_intr_mode_preferred = RTE_INTR_MODE_LEGACY;
                               printk(KERN_INFO "Use legacy interrupt\n");
               } else {
                               printk(KERN_INFO "Error: bad parameter - %s\n", intr_str);
@@ -656,8 +649,8 @@ module_exit(igbuio_pci_exit_module);
module_param(intr_mode, charp, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(intr_mode,
"igb_uio interrupt mode (default=msix):\n"
-"    msix       Use MSIX interrupt\n"
-"    legacy     Use Legacy interrupt\n"
+"    " RTE_INTR_MODE_MSIX_NAME "       Use MSIX interrupt\n"
+"    " RTE_INTR_MODE_LEGACY_NAME "     Use Legacy interrupt\n"
"\n");
 MODULE_DESCRIPTION("UIO driver for Intel IGB PCI cards");
--
1.7.0.7

^ permalink raw reply	[flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v2 05/16] Moved interrupt type out of igb_uio
@ 2014-05-27  3:01 Xu, HuilongX
  0 siblings, 0 replies; 6+ messages in thread
From: Xu, HuilongX @ 2014-05-27  3:01 UTC (permalink / raw)
  To: dev, Burakov, Anatoly


Moving interrupt type enum out of igb_uio and renaming it to be more
generic. Such a strange header naming and separation is done mostly to
make coming virtio patches easier to port to dpdk.org tree.

Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
Test-by: HuilongX Xu <huilongx.xu at intel.com>
Compile pass
     >>Compile OS: FC20 x86_64
     >>Kernel version: 3.13.6-200
     >>GCC version: 4.8.2
     >>Server: Crownpass
---
lib/librte_eal/common/Makefile                     |    1 +
lib/librte_eal/common/include/rte_pci.h            |    1 +
.../common/include/rte_pci_dev_feature_defs.h      |   46 ++++++++++++++++++
.../common/include/rte_pci_dev_features.h          |   40 ++++++++++++++++
lib/librte_eal/linuxapp/igb_uio/igb_uio.c          |   49 ++++++++-----------
5 files changed, 109 insertions(+), 28 deletions(-)
create mode 100644 lib/librte_eal/common/include/rte_pci_dev_feature_defs.h
create mode 100644 lib/librte_eal/common/include/rte_pci_dev_features.h

diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 2f99bf4..7daf38c 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -39,6 +39,7 @@ INC += rte_rwlock.h rte_spinlock.h rte_tailq.h rte_interrupts.h rte_alarm.h
INC += rte_string_fns.h rte_cpuflags.h rte_version.h rte_tailq_elem.h
INC += rte_eal_memconfig.h rte_malloc_heap.h
INC += rte_hexdump.h rte_devargs.h rte_vdev.h
+INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h

 ifeq ($(CONFIG_RTE_INSECURE_FUNCTION_WARNING),y)
INC += rte_warnings.h
diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index 84d7b42..d364cee 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -80,6 +80,7 @@ extern "C" {
#include <sys/queue.h>
#include <stdint.h>
#include <inttypes.h>
+
#include <rte_interrupts.h>

 TAILQ_HEAD(pci_device_list, rte_pci_device); /**< PCI devices in D-linked Q. */
diff --git a/lib/librte_eal/common/include/rte_pci_dev_feature_defs.h b/lib/librte_eal/common/include/rte_pci_dev_feature_defs.h
new file mode 100644
index 0000000..82f2c00
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_pci_dev_feature_defs.h
@@ -0,0 +1,46 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_PCI_DEV_DEFS_H_
+#define _RTE_PCI_DEV_DEFS_H_
+
+/* interrupt mode */
+enum rte_intr_mode {
+             RTE_INTR_MODE_NONE = 0,
+             RTE_INTR_MODE_LEGACY,
+             RTE_INTR_MODE_MSI,
+             RTE_INTR_MODE_MSIX,
+             RTE_INTR_MODE_MAX
+};
+
+#endif /* _RTE_PCI_DEV_DEFS_H_ */
diff --git a/lib/librte_eal/common/include/rte_pci_dev_features.h b/lib/librte_eal/common/include/rte_pci_dev_features.h
new file mode 100644
index 0000000..61f271a
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_pci_dev_features.h
@@ -0,0 +1,40 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <rte_pci_dev_feature_defs.h>
+
+#define RTE_INTR_MODE_NONE_NAME "none"
+#define RTE_INTR_MODE_LEGACY_NAME "legacy"
+#define RTE_INTR_MODE_MSI_NAME "msi"
+#define RTE_INTR_MODE_MSIX_NAME "msix"
+#define RTE_INTR_MODE_MAX_MAX "max"
diff --git a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
index 09c40bf..043c0f6 100644
--- a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
+++ b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
@@ -33,6 +33,7 @@
#ifdef CONFIG_XEN_DOM0
 #include <xen/xen.h>
#endif
+#include <rte_pci_dev_features.h>

 /**
  * MSI-X related macros, copy from linux/pci_regs.h in kernel 2.6.39,
@@ -49,14 +50,6 @@

 #define IGBUIO_NUM_MSI_VECTORS 1

-/* interrupt mode */
-enum igbuio_intr_mode {
-              IGBUIO_LEGACY_INTR_MODE = 0,
-              IGBUIO_MSI_INTR_MODE,
-              IGBUIO_MSIX_INTR_MODE,
-              IGBUIO_INTR_MODE_MAX
-};
-
/**
  * A structure describing the private information for a uio device.
  */
@@ -64,13 +57,13 @@ struct rte_uio_pci_dev {
               struct uio_info info;
               struct pci_dev *pdev;
               spinlock_t lock; /* spinlock for accessing PCI config space or msix data in multi tasks/isr */
-              enum igbuio_intr_mode mode;
+             enum rte_intr_mode mode;
               struct msix_entry \
                               msix_entries[IGBUIO_NUM_MSI_VECTORS]; /* pointer to the msix vectors to be allocated later */
};

 static char *intr_mode = NULL;
-static enum igbuio_intr_mode igbuio_intr_mode_preferred = IGBUIO_MSIX_INTR_MODE;
+static enum rte_intr_mode igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX;

 /* PCI device id table */
static struct pci_device_id igbuio_pci_ids[] = {
@@ -222,14 +215,14 @@ igbuio_set_interrupt_mask(struct rte_uio_pci_dev *udev, int32_t state)
{
               struct pci_dev *pdev = udev->pdev;

-              if (udev->mode == IGBUIO_MSIX_INTR_MODE) {
+             if (udev->mode == RTE_INTR_MODE_MSIX) {
                               struct msi_desc *desc;

                                list_for_each_entry(desc, &pdev->msi_list, list) {
                                               igbuio_msix_mask_irq(desc, state);
                               }
               }
-              else if (udev->mode == IGBUIO_LEGACY_INTR_MODE) {
+             else if (udev->mode == RTE_INTR_MODE_LEGACY) {
                               uint32_t status;
                               uint16_t old, new;

@@ -301,7 +294,7 @@ igbuio_pci_irqhandler(int irq, struct uio_info *info)
                               goto spin_unlock;

                /* for legacy mode, interrupt maybe shared */
-              if (udev->mode == IGBUIO_LEGACY_INTR_MODE) {
+             if (udev->mode == RTE_INTR_MODE_LEGACY) {
                               pci_read_config_dword(pdev, PCI_COMMAND, &cmd_status_dword);
                               status = cmd_status_dword >> 16;
                               /* interrupt is not ours, goes to out */
@@ -520,18 +513,18 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
#endif
               udev->info.priv = udev;
               udev->pdev = dev;
-              udev->mode = 0; /* set the default value for interrupt mode */
+             udev->mode = RTE_INTR_MODE_LEGACY;
               spin_lock_init(&udev->lock);

                /* check if it need to try msix first */
-              if (igbuio_intr_mode_preferred == IGBUIO_MSIX_INTR_MODE) {
+             if (igbuio_intr_mode_preferred == RTE_INTR_MODE_MSIX) {
                               int vector;

                                for (vector = 0; vector < IGBUIO_NUM_MSI_VECTORS; vector ++)
                                               udev->msix_entries[vector].entry = vector;

                                if (pci_enable_msix(udev->pdev, udev->msix_entries, IGBUIO_NUM_MSI_VECTORS) == 0) {
-                                              udev->mode = IGBUIO_MSIX_INTR_MODE;
+                                             udev->mode = RTE_INTR_MODE_MSIX;
                               }
                               else {
                                               pci_disable_msix(udev->pdev);
@@ -539,13 +532,13 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
                               }
               }
               switch (udev->mode) {
-              case IGBUIO_MSIX_INTR_MODE:
+             case RTE_INTR_MODE_MSIX:
                               udev->info.irq_flags = 0;
                               udev->info.irq = udev->msix_entries[0].vector;
                               break;
-              case IGBUIO_MSI_INTR_MODE:
+             case RTE_INTR_MODE_MSI:
                               break;
-              case IGBUIO_LEGACY_INTR_MODE:
+             case RTE_INTR_MODE_LEGACY:
                               udev->info.irq_flags = IRQF_SHARED;
                               udev->info.irq = dev->irq;
                               break;
@@ -570,7 +563,7 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
fail_release_iomem:
               sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
               igbuio_pci_release_iomem(&udev->info);
-              if (udev->mode == IGBUIO_MSIX_INTR_MODE)
+             if (udev->mode == RTE_INTR_MODE_MSIX)
                               pci_disable_msix(udev->pdev);
               pci_release_regions(dev);
fail_disable:
@@ -595,8 +588,8 @@ igbuio_pci_remove(struct pci_dev *dev)
               uio_unregister_device(info);
               igbuio_pci_release_iomem(info);
               if (((struct rte_uio_pci_dev *)info->priv)->mode ==
-                                                                              IGBUIO_MSIX_INTR_MODE)
-                              pci_disable_msix(dev);
+                                             RTE_INTR_MODE_MSIX)
+             pci_disable_msix(dev);
               pci_release_regions(dev);
               pci_disable_device(dev);
               pci_set_drvdata(dev, NULL);
@@ -611,11 +604,11 @@ igbuio_config_intr_mode(char *intr_str)
                               return 0;
               }

-              if (!strcmp(intr_str, "msix")) {
-                              igbuio_intr_mode_preferred = IGBUIO_MSIX_INTR_MODE;
+             if (!strcmp(intr_str, RTE_INTR_MODE_MSIX_NAME)) {
+                             igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX;
                               printk(KERN_INFO "Use MSIX interrupt\n");
-              } else if (!strcmp(intr_str, "legacy")) {
-                              igbuio_intr_mode_preferred = IGBUIO_LEGACY_INTR_MODE;
+             } else if (!strcmp(intr_str, RTE_INTR_MODE_LEGACY_NAME)) {
+                             igbuio_intr_mode_preferred = RTE_INTR_MODE_LEGACY;
                               printk(KERN_INFO "Use legacy interrupt\n");
               } else {
                               printk(KERN_INFO "Error: bad parameter - %s\n", intr_str);
@@ -656,8 +649,8 @@ module_exit(igbuio_pci_exit_module);
module_param(intr_mode, charp, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(intr_mode,
"igb_uio interrupt mode (default=msix):\n"
-"    msix       Use MSIX interrupt\n"
-"    legacy     Use Legacy interrupt\n"
+"    " RTE_INTR_MODE_MSIX_NAME "       Use MSIX interrupt\n"
+"    " RTE_INTR_MODE_LEGACY_NAME "     Use Legacy interrupt\n"
"\n");

 MODULE_DESCRIPTION("UIO driver for Intel IGB PCI cards");
--
1.7.0.7

^ permalink raw reply	[flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH 00/16] [RFC] [VFIO] Add VFIO support to DPDK
@ 2014-05-01 11:05 Burakov, Anatoly
  2014-05-19 15:51 ` [dpdk-dev] [PATCH v2 05/16] Moved interrupt type out of igb_uio Anatoly Burakov
  0 siblings, 1 reply; 6+ messages in thread
From: Burakov, Anatoly @ 2014-05-01 11:05 UTC (permalink / raw)
  To: dev

This patchset adds support for using VFIO instead of IGB_UIO to
map the device BARs.

VFIO is a kernel 3.6+ driver allowing secure DMA from userspace
by means of using IOMMU instead of working directly with physical
memory like igb_uio does.

Short summary:
* Adding support for VFIO in EAL PCI code
* Adding new command-line parameter for VFIO interrupt type
* Adding support for VFIO in setup.sh
* Renaming igb_uio_bind to dpdk_nic_bind and adding support for
  VFIO there
* Removing PCI ID list from igb_uio, effectively making it another
  generic PCI driver similar to pci_stub, vfio-pci et al
* Adding autotest for VFIO interrupt types
* Making igb_uio and VFIO compilation optional

I'm submitting this as an RFC because this patch is based off
current dpdk.org branch with David Marchand's RTE_EAL_UNBIND_PORTS
patchset. IOW, this will *not* apply to the dpdk.org tree *unless* you
also apply David's patches beforehand.

Signed-off by: Anatoly Burakov <anatoly.burakov@intel.com>

Anatoly Burakov (16):
  Separate igb_uio mapping into a separate file
  Distinguish between legitimate failures and non-fatal errors
  Rename RTE_PCI_DRV_NEED_IGB_UIO to RTE_PCI_DRV_NEED_MAPPING
  Make igb_uio compilation optional
  Moved interrupt type out of igb_uio
  Add support for VFIO in Linuxapp targets
  Add support for VFIO interrupts, add VFIO header
  Add support for mapping devices through VFIO.
  Enable VFIO device binding
  Added support for selecting VFIO interrupt type from EAL command-line
  Make --no-huge use mmap instead of malloc.
  Adding unit tests for VFIO EAL command-line parameter
  Removed PCI ID table from igb_uio
  Renamed igb_uio_bind to dpdk_nic_bind
  Added support for VFIO drivers in dpdk_nic_bind.py
  Adding support for VFIO to setup.sh

 app/test/test_eal_flags.c                          |  24 +
 app/test/test_pci.c                                |   4 +-
 config/defconfig_i686-default-linuxapp-gcc         |   2 +
 config/defconfig_i686-default-linuxapp-icc         |   2 +
 config/defconfig_x86_64-default-linuxapp-gcc       |   2 +
 config/defconfig_x86_64-default-linuxapp-icc       |   2 +
 lib/librte_eal/bsdapp/eal/eal_pci.c                |   2 +-
 lib/librte_eal/common/Makefile                     |   1 +
 lib/librte_eal/common/eal_common_pci.c             |  17 +-
 lib/librte_eal/common/include/rte_pci.h            |   7 +-
 .../common/include/rte_pci_dev_feature_defs.h      |  46 ++
 .../common/include/rte_pci_dev_features.h          |  42 ++
 lib/librte_eal/linuxapp/Makefile                   |   2 +
 lib/librte_eal/linuxapp/eal/Makefile               |   6 +-
 lib/librte_eal/linuxapp/eal/eal.c                  |  35 +
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 203 +++++-
 lib/librte_eal/linuxapp/eal/eal_memory.c           |   8 +-
 lib/librte_eal/linuxapp/eal/eal_pci.c              | 480 ++------------
 lib/librte_eal/linuxapp/eal/eal_pci_uio.c          | 416 ++++++++++++
 lib/librte_eal/linuxapp/eal/eal_pci_vfio.c         | 709 +++++++++++++++++++++
 lib/librte_eal/linuxapp/eal/eal_pci_vfio_socket.c  | 367 +++++++++++
 .../linuxapp/eal/include/eal_internal_cfg.h        |   3 +
 lib/librte_eal/linuxapp/eal/include/eal_pci_init.h | 120 ++++
 lib/librte_eal/linuxapp/eal/include/eal_vfio.h     |  55 ++
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |   7 +-
 lib/librte_eal/linuxapp/igb_uio/igb_uio.c          |  70 +-
 lib/librte_pmd_e1000/em_ethdev.c                   |   2 +-
 lib/librte_pmd_e1000/igb_ethdev.c                  |   4 +-
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c                |   4 +-
 lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c            |   2 +-
 tools/dpdk_nic_bind.py                             | 500 +++++++++++++++
 tools/igb_uio_bind.py                              | 485 --------------
 tools/setup.sh                                     | 168 ++++-
 33 files changed, 2797 insertions(+), 1000 deletions(-)
 create mode 100644 lib/librte_eal/common/include/rte_pci_dev_feature_defs.h
 create mode 100644 lib/librte_eal/common/include/rte_pci_dev_features.h
 create mode 100644 lib/librte_eal/linuxapp/eal/eal_pci_uio.c
 create mode 100644 lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
 create mode 100644 lib/librte_eal/linuxapp/eal/eal_pci_vfio_socket.c
 create mode 100644 lib/librte_eal/linuxapp/eal/include/eal_pci_init.h
 create mode 100644 lib/librte_eal/linuxapp/eal/include/eal_vfio.h
 create mode 100755 tools/dpdk_nic_bind.py
 delete mode 100755 tools/igb_uio_bind.py

-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-05-27  3:00 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-27  2:46 [dpdk-dev] [PATCH v2 05/16] Moved interrupt type out of igb_uio Xu, HuilongX
  -- strict thread matches above, loose matches on Subject: below --
2014-05-27  3:01 Xu, HuilongX
2014-05-01 11:05 [dpdk-dev] [PATCH 00/16] [RFC] [VFIO] Add VFIO support to DPDK Burakov, Anatoly
2014-05-19 15:51 ` [dpdk-dev] [PATCH v2 05/16] Moved interrupt type out of igb_uio Anatoly Burakov
2014-05-21 13:38   ` Thomas Monjalon
2014-05-21 13:44     ` Burakov, Anatoly
2014-05-21 13:46   ` Thomas Monjalon

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).