[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