New upstream version 17.11-rc3
[deb_dpdk.git] / drivers / net / thunderx / nicvf_ethdev.h
index 59fa19c..71bc3cf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   BSD LICENSE
  *
- *   Copyright (C) Cavium networks Ltd. 2016.
+ *   Copyright (C) Cavium, Inc. 2016.
  *
  *   Redistribution and use in source and binary forms, with or without
  *   modification, are permitted provided that the following conditions
@@ -13,7 +13,7 @@
  *       notice, this list of conditions and the following disclaimer in
  *       the documentation and/or other materials provided with the
  *       distribution.
- *     * Neither the name of Cavium networks nor the names of its
+ *     * Neither the name of Cavium, Inc nor the names of its
  *       contributors may be used to endorse or promote products derived
  *       from this software without specific prior written permission.
  *
@@ -35,7 +35,8 @@
 
 #include <rte_ethdev.h>
 
-#define THUNDERX_NICVF_PMD_VERSION      "1.0"
+#define THUNDERX_NICVF_PMD_VERSION      "2.0"
+#define THUNDERX_REG_BYTES             8
 
 #define NICVF_INTR_POLL_INTERVAL_MS    50
 #define NICVF_HALF_DUPLEX              0x00
@@ -77,7 +78,7 @@ nicvf_mempool_phy_offset(struct rte_mempool *mp)
 
        hdr = STAILQ_FIRST(&mp->mem_list);
        assert(hdr != NULL);
-       return (uint64_t)((uintptr_t)hdr->addr - hdr->phys_addr);
+       return (uint64_t)((uintptr_t)hdr->addr - hdr->iova);
 }
 
 static inline uint16_t
@@ -86,13 +87,24 @@ nicvf_mbuff_meta_length(struct rte_mbuf *mbuf)
        return (uint16_t)((uintptr_t)mbuf->buf_addr - (uintptr_t)mbuf);
 }
 
+static inline uint16_t
+nicvf_netdev_qidx(struct nicvf *nic, uint8_t local_qidx)
+{
+       uint16_t global_qidx = local_qidx;
+
+       if (nic->sqs_mode)
+               global_qidx += ((nic->sqs_id + 1) * MAX_CMP_QUEUES_PER_QS);
+
+       return global_qidx;
+}
+
 /*
  * Simple phy2virt functions assuming mbufs are in a single huge page
  * V = P + offset
  * P = V - offset
  */
 static inline uintptr_t
-nicvf_mbuff_phy2virt(phys_addr_t phy, uint64_t mbuf_phys_off)
+nicvf_mbuff_phy2virt(rte_iova_t phy, uint64_t mbuf_phys_off)
 {
        return (uintptr_t)(phy + mbuf_phys_off);
 }
@@ -100,7 +112,35 @@ nicvf_mbuff_phy2virt(phys_addr_t phy, uint64_t mbuf_phys_off)
 static inline uintptr_t
 nicvf_mbuff_virt2phy(uintptr_t virt, uint64_t mbuf_phys_off)
 {
-       return (phys_addr_t)(virt - mbuf_phys_off);
+       return (rte_iova_t)(virt - mbuf_phys_off);
+}
+
+static inline void
+nicvf_tx_range(struct rte_eth_dev *dev, struct nicvf *nic, uint16_t *tx_start,
+              uint16_t *tx_end)
+{
+       uint16_t tmp;
+
+       *tx_start = RTE_ALIGN_FLOOR(nicvf_netdev_qidx(nic, 0),
+                                   MAX_SND_QUEUES_PER_QS);
+       tmp = RTE_ALIGN_CEIL(nicvf_netdev_qidx(nic, 0) + 1,
+                            MAX_SND_QUEUES_PER_QS) - 1;
+       *tx_end = dev->data->nb_tx_queues ?
+               RTE_MIN(tmp, dev->data->nb_tx_queues - 1) : 0;
+}
+
+static inline void
+nicvf_rx_range(struct rte_eth_dev *dev, struct nicvf *nic, uint16_t *rx_start,
+              uint16_t *rx_end)
+{
+       uint16_t tmp;
+
+       *rx_start = RTE_ALIGN_FLOOR(nicvf_netdev_qidx(nic, 0),
+                                   MAX_RCV_QUEUES_PER_QS);
+       tmp = RTE_ALIGN_CEIL(nicvf_netdev_qidx(nic, 0) + 1,
+                            MAX_RCV_QUEUES_PER_QS) - 1;
+       *rx_end = dev->data->nb_rx_queues ?
+               RTE_MIN(tmp, dev->data->nb_rx_queues - 1) : 0;
 }
 
 #endif /* __THUNDERX_NICVF_ETHDEV_H__  */