DPDK patches and discussions
 help / color / mirror / Atom feed
From: Shaopeng He <shaopeng.he@intel.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v2 2/7] fm10k: setup rx queue interrupts for PF and VF
Date: Mon, 26 Oct 2015 11:47:40 +0800	[thread overview]
Message-ID: <1445831265-14256-3-git-send-email-shaopeng.he@intel.com> (raw)
In-Reply-To: <1445831265-14256-1-git-send-email-shaopeng.he@intel.com>

In interrupt mode, each rx queue can have one interrupt to notify the up
layer application when packets are available in that queue. Some queues
also can share one interrupt.
Currently, fm10k needs one separate interrupt for mailbox. So, only those
drivers which support multiple interrupt vectors e.g. vfio-pci can work
in fm10k interrupt mode.
This patch uses the RXINT/INT_MAP registers to map interrupt causes
(rx queue and other events) to vectors, and enable these interrupts
through kernel drivers like vfio-pci.

Signed-off-by: Shaopeng He <shaopeng.he@intel.com>
---
 drivers/net/fm10k/fm10k_ethdev.c | 93 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 86 insertions(+), 7 deletions(-)

diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index a82cd59..68ae1ba 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -52,6 +52,8 @@
 /* Number of chars per uint32 type */
 #define CHARS_PER_UINT32 (sizeof(uint32_t))
 #define BIT_MASK_PER_UINT32 ((1 << CHARS_PER_UINT32) - 1)
+/* default 1:1 map from queue ID to interrupt vector ID */
+#define Q2V(dev, queue_id) (dev->pci_dev->intr_handle.intr_vec[queue_id])
 
 static void fm10k_close_mbx_service(struct fm10k_hw *hw);
 static void fm10k_dev_promiscuous_enable(struct rte_eth_dev *dev);
@@ -67,6 +69,8 @@ static void
 fm10k_MACVLAN_remove_all(struct rte_eth_dev *dev);
 static void fm10k_tx_queue_release(void *queue);
 static void fm10k_rx_queue_release(void *queue);
+static int
+fm10k_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);
 
 static void
 fm10k_mbx_initlock(struct fm10k_hw *hw)
@@ -406,6 +410,7 @@ static int
 fm10k_dev_rx_init(struct rte_eth_dev *dev)
 {
 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 	int i, ret;
 	struct fm10k_rx_queue *rxq;
 	uint64_t base_addr;
@@ -413,10 +418,23 @@ fm10k_dev_rx_init(struct rte_eth_dev *dev)
 	uint32_t rxdctl = FM10K_RXDCTL_WRITE_BACK_MIN_DELAY;
 	uint16_t buf_size;
 
-	/* Disable RXINT to avoid possible interrupt */
-	for (i = 0; i < hw->mac.max_queues; i++)
+	/* enable RXINT for interrupt mode */
+	i = 0;
+	if (rte_intr_dp_is_en(intr_handle)) {
+		for (; i < dev->data->nb_rx_queues; i++) {
+			FM10K_WRITE_REG(hw, FM10K_RXINT(i), Q2V(dev, i));
+			if (hw->mac.type == fm10k_mac_pf)
+				FM10K_WRITE_REG(hw, FM10K_ITR(Q2V(dev, i)),
+					FM10K_ITR_AUTOMASK | FM10K_ITR_MASK_CLEAR);
+			else
+				FM10K_WRITE_REG(hw, FM10K_VFITR(Q2V(dev, i)),
+					FM10K_ITR_AUTOMASK | FM10K_ITR_MASK_CLEAR);
+		}
+	}
+	/* Disable other RXINT to avoid possible interrupt */
+	for (; i < hw->mac.max_queues; i++)
 		FM10K_WRITE_REG(hw, FM10K_RXINT(i),
-				3 << FM10K_RXINT_TIMER_SHIFT);
+			3 << FM10K_RXINT_TIMER_SHIFT);
 
 	/* Setup RX queues */
 	for (i = 0; i < dev->data->nb_rx_queues; ++i) {
@@ -741,6 +759,9 @@ fm10k_dev_start(struct rte_eth_dev *dev)
 		return diag;
 	}
 
+	if (fm10k_dev_rxq_interrupt_setup(dev))
+		return -EIO;
+
 	diag = fm10k_dev_rx_init(dev);
 	if (diag) {
 		PMD_INIT_LOG(ERR, "RX init failed: %d", diag);
@@ -1778,6 +1799,64 @@ fm10k_dev_disable_intr_vf(struct rte_eth_dev *dev)
 }
 
 static int
+fm10k_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
+{
+	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	uint32_t intr_vector, vec;
+	uint16_t queue_id;
+	int result = 0;
+
+	/* fm10k needs one separate interrupt for mailbox,
+	 * so only drivers which support multiple interrupt vectors
+	 * e.g. vfio-pci can work for fm10k interrupt mode
+	 */
+	if (!rte_intr_cap_multiple(intr_handle) ||
+			dev->data->dev_conf.intr_conf.rxq == 0)
+		return result;
+
+	intr_vector = dev->data->nb_rx_queues;
+
+	/* disable interrupt first */
+	rte_intr_disable(&dev->pci_dev->intr_handle);
+	if (hw->mac.type == fm10k_mac_pf)
+		fm10k_dev_disable_intr_pf(dev);
+	else
+		fm10k_dev_disable_intr_vf(dev);
+
+	if (rte_intr_efd_enable(intr_handle, intr_vector)) {
+		PMD_INIT_LOG(ERR, "Failed to init event fd");
+		result = -EIO;
+	}
+
+	if (rte_intr_dp_is_en(intr_handle) && !result) {
+		intr_handle->intr_vec =	rte_zmalloc("intr_vec",
+			dev->data->nb_rx_queues * sizeof(int), 0);
+		if (intr_handle->intr_vec) {
+			for (queue_id = 0, vec = RX_VEC_START;
+					queue_id < dev->data->nb_rx_queues;
+					queue_id++) {
+				intr_handle->intr_vec[queue_id] = vec;
+				if (vec < intr_handle->nb_efd - 1 + RX_VEC_START)
+					vec++;
+			}
+		} else {
+			PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
+				" intr_vec", dev->data->nb_rx_queues);
+			result = -ENOMEM;
+		}
+	}
+
+	if (hw->mac.type == fm10k_mac_pf)
+		fm10k_dev_enable_intr_pf(dev);
+	else
+		fm10k_dev_enable_intr_vf(dev);
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+	hw->mac.ops.update_int_moderator(hw);
+	return result;
+}
+
+static int
 fm10k_dev_handle_fault(struct fm10k_hw *hw, uint32_t eicr)
 {
 	struct fm10k_fault fault;
@@ -2060,7 +2139,7 @@ static int
 eth_fm10k_dev_init(struct rte_eth_dev *dev)
 {
 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	int diag;
+	int diag, i;
 	struct fm10k_macvlan_filter_info *macvlan;
 
 	PMD_INIT_FUNC_TRACE();
@@ -2177,7 +2256,7 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev)
 		fm10k_dev_enable_intr_vf(dev);
 	}
 
-	/* Enable uio intr after callback registered */
+	/* Enable intr after callback registered */
 	rte_intr_enable(&(dev->pci_dev->intr_handle));
 
 	hw->mac.ops.update_int_moderator(hw);
@@ -2185,7 +2264,6 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev)
 	/* Make sure Switch Manager is ready before going forward. */
 	if (hw->mac.type == fm10k_mac_pf) {
 		int switch_ready = 0;
-		int i;
 
 		for (i = 0; i < MAX_QUERY_SWITCH_STATE_TIMES; i++) {
 			fm10k_mbx_lock(hw);
@@ -2291,7 +2369,8 @@ static struct eth_driver rte_pmd_fm10k = {
 	.pci_drv = {
 		.name = "rte_pmd_fm10k",
 		.id_table = pci_id_fm10k_map,
-		.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_DETACHABLE,
+		.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
+			RTE_PCI_DRV_DETACHABLE,
 	},
 	.eth_dev_init = eth_fm10k_dev_init,
 	.eth_dev_uninit = eth_fm10k_dev_uninit,
-- 
1.9.3

  parent reply	other threads:[~2015-10-26  3:48 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-25  5:37 [dpdk-dev] [PATCH 0/5] interrupt mode for fm10k Shaopeng He
2015-09-25  5:37 ` [dpdk-dev] [PATCH 1/5] fm10k: implement rx_descriptor_done function Shaopeng He
2015-09-25  5:37 ` [dpdk-dev] [PATCH 2/5] fm10k: enable Rx queue interrupts for PF and VF Shaopeng He
2015-10-22  6:52   ` Chen, Jing D
2015-09-25  5:37 ` [dpdk-dev] [PATCH 3/5] fm10k: make sure default VID available in dev_init Shaopeng He
2015-09-25  5:37 ` [dpdk-dev] [PATCH 4/5] l3fwd-power: fix a memory leak for non-ip packet Shaopeng He
2015-09-25  7:19   ` De Lara Guarch, Pablo
2015-09-25  9:00     ` He, Shaopeng
2015-09-25  5:37 ` [dpdk-dev] [PATCH 5/5] doc: release note update for fm10k intr mode Shaopeng He
2015-10-26  3:47 ` [dpdk-dev] [PATCH v2 0/7] interrupt mode for fm10k Shaopeng He
2015-10-26  3:47   ` [dpdk-dev] [PATCH v2 1/7] fm10k: implement rx_descriptor_done function Shaopeng He
2015-10-26  3:47   ` Shaopeng He [this message]
2015-10-26  3:47   ` [dpdk-dev] [PATCH v2 3/7] fm10k: remove rx queue interrupts when dev stops Shaopeng He
2015-10-26  3:47   ` [dpdk-dev] [PATCH v2 4/7] fm10k: add rx queue interrupt en/dis functions Shaopeng He
2015-10-26  3:47   ` [dpdk-dev] [PATCH v2 5/7] fm10k: make sure default VID available in dev_init Shaopeng He
2015-10-26  3:47   ` [dpdk-dev] [PATCH v2 6/7] l3fwd-power: fix a memory leak for non-ip packet Shaopeng He
2015-10-26  3:47   ` [dpdk-dev] [PATCH v2 7/7] doc: release note update for fm10k intr mode Shaopeng He
2015-12-22  7:00     ` Qiu, Michael
2015-12-22 12:07       ` He, Shaopeng
2015-10-28  7:34   ` [dpdk-dev] [PATCH v2 0/7] interrupt mode for fm10k Chen, Jing D
2015-10-30 10:40     ` He, Shaopeng
2015-10-30 13:54       ` Thomas Monjalon
2015-10-31  3:06         ` He, Shaopeng
2015-11-04 14:52           ` Thomas Monjalon
2015-11-05  5:12   ` [dpdk-dev] [PATCH v3 " Shaopeng He
2015-11-05  5:12     ` [dpdk-dev] [PATCH v3 1/7] fm10k: implement rx_descriptor_done function Shaopeng He
2015-11-05  5:12     ` [dpdk-dev] [PATCH v3 2/7] fm10k: setup rx queue interrupts for PF and VF Shaopeng He
2015-11-05  5:12     ` [dpdk-dev] [PATCH v3 3/7] fm10k: remove rx queue interrupts when dev stops Shaopeng He
2015-11-05  5:12     ` [dpdk-dev] [PATCH v3 4/7] fm10k: add rx queue interrupt en/dis functions Shaopeng He
2015-11-05  5:12     ` [dpdk-dev] [PATCH v3 5/7] fm10k: make sure default VID available in dev_init Shaopeng He
2015-11-05  5:12     ` [dpdk-dev] [PATCH v3 6/7] l3fwd-power: fix a memory leak for non-ip packet Shaopeng He
2015-11-05  5:12     ` [dpdk-dev] [PATCH v3 7/7] doc: release note update for fm10k intr mode Shaopeng He
2015-12-21 10:19     ` [dpdk-dev] [PATCH v4 0/6] interrupt mode for fm10k Shaopeng He
2015-12-21 10:19       ` [dpdk-dev] [PATCH v4 1/6] fm10k: implement rx_descriptor_done function Shaopeng He
2015-12-22  6:50         ` Qiu, Michael
2015-12-22 11:55           ` He, Shaopeng
2015-12-21 10:19       ` [dpdk-dev] [PATCH v4 2/6] fm10k: setup rx queue interrupts for PF and VF Shaopeng He
2015-12-22  7:28         ` Qiu, Michael
2015-12-23  1:57           ` He, Shaopeng
2015-12-21 10:19       ` [dpdk-dev] [PATCH v4 3/6] fm10k: remove rx queue interrupts when dev stops Shaopeng He
2015-12-22  6:54         ` Qiu, Michael
2015-12-22 12:03           ` He, Shaopeng
2015-12-21 10:19       ` [dpdk-dev] [PATCH v4 4/6] fm10k: add rx queue interrupt en/dis functions Shaopeng He
2015-12-21 10:19       ` [dpdk-dev] [PATCH v4 5/6] fm10k: make sure default VID available in dev_init Shaopeng He
2015-12-21 10:19       ` [dpdk-dev] [PATCH v4 6/6] l3fwd-power: fix a memory leak for non-ip packet Shaopeng He
2015-12-23  7:37       ` [dpdk-dev] [PATCH v5 0/6] interrupt mode for fm10k Shaopeng He
2015-12-23  7:37         ` [dpdk-dev] [PATCH v5 1/6] fm10k: implement rx_descriptor_done function Shaopeng He
2015-12-23  7:37         ` [dpdk-dev] [PATCH v5 2/6] fm10k: setup rx queue interrupts for PF and VF Shaopeng He
2015-12-23  7:37         ` [dpdk-dev] [PATCH v5 3/6] fm10k: remove rx queue interrupts when dev stops Shaopeng He
2015-12-23  7:37         ` [dpdk-dev] [PATCH v5 4/6] fm10k: add rx queue interrupt en/dis functions Shaopeng He
2015-12-23  7:37         ` [dpdk-dev] [PATCH v5 5/6] fm10k: make sure default VID available in dev_init Shaopeng He
2015-12-23  7:37         ` [dpdk-dev] [PATCH v5 6/6] l3fwd-power: fix a memory leak for non-ip packet Shaopeng He
2015-12-24  8:04         ` [dpdk-dev] [PATCH v5 0/6] interrupt mode for fm10k Qiu, Michael
2016-02-05  4:57         ` [dpdk-dev] [PATCH v6 " Shaopeng He
2016-02-05  4:57           ` [dpdk-dev] [PATCH v6 1/6] fm10k: implement rx_descriptor_done function Shaopeng He
2016-02-05  4:57           ` [dpdk-dev] [PATCH v6 2/6] fm10k: setup rx queue interrupts for PF and VF Shaopeng He
2016-02-05  4:57           ` [dpdk-dev] [PATCH v6 3/6] fm10k: remove rx queue interrupts when dev stops Shaopeng He
2016-02-05  4:57           ` [dpdk-dev] [PATCH v6 4/6] fm10k: add rx queue interrupt en/dis functions Shaopeng He
2016-02-05  4:57           ` [dpdk-dev] [PATCH v6 5/6] fm10k: make sure default VID available in dev_init Shaopeng He
2016-02-05  4:57           ` [dpdk-dev] [PATCH v6 6/6] l3fwd-power: fix a memory leak for non-ip packet Shaopeng He
2016-02-05 16:34           ` [dpdk-dev] [PATCH v6 0/6] interrupt mode for fm10k Bruce Richardson
2016-03-03  8:36           ` Liu, Yong
2016-03-03  9:10             ` Thomas Monjalon
2016-03-03  9:19               ` Liu, Yong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1445831265-14256-3-git-send-email-shaopeng.he@intel.com \
    --to=shaopeng.he@intel.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).