[dpdk-dev] [PATCH 3/4] [PATCH 3/4] FreeBSD: Adds the equivalent interrupt mode setting and parsing

Alan Carew alan.carew at intel.com
Thu Jun 5 16:39:18 CEST 2014


This patch adds the equivalent functionality to FreeBSD as with patches 1 and 2

Signed-off-by: Alan Carew <alan.carew at intel.com>
---
 lib/librte_eal/bsdapp/eal/eal_pci.c     |   45 +++++++++++++++++++++++++++++++
 lib/librte_eal/bsdapp/nic_uio/nic_uio.c |   14 +++++++++
 2 files changed, 59 insertions(+), 0 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c
index 94ae461..7c270bb 100644
--- a/lib/librte_eal/bsdapp/eal/eal_pci.c
+++ b/lib/librte_eal/bsdapp/eal/eal_pci.c
@@ -50,6 +50,7 @@
 #include <sys/ioctl.h>
 #include <sys/pciio.h>
 #include <dev/pci/pcireg.h>
+#include <sys/sysctl.h>
 
 #include <rte_interrupts.h>
 #include <rte_log.h>
@@ -108,6 +109,44 @@ TAILQ_HEAD(uio_res_list, uio_resource);
 
 static struct uio_res_list *uio_res_list = NULL;
 
+struct rte_pci_dev_intr_mode {
+	enum igbuio_intr_mode mode;
+	const char *name;
+};
+
+/* Table of interrupt modes */
+const struct rte_pci_dev_intr_mode interrupt_modes[] = {
+#define RTE_PCI_DEV_INTR_MODE(id, mode_name) {INTR_MODE (id, mode_name)},
+#include <rte_pci_dev_features.h>
+};
+
+/*
+ * Determine the kernel configured interrupt mode
+ */
+static int
+pci_parse_intr_mode(struct rte_pci_device *dev)
+{
+	char intr_mode[INTR_NAME_LEN];
+	unsigned int i, num_intr_modes = RTE_DIM(interrupt_modes);
+	size_t sysctl_size = sizeof(intr_mode);
+
+	if (sysctlbyname("hw.nic_uio."RTE_PCI_DEV_FEATURE_INTR_MODE, &intr_mode,
+				&sysctl_size, NULL, 0) < 0) {
+		RTE_LOG(ERR, EAL,
+			"%s(): cannot get sysctlbyname: hw.nic_uio.intr_mode\n",
+			 __func__);
+		return (-1);
+	}
+	for (i = 0; i < num_intr_modes; i++) {
+		if (!strncmp(intr_mode, interrupt_modes[i].name, INTR_NAME_LEN)) {
+			dev->intr_mode = interrupt_modes[i].mode;
+			return 0;
+		}
+	}
+	return -1;
+	
+}
+
 /* unbind kernel driver for this device */
 static int
 pci_unbind_kernel_driver(struct rte_pci_device *dev)
@@ -220,6 +259,12 @@ pci_uio_map_resource(struct rte_pci_device *dev)
 		return -1;
 	}
 
+	if (pci_parse_intr_mode(dev) < 0) {
+		RTE_LOG(ERR, EAL,
+				"%s(): unable to determine interrupt mode\n", __func__);
+		return (-1);
+	}
+
 	/* save fd if in primary process */
 	dev->intr_handle.fd = open(devname, O_RDWR);
 	if (dev->intr_handle.fd < 0) {
diff --git a/lib/librte_eal/bsdapp/nic_uio/nic_uio.c b/lib/librte_eal/bsdapp/nic_uio/nic_uio.c
index c10e9aa..0e17d63 100644
--- a/lib/librte_eal/bsdapp/nic_uio/nic_uio.c
+++ b/lib/librte_eal/bsdapp/nic_uio/nic_uio.c
@@ -51,6 +51,10 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_object.h>
 #include <vm/vm_page.h>
 #include <vm/vm_pager.h>
+#include <sys/sysctl.h>
+
+#include <rte_pci_dev_feature_defs.h>
+#include <rte_pci_dev_features.h>
 
 
 #define MAX_BARS (PCIR_MAX_BAR_0 + 1)
@@ -116,6 +120,16 @@ const struct device devices[] = {
 };
 #define NUM_DEVICES (sizeof(devices)/sizeof(devices[0]))
 
+static char nic_uio_intr_mode[] = {IGBUIO_NONE_INTR_NAME};
+
+TUNABLE_STR("hw.nic_uio."RTE_PCI_DEV_FEATURE_INTR_MODE, nic_uio_intr_mode, sizeof(nic_uio_intr_mode));
+
+static SYSCTL_NODE(_hw, OID_AUTO, nic_uio, CTLFLAG_RD, 0, "nic_uio");
+
+SYSCTL_STRING(_hw_nic_uio, OID_AUTO, interrupt_mode, CTLFLAG_RW,
+			&nic_uio_intr_mode, sizeof(nic_uio_intr_mode),
+			"Configured interrupt mode");
+
 
 static devclass_t nic_uio_devclass;
 
-- 
1.7.0.7



More information about the dev mailing list