From: Martin Spinler <[email protected]>

This prepares queue mapping for port-aware driver implementation.

Signed-off-by: Martin Spinler <[email protected]>
---
 drivers/net/nfb/nfb.h        |  3 +++
 drivers/net/nfb/nfb_ethdev.c | 21 +++++++++++++++++++++
 drivers/net/nfb/nfb_rx.c     | 30 +++++++++++++++---------------
 drivers/net/nfb/nfb_rx.h     |  9 ++++-----
 drivers/net/nfb/nfb_tx.c     | 27 +++++++++++++++------------
 drivers/net/nfb/nfb_tx.h     |  7 +++----
 6 files changed, 61 insertions(+), 36 deletions(-)

diff --git a/drivers/net/nfb/nfb.h b/drivers/net/nfb/nfb.h
index 90b04c6151..3821732c37 100644
--- a/drivers/net/nfb/nfb.h
+++ b/drivers/net/nfb/nfb.h
@@ -60,6 +60,9 @@ struct pmd_internals {
 struct pmd_priv {
        uint16_t max_rx_queues;
        uint16_t max_tx_queues;
+
+       int             *queue_map_rx;
+       int             *queue_map_tx;
 };
 
 #endif /* _NFB_H_ */
diff --git a/drivers/net/nfb/nfb_ethdev.c b/drivers/net/nfb/nfb_ethdev.c
index 947ee9e21d..803815138c 100644
--- a/drivers/net/nfb/nfb_ethdev.c
+++ b/drivers/net/nfb/nfb_ethdev.c
@@ -509,6 +509,7 @@ static const struct eth_dev_ops ops = {
 static int
 nfb_eth_dev_init(struct rte_eth_dev *dev)
 {
+       int i;
        int ret;
        uint32_t mac_count;
        struct rte_eth_dev_data *data = dev->data;
@@ -577,6 +578,20 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
                priv->max_rx_queues = max_rx_queues;
                priv->max_tx_queues = max_tx_queues;
 
+               priv->queue_map_rx = rte_calloc("NFB queue map", (max_rx_queues 
+ max_tx_queues),
+                               sizeof(*priv->queue_map_rx), 0);
+               if (priv->queue_map_rx == NULL) {
+                       ret = -ENOMEM;
+                       goto err_alloc_queue_map;
+               }
+               priv->queue_map_tx = priv->queue_map_rx + max_rx_queues;
+
+               /* default queue mapping is 1:1 */
+               for (i = 0; i < max_rx_queues; i++)
+                       priv->queue_map_rx[i] = i;
+               for (i = 0; i < max_tx_queues; i++)
+                       priv->queue_map_tx[i] = i;
+
                /* Allocate space for MAC addresses */
                mac_count = nfb_eth_get_max_mac_address_count(dev);
                data->mac_addrs = rte_zmalloc(data->name,
@@ -608,6 +623,8 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
        return 0;
 
 err_malloc_mac_addrs:
+       rte_free(priv->queue_map_rx);
+err_alloc_queue_map:
        nfb_nc_rxmac_deinit(internals->rxmac, internals->max_rxmac);
        nfb_nc_txmac_deinit(internals->txmac, internals->max_txmac);
        nfb_close(internals->nfb);
@@ -633,6 +650,10 @@ nfb_eth_dev_uninit(struct rte_eth_dev *dev)
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_pci_addr *pci_addr = &pci_dev->addr;
        struct pmd_internals *internals = dev->process_private;
+       struct pmd_priv *priv = dev->data->dev_private;
+
+       if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+               rte_free(priv->queue_map_rx);
 
        nfb_nc_rxmac_deinit(internals->rxmac, internals->max_rxmac);
        nfb_nc_txmac_deinit(internals->txmac, internals->max_txmac);
diff --git a/drivers/net/nfb/nfb_rx.c b/drivers/net/nfb/nfb_rx.c
index 413d275853..ff630f32f4 100644
--- a/drivers/net/nfb/nfb_rx.c
+++ b/drivers/net/nfb/nfb_rx.c
@@ -61,12 +61,13 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev,
                struct rte_mempool *mb_pool)
 {
        struct pmd_internals *internals = dev->process_private;
+       struct pmd_priv *priv = dev->data->dev_private;
 
-       struct ndp_rx_queue *rxq;
        int ret;
+       int qid;
+       struct ndp_rx_queue *rxq;
 
-       rxq = rte_zmalloc_socket("ndp rx queue",
-                       sizeof(struct ndp_rx_queue),
+       rxq = rte_zmalloc_socket("ndp rx queue", sizeof(struct ndp_rx_queue),
                        RTE_CACHE_LINE_SIZE, socket_id);
 
        if (rxq == NULL) {
@@ -77,23 +78,23 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev,
 
        rxq->flags = 0;
 
-       ret = nfb_eth_rx_queue_init(internals->nfb,
-               rx_queue_id,
-               dev->data->port_id,
-               mb_pool,
-               rxq);
+       qid = priv->queue_map_rx[rx_queue_id];
 
-       if (ret == 0)
-               dev->data->rx_queues[rx_queue_id] = rxq;
-       else
-               rte_free(rxq);
+       ret = nfb_eth_rx_queue_init(internals->nfb, qid, dev->data->port_id, 
mb_pool, rxq);
+       if (ret)
+               goto err_queue_init;
 
+       dev->data->rx_queues[rx_queue_id] = rxq;
+       return 0;
+
+err_queue_init:
+       rte_free(rxq);
        return ret;
 }
 
 int
 nfb_eth_rx_queue_init(struct nfb_device *nfb,
-               uint16_t rx_queue_id,
+               int qid,
                uint16_t port_id,
                struct rte_mempool *mb_pool,
                struct ndp_rx_queue *rxq)
@@ -104,12 +105,11 @@ nfb_eth_rx_queue_init(struct nfb_device *nfb,
        if (nfb == NULL)
                return -EINVAL;
 
-       rxq->queue = ndp_open_rx_queue(nfb, rx_queue_id);
+       rxq->queue = ndp_open_rx_queue(nfb, qid);
        if (rxq->queue == NULL)
                return -EINVAL;
 
        rxq->nfb = nfb;
-       rxq->rx_queue_id = rx_queue_id;
        rxq->in_port = port_id;
        rxq->mb_pool = mb_pool;
        rxq->buf_size = (uint16_t)(mbp_priv->mbuf_data_room_size -
diff --git a/drivers/net/nfb/nfb_rx.h b/drivers/net/nfb/nfb_rx.h
index 67b3b00e2a..831945c577 100644
--- a/drivers/net/nfb/nfb_rx.h
+++ b/drivers/net/nfb/nfb_rx.h
@@ -30,7 +30,6 @@ nfb_timestamp_dynfield(struct rte_mbuf *mbuf)
 struct ndp_rx_queue {
        struct nfb_device *nfb;      /* nfb dev structure */
        struct ndp_queue *queue;     /* rx queue */
-       uint16_t rx_queue_id;        /* index */
        uint8_t in_port;             /* port */
        uint8_t flags;               /* setup flags */
 
@@ -47,8 +46,8 @@ struct ndp_rx_queue {
  *
  * @param nfb
  *   Pointer to nfb device structure.
- * @param rx_queue_id
- *   RX queue index.
+ * @param qid
+ *   RX queue ID.
  * @param port_id
  *   Device [external] port identifier.
  * @param mb_pool
@@ -60,7 +59,7 @@ struct ndp_rx_queue {
  */
 int
 nfb_eth_rx_queue_init(struct nfb_device *nfb,
-       uint16_t rx_queue_id,
+       int qid,
        uint16_t port_id,
        struct rte_mempool *mb_pool,
        struct ndp_rx_queue *rxq);
@@ -70,7 +69,7 @@ nfb_eth_rx_queue_init(struct nfb_device *nfb,
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param idx
+ * @param rx_queue_id
  *   RX queue index.
  * @param desc
  *   Number of descriptors to configure in queue.
diff --git a/drivers/net/nfb/nfb_tx.c b/drivers/net/nfb/nfb_tx.c
index 1f997ce22f..b5cbedeaf6 100644
--- a/drivers/net/nfb/nfb_tx.c
+++ b/drivers/net/nfb/nfb_tx.c
@@ -54,11 +54,13 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
        const struct rte_eth_txconf *tx_conf __rte_unused)
 {
        struct pmd_internals *internals = dev->process_private;
+       struct pmd_priv *priv = dev->data->dev_private;
+
        int ret;
+       int qid;
        struct ndp_tx_queue *txq;
 
-       txq = rte_zmalloc_socket("ndp tx queue",
-               sizeof(struct ndp_tx_queue),
+       txq = rte_zmalloc_socket("ndp tx queue", sizeof(struct ndp_tx_queue),
                RTE_CACHE_LINE_SIZE, socket_id);
 
        if (txq == NULL) {
@@ -67,32 +69,33 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
                return -ENOMEM;
        }
 
-       ret = nfb_eth_tx_queue_init(internals->nfb,
-               tx_queue_id,
-               txq);
+       qid = priv->queue_map_tx[tx_queue_id];
 
-       if (ret == 0)
-               dev->data->tx_queues[tx_queue_id] = txq;
-       else
-               rte_free(txq);
+       ret = nfb_eth_tx_queue_init(internals->nfb, qid, txq);
+       if (ret)
+               goto err_queue_init;
 
+       dev->data->tx_queues[tx_queue_id] = txq;
+       return 0;
+
+err_queue_init:
+       rte_free(txq);
        return ret;
 }
 
 int
 nfb_eth_tx_queue_init(struct nfb_device *nfb,
-       uint16_t tx_queue_id,
+       int qid,
        struct ndp_tx_queue *txq)
 {
        if (nfb == NULL)
                return -EINVAL;
 
-       txq->queue = ndp_open_tx_queue(nfb, tx_queue_id);
+       txq->queue = ndp_open_tx_queue(nfb, qid);
        if (txq->queue == NULL)
                return -EINVAL;
 
        txq->nfb = nfb;
-       txq->tx_queue_id = tx_queue_id;
 
        txq->tx_pkts = 0;
        txq->tx_bytes = 0;
diff --git a/drivers/net/nfb/nfb_tx.h b/drivers/net/nfb/nfb_tx.h
index f107cf914b..c253af1a86 100644
--- a/drivers/net/nfb/nfb_tx.h
+++ b/drivers/net/nfb/nfb_tx.h
@@ -17,7 +17,6 @@
 struct ndp_tx_queue {
        struct nfb_device *nfb;     /* nfb dev structure */
        struct ndp_queue *queue;    /* tx queue */
-       uint16_t          tx_queue_id;       /* index */
        volatile uint64_t tx_pkts;  /* packets transmitted */
        volatile uint64_t tx_bytes; /* bytes transmitted */
        volatile uint64_t err_pkts; /* erroneous packets */
@@ -54,8 +53,8 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
  *
  * @param nfb
  *   Pointer to nfb device structure.
- * @param tx_queue_id
- *   TX queue index.
+ * @param qid
+ *   TX queue ID.
  * @param[out] txq
  *   Pointer to ndp_tx_queue output structure
  *
@@ -64,7 +63,7 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
  */
 int
 nfb_eth_tx_queue_init(struct nfb_device *nfb,
-       uint16_t tx_queue_id,
+       int qid,
        struct ndp_tx_queue *txq);
 
 /**
-- 
2.52.0

Reply via email to