xref: /dpdk/drivers/net/mana/mana.h (revision 2b843cac232eb3f2fa79e4254e21766817e2019f)
1517ed6e2SLong Li /* SPDX-License-Identifier: BSD-3-Clause
2517ed6e2SLong Li  * Copyright 2022 Microsoft Corporation
3517ed6e2SLong Li  */
4517ed6e2SLong Li 
5517ed6e2SLong Li #ifndef __MANA_H__
6517ed6e2SLong Li #define __MANA_H__
7517ed6e2SLong Li 
8517ed6e2SLong Li #define	PCI_VENDOR_ID_MICROSOFT		0x1414
9517ed6e2SLong Li #define PCI_DEVICE_ID_MICROSOFT_MANA	0x00ba
10517ed6e2SLong Li 
11517ed6e2SLong Li /* Shared data between primary/secondary processes */
12517ed6e2SLong Li struct mana_shared_data {
13517ed6e2SLong Li 	rte_spinlock_t lock;
14517ed6e2SLong Li 	int init_done;
15517ed6e2SLong Li 	unsigned int primary_cnt;
16517ed6e2SLong Li 	unsigned int secondary_cnt;
17517ed6e2SLong Li };
18517ed6e2SLong Li 
1984497839SLong Li #define MANA_MAX_MTU	9000
20d878cb09SLong Li #define MIN_RX_BUF_SIZE	1024
21d878cb09SLong Li #define MANA_MAX_MAC_ADDR 1
22d878cb09SLong Li 
23d878cb09SLong Li #define MANA_DEV_RX_OFFLOAD_SUPPORT ( \
24f8a4217dSWei Hu 		RTE_ETH_RX_OFFLOAD_VLAN_STRIP | \
25d878cb09SLong Li 		RTE_ETH_RX_OFFLOAD_CHECKSUM | \
26d878cb09SLong Li 		RTE_ETH_RX_OFFLOAD_RSS_HASH)
27d878cb09SLong Li 
28d878cb09SLong Li #define MANA_DEV_TX_OFFLOAD_SUPPORT ( \
29f8a4217dSWei Hu 		RTE_ETH_TX_OFFLOAD_VLAN_INSERT | \
30d878cb09SLong Li 		RTE_ETH_TX_OFFLOAD_MULTI_SEGS | \
31d878cb09SLong Li 		RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \
32d878cb09SLong Li 		RTE_ETH_TX_OFFLOAD_TCP_CKSUM | \
33d878cb09SLong Li 		RTE_ETH_TX_OFFLOAD_UDP_CKSUM)
34d878cb09SLong Li 
35d878cb09SLong Li #define INDIRECTION_TABLE_NUM_ELEMENTS 64
36d878cb09SLong Li #define TOEPLITZ_HASH_KEY_SIZE_IN_BYTES 40
37d878cb09SLong Li #define MANA_ETH_RSS_SUPPORT ( \
38d878cb09SLong Li 	RTE_ETH_RSS_IPV4 |	     \
39d878cb09SLong Li 	RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
40d878cb09SLong Li 	RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
41d878cb09SLong Li 	RTE_ETH_RSS_IPV6 |	     \
42d878cb09SLong Li 	RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
43d878cb09SLong Li 	RTE_ETH_RSS_NONFRAG_IPV6_UDP)
44d878cb09SLong Li 
45d878cb09SLong Li #define MIN_BUFFERS_PER_QUEUE		64
46d878cb09SLong Li #define MAX_RECEIVE_BUFFERS_PER_QUEUE	256
47d878cb09SLong Li #define MAX_SEND_BUFFERS_PER_QUEUE	256
48d878cb09SLong Li 
4956dd45c0SLong Li #define GDMA_WQE_ALIGNMENT_UNIT_SIZE 32
5056dd45c0SLong Li 
5156dd45c0SLong Li #define COMP_ENTRY_SIZE 64
5256dd45c0SLong Li #define MAX_TX_WQE_SIZE 512
5356dd45c0SLong Li #define MAX_RX_WQE_SIZE 256
5456dd45c0SLong Li 
5526c6bdf3SWei Hu /* For 32 bit only */
5626c6bdf3SWei Hu #ifdef RTE_ARCH_32
5726c6bdf3SWei Hu #define	GDMA_SHORT_DB_INC_MASK 0xffff
5826c6bdf3SWei Hu #define	GDMA_SHORT_DB_QID_MASK 0xfff
5926c6bdf3SWei Hu 
6026c6bdf3SWei Hu #define GDMA_SHORT_DB_MAX_WQE	(0x10000 / GDMA_WQE_ALIGNMENT_UNIT_SIZE)
6126c6bdf3SWei Hu 
6226c6bdf3SWei Hu #define TX_WQE_SHORT_DB_THRESHOLD			\
6326c6bdf3SWei Hu 	(GDMA_SHORT_DB_MAX_WQE -			\
6426c6bdf3SWei Hu 	(MAX_TX_WQE_SIZE / GDMA_WQE_ALIGNMENT_UNIT_SIZE))
6526c6bdf3SWei Hu #define RX_WQE_SHORT_DB_THRESHOLD			\
6626c6bdf3SWei Hu 	(GDMA_SHORT_DB_MAX_WQE -			\
6726c6bdf3SWei Hu 	(MAX_RX_WQE_SIZE / GDMA_WQE_ALIGNMENT_UNIT_SIZE))
6826c6bdf3SWei Hu #endif
6926c6bdf3SWei Hu 
7056dd45c0SLong Li /* Values from the GDMA specification document, WQE format description */
7156dd45c0SLong Li #define INLINE_OOB_SMALL_SIZE_IN_BYTES 8
7256dd45c0SLong Li #define INLINE_OOB_LARGE_SIZE_IN_BYTES 24
7356dd45c0SLong Li 
7456dd45c0SLong Li #define NOT_USING_CLIENT_DATA_UNIT 0
7556dd45c0SLong Li 
767f322844SLong Li enum tx_packet_format_v2 {
777f322844SLong Li 	SHORT_PACKET_FORMAT = 0,
787f322844SLong Li 	LONG_PACKET_FORMAT = 1
797f322844SLong Li };
807f322844SLong Li 
817f322844SLong Li struct transmit_short_oob_v2 {
827f322844SLong Li 	enum tx_packet_format_v2 packet_format : 2;
837f322844SLong Li 	uint32_t tx_is_outer_ipv4 : 1;
847f322844SLong Li 	uint32_t tx_is_outer_ipv6 : 1;
857f322844SLong Li 	uint32_t tx_compute_IP_header_checksum : 1;
867f322844SLong Li 	uint32_t tx_compute_TCP_checksum : 1;
877f322844SLong Li 	uint32_t tx_compute_UDP_checksum : 1;
887f322844SLong Li 	uint32_t suppress_tx_CQE_generation : 1;
897f322844SLong Li 	uint32_t VCQ_number : 24;
907f322844SLong Li 	uint32_t tx_transport_header_offset : 10;
917f322844SLong Li 	uint32_t VSQ_frame_num : 14;
927f322844SLong Li 	uint32_t short_vport_offset : 8;
937f322844SLong Li };
947f322844SLong Li 
957f322844SLong Li struct transmit_long_oob_v2 {
967f322844SLong Li 	uint32_t tx_is_encapsulated_packet : 1;
977f322844SLong Li 	uint32_t tx_inner_is_ipv6 : 1;
987f322844SLong Li 	uint32_t tx_inner_TCP_options_present : 1;
997f322844SLong Li 	uint32_t inject_vlan_prior_tag : 1;
1007f322844SLong Li 	uint32_t reserved1 : 12;
1017f322844SLong Li 	uint32_t priority_code_point : 3;
1027f322844SLong Li 	uint32_t drop_eligible_indicator : 1;
1037f322844SLong Li 	uint32_t vlan_identifier : 12;
1047f322844SLong Li 	uint32_t tx_inner_frame_offset : 10;
1057f322844SLong Li 	uint32_t tx_inner_IP_header_relative_offset : 6;
1067f322844SLong Li 	uint32_t long_vport_offset : 12;
1077f322844SLong Li 	uint32_t reserved3 : 4;
1087f322844SLong Li 	uint32_t reserved4 : 32;
1097f322844SLong Li 	uint32_t reserved5 : 32;
1107f322844SLong Li };
1117f322844SLong Li 
1127f322844SLong Li struct transmit_oob_v2 {
1137f322844SLong Li 	struct transmit_short_oob_v2 short_oob;
1147f322844SLong Li 	struct transmit_long_oob_v2 long_oob;
1157f322844SLong Li };
1167f322844SLong Li 
11756dd45c0SLong Li enum gdma_queue_types {
11856dd45c0SLong Li 	GDMA_QUEUE_TYPE_INVALID  = 0,
11956dd45c0SLong Li 	GDMA_QUEUE_SEND,
12056dd45c0SLong Li 	GDMA_QUEUE_RECEIVE,
12156dd45c0SLong Li 	GDMA_QUEUE_COMPLETION,
12256dd45c0SLong Li 	GDMA_QUEUE_EVENT,
12356dd45c0SLong Li 	GDMA_QUEUE_TYPE_MAX = 16,
12456dd45c0SLong Li 	/*Room for expansion */
12556dd45c0SLong Li 
12656dd45c0SLong Li 	/* This enum can be expanded to add more queue types but
12756dd45c0SLong Li 	 * it's expected to be done in a contiguous manner.
12856dd45c0SLong Li 	 * Failing that will result in unexpected behavior.
12956dd45c0SLong Li 	 */
13056dd45c0SLong Li };
13156dd45c0SLong Li 
13256dd45c0SLong Li #define WORK_QUEUE_NUMBER_BASE_BITS 10
13356dd45c0SLong Li 
13456dd45c0SLong Li struct gdma_header {
13556dd45c0SLong Li 	/* size of the entire gdma structure, including the entire length of
13656dd45c0SLong Li 	 * the struct that is formed by extending other gdma struct. i.e.
13756dd45c0SLong Li 	 * GDMA_BASE_SPEC extends gdma_header, GDMA_EVENT_QUEUE_SPEC extends
13856dd45c0SLong Li 	 * GDMA_BASE_SPEC, StructSize for GDMA_EVENT_QUEUE_SPEC will be size of
13956dd45c0SLong Li 	 * GDMA_EVENT_QUEUE_SPEC which includes size of GDMA_BASE_SPEC and size
14056dd45c0SLong Li 	 * of gdma_header.
14156dd45c0SLong Li 	 * Above example is for illustration purpose and is not in code
14256dd45c0SLong Li 	 */
14356dd45c0SLong Li 	size_t struct_size;
14456dd45c0SLong Li };
14556dd45c0SLong Li 
14656dd45c0SLong Li /* The following macros are from GDMA SPEC 3.6, "Table 2: CQE data structure"
14756dd45c0SLong Li  * and "Table 4: Event Queue Entry (EQE) data format"
14856dd45c0SLong Li  */
14956dd45c0SLong Li #define GDMA_COMP_DATA_SIZE 0x3C /* Must be a multiple of 4 */
15056dd45c0SLong Li #define GDMA_COMP_DATA_SIZE_IN_UINT32 (GDMA_COMP_DATA_SIZE / 4)
15156dd45c0SLong Li 
15256dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_WORK_QUEUE_INDEX 0
15356dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_WORK_QUEUE_SIZE 24
15456dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_SEND_WORK_QUEUE_INDEX 24
15556dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_SEND_WORK_QUEUE_SIZE 1
15656dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_OWNER_BITS_INDEX 29
15756dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_OWNER_BITS_SIZE 3
15856dd45c0SLong Li 
15956dd45c0SLong Li #define COMPLETION_QUEUE_OWNER_MASK \
16056dd45c0SLong Li 	((1 << (COMPLETION_QUEUE_ENTRY_OWNER_BITS_SIZE)) - 1)
16156dd45c0SLong Li 
16256dd45c0SLong Li struct gdma_hardware_completion_entry {
16356dd45c0SLong Li 	char dma_client_data[GDMA_COMP_DATA_SIZE];
16456dd45c0SLong Li 	union {
16556dd45c0SLong Li 		uint32_t work_queue_owner_bits;
16656dd45c0SLong Li 		struct {
16756dd45c0SLong Li 			uint32_t wq_num		: 24;
16856dd45c0SLong Li 			uint32_t is_sq		: 1;
16956dd45c0SLong Li 			uint32_t reserved	: 4;
17056dd45c0SLong Li 			uint32_t owner_bits	: 3;
17156dd45c0SLong Li 		};
17256dd45c0SLong Li 	};
17356dd45c0SLong Li }; /* HW DATA */
17456dd45c0SLong Li 
17556dd45c0SLong Li struct gdma_posted_wqe_info {
17656dd45c0SLong Li 	struct gdma_header gdma_header;
17756dd45c0SLong Li 
17856dd45c0SLong Li 	/* size of the written wqe in basic units (32B), filled by GDMA core.
17956dd45c0SLong Li 	 * Use this value to progress the work queue after the wqe is processed
18056dd45c0SLong Li 	 * by hardware.
18156dd45c0SLong Li 	 */
18256dd45c0SLong Li 	uint32_t wqe_size_in_bu;
18356dd45c0SLong Li 
18456dd45c0SLong Li 	/* At the time of writing the wqe to the work queue, the offset in the
18556dd45c0SLong Li 	 * work queue buffer where by the wqe will be written. Each unit
18656dd45c0SLong Li 	 * represents 32B of buffer space.
18756dd45c0SLong Li 	 */
18856dd45c0SLong Li 	uint32_t wqe_index;
18956dd45c0SLong Li 
19056dd45c0SLong Li 	/* Unmasked offset in the queue to which the WQE was written.
19156dd45c0SLong Li 	 * In 32 byte units.
19256dd45c0SLong Li 	 */
19356dd45c0SLong Li 	uint32_t unmasked_queue_offset;
19456dd45c0SLong Li };
19556dd45c0SLong Li 
19656dd45c0SLong Li struct gdma_sgl_element {
19756dd45c0SLong Li 	uint64_t address;
19856dd45c0SLong Li 	uint32_t memory_key;
19956dd45c0SLong Li 	uint32_t size;
20056dd45c0SLong Li };
20156dd45c0SLong Li 
20256dd45c0SLong Li #define MAX_SGL_ENTRIES_FOR_TRANSMIT 30
20356dd45c0SLong Li 
20456dd45c0SLong Li struct one_sgl {
20556dd45c0SLong Li 	struct gdma_sgl_element gdma_sgl[MAX_SGL_ENTRIES_FOR_TRANSMIT];
20656dd45c0SLong Li };
20756dd45c0SLong Li 
20856dd45c0SLong Li struct gdma_work_request {
20956dd45c0SLong Li 	struct gdma_header gdma_header;
21056dd45c0SLong Li 	struct gdma_sgl_element *sgl;
21156dd45c0SLong Li 	uint32_t num_sgl_elements;
21256dd45c0SLong Li 	uint32_t inline_oob_size_in_bytes;
21356dd45c0SLong Li 	void *inline_oob_data;
21456dd45c0SLong Li 	uint32_t flags; /* From _gdma_work_request_FLAGS */
21556dd45c0SLong Li 	uint32_t client_data_unit; /* For LSO, this is the MTU of the data */
21656dd45c0SLong Li };
21756dd45c0SLong Li 
21856dd45c0SLong Li enum mana_cqe_type {
21956dd45c0SLong Li 	CQE_INVALID                     = 0,
220eb9994ddSLong Li 
221eb9994ddSLong Li 	CQE_RX_OKAY                     = 1,
222eb9994ddSLong Li 	CQE_RX_COALESCED_4              = 2,
223eb9994ddSLong Li 	CQE_RX_OBJECT_FENCE             = 3,
224eb9994ddSLong Li 	CQE_RX_TRUNCATED                = 4,
2257f322844SLong Li 
2267f322844SLong Li 	CQE_TX_OKAY                     = 32,
2277f322844SLong Li 	CQE_TX_SA_DROP                  = 33,
2287f322844SLong Li 	CQE_TX_MTU_DROP                 = 34,
2297f322844SLong Li 	CQE_TX_INVALID_OOB              = 35,
2307f322844SLong Li 	CQE_TX_INVALID_ETH_TYPE         = 36,
2317f322844SLong Li 	CQE_TX_HDR_PROCESSING_ERROR     = 37,
2327f322844SLong Li 	CQE_TX_VF_DISABLED              = 38,
2337f322844SLong Li 	CQE_TX_VPORT_IDX_OUT_OF_RANGE   = 39,
2347f322844SLong Li 	CQE_TX_VPORT_DISABLED           = 40,
2357f322844SLong Li 	CQE_TX_VLAN_TAGGING_VIOLATION   = 41,
23656dd45c0SLong Li };
23756dd45c0SLong Li 
23856dd45c0SLong Li struct mana_cqe_header {
23956dd45c0SLong Li 	uint32_t cqe_type    : 6;
24056dd45c0SLong Li 	uint32_t client_type : 2;
24156dd45c0SLong Li 	uint32_t vendor_err  : 24;
24256dd45c0SLong Li }; /* HW DATA */
24356dd45c0SLong Li 
2447f322844SLong Li struct mana_tx_comp_oob {
2457f322844SLong Li 	struct mana_cqe_header cqe_hdr;
2467f322844SLong Li 
2477f322844SLong Li 	uint32_t tx_data_offset;
2487f322844SLong Li 
2497f322844SLong Li 	uint32_t tx_sgl_offset       : 5;
2507f322844SLong Li 	uint32_t tx_wqe_offset       : 27;
2517f322844SLong Li 
2527f322844SLong Li 	uint32_t reserved[12];
2537f322844SLong Li }; /* HW DATA */
2547f322844SLong Li 
25556dd45c0SLong Li /* NDIS HASH Types */
25656dd45c0SLong Li #define NDIS_HASH_IPV4          RTE_BIT32(0)
25756dd45c0SLong Li #define NDIS_HASH_TCP_IPV4      RTE_BIT32(1)
25856dd45c0SLong Li #define NDIS_HASH_UDP_IPV4      RTE_BIT32(2)
25956dd45c0SLong Li #define NDIS_HASH_IPV6          RTE_BIT32(3)
26056dd45c0SLong Li #define NDIS_HASH_TCP_IPV6      RTE_BIT32(4)
26156dd45c0SLong Li #define NDIS_HASH_UDP_IPV6      RTE_BIT32(5)
26256dd45c0SLong Li #define NDIS_HASH_IPV6_EX       RTE_BIT32(6)
26356dd45c0SLong Li #define NDIS_HASH_TCP_IPV6_EX   RTE_BIT32(7)
26456dd45c0SLong Li #define NDIS_HASH_UDP_IPV6_EX   RTE_BIT32(8)
26556dd45c0SLong Li 
26656dd45c0SLong Li #define MANA_HASH_L3 (NDIS_HASH_IPV4 | NDIS_HASH_IPV6 | NDIS_HASH_IPV6_EX)
26756dd45c0SLong Li #define MANA_HASH_L4                                                         \
26856dd45c0SLong Li 	(NDIS_HASH_TCP_IPV4 | NDIS_HASH_UDP_IPV4 | NDIS_HASH_TCP_IPV6 |      \
26956dd45c0SLong Li 	 NDIS_HASH_UDP_IPV6 | NDIS_HASH_TCP_IPV6_EX | NDIS_HASH_UDP_IPV6_EX)
27056dd45c0SLong Li 
271eb9994ddSLong Li struct mana_rx_comp_per_packet_info {
272eb9994ddSLong Li 	uint32_t packet_length	: 16;
273eb9994ddSLong Li 	uint32_t reserved0	: 16;
274eb9994ddSLong Li 	uint32_t reserved1;
275eb9994ddSLong Li 	uint32_t packet_hash;
276eb9994ddSLong Li }; /* HW DATA */
277eb9994ddSLong Li #define RX_COM_OOB_NUM_PACKETINFO_SEGMENTS 4
278eb9994ddSLong Li 
279eb9994ddSLong Li struct mana_rx_comp_oob {
280eb9994ddSLong Li 	struct mana_cqe_header cqe_hdr;
281eb9994ddSLong Li 
282eb9994ddSLong Li 	uint32_t rx_vlan_id				: 12;
283eb9994ddSLong Li 	uint32_t rx_vlan_tag_present			: 1;
284eb9994ddSLong Li 	uint32_t rx_outer_ip_header_checksum_succeeded	: 1;
285eb9994ddSLong Li 	uint32_t rx_outer_ip_header_checksum_failed	: 1;
286eb9994ddSLong Li 	uint32_t reserved				: 1;
287eb9994ddSLong Li 	uint32_t rx_hash_type				: 9;
288eb9994ddSLong Li 	uint32_t rx_ip_header_checksum_succeeded	: 1;
289eb9994ddSLong Li 	uint32_t rx_ip_header_checksum_failed		: 1;
290eb9994ddSLong Li 	uint32_t rx_tcp_checksum_succeeded		: 1;
291eb9994ddSLong Li 	uint32_t rx_tcp_checksum_failed			: 1;
292eb9994ddSLong Li 	uint32_t rx_udp_checksum_succeeded		: 1;
293eb9994ddSLong Li 	uint32_t rx_udp_checksum_failed			: 1;
294eb9994ddSLong Li 	uint32_t reserved1				: 1;
295eb9994ddSLong Li 	struct mana_rx_comp_per_packet_info
296eb9994ddSLong Li 		packet_info[RX_COM_OOB_NUM_PACKETINFO_SEGMENTS];
297eb9994ddSLong Li 	uint32_t received_wqe_offset;
298eb9994ddSLong Li }; /* HW DATA */
299eb9994ddSLong Li 
30056dd45c0SLong Li struct gdma_wqe_dma_oob {
30156dd45c0SLong Li 	uint32_t reserved:24;
30256dd45c0SLong Li 	uint32_t last_v_bytes:8;
30356dd45c0SLong Li 	union {
30456dd45c0SLong Li 		uint32_t flags;
30556dd45c0SLong Li 		struct {
30656dd45c0SLong Li 			uint32_t num_sgl_entries:8;
30756dd45c0SLong Li 			uint32_t inline_client_oob_size_in_dwords:3;
30856dd45c0SLong Li 			uint32_t client_oob_in_sgl:1;
30956dd45c0SLong Li 			uint32_t consume_credit:1;
31056dd45c0SLong Li 			uint32_t fence:1;
31156dd45c0SLong Li 			uint32_t reserved1:2;
31256dd45c0SLong Li 			uint32_t client_data_unit:14;
31356dd45c0SLong Li 			uint32_t check_sn:1;
31456dd45c0SLong Li 			uint32_t sgl_direct:1;
31556dd45c0SLong Li 		};
31656dd45c0SLong Li 	};
31756dd45c0SLong Li };
31856dd45c0SLong Li 
3190f5db3c6SLong Li struct mana_mr_cache {
3200f5db3c6SLong Li 	uint32_t	lkey;
3210f5db3c6SLong Li 	uintptr_t	addr;
3220f5db3c6SLong Li 	size_t		len;
3230f5db3c6SLong Li 	void		*verb_obj;
3240f5db3c6SLong Li };
3250f5db3c6SLong Li 
3260f5db3c6SLong Li #define MANA_MR_BTREE_CACHE_N	512
3270f5db3c6SLong Li struct mana_mr_btree {
3280f5db3c6SLong Li 	uint16_t	len;	/* Used entries */
3290f5db3c6SLong Li 	uint16_t	size;	/* Total entries */
3300f5db3c6SLong Li 	int		overflow;
3310f5db3c6SLong Li 	int		socket;
3320f5db3c6SLong Li 	struct mana_mr_cache *table;
3330f5db3c6SLong Li };
3340f5db3c6SLong Li 
335517ed6e2SLong Li struct mana_process_priv {
336517ed6e2SLong Li 	void *db_page;
337517ed6e2SLong Li };
338517ed6e2SLong Li 
339517ed6e2SLong Li struct mana_priv {
340517ed6e2SLong Li 	struct rte_eth_dev_data *dev_data;
341517ed6e2SLong Li 	struct mana_process_priv *process_priv;
3420dbfecfeSLong Li 	int num_queues;
343517ed6e2SLong Li 
344517ed6e2SLong Li 	/* DPDK port */
345517ed6e2SLong Li 	uint16_t port_id;
346517ed6e2SLong Li 
347517ed6e2SLong Li 	/* IB device port */
348517ed6e2SLong Li 	uint8_t dev_port;
349517ed6e2SLong Li 
350f8a4217dSWei Hu 	uint8_t vlan_strip;
351f8a4217dSWei Hu 
352517ed6e2SLong Li 	struct ibv_context *ib_ctx;
353517ed6e2SLong Li 	struct ibv_pd *ib_pd;
354517ed6e2SLong Li 	struct ibv_pd *ib_parent_pd;
3555f705ac2SLong Li 	struct ibv_rwq_ind_table *ind_table;
3565f705ac2SLong Li 	struct ibv_qp *rwq_qp;
357517ed6e2SLong Li 	void *db_page;
358a382177cSLong Li 	struct rte_eth_rss_conf rss_conf;
359bd15f237SLong Li 	struct rte_intr_handle *intr_handle;
360517ed6e2SLong Li 	int max_rx_queues;
361517ed6e2SLong Li 	int max_tx_queues;
362517ed6e2SLong Li 	int max_rx_desc;
363517ed6e2SLong Li 	int max_tx_desc;
364517ed6e2SLong Li 	int max_send_sge;
365517ed6e2SLong Li 	int max_recv_sge;
366517ed6e2SLong Li 	int max_mr;
367517ed6e2SLong Li 	uint64_t max_mr_size;
3680f5db3c6SLong Li 	struct mana_mr_btree mr_btree;
3690f5db3c6SLong Li 	rte_spinlock_t	mr_btree_lock;
370517ed6e2SLong Li };
371517ed6e2SLong Li 
372f7dc479aSLong Li struct mana_txq_desc {
373f7dc479aSLong Li 	struct rte_mbuf *pkt;
374f7dc479aSLong Li 	uint32_t wqe_size_in_bu;
375cce2c9dfSLong Li 	bool suppress_tx_cqe;
376f7dc479aSLong Li };
377f7dc479aSLong Li 
3780c63c005SLong Li struct mana_rxq_desc {
3790c63c005SLong Li 	struct rte_mbuf *pkt;
3800c63c005SLong Li 	uint32_t wqe_size_in_bu;
3810c63c005SLong Li };
3820c63c005SLong Li 
3835f705ac2SLong Li struct mana_stats {
3845f705ac2SLong Li 	uint64_t packets;
3855f705ac2SLong Li 	uint64_t bytes;
3865f705ac2SLong Li 	uint64_t errors;
3875f705ac2SLong Li 	uint64_t nombuf;
3885f705ac2SLong Li };
3895f705ac2SLong Li 
39056dd45c0SLong Li struct mana_gdma_queue {
39156dd45c0SLong Li 	void *buffer;
39256dd45c0SLong Li 	uint32_t count;	/* in entries */
39356dd45c0SLong Li 	uint32_t size;	/* in bytes */
39456dd45c0SLong Li 	uint32_t id;
39556dd45c0SLong Li 	uint32_t head;
39656dd45c0SLong Li 	uint32_t tail;
39756dd45c0SLong Li };
39856dd45c0SLong Li 
3990f5db3c6SLong Li #define MANA_MR_BTREE_PER_QUEUE_N	64
4000f5db3c6SLong Li 
40131124619SLong Li struct gdma_comp {
40231124619SLong Li 	/* Filled by GDMA core */
40331124619SLong Li 	char *cqe_data;
40431124619SLong Li };
40531124619SLong Li 
406f7dc479aSLong Li struct mana_txq {
407f7dc479aSLong Li 	struct mana_priv *priv;
408f7dc479aSLong Li 	uint32_t num_desc;
409410333daSLong Li 	struct ibv_cq *cq;
410410333daSLong Li 	struct ibv_qp *qp;
411410333daSLong Li 
412410333daSLong Li 	struct mana_gdma_queue gdma_sq;
413410333daSLong Li 	struct mana_gdma_queue gdma_cq;
41431124619SLong Li 	struct gdma_comp *gdma_comp_buf;
415410333daSLong Li 
416410333daSLong Li 	uint32_t tx_vp_offset;
417f7dc479aSLong Li 
418f7dc479aSLong Li 	/* For storing pending requests */
419f7dc479aSLong Li 	struct mana_txq_desc *desc_ring;
420f7dc479aSLong Li 
421f7dc479aSLong Li 	/* desc_ring_head is where we put pending requests to ring,
422f7dc479aSLong Li 	 * completion pull off desc_ring_tail
423f7dc479aSLong Li 	 */
424cce2c9dfSLong Li 	uint32_t desc_ring_head, desc_ring_tail, desc_ring_len;
425f7dc479aSLong Li 
4260f5db3c6SLong Li 	struct mana_mr_btree mr_btree;
4277f322844SLong Li 	struct mana_stats stats;
428f7dc479aSLong Li 	unsigned int socket;
429f7dc479aSLong Li };
430f7dc479aSLong Li 
4310c63c005SLong Li struct mana_rxq {
4320c63c005SLong Li 	struct mana_priv *priv;
4330c63c005SLong Li 	uint32_t num_desc;
4340c63c005SLong Li 	struct rte_mempool *mp;
4355f705ac2SLong Li 	struct ibv_cq *cq;
436afd5d170SLong Li 	struct ibv_comp_channel *channel;
4375f705ac2SLong Li 	struct ibv_wq *wq;
4380c63c005SLong Li 
4390c63c005SLong Li 	/* For storing pending requests */
4400c63c005SLong Li 	struct mana_rxq_desc *desc_ring;
4410c63c005SLong Li 
4420c63c005SLong Li 	/* desc_ring_head is where we put pending requests to ring,
4430c63c005SLong Li 	 * completion pull off desc_ring_tail
4440c63c005SLong Li 	 */
4450c63c005SLong Li 	uint32_t desc_ring_head, desc_ring_tail;
4460c63c005SLong Li 
44726c6bdf3SWei Hu #ifdef RTE_ARCH_32
44826c6bdf3SWei Hu 	/* For storing wqe increment count btw each short doorbell ring */
44926c6bdf3SWei Hu 	uint32_t wqe_cnt_to_short_db;
45026c6bdf3SWei Hu #endif
45126c6bdf3SWei Hu 
4525f705ac2SLong Li 	struct mana_gdma_queue gdma_rq;
4535f705ac2SLong Li 	struct mana_gdma_queue gdma_cq;
45431124619SLong Li 	struct gdma_comp *gdma_comp_buf;
4555f705ac2SLong Li 
4563409e0f1SLong Li 	uint32_t comp_buf_len;
4573409e0f1SLong Li 	uint32_t comp_buf_idx;
4583409e0f1SLong Li 	uint32_t backlog_idx;
4593409e0f1SLong Li 
4605f705ac2SLong Li 	struct mana_stats stats;
4610f5db3c6SLong Li 	struct mana_mr_btree mr_btree;
4620f5db3c6SLong Li 
4630c63c005SLong Li 	unsigned int socket;
4640c63c005SLong Li };
4650c63c005SLong Li 
466517ed6e2SLong Li extern int mana_logtype_driver;
4673178e37cSDavid Marchand #define RTE_LOGTYPE_MANA_DRIVER mana_logtype_driver
468517ed6e2SLong Li extern int mana_logtype_init;
469*2b843cacSDavid Marchand #define RTE_LOGTYPE_MANA_INIT mana_logtype_init
470517ed6e2SLong Li 
471*2b843cacSDavid Marchand #define DRV_LOG(level, ...) \
472*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(level, MANA_DRIVER, "%s(): ", __func__, __VA_ARGS__)
473517ed6e2SLong Li 
474*2b843cacSDavid Marchand #define DP_LOG(level, ...) \
475*2b843cacSDavid Marchand 	RTE_LOG_DP_LINE(level, MANA_DRIVER, __VA_ARGS__)
476e2d3a3c0SLong Li 
477*2b843cacSDavid Marchand #define PMD_INIT_LOG(level, ...) \
478*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(level, MANA_INIT, "%s(): ", __func__, __VA_ARGS__)
479517ed6e2SLong Li 
480517ed6e2SLong Li #define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
481517ed6e2SLong Li 
48226c6bdf3SWei Hu #ifdef RTE_ARCH_32
48326c6bdf3SWei Hu int mana_ring_short_doorbell(void *db_page, enum gdma_queue_types queue_type,
48426c6bdf3SWei Hu 			     uint32_t queue_id, uint32_t tail_incr,
48526c6bdf3SWei Hu 			     uint8_t arm);
48626c6bdf3SWei Hu #else
48756dd45c0SLong Li int mana_ring_doorbell(void *db_page, enum gdma_queue_types queue_type,
488afd5d170SLong Li 		       uint32_t queue_id, uint32_t tail, uint8_t arm);
48926c6bdf3SWei Hu #endif
490304ad326SLong Li int mana_rq_ring_doorbell(struct mana_rxq *rxq);
49156dd45c0SLong Li 
49256dd45c0SLong Li int gdma_post_work_request(struct mana_gdma_queue *queue,
49356dd45c0SLong Li 			   struct gdma_work_request *work_req,
494b5dfcaecSLong Li 			   uint32_t *wqe_size_in_bu);
49556dd45c0SLong Li uint8_t *gdma_get_wqe_pointer(struct mana_gdma_queue *queue);
49656dd45c0SLong Li 
497eb9994ddSLong Li uint16_t mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **rx_pkts,
498eb9994ddSLong Li 		       uint16_t pkts_n);
4997f322844SLong Li uint16_t mana_tx_burst(void *dpdk_txq, struct rte_mbuf **tx_pkts,
5007f322844SLong Li 		       uint16_t pkts_n);
501eb9994ddSLong Li 
502517ed6e2SLong Li uint16_t mana_rx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts,
503517ed6e2SLong Li 			       uint16_t pkts_n);
504517ed6e2SLong Li 
505517ed6e2SLong Li uint16_t mana_tx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts,
506517ed6e2SLong Li 			       uint16_t pkts_n);
507517ed6e2SLong Li 
50831124619SLong Li uint32_t gdma_poll_completion_queue(struct mana_gdma_queue *cq,
50931124619SLong Li 				    struct gdma_comp *gdma_comp,
51031124619SLong Li 				    uint32_t max_comp);
51156dd45c0SLong Li 
5125f705ac2SLong Li int mana_start_rx_queues(struct rte_eth_dev *dev);
513410333daSLong Li int mana_start_tx_queues(struct rte_eth_dev *dev);
514410333daSLong Li 
5155f705ac2SLong Li int mana_stop_rx_queues(struct rte_eth_dev *dev);
516410333daSLong Li int mana_stop_tx_queues(struct rte_eth_dev *dev);
517410333daSLong Li 
5187d79530eSLong Li struct mana_mr_cache *mana_alloc_pmd_mr(struct mana_mr_btree *local_tree,
5190f5db3c6SLong Li 					struct mana_priv *priv,
5200f5db3c6SLong Li 					struct rte_mbuf *mbuf);
5210f5db3c6SLong Li int mana_new_pmd_mr(struct mana_mr_btree *local_tree, struct mana_priv *priv,
5220f5db3c6SLong Li 		    struct rte_mempool *pool);
5230f5db3c6SLong Li void mana_remove_all_mr(struct mana_priv *priv);
5240f5db3c6SLong Li void mana_del_pmd_mr(struct mana_mr_cache *mr);
5250f5db3c6SLong Li 
5260f5db3c6SLong Li void mana_mempool_chunk_cb(struct rte_mempool *mp, void *opaque,
5270f5db3c6SLong Li 			   struct rte_mempool_memhdr *memhdr, unsigned int idx);
5280f5db3c6SLong Li 
5290c7bc26bSLong Li int mana_mr_btree_lookup(struct mana_mr_btree *bt, uint16_t *idx,
5300c7bc26bSLong Li 			 uintptr_t addr, size_t len,
5310c7bc26bSLong Li 			 struct mana_mr_cache **cache);
5320f5db3c6SLong Li int mana_mr_btree_insert(struct mana_mr_btree *bt, struct mana_mr_cache *entry);
5330f5db3c6SLong Li int mana_mr_btree_init(struct mana_mr_btree *bt, int n, int socket);
5340f5db3c6SLong Li void mana_mr_btree_free(struct mana_mr_btree *bt);
5350f5db3c6SLong Li 
536517ed6e2SLong Li /** Request timeout for IPC. */
537517ed6e2SLong Li #define MANA_MP_REQ_TIMEOUT_SEC 5
538517ed6e2SLong Li 
539517ed6e2SLong Li /* Request types for IPC. */
540517ed6e2SLong Li enum mana_mp_req_type {
541517ed6e2SLong Li 	MANA_MP_REQ_VERBS_CMD_FD = 1,
542517ed6e2SLong Li 	MANA_MP_REQ_CREATE_MR,
543517ed6e2SLong Li 	MANA_MP_REQ_START_RXTX,
544517ed6e2SLong Li 	MANA_MP_REQ_STOP_RXTX,
545517ed6e2SLong Li };
546517ed6e2SLong Li 
547517ed6e2SLong Li /* Pameters for IPC. */
548517ed6e2SLong Li struct mana_mp_param {
549517ed6e2SLong Li 	enum mana_mp_req_type type;
550517ed6e2SLong Li 	int port_id;
551517ed6e2SLong Li 	int result;
552517ed6e2SLong Li 
553517ed6e2SLong Li 	/* MANA_MP_REQ_CREATE_MR */
554517ed6e2SLong Li 	uintptr_t addr;
555517ed6e2SLong Li 	uint32_t len;
556517ed6e2SLong Li };
557517ed6e2SLong Li 
558517ed6e2SLong Li #define MANA_MP_NAME	"net_mana_mp"
559517ed6e2SLong Li int mana_mp_init_primary(void);
560517ed6e2SLong Li int mana_mp_init_secondary(void);
561517ed6e2SLong Li void mana_mp_uninit_primary(void);
562517ed6e2SLong Li void mana_mp_uninit_secondary(void);
563517ed6e2SLong Li int mana_mp_req_verbs_cmd_fd(struct rte_eth_dev *dev);
5640f5db3c6SLong Li int mana_mp_req_mr_create(struct mana_priv *priv, uintptr_t addr, uint32_t len);
565517ed6e2SLong Li 
566517ed6e2SLong Li void mana_mp_req_on_rxtx(struct rte_eth_dev *dev, enum mana_mp_req_type type);
567517ed6e2SLong Li 
5680dbfecfeSLong Li void *mana_alloc_verbs_buf(size_t size, void *data);
5690dbfecfeSLong Li void mana_free_verbs_buf(void *ptr, void *data __rte_unused);
5700dbfecfeSLong Li 
571afd5d170SLong Li int mana_rx_intr_enable(struct rte_eth_dev *dev, uint16_t rx_queue_id);
572afd5d170SLong Li int mana_rx_intr_disable(struct rte_eth_dev *dev, uint16_t rx_queue_id);
573afd5d170SLong Li int mana_fd_set_non_blocking(int fd);
574afd5d170SLong Li 
575517ed6e2SLong Li #endif
576