xref: /dpdk/drivers/net/mana/mana.h (revision 0c63c005f64eea378bd3a1302abd6cd14d398d24)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2022 Microsoft Corporation
3  */
4 
5 #ifndef __MANA_H__
6 #define __MANA_H__
7 
8 #define	PCI_VENDOR_ID_MICROSOFT		0x1414
9 #define PCI_DEVICE_ID_MICROSOFT_MANA	0x00ba
10 
11 /* Shared data between primary/secondary processes */
12 struct mana_shared_data {
13 	rte_spinlock_t lock;
14 	int init_done;
15 	unsigned int primary_cnt;
16 	unsigned int secondary_cnt;
17 };
18 
19 #define MIN_RX_BUF_SIZE	1024
20 #define MAX_FRAME_SIZE	RTE_ETHER_MAX_LEN
21 #define MANA_MAX_MAC_ADDR 1
22 
23 #define MANA_DEV_RX_OFFLOAD_SUPPORT ( \
24 		RTE_ETH_RX_OFFLOAD_CHECKSUM | \
25 		RTE_ETH_RX_OFFLOAD_RSS_HASH)
26 
27 #define MANA_DEV_TX_OFFLOAD_SUPPORT ( \
28 		RTE_ETH_TX_OFFLOAD_MULTI_SEGS | \
29 		RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \
30 		RTE_ETH_TX_OFFLOAD_TCP_CKSUM | \
31 		RTE_ETH_TX_OFFLOAD_UDP_CKSUM)
32 
33 #define INDIRECTION_TABLE_NUM_ELEMENTS 64
34 #define TOEPLITZ_HASH_KEY_SIZE_IN_BYTES 40
35 #define MANA_ETH_RSS_SUPPORT ( \
36 	RTE_ETH_RSS_IPV4 |	     \
37 	RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
38 	RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
39 	RTE_ETH_RSS_IPV6 |	     \
40 	RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
41 	RTE_ETH_RSS_NONFRAG_IPV6_UDP)
42 
43 #define MIN_BUFFERS_PER_QUEUE		64
44 #define MAX_RECEIVE_BUFFERS_PER_QUEUE	256
45 #define MAX_SEND_BUFFERS_PER_QUEUE	256
46 
47 struct mana_process_priv {
48 	void *db_page;
49 };
50 
51 struct mana_priv {
52 	struct rte_eth_dev_data *dev_data;
53 	struct mana_process_priv *process_priv;
54 	int num_queues;
55 
56 	/* DPDK port */
57 	uint16_t port_id;
58 
59 	/* IB device port */
60 	uint8_t dev_port;
61 
62 	struct ibv_context *ib_ctx;
63 	struct ibv_pd *ib_pd;
64 	struct ibv_pd *ib_parent_pd;
65 	void *db_page;
66 	struct rte_eth_rss_conf rss_conf;
67 	struct rte_intr_handle *intr_handle;
68 	int max_rx_queues;
69 	int max_tx_queues;
70 	int max_rx_desc;
71 	int max_tx_desc;
72 	int max_send_sge;
73 	int max_recv_sge;
74 	int max_mr;
75 	uint64_t max_mr_size;
76 };
77 
78 struct mana_rxq_desc {
79 	struct rte_mbuf *pkt;
80 	uint32_t wqe_size_in_bu;
81 };
82 
83 struct mana_rxq {
84 	struct mana_priv *priv;
85 	uint32_t num_desc;
86 	struct rte_mempool *mp;
87 
88 	/* For storing pending requests */
89 	struct mana_rxq_desc *desc_ring;
90 
91 	/* desc_ring_head is where we put pending requests to ring,
92 	 * completion pull off desc_ring_tail
93 	 */
94 	uint32_t desc_ring_head, desc_ring_tail;
95 
96 	unsigned int socket;
97 };
98 
99 extern int mana_logtype_driver;
100 extern int mana_logtype_init;
101 
102 #define DRV_LOG(level, fmt, args...) \
103 	rte_log(RTE_LOG_ ## level, mana_logtype_driver, "%s(): " fmt "\n", \
104 		__func__, ## args)
105 
106 #define PMD_INIT_LOG(level, fmt, args...) \
107 	rte_log(RTE_LOG_ ## level, mana_logtype_init, "%s(): " fmt "\n",\
108 		__func__, ## args)
109 
110 #define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
111 
112 uint16_t mana_rx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts,
113 			       uint16_t pkts_n);
114 
115 uint16_t mana_tx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts,
116 			       uint16_t pkts_n);
117 
118 /** Request timeout for IPC. */
119 #define MANA_MP_REQ_TIMEOUT_SEC 5
120 
121 /* Request types for IPC. */
122 enum mana_mp_req_type {
123 	MANA_MP_REQ_VERBS_CMD_FD = 1,
124 	MANA_MP_REQ_CREATE_MR,
125 	MANA_MP_REQ_START_RXTX,
126 	MANA_MP_REQ_STOP_RXTX,
127 };
128 
129 /* Pameters for IPC. */
130 struct mana_mp_param {
131 	enum mana_mp_req_type type;
132 	int port_id;
133 	int result;
134 
135 	/* MANA_MP_REQ_CREATE_MR */
136 	uintptr_t addr;
137 	uint32_t len;
138 };
139 
140 #define MANA_MP_NAME	"net_mana_mp"
141 int mana_mp_init_primary(void);
142 int mana_mp_init_secondary(void);
143 void mana_mp_uninit_primary(void);
144 void mana_mp_uninit_secondary(void);
145 int mana_mp_req_verbs_cmd_fd(struct rte_eth_dev *dev);
146 
147 void mana_mp_req_on_rxtx(struct rte_eth_dev *dev, enum mana_mp_req_type type);
148 
149 void *mana_alloc_verbs_buf(size_t size, void *data);
150 void mana_free_verbs_buf(void *ptr, void *data __rte_unused);
151 
152 #endif
153