xref: /dpdk/drivers/common/idpf/idpf_common_device.h (revision e12a0166c80f65e35408f4715b2f3a60763c3741)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2023 Intel Corporation
3  */
4 
5 #ifndef _IDPF_COMMON_DEVICE_H_
6 #define _IDPF_COMMON_DEVICE_H_
7 
8 #include <rte_mbuf_ptype.h>
9 #include "base/idpf_prototype.h"
10 #include "base/virtchnl2.h"
11 #include "idpf_common_logs.h"
12 
13 #define IDPF_DEV_ID_SRIOV	0x145C
14 
15 #define IDPF_RSS_KEY_LEN	52
16 
17 #define IDPF_CTLQ_ID		-1
18 #define IDPF_CTLQ_LEN		64
19 #define IDPF_DFLT_MBX_BUF_SIZE	4096
20 
21 #define IDPF_DEFAULT_RXQ_NUM	16
22 #define IDPF_RX_BUFQ_PER_GRP	2
23 #define IDPF_RXQ_PER_GRP	1
24 #define IDPF_DEFAULT_TXQ_NUM	16
25 #define IDPF_TX_COMPLQ_PER_GRP	1
26 #define IDPF_TXQ_PER_GRP	1
27 
28 #define IDPF_MIN_FRAME_SIZE	14
29 
30 #define IDPF_MAX_PKT_TYPE	1024
31 
32 #define IDPF_DFLT_INTERVAL	16
33 
34 #define IDPF_RX_MAX_PTYPE_PROTO_IDS	32
35 #define IDPF_RX_MAX_PTYPE_SZ	(sizeof(struct virtchnl2_ptype) +	\
36 				 (sizeof(uint16_t) *			\
37 				  (IDPF_RX_MAX_PTYPE_PROTO_IDS - 1)))
38 #define IDPF_RX_PTYPE_HDR_SZ	(sizeof(struct virtchnl2_get_ptype_info) - \
39 				 sizeof(struct virtchnl2_ptype))
40 #define IDPF_RX_MAX_PTYPES_PER_BUF				\
41 	((IDPF_DFLT_MBX_BUF_SIZE - IDPF_RX_PTYPE_HDR_SZ)/	\
42 	 IDPF_RX_MAX_PTYPE_SZ)
43 #define IDPF_GET_PTYPE_SIZE(p)						\
44 	(sizeof(struct virtchnl2_ptype) +				\
45 	 (((p)->proto_id_count ? ((p)->proto_id_count - 1) : 0) * sizeof((p)->proto_id[0])))
46 
47 struct idpf_adapter {
48 	struct idpf_hw hw;
49 	struct virtchnl2_version_info virtchnl_version;
50 	struct virtchnl2_get_capabilities caps;
51 	volatile RTE_ATOMIC(uint32_t) pend_cmd; /* pending command not finished */
52 	uint32_t cmd_retval; /* return value of the cmd response from cp */
53 	uint8_t *mbx_resp; /* buffer to store the mailbox response from cp */
54 
55 	alignas(RTE_CACHE_LINE_MIN_SIZE) uint32_t ptype_tbl[IDPF_MAX_PKT_TYPE];
56 
57 	bool is_tx_singleq; /* true - single queue model, false - split queue model */
58 	bool is_rx_singleq; /* true - single queue model, false - split queue model */
59 
60 	/* For timestamp */
61 	uint64_t time_hw;
62 };
63 
64 struct idpf_chunks_info {
65 	uint32_t tx_start_qid;
66 	uint32_t rx_start_qid;
67 	/* Valid only if split queue model */
68 	uint32_t tx_compl_start_qid;
69 	uint32_t rx_buf_start_qid;
70 
71 	uint64_t tx_qtail_start;
72 	uint32_t tx_qtail_spacing;
73 	uint64_t rx_qtail_start;
74 	uint32_t rx_qtail_spacing;
75 	uint64_t tx_compl_qtail_start;
76 	uint32_t tx_compl_qtail_spacing;
77 	uint64_t rx_buf_qtail_start;
78 	uint32_t rx_buf_qtail_spacing;
79 };
80 
81 struct idpf_vport {
82 	struct idpf_adapter *adapter; /* Backreference to associated adapter */
83 	union {
84 		struct virtchnl2_create_vport info; /* virtchnl response info handling */
85 		uint8_t data[IDPF_DFLT_MBX_BUF_SIZE];
86 	} vport_info;
87 	uint16_t sw_idx; /* SW index in adapter->vports[]*/
88 	uint16_t vport_id;
89 	uint32_t txq_model;
90 	uint32_t rxq_model;
91 	uint16_t num_tx_q;
92 	/* valid only if txq_model is split Q */
93 	uint16_t num_tx_complq;
94 	uint16_t num_rx_q;
95 	/* valid only if rxq_model is split Q */
96 	uint16_t num_rx_bufq;
97 
98 	uint16_t max_mtu;
99 	uint8_t default_mac_addr[VIRTCHNL_ETH_LENGTH_OF_ADDRESS];
100 
101 	enum virtchnl_rss_algorithm rss_algorithm;
102 	uint16_t rss_key_size;
103 	uint16_t rss_lut_size;
104 
105 	void *dev_data; /* Pointer to the device data */
106 	uint16_t max_pkt_len; /* Maximum packet length */
107 
108 	/* RSS info */
109 	uint32_t *rss_lut;
110 	uint8_t *rss_key;
111 	uint64_t rss_hf;
112 	uint64_t last_general_rss_hf;
113 
114 	/* MSIX info*/
115 	struct virtchnl2_queue_vector *qv_map; /* queue vector mapping */
116 	uint16_t max_vectors;
117 	struct virtchnl2_alloc_vectors *recv_vectors;
118 
119 	/* Chunk info */
120 	struct idpf_chunks_info chunks_info;
121 
122 	uint16_t devarg_id;
123 
124 	bool rx_vec_allowed;
125 	bool tx_vec_allowed;
126 	bool rx_use_avx512;
127 	bool tx_use_avx512;
128 
129 	struct virtchnl2_vport_stats eth_stats_offset;
130 
131 	/* Event from ipf */
132 	bool link_up;
133 	uint32_t link_speed;
134 };
135 
136 /* Message type read in virtual channel from PF */
137 enum idpf_vc_result {
138 	IDPF_MSG_ERR = -1, /* Meet error when accessing admin queue */
139 	IDPF_MSG_NON,      /* Read nothing from admin queue */
140 	IDPF_MSG_SYS,      /* Read system msg from admin queue */
141 	IDPF_MSG_CMD,      /* Read async command result */
142 };
143 
144 /* structure used for sending and checking response of virtchnl ops */
145 struct idpf_cmd_info {
146 	uint32_t ops;
147 	uint8_t *in_args;       /* buffer for sending */
148 	uint32_t in_args_size;  /* buffer size for sending */
149 	uint8_t *out_buffer;    /* buffer for response */
150 	uint32_t out_size;      /* buffer size for response */
151 };
152 
153 /* notify current command done. Only call in case execute
154  * _atomic_set_cmd successfully.
155  */
156 static inline void
notify_cmd(struct idpf_adapter * adapter,int msg_ret)157 notify_cmd(struct idpf_adapter *adapter, int msg_ret)
158 {
159 	adapter->cmd_retval = msg_ret;
160 	/* Return value may be checked in anither thread, need to ensure the coherence. */
161 	rte_wmb();
162 	adapter->pend_cmd = VIRTCHNL2_OP_UNKNOWN;
163 }
164 
165 /* clear current command. Only call in case execute
166  * _atomic_set_cmd successfully.
167  */
168 static inline void
clear_cmd(struct idpf_adapter * adapter)169 clear_cmd(struct idpf_adapter *adapter)
170 {
171 	/* Return value may be checked in anither thread, need to ensure the coherence. */
172 	rte_wmb();
173 	adapter->pend_cmd = VIRTCHNL2_OP_UNKNOWN;
174 	adapter->cmd_retval = VIRTCHNL_STATUS_SUCCESS;
175 }
176 
177 /* Check there is pending cmd in execution. If none, set new command. */
178 static inline bool
atomic_set_cmd(struct idpf_adapter * adapter,uint32_t ops)179 atomic_set_cmd(struct idpf_adapter *adapter, uint32_t ops)
180 {
181 	uint32_t op_unk = VIRTCHNL2_OP_UNKNOWN;
182 	bool ret = rte_atomic_compare_exchange_strong_explicit(&adapter->pend_cmd, &op_unk, ops,
183 					    rte_memory_order_acquire, rte_memory_order_acquire);
184 
185 	if (!ret)
186 		DRV_LOG(ERR, "There is incomplete cmd %d", adapter->pend_cmd);
187 
188 	return !ret;
189 }
190 
191 __rte_internal
192 int idpf_adapter_init(struct idpf_adapter *adapter);
193 __rte_internal
194 int idpf_adapter_deinit(struct idpf_adapter *adapter);
195 __rte_internal
196 int idpf_vport_init(struct idpf_vport *vport,
197 		    struct virtchnl2_create_vport *vport_req_info,
198 		    void *dev_data);
199 __rte_internal
200 int idpf_vport_deinit(struct idpf_vport *vport);
201 __rte_internal
202 int idpf_vport_rss_config(struct idpf_vport *vport);
203 __rte_internal
204 int idpf_vport_irq_map_config(struct idpf_vport *vport, uint16_t nb_rx_queues);
205 __rte_internal
206 int idpf_vport_irq_unmap_config(struct idpf_vport *vport, uint16_t nb_rx_queues);
207 __rte_internal
208 int idpf_vport_info_init(struct idpf_vport *vport,
209 			 struct virtchnl2_create_vport *vport_info);
210 __rte_internal
211 void idpf_vport_stats_update(struct virtchnl2_vport_stats *oes, struct virtchnl2_vport_stats *nes);
212 __rte_internal
213 int idpf_vport_irq_map_config_by_qids(struct idpf_vport *vport,
214 				      uint32_t *qids,
215 				      uint16_t nb_rx_queues);
216 
217 #endif /* _IDPF_COMMON_DEVICE_H_ */
218