1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2016 Cavium, Inc
3a9643ea8Slogwang */
4a9643ea8Slogwang
5a9643ea8Slogwang #ifndef __THUNDERX_NICVF_ETHDEV_H__
6a9643ea8Slogwang #define __THUNDERX_NICVF_ETHDEV_H__
7a9643ea8Slogwang
8d30ea906Sjfb8856606 #include <rte_ethdev_driver.h>
9a9643ea8Slogwang
102bfe3f2eSlogwang #define THUNDERX_NICVF_PMD_VERSION "2.0"
11a9643ea8Slogwang #define THUNDERX_REG_BYTES 8
12a9643ea8Slogwang
13a9643ea8Slogwang #define NICVF_INTR_POLL_INTERVAL_MS 50
14a9643ea8Slogwang #define NICVF_HALF_DUPLEX 0x00
15a9643ea8Slogwang #define NICVF_FULL_DUPLEX 0x01
16a9643ea8Slogwang #define NICVF_UNKNOWN_DUPLEX 0xff
17a9643ea8Slogwang
18a9643ea8Slogwang #define NICVF_RSS_OFFLOAD_PASS1 ( \
19a9643ea8Slogwang ETH_RSS_PORT | \
20a9643ea8Slogwang ETH_RSS_IPV4 | \
21a9643ea8Slogwang ETH_RSS_NONFRAG_IPV4_TCP | \
22a9643ea8Slogwang ETH_RSS_NONFRAG_IPV4_UDP | \
23a9643ea8Slogwang ETH_RSS_IPV6 | \
24a9643ea8Slogwang ETH_RSS_NONFRAG_IPV6_TCP | \
25a9643ea8Slogwang ETH_RSS_NONFRAG_IPV6_UDP)
26a9643ea8Slogwang
27a9643ea8Slogwang #define NICVF_RSS_OFFLOAD_TUNNEL ( \
28a9643ea8Slogwang ETH_RSS_VXLAN | \
29a9643ea8Slogwang ETH_RSS_GENEVE | \
30a9643ea8Slogwang ETH_RSS_NVGRE)
31a9643ea8Slogwang
32d30ea906Sjfb8856606 #define NICVF_TX_OFFLOAD_CAPA ( \
33d30ea906Sjfb8856606 DEV_TX_OFFLOAD_IPV4_CKSUM | \
34d30ea906Sjfb8856606 DEV_TX_OFFLOAD_UDP_CKSUM | \
35d30ea906Sjfb8856606 DEV_TX_OFFLOAD_TCP_CKSUM | \
36d30ea906Sjfb8856606 DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | \
37d30ea906Sjfb8856606 DEV_TX_OFFLOAD_MBUF_FAST_FREE | \
38d30ea906Sjfb8856606 DEV_TX_OFFLOAD_MULTI_SEGS)
39d30ea906Sjfb8856606
40d30ea906Sjfb8856606 #define NICVF_RX_OFFLOAD_CAPA ( \
41d30ea906Sjfb8856606 DEV_RX_OFFLOAD_CHECKSUM | \
42d30ea906Sjfb8856606 DEV_RX_OFFLOAD_VLAN_STRIP | \
43d30ea906Sjfb8856606 DEV_RX_OFFLOAD_JUMBO_FRAME | \
44*4418919fSjohnjiang DEV_RX_OFFLOAD_SCATTER | \
45*4418919fSjohnjiang DEV_RX_OFFLOAD_RSS_HASH)
46d30ea906Sjfb8856606
47a9643ea8Slogwang #define NICVF_DEFAULT_RX_FREE_THRESH 224
48a9643ea8Slogwang #define NICVF_DEFAULT_TX_FREE_THRESH 224
49a9643ea8Slogwang #define NICVF_TX_FREE_MPOOL_THRESH 16
50a9643ea8Slogwang #define NICVF_MAX_RX_FREE_THRESH 1024
51a9643ea8Slogwang #define NICVF_MAX_TX_FREE_THRESH 1024
52a9643ea8Slogwang
53a9643ea8Slogwang #define VLAN_TAG_SIZE 4 /* 802.3ac tag */
54a9643ea8Slogwang
55d30ea906Sjfb8856606 #define SKIP_DATA_BYTES "skip_data_bytes"
56a9643ea8Slogwang static inline struct nicvf *
nicvf_pmd_priv(struct rte_eth_dev * eth_dev)57a9643ea8Slogwang nicvf_pmd_priv(struct rte_eth_dev *eth_dev)
58a9643ea8Slogwang {
59a9643ea8Slogwang return eth_dev->data->dev_private;
60a9643ea8Slogwang }
61a9643ea8Slogwang
62a9643ea8Slogwang static inline uint64_t
nicvf_mempool_phy_offset(struct rte_mempool * mp)63a9643ea8Slogwang nicvf_mempool_phy_offset(struct rte_mempool *mp)
64a9643ea8Slogwang {
65a9643ea8Slogwang struct rte_mempool_memhdr *hdr;
66a9643ea8Slogwang
67a9643ea8Slogwang hdr = STAILQ_FIRST(&mp->mem_list);
68a9643ea8Slogwang assert(hdr != NULL);
692bfe3f2eSlogwang return (uint64_t)((uintptr_t)hdr->addr - hdr->iova);
70a9643ea8Slogwang }
71a9643ea8Slogwang
72a9643ea8Slogwang static inline uint16_t
nicvf_mbuff_meta_length(struct rte_mbuf * mbuf)73a9643ea8Slogwang nicvf_mbuff_meta_length(struct rte_mbuf *mbuf)
74a9643ea8Slogwang {
75a9643ea8Slogwang return (uint16_t)((uintptr_t)mbuf->buf_addr - (uintptr_t)mbuf);
76a9643ea8Slogwang }
77a9643ea8Slogwang
782bfe3f2eSlogwang static inline uint16_t
nicvf_netdev_qidx(struct nicvf * nic,uint8_t local_qidx)792bfe3f2eSlogwang nicvf_netdev_qidx(struct nicvf *nic, uint8_t local_qidx)
802bfe3f2eSlogwang {
812bfe3f2eSlogwang uint16_t global_qidx = local_qidx;
822bfe3f2eSlogwang
832bfe3f2eSlogwang if (nic->sqs_mode)
842bfe3f2eSlogwang global_qidx += ((nic->sqs_id + 1) * MAX_CMP_QUEUES_PER_QS);
852bfe3f2eSlogwang
862bfe3f2eSlogwang return global_qidx;
872bfe3f2eSlogwang }
882bfe3f2eSlogwang
89a9643ea8Slogwang /*
90a9643ea8Slogwang * Simple phy2virt functions assuming mbufs are in a single huge page
91a9643ea8Slogwang * V = P + offset
92a9643ea8Slogwang * P = V - offset
93a9643ea8Slogwang */
94a9643ea8Slogwang static inline uintptr_t
nicvf_mbuff_phy2virt(rte_iova_t phy,uint64_t mbuf_phys_off)952bfe3f2eSlogwang nicvf_mbuff_phy2virt(rte_iova_t phy, uint64_t mbuf_phys_off)
96a9643ea8Slogwang {
97a9643ea8Slogwang return (uintptr_t)(phy + mbuf_phys_off);
98a9643ea8Slogwang }
99a9643ea8Slogwang
100a9643ea8Slogwang static inline uintptr_t
nicvf_mbuff_virt2phy(uintptr_t virt,uint64_t mbuf_phys_off)101a9643ea8Slogwang nicvf_mbuff_virt2phy(uintptr_t virt, uint64_t mbuf_phys_off)
102a9643ea8Slogwang {
1032bfe3f2eSlogwang return (rte_iova_t)(virt - mbuf_phys_off);
1042bfe3f2eSlogwang }
1052bfe3f2eSlogwang
1062bfe3f2eSlogwang static inline void
nicvf_tx_range(struct rte_eth_dev * dev,struct nicvf * nic,uint16_t * tx_start,uint16_t * tx_end)1072bfe3f2eSlogwang nicvf_tx_range(struct rte_eth_dev *dev, struct nicvf *nic, uint16_t *tx_start,
1082bfe3f2eSlogwang uint16_t *tx_end)
1092bfe3f2eSlogwang {
1102bfe3f2eSlogwang uint16_t tmp;
1112bfe3f2eSlogwang
1122bfe3f2eSlogwang *tx_start = RTE_ALIGN_FLOOR(nicvf_netdev_qidx(nic, 0),
1132bfe3f2eSlogwang MAX_SND_QUEUES_PER_QS);
1142bfe3f2eSlogwang tmp = RTE_ALIGN_CEIL(nicvf_netdev_qidx(nic, 0) + 1,
1152bfe3f2eSlogwang MAX_SND_QUEUES_PER_QS) - 1;
1162bfe3f2eSlogwang *tx_end = dev->data->nb_tx_queues ?
1172bfe3f2eSlogwang RTE_MIN(tmp, dev->data->nb_tx_queues - 1) : 0;
1182bfe3f2eSlogwang }
1192bfe3f2eSlogwang
1202bfe3f2eSlogwang static inline void
nicvf_rx_range(struct rte_eth_dev * dev,struct nicvf * nic,uint16_t * rx_start,uint16_t * rx_end)1212bfe3f2eSlogwang nicvf_rx_range(struct rte_eth_dev *dev, struct nicvf *nic, uint16_t *rx_start,
1222bfe3f2eSlogwang uint16_t *rx_end)
1232bfe3f2eSlogwang {
1242bfe3f2eSlogwang uint16_t tmp;
1252bfe3f2eSlogwang
1262bfe3f2eSlogwang *rx_start = RTE_ALIGN_FLOOR(nicvf_netdev_qidx(nic, 0),
1272bfe3f2eSlogwang MAX_RCV_QUEUES_PER_QS);
1282bfe3f2eSlogwang tmp = RTE_ALIGN_CEIL(nicvf_netdev_qidx(nic, 0) + 1,
1292bfe3f2eSlogwang MAX_RCV_QUEUES_PER_QS) - 1;
1302bfe3f2eSlogwang *rx_end = dev->data->nb_rx_queues ?
1312bfe3f2eSlogwang RTE_MIN(tmp, dev->data->nb_rx_queues - 1) : 0;
132a9643ea8Slogwang }
133a9643ea8Slogwang
134a9643ea8Slogwang #endif /* __THUNDERX_NICVF_ETHDEV_H__ */
135