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