xref: /openbmc/linux/drivers/vdpa/mlx5/net/mlx5_vnet.c (revision b8b350af)
1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
2 /* Copyright (c) 2020 Mellanox Technologies Ltd. */
3 
4 #include <linux/module.h>
5 #include <linux/vdpa.h>
6 #include <linux/vringh.h>
7 #include <uapi/linux/virtio_net.h>
8 #include <uapi/linux/virtio_ids.h>
9 #include <linux/virtio_config.h>
10 #include <linux/auxiliary_bus.h>
11 #include <linux/mlx5/cq.h>
12 #include <linux/mlx5/qp.h>
13 #include <linux/mlx5/device.h>
14 #include <linux/mlx5/driver.h>
15 #include <linux/mlx5/vport.h>
16 #include <linux/mlx5/fs.h>
17 #include <linux/mlx5/mlx5_ifc_vdpa.h>
18 #include <linux/mlx5/mpfs.h>
19 #include "mlx5_vdpa.h"
20 
21 MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>");
22 MODULE_DESCRIPTION("Mellanox VDPA driver");
23 MODULE_LICENSE("Dual BSD/GPL");
24 
25 #define to_mlx5_vdpa_ndev(__mvdev)                                             \
26 	container_of(__mvdev, struct mlx5_vdpa_net, mvdev)
27 #define to_mvdev(__vdev) container_of((__vdev), struct mlx5_vdpa_dev, vdev)
28 
29 #define VALID_FEATURES_MASK                                                                        \
30 	(BIT_ULL(VIRTIO_NET_F_CSUM) | BIT_ULL(VIRTIO_NET_F_GUEST_CSUM) |                                   \
31 	 BIT_ULL(VIRTIO_NET_F_CTRL_GUEST_OFFLOADS) | BIT_ULL(VIRTIO_NET_F_MTU) | BIT_ULL(VIRTIO_NET_F_MAC) |   \
32 	 BIT_ULL(VIRTIO_NET_F_GUEST_TSO4) | BIT_ULL(VIRTIO_NET_F_GUEST_TSO6) |                             \
33 	 BIT_ULL(VIRTIO_NET_F_GUEST_ECN) | BIT_ULL(VIRTIO_NET_F_GUEST_UFO) | BIT_ULL(VIRTIO_NET_F_HOST_TSO4) | \
34 	 BIT_ULL(VIRTIO_NET_F_HOST_TSO6) | BIT_ULL(VIRTIO_NET_F_HOST_ECN) | BIT_ULL(VIRTIO_NET_F_HOST_UFO) |   \
35 	 BIT_ULL(VIRTIO_NET_F_MRG_RXBUF) | BIT_ULL(VIRTIO_NET_F_STATUS) | BIT_ULL(VIRTIO_NET_F_CTRL_VQ) |      \
36 	 BIT_ULL(VIRTIO_NET_F_CTRL_RX) | BIT_ULL(VIRTIO_NET_F_CTRL_VLAN) |                                 \
37 	 BIT_ULL(VIRTIO_NET_F_CTRL_RX_EXTRA) | BIT_ULL(VIRTIO_NET_F_GUEST_ANNOUNCE) |                      \
38 	 BIT_ULL(VIRTIO_NET_F_MQ) | BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR) | BIT_ULL(VIRTIO_NET_F_HASH_REPORT) |  \
39 	 BIT_ULL(VIRTIO_NET_F_RSS) | BIT_ULL(VIRTIO_NET_F_RSC_EXT) | BIT_ULL(VIRTIO_NET_F_STANDBY) |           \
40 	 BIT_ULL(VIRTIO_NET_F_SPEED_DUPLEX) | BIT_ULL(VIRTIO_F_NOTIFY_ON_EMPTY) |                          \
41 	 BIT_ULL(VIRTIO_F_ANY_LAYOUT) | BIT_ULL(VIRTIO_F_VERSION_1) | BIT_ULL(VIRTIO_F_ACCESS_PLATFORM) |      \
42 	 BIT_ULL(VIRTIO_F_RING_PACKED) | BIT_ULL(VIRTIO_F_ORDER_PLATFORM) | BIT_ULL(VIRTIO_F_SR_IOV))
43 
44 #define VALID_STATUS_MASK                                                                          \
45 	(VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK |        \
46 	 VIRTIO_CONFIG_S_FEATURES_OK | VIRTIO_CONFIG_S_NEEDS_RESET | VIRTIO_CONFIG_S_FAILED)
47 
48 #define MLX5_FEATURE(_mvdev, _feature) (!!((_mvdev)->actual_features & BIT_ULL(_feature)))
49 
50 struct mlx5_vdpa_net_resources {
51 	u32 tisn;
52 	u32 tdn;
53 	u32 tirn;
54 	u32 rqtn;
55 	bool valid;
56 };
57 
58 struct mlx5_vdpa_cq_buf {
59 	struct mlx5_frag_buf_ctrl fbc;
60 	struct mlx5_frag_buf frag_buf;
61 	int cqe_size;
62 	int nent;
63 };
64 
65 struct mlx5_vdpa_cq {
66 	struct mlx5_core_cq mcq;
67 	struct mlx5_vdpa_cq_buf buf;
68 	struct mlx5_db db;
69 	int cqe;
70 };
71 
72 struct mlx5_vdpa_umem {
73 	struct mlx5_frag_buf_ctrl fbc;
74 	struct mlx5_frag_buf frag_buf;
75 	int size;
76 	u32 id;
77 };
78 
79 struct mlx5_vdpa_qp {
80 	struct mlx5_core_qp mqp;
81 	struct mlx5_frag_buf frag_buf;
82 	struct mlx5_db db;
83 	u16 head;
84 	bool fw;
85 };
86 
87 struct mlx5_vq_restore_info {
88 	u32 num_ent;
89 	u64 desc_addr;
90 	u64 device_addr;
91 	u64 driver_addr;
92 	u16 avail_index;
93 	u16 used_index;
94 	bool ready;
95 	bool restore;
96 };
97 
98 struct mlx5_vdpa_virtqueue {
99 	bool ready;
100 	u64 desc_addr;
101 	u64 device_addr;
102 	u64 driver_addr;
103 	u32 num_ent;
104 
105 	/* Resources for implementing the notification channel from the device
106 	 * to the driver. fwqp is the firmware end of an RC connection; the
107 	 * other end is vqqp used by the driver. cq is is where completions are
108 	 * reported.
109 	 */
110 	struct mlx5_vdpa_cq cq;
111 	struct mlx5_vdpa_qp fwqp;
112 	struct mlx5_vdpa_qp vqqp;
113 
114 	/* umem resources are required for the virtqueue operation. They're use
115 	 * is internal and they must be provided by the driver.
116 	 */
117 	struct mlx5_vdpa_umem umem1;
118 	struct mlx5_vdpa_umem umem2;
119 	struct mlx5_vdpa_umem umem3;
120 
121 	bool initialized;
122 	int index;
123 	u32 virtq_id;
124 	struct mlx5_vdpa_net *ndev;
125 	u16 avail_idx;
126 	u16 used_idx;
127 	int fw_state;
128 
129 	/* keep last in the struct */
130 	struct mlx5_vq_restore_info ri;
131 };
132 
133 /* We will remove this limitation once mlx5_vdpa_alloc_resources()
134  * provides for driver space allocation
135  */
136 #define MLX5_MAX_SUPPORTED_VQS 16
137 
138 static bool is_index_valid(struct mlx5_vdpa_dev *mvdev, u16 idx)
139 {
140 	if (unlikely(idx > mvdev->max_idx))
141 		return false;
142 
143 	return true;
144 }
145 
146 struct mlx5_vdpa_net {
147 	struct mlx5_vdpa_dev mvdev;
148 	struct mlx5_vdpa_net_resources res;
149 	struct virtio_net_config config;
150 	struct mlx5_vdpa_virtqueue vqs[MLX5_MAX_SUPPORTED_VQS];
151 	struct vdpa_callback event_cbs[MLX5_MAX_SUPPORTED_VQS + 1];
152 
153 	/* Serialize vq resources creation and destruction. This is required
154 	 * since memory map might change and we need to destroy and create
155 	 * resources while driver in operational.
156 	 */
157 	struct mutex reslock;
158 	struct mlx5_flow_table *rxft;
159 	struct mlx5_fc *rx_counter;
160 	struct mlx5_flow_handle *rx_rule;
161 	bool setup;
162 	u16 mtu;
163 	u32 cur_num_vqs;
164 };
165 
166 static void free_resources(struct mlx5_vdpa_net *ndev);
167 static void init_mvqs(struct mlx5_vdpa_net *ndev);
168 static int setup_driver(struct mlx5_vdpa_dev *mvdev);
169 static void teardown_driver(struct mlx5_vdpa_net *ndev);
170 
171 static bool mlx5_vdpa_debug;
172 
173 #define MLX5_CVQ_MAX_ENT 16
174 
175 #define MLX5_LOG_VIO_FLAG(_feature)                                                                \
176 	do {                                                                                       \
177 		if (features & BIT_ULL(_feature))                                                  \
178 			mlx5_vdpa_info(mvdev, "%s\n", #_feature);                                  \
179 	} while (0)
180 
181 #define MLX5_LOG_VIO_STAT(_status)                                                                 \
182 	do {                                                                                       \
183 		if (status & (_status))                                                            \
184 			mlx5_vdpa_info(mvdev, "%s\n", #_status);                                   \
185 	} while (0)
186 
187 /* TODO: cross-endian support */
188 static inline bool mlx5_vdpa_is_little_endian(struct mlx5_vdpa_dev *mvdev)
189 {
190 	return virtio_legacy_is_little_endian() ||
191 		(mvdev->actual_features & BIT_ULL(VIRTIO_F_VERSION_1));
192 }
193 
194 static u16 mlx5vdpa16_to_cpu(struct mlx5_vdpa_dev *mvdev, __virtio16 val)
195 {
196 	return __virtio16_to_cpu(mlx5_vdpa_is_little_endian(mvdev), val);
197 }
198 
199 static __virtio16 cpu_to_mlx5vdpa16(struct mlx5_vdpa_dev *mvdev, u16 val)
200 {
201 	return __cpu_to_virtio16(mlx5_vdpa_is_little_endian(mvdev), val);
202 }
203 
204 static inline u32 mlx5_vdpa_max_qps(int max_vqs)
205 {
206 	return max_vqs / 2;
207 }
208 
209 static u16 ctrl_vq_idx(struct mlx5_vdpa_dev *mvdev)
210 {
211 	if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_MQ)))
212 		return 2;
213 
214 	return 2 * mlx5_vdpa_max_qps(mvdev->max_vqs);
215 }
216 
217 static bool is_ctrl_vq_idx(struct mlx5_vdpa_dev *mvdev, u16 idx)
218 {
219 	return idx == ctrl_vq_idx(mvdev);
220 }
221 
222 static void print_status(struct mlx5_vdpa_dev *mvdev, u8 status, bool set)
223 {
224 	if (status & ~VALID_STATUS_MASK)
225 		mlx5_vdpa_warn(mvdev, "Warning: there are invalid status bits 0x%x\n",
226 			       status & ~VALID_STATUS_MASK);
227 
228 	if (!mlx5_vdpa_debug)
229 		return;
230 
231 	mlx5_vdpa_info(mvdev, "driver status %s", set ? "set" : "get");
232 	if (set && !status) {
233 		mlx5_vdpa_info(mvdev, "driver resets the device\n");
234 		return;
235 	}
236 
237 	MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_ACKNOWLEDGE);
238 	MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_DRIVER);
239 	MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_DRIVER_OK);
240 	MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_FEATURES_OK);
241 	MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_NEEDS_RESET);
242 	MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_FAILED);
243 }
244 
245 static void print_features(struct mlx5_vdpa_dev *mvdev, u64 features, bool set)
246 {
247 	if (features & ~VALID_FEATURES_MASK)
248 		mlx5_vdpa_warn(mvdev, "There are invalid feature bits 0x%llx\n",
249 			       features & ~VALID_FEATURES_MASK);
250 
251 	if (!mlx5_vdpa_debug)
252 		return;
253 
254 	mlx5_vdpa_info(mvdev, "driver %s feature bits:\n", set ? "sets" : "reads");
255 	if (!features)
256 		mlx5_vdpa_info(mvdev, "all feature bits are cleared\n");
257 
258 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CSUM);
259 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_CSUM);
260 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_GUEST_OFFLOADS);
261 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MTU);
262 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MAC);
263 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_TSO4);
264 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_TSO6);
265 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_ECN);
266 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_UFO);
267 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_TSO4);
268 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_TSO6);
269 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_ECN);
270 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_UFO);
271 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MRG_RXBUF);
272 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_STATUS);
273 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_VQ);
274 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_RX);
275 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_VLAN);
276 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_RX_EXTRA);
277 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_ANNOUNCE);
278 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MQ);
279 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_MAC_ADDR);
280 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HASH_REPORT);
281 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_RSS);
282 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_RSC_EXT);
283 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_STANDBY);
284 	MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_SPEED_DUPLEX);
285 	MLX5_LOG_VIO_FLAG(VIRTIO_F_NOTIFY_ON_EMPTY);
286 	MLX5_LOG_VIO_FLAG(VIRTIO_F_ANY_LAYOUT);
287 	MLX5_LOG_VIO_FLAG(VIRTIO_F_VERSION_1);
288 	MLX5_LOG_VIO_FLAG(VIRTIO_F_ACCESS_PLATFORM);
289 	MLX5_LOG_VIO_FLAG(VIRTIO_F_RING_PACKED);
290 	MLX5_LOG_VIO_FLAG(VIRTIO_F_ORDER_PLATFORM);
291 	MLX5_LOG_VIO_FLAG(VIRTIO_F_SR_IOV);
292 }
293 
294 static int create_tis(struct mlx5_vdpa_net *ndev)
295 {
296 	struct mlx5_vdpa_dev *mvdev = &ndev->mvdev;
297 	u32 in[MLX5_ST_SZ_DW(create_tis_in)] = {};
298 	void *tisc;
299 	int err;
300 
301 	tisc = MLX5_ADDR_OF(create_tis_in, in, ctx);
302 	MLX5_SET(tisc, tisc, transport_domain, ndev->res.tdn);
303 	err = mlx5_vdpa_create_tis(mvdev, in, &ndev->res.tisn);
304 	if (err)
305 		mlx5_vdpa_warn(mvdev, "create TIS (%d)\n", err);
306 
307 	return err;
308 }
309 
310 static void destroy_tis(struct mlx5_vdpa_net *ndev)
311 {
312 	mlx5_vdpa_destroy_tis(&ndev->mvdev, ndev->res.tisn);
313 }
314 
315 #define MLX5_VDPA_CQE_SIZE 64
316 #define MLX5_VDPA_LOG_CQE_SIZE ilog2(MLX5_VDPA_CQE_SIZE)
317 
318 static int cq_frag_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_cq_buf *buf, int nent)
319 {
320 	struct mlx5_frag_buf *frag_buf = &buf->frag_buf;
321 	u8 log_wq_stride = MLX5_VDPA_LOG_CQE_SIZE;
322 	u8 log_wq_sz = MLX5_VDPA_LOG_CQE_SIZE;
323 	int err;
324 
325 	err = mlx5_frag_buf_alloc_node(ndev->mvdev.mdev, nent * MLX5_VDPA_CQE_SIZE, frag_buf,
326 				       ndev->mvdev.mdev->priv.numa_node);
327 	if (err)
328 		return err;
329 
330 	mlx5_init_fbc(frag_buf->frags, log_wq_stride, log_wq_sz, &buf->fbc);
331 
332 	buf->cqe_size = MLX5_VDPA_CQE_SIZE;
333 	buf->nent = nent;
334 
335 	return 0;
336 }
337 
338 static int umem_frag_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_umem *umem, int size)
339 {
340 	struct mlx5_frag_buf *frag_buf = &umem->frag_buf;
341 
342 	return mlx5_frag_buf_alloc_node(ndev->mvdev.mdev, size, frag_buf,
343 					ndev->mvdev.mdev->priv.numa_node);
344 }
345 
346 static void cq_frag_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_cq_buf *buf)
347 {
348 	mlx5_frag_buf_free(ndev->mvdev.mdev, &buf->frag_buf);
349 }
350 
351 static void *get_cqe(struct mlx5_vdpa_cq *vcq, int n)
352 {
353 	return mlx5_frag_buf_get_wqe(&vcq->buf.fbc, n);
354 }
355 
356 static void cq_frag_buf_init(struct mlx5_vdpa_cq *vcq, struct mlx5_vdpa_cq_buf *buf)
357 {
358 	struct mlx5_cqe64 *cqe64;
359 	void *cqe;
360 	int i;
361 
362 	for (i = 0; i < buf->nent; i++) {
363 		cqe = get_cqe(vcq, i);
364 		cqe64 = cqe;
365 		cqe64->op_own = MLX5_CQE_INVALID << 4;
366 	}
367 }
368 
369 static void *get_sw_cqe(struct mlx5_vdpa_cq *cq, int n)
370 {
371 	struct mlx5_cqe64 *cqe64 = get_cqe(cq, n & (cq->cqe - 1));
372 
373 	if (likely(get_cqe_opcode(cqe64) != MLX5_CQE_INVALID) &&
374 	    !((cqe64->op_own & MLX5_CQE_OWNER_MASK) ^ !!(n & cq->cqe)))
375 		return cqe64;
376 
377 	return NULL;
378 }
379 
380 static void rx_post(struct mlx5_vdpa_qp *vqp, int n)
381 {
382 	vqp->head += n;
383 	vqp->db.db[0] = cpu_to_be32(vqp->head);
384 }
385 
386 static void qp_prepare(struct mlx5_vdpa_net *ndev, bool fw, void *in,
387 		       struct mlx5_vdpa_virtqueue *mvq, u32 num_ent)
388 {
389 	struct mlx5_vdpa_qp *vqp;
390 	__be64 *pas;
391 	void *qpc;
392 
393 	vqp = fw ? &mvq->fwqp : &mvq->vqqp;
394 	MLX5_SET(create_qp_in, in, uid, ndev->mvdev.res.uid);
395 	qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
396 	if (vqp->fw) {
397 		/* Firmware QP is allocated by the driver for the firmware's
398 		 * use so we can skip part of the params as they will be chosen by firmware
399 		 */
400 		qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
401 		MLX5_SET(qpc, qpc, rq_type, MLX5_ZERO_LEN_RQ);
402 		MLX5_SET(qpc, qpc, no_sq, 1);
403 		return;
404 	}
405 
406 	MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
407 	MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
408 	MLX5_SET(qpc, qpc, pd, ndev->mvdev.res.pdn);
409 	MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
410 	MLX5_SET(qpc, qpc, uar_page, ndev->mvdev.res.uar->index);
411 	MLX5_SET(qpc, qpc, log_page_size, vqp->frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
412 	MLX5_SET(qpc, qpc, no_sq, 1);
413 	MLX5_SET(qpc, qpc, cqn_rcv, mvq->cq.mcq.cqn);
414 	MLX5_SET(qpc, qpc, log_rq_size, ilog2(num_ent));
415 	MLX5_SET(qpc, qpc, rq_type, MLX5_NON_ZERO_RQ);
416 	pas = (__be64 *)MLX5_ADDR_OF(create_qp_in, in, pas);
417 	mlx5_fill_page_frag_array(&vqp->frag_buf, pas);
418 }
419 
420 static int rq_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp, u32 num_ent)
421 {
422 	return mlx5_frag_buf_alloc_node(ndev->mvdev.mdev,
423 					num_ent * sizeof(struct mlx5_wqe_data_seg), &vqp->frag_buf,
424 					ndev->mvdev.mdev->priv.numa_node);
425 }
426 
427 static void rq_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp)
428 {
429 	mlx5_frag_buf_free(ndev->mvdev.mdev, &vqp->frag_buf);
430 }
431 
432 static int qp_create(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
433 		     struct mlx5_vdpa_qp *vqp)
434 {
435 	struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
436 	int inlen = MLX5_ST_SZ_BYTES(create_qp_in);
437 	u32 out[MLX5_ST_SZ_DW(create_qp_out)] = {};
438 	void *qpc;
439 	void *in;
440 	int err;
441 
442 	if (!vqp->fw) {
443 		vqp = &mvq->vqqp;
444 		err = rq_buf_alloc(ndev, vqp, mvq->num_ent);
445 		if (err)
446 			return err;
447 
448 		err = mlx5_db_alloc(ndev->mvdev.mdev, &vqp->db);
449 		if (err)
450 			goto err_db;
451 		inlen += vqp->frag_buf.npages * sizeof(__be64);
452 	}
453 
454 	in = kzalloc(inlen, GFP_KERNEL);
455 	if (!in) {
456 		err = -ENOMEM;
457 		goto err_kzalloc;
458 	}
459 
460 	qp_prepare(ndev, vqp->fw, in, mvq, mvq->num_ent);
461 	qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
462 	MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
463 	MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
464 	MLX5_SET(qpc, qpc, pd, ndev->mvdev.res.pdn);
465 	MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
466 	if (!vqp->fw)
467 		MLX5_SET64(qpc, qpc, dbr_addr, vqp->db.dma);
468 	MLX5_SET(create_qp_in, in, opcode, MLX5_CMD_OP_CREATE_QP);
469 	err = mlx5_cmd_exec(mdev, in, inlen, out, sizeof(out));
470 	kfree(in);
471 	if (err)
472 		goto err_kzalloc;
473 
474 	vqp->mqp.uid = ndev->mvdev.res.uid;
475 	vqp->mqp.qpn = MLX5_GET(create_qp_out, out, qpn);
476 
477 	if (!vqp->fw)
478 		rx_post(vqp, mvq->num_ent);
479 
480 	return 0;
481 
482 err_kzalloc:
483 	if (!vqp->fw)
484 		mlx5_db_free(ndev->mvdev.mdev, &vqp->db);
485 err_db:
486 	if (!vqp->fw)
487 		rq_buf_free(ndev, vqp);
488 
489 	return err;
490 }
491 
492 static void qp_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp)
493 {
494 	u32 in[MLX5_ST_SZ_DW(destroy_qp_in)] = {};
495 
496 	MLX5_SET(destroy_qp_in, in, opcode, MLX5_CMD_OP_DESTROY_QP);
497 	MLX5_SET(destroy_qp_in, in, qpn, vqp->mqp.qpn);
498 	MLX5_SET(destroy_qp_in, in, uid, ndev->mvdev.res.uid);
499 	if (mlx5_cmd_exec_in(ndev->mvdev.mdev, destroy_qp, in))
500 		mlx5_vdpa_warn(&ndev->mvdev, "destroy qp 0x%x\n", vqp->mqp.qpn);
501 	if (!vqp->fw) {
502 		mlx5_db_free(ndev->mvdev.mdev, &vqp->db);
503 		rq_buf_free(ndev, vqp);
504 	}
505 }
506 
507 static void *next_cqe_sw(struct mlx5_vdpa_cq *cq)
508 {
509 	return get_sw_cqe(cq, cq->mcq.cons_index);
510 }
511 
512 static int mlx5_vdpa_poll_one(struct mlx5_vdpa_cq *vcq)
513 {
514 	struct mlx5_cqe64 *cqe64;
515 
516 	cqe64 = next_cqe_sw(vcq);
517 	if (!cqe64)
518 		return -EAGAIN;
519 
520 	vcq->mcq.cons_index++;
521 	return 0;
522 }
523 
524 static void mlx5_vdpa_handle_completions(struct mlx5_vdpa_virtqueue *mvq, int num)
525 {
526 	struct mlx5_vdpa_net *ndev = mvq->ndev;
527 	struct vdpa_callback *event_cb;
528 
529 	event_cb = &ndev->event_cbs[mvq->index];
530 	mlx5_cq_set_ci(&mvq->cq.mcq);
531 
532 	/* make sure CQ cosumer update is visible to the hardware before updating
533 	 * RX doorbell record.
534 	 */
535 	dma_wmb();
536 	rx_post(&mvq->vqqp, num);
537 	if (event_cb->callback)
538 		event_cb->callback(event_cb->private);
539 }
540 
541 static void mlx5_vdpa_cq_comp(struct mlx5_core_cq *mcq, struct mlx5_eqe *eqe)
542 {
543 	struct mlx5_vdpa_virtqueue *mvq = container_of(mcq, struct mlx5_vdpa_virtqueue, cq.mcq);
544 	struct mlx5_vdpa_net *ndev = mvq->ndev;
545 	void __iomem *uar_page = ndev->mvdev.res.uar->map;
546 	int num = 0;
547 
548 	while (!mlx5_vdpa_poll_one(&mvq->cq)) {
549 		num++;
550 		if (num > mvq->num_ent / 2) {
551 			/* If completions keep coming while we poll, we want to
552 			 * let the hardware know that we consumed them by
553 			 * updating the doorbell record.  We also let vdpa core
554 			 * know about this so it passes it on the virtio driver
555 			 * on the guest.
556 			 */
557 			mlx5_vdpa_handle_completions(mvq, num);
558 			num = 0;
559 		}
560 	}
561 
562 	if (num)
563 		mlx5_vdpa_handle_completions(mvq, num);
564 
565 	mlx5_cq_arm(&mvq->cq.mcq, MLX5_CQ_DB_REQ_NOT, uar_page, mvq->cq.mcq.cons_index);
566 }
567 
568 static int cq_create(struct mlx5_vdpa_net *ndev, u16 idx, u32 num_ent)
569 {
570 	struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
571 	struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
572 	void __iomem *uar_page = ndev->mvdev.res.uar->map;
573 	u32 out[MLX5_ST_SZ_DW(create_cq_out)];
574 	struct mlx5_vdpa_cq *vcq = &mvq->cq;
575 	__be64 *pas;
576 	int inlen;
577 	void *cqc;
578 	void *in;
579 	int err;
580 	int eqn;
581 
582 	err = mlx5_db_alloc(mdev, &vcq->db);
583 	if (err)
584 		return err;
585 
586 	vcq->mcq.set_ci_db = vcq->db.db;
587 	vcq->mcq.arm_db = vcq->db.db + 1;
588 	vcq->mcq.cqe_sz = 64;
589 
590 	err = cq_frag_buf_alloc(ndev, &vcq->buf, num_ent);
591 	if (err)
592 		goto err_db;
593 
594 	cq_frag_buf_init(vcq, &vcq->buf);
595 
596 	inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
597 		MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) * vcq->buf.frag_buf.npages;
598 	in = kzalloc(inlen, GFP_KERNEL);
599 	if (!in) {
600 		err = -ENOMEM;
601 		goto err_vzalloc;
602 	}
603 
604 	MLX5_SET(create_cq_in, in, uid, ndev->mvdev.res.uid);
605 	pas = (__be64 *)MLX5_ADDR_OF(create_cq_in, in, pas);
606 	mlx5_fill_page_frag_array(&vcq->buf.frag_buf, pas);
607 
608 	cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
609 	MLX5_SET(cqc, cqc, log_page_size, vcq->buf.frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
610 
611 	/* Use vector 0 by default. Consider adding code to choose least used
612 	 * vector.
613 	 */
614 	err = mlx5_vector2eqn(mdev, 0, &eqn);
615 	if (err)
616 		goto err_vec;
617 
618 	cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
619 	MLX5_SET(cqc, cqc, log_cq_size, ilog2(num_ent));
620 	MLX5_SET(cqc, cqc, uar_page, ndev->mvdev.res.uar->index);
621 	MLX5_SET(cqc, cqc, c_eqn_or_apu_element, eqn);
622 	MLX5_SET64(cqc, cqc, dbr_addr, vcq->db.dma);
623 
624 	err = mlx5_core_create_cq(mdev, &vcq->mcq, in, inlen, out, sizeof(out));
625 	if (err)
626 		goto err_vec;
627 
628 	vcq->mcq.comp = mlx5_vdpa_cq_comp;
629 	vcq->cqe = num_ent;
630 	vcq->mcq.set_ci_db = vcq->db.db;
631 	vcq->mcq.arm_db = vcq->db.db + 1;
632 	mlx5_cq_arm(&mvq->cq.mcq, MLX5_CQ_DB_REQ_NOT, uar_page, mvq->cq.mcq.cons_index);
633 	kfree(in);
634 	return 0;
635 
636 err_vec:
637 	kfree(in);
638 err_vzalloc:
639 	cq_frag_buf_free(ndev, &vcq->buf);
640 err_db:
641 	mlx5_db_free(ndev->mvdev.mdev, &vcq->db);
642 	return err;
643 }
644 
645 static void cq_destroy(struct mlx5_vdpa_net *ndev, u16 idx)
646 {
647 	struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
648 	struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
649 	struct mlx5_vdpa_cq *vcq = &mvq->cq;
650 
651 	if (mlx5_core_destroy_cq(mdev, &vcq->mcq)) {
652 		mlx5_vdpa_warn(&ndev->mvdev, "destroy CQ 0x%x\n", vcq->mcq.cqn);
653 		return;
654 	}
655 	cq_frag_buf_free(ndev, &vcq->buf);
656 	mlx5_db_free(ndev->mvdev.mdev, &vcq->db);
657 }
658 
659 static void set_umem_size(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num,
660 			  struct mlx5_vdpa_umem **umemp)
661 {
662 	struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
663 	int p_a;
664 	int p_b;
665 
666 	switch (num) {
667 	case 1:
668 		p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_1_buffer_param_a);
669 		p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_1_buffer_param_b);
670 		*umemp = &mvq->umem1;
671 		break;
672 	case 2:
673 		p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_2_buffer_param_a);
674 		p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_2_buffer_param_b);
675 		*umemp = &mvq->umem2;
676 		break;
677 	case 3:
678 		p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_3_buffer_param_a);
679 		p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_3_buffer_param_b);
680 		*umemp = &mvq->umem3;
681 		break;
682 	}
683 	(*umemp)->size = p_a * mvq->num_ent + p_b;
684 }
685 
686 static void umem_frag_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_umem *umem)
687 {
688 	mlx5_frag_buf_free(ndev->mvdev.mdev, &umem->frag_buf);
689 }
690 
691 static int create_umem(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num)
692 {
693 	int inlen;
694 	u32 out[MLX5_ST_SZ_DW(create_umem_out)] = {};
695 	void *um;
696 	void *in;
697 	int err;
698 	__be64 *pas;
699 	struct mlx5_vdpa_umem *umem;
700 
701 	set_umem_size(ndev, mvq, num, &umem);
702 	err = umem_frag_buf_alloc(ndev, umem, umem->size);
703 	if (err)
704 		return err;
705 
706 	inlen = MLX5_ST_SZ_BYTES(create_umem_in) + MLX5_ST_SZ_BYTES(mtt) * umem->frag_buf.npages;
707 
708 	in = kzalloc(inlen, GFP_KERNEL);
709 	if (!in) {
710 		err = -ENOMEM;
711 		goto err_in;
712 	}
713 
714 	MLX5_SET(create_umem_in, in, opcode, MLX5_CMD_OP_CREATE_UMEM);
715 	MLX5_SET(create_umem_in, in, uid, ndev->mvdev.res.uid);
716 	um = MLX5_ADDR_OF(create_umem_in, in, umem);
717 	MLX5_SET(umem, um, log_page_size, umem->frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
718 	MLX5_SET64(umem, um, num_of_mtt, umem->frag_buf.npages);
719 
720 	pas = (__be64 *)MLX5_ADDR_OF(umem, um, mtt[0]);
721 	mlx5_fill_page_frag_array_perm(&umem->frag_buf, pas, MLX5_MTT_PERM_RW);
722 
723 	err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
724 	if (err) {
725 		mlx5_vdpa_warn(&ndev->mvdev, "create umem(%d)\n", err);
726 		goto err_cmd;
727 	}
728 
729 	kfree(in);
730 	umem->id = MLX5_GET(create_umem_out, out, umem_id);
731 
732 	return 0;
733 
734 err_cmd:
735 	kfree(in);
736 err_in:
737 	umem_frag_buf_free(ndev, umem);
738 	return err;
739 }
740 
741 static void umem_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num)
742 {
743 	u32 in[MLX5_ST_SZ_DW(destroy_umem_in)] = {};
744 	u32 out[MLX5_ST_SZ_DW(destroy_umem_out)] = {};
745 	struct mlx5_vdpa_umem *umem;
746 
747 	switch (num) {
748 	case 1:
749 		umem = &mvq->umem1;
750 		break;
751 	case 2:
752 		umem = &mvq->umem2;
753 		break;
754 	case 3:
755 		umem = &mvq->umem3;
756 		break;
757 	}
758 
759 	MLX5_SET(destroy_umem_in, in, opcode, MLX5_CMD_OP_DESTROY_UMEM);
760 	MLX5_SET(destroy_umem_in, in, umem_id, umem->id);
761 	if (mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out)))
762 		return;
763 
764 	umem_frag_buf_free(ndev, umem);
765 }
766 
767 static int umems_create(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
768 {
769 	int num;
770 	int err;
771 
772 	for (num = 1; num <= 3; num++) {
773 		err = create_umem(ndev, mvq, num);
774 		if (err)
775 			goto err_umem;
776 	}
777 	return 0;
778 
779 err_umem:
780 	for (num--; num > 0; num--)
781 		umem_destroy(ndev, mvq, num);
782 
783 	return err;
784 }
785 
786 static void umems_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
787 {
788 	int num;
789 
790 	for (num = 3; num > 0; num--)
791 		umem_destroy(ndev, mvq, num);
792 }
793 
794 static int get_queue_type(struct mlx5_vdpa_net *ndev)
795 {
796 	u32 type_mask;
797 
798 	type_mask = MLX5_CAP_DEV_VDPA_EMULATION(ndev->mvdev.mdev, virtio_queue_type);
799 
800 	/* prefer split queue */
801 	if (type_mask & MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT)
802 		return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT;
803 
804 	WARN_ON(!(type_mask & MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_PACKED));
805 
806 	return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED;
807 }
808 
809 static bool vq_is_tx(u16 idx)
810 {
811 	return idx % 2;
812 }
813 
814 static u16 get_features_12_3(u64 features)
815 {
816 	return (!!(features & BIT_ULL(VIRTIO_NET_F_HOST_TSO4)) << 9) |
817 	       (!!(features & BIT_ULL(VIRTIO_NET_F_HOST_TSO6)) << 8) |
818 	       (!!(features & BIT_ULL(VIRTIO_NET_F_CSUM)) << 7) |
819 	       (!!(features & BIT_ULL(VIRTIO_NET_F_GUEST_CSUM)) << 6);
820 }
821 
822 static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
823 {
824 	int inlen = MLX5_ST_SZ_BYTES(create_virtio_net_q_in);
825 	u32 out[MLX5_ST_SZ_DW(create_virtio_net_q_out)] = {};
826 	void *obj_context;
827 	void *cmd_hdr;
828 	void *vq_ctx;
829 	void *in;
830 	int err;
831 
832 	err = umems_create(ndev, mvq);
833 	if (err)
834 		return err;
835 
836 	in = kzalloc(inlen, GFP_KERNEL);
837 	if (!in) {
838 		err = -ENOMEM;
839 		goto err_alloc;
840 	}
841 
842 	cmd_hdr = MLX5_ADDR_OF(create_virtio_net_q_in, in, general_obj_in_cmd_hdr);
843 
844 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
845 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
846 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
847 
848 	obj_context = MLX5_ADDR_OF(create_virtio_net_q_in, in, obj_context);
849 	MLX5_SET(virtio_net_q_object, obj_context, hw_available_index, mvq->avail_idx);
850 	MLX5_SET(virtio_net_q_object, obj_context, hw_used_index, mvq->used_idx);
851 	MLX5_SET(virtio_net_q_object, obj_context, queue_feature_bit_mask_12_3,
852 		 get_features_12_3(ndev->mvdev.actual_features));
853 	vq_ctx = MLX5_ADDR_OF(virtio_net_q_object, obj_context, virtio_q_context);
854 	MLX5_SET(virtio_q, vq_ctx, virtio_q_type, get_queue_type(ndev));
855 
856 	if (vq_is_tx(mvq->index))
857 		MLX5_SET(virtio_net_q_object, obj_context, tisn_or_qpn, ndev->res.tisn);
858 
859 	MLX5_SET(virtio_q, vq_ctx, event_mode, MLX5_VIRTIO_Q_EVENT_MODE_QP_MODE);
860 	MLX5_SET(virtio_q, vq_ctx, queue_index, mvq->index);
861 	MLX5_SET(virtio_q, vq_ctx, event_qpn_or_msix, mvq->fwqp.mqp.qpn);
862 	MLX5_SET(virtio_q, vq_ctx, queue_size, mvq->num_ent);
863 	MLX5_SET(virtio_q, vq_ctx, virtio_version_1_0,
864 		 !!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_F_VERSION_1)));
865 	MLX5_SET64(virtio_q, vq_ctx, desc_addr, mvq->desc_addr);
866 	MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr);
867 	MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr);
868 	MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, ndev->mvdev.mr.mkey.key);
869 	MLX5_SET(virtio_q, vq_ctx, umem_1_id, mvq->umem1.id);
870 	MLX5_SET(virtio_q, vq_ctx, umem_1_size, mvq->umem1.size);
871 	MLX5_SET(virtio_q, vq_ctx, umem_2_id, mvq->umem2.id);
872 	MLX5_SET(virtio_q, vq_ctx, umem_2_size, mvq->umem2.size);
873 	MLX5_SET(virtio_q, vq_ctx, umem_3_id, mvq->umem3.id);
874 	MLX5_SET(virtio_q, vq_ctx, umem_3_size, mvq->umem3.size);
875 	MLX5_SET(virtio_q, vq_ctx, pd, ndev->mvdev.res.pdn);
876 	if (MLX5_CAP_DEV_VDPA_EMULATION(ndev->mvdev.mdev, eth_frame_offload_type))
877 		MLX5_SET(virtio_q, vq_ctx, virtio_version_1_0, 1);
878 
879 	err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
880 	if (err)
881 		goto err_cmd;
882 
883 	kfree(in);
884 	mvq->virtq_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
885 
886 	return 0;
887 
888 err_cmd:
889 	kfree(in);
890 err_alloc:
891 	umems_destroy(ndev, mvq);
892 	return err;
893 }
894 
895 static void destroy_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
896 {
897 	u32 in[MLX5_ST_SZ_DW(destroy_virtio_net_q_in)] = {};
898 	u32 out[MLX5_ST_SZ_DW(destroy_virtio_net_q_out)] = {};
899 
900 	MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.opcode,
901 		 MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
902 	MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.obj_id, mvq->virtq_id);
903 	MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.uid, ndev->mvdev.res.uid);
904 	MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.obj_type,
905 		 MLX5_OBJ_TYPE_VIRTIO_NET_Q);
906 	if (mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out))) {
907 		mlx5_vdpa_warn(&ndev->mvdev, "destroy virtqueue 0x%x\n", mvq->virtq_id);
908 		return;
909 	}
910 	umems_destroy(ndev, mvq);
911 }
912 
913 static u32 get_rqpn(struct mlx5_vdpa_virtqueue *mvq, bool fw)
914 {
915 	return fw ? mvq->vqqp.mqp.qpn : mvq->fwqp.mqp.qpn;
916 }
917 
918 static u32 get_qpn(struct mlx5_vdpa_virtqueue *mvq, bool fw)
919 {
920 	return fw ? mvq->fwqp.mqp.qpn : mvq->vqqp.mqp.qpn;
921 }
922 
923 static void alloc_inout(struct mlx5_vdpa_net *ndev, int cmd, void **in, int *inlen, void **out,
924 			int *outlen, u32 qpn, u32 rqpn)
925 {
926 	void *qpc;
927 	void *pp;
928 
929 	switch (cmd) {
930 	case MLX5_CMD_OP_2RST_QP:
931 		*inlen = MLX5_ST_SZ_BYTES(qp_2rst_in);
932 		*outlen = MLX5_ST_SZ_BYTES(qp_2rst_out);
933 		*in = kzalloc(*inlen, GFP_KERNEL);
934 		*out = kzalloc(*outlen, GFP_KERNEL);
935 		if (!*in || !*out)
936 			goto outerr;
937 
938 		MLX5_SET(qp_2rst_in, *in, opcode, cmd);
939 		MLX5_SET(qp_2rst_in, *in, uid, ndev->mvdev.res.uid);
940 		MLX5_SET(qp_2rst_in, *in, qpn, qpn);
941 		break;
942 	case MLX5_CMD_OP_RST2INIT_QP:
943 		*inlen = MLX5_ST_SZ_BYTES(rst2init_qp_in);
944 		*outlen = MLX5_ST_SZ_BYTES(rst2init_qp_out);
945 		*in = kzalloc(*inlen, GFP_KERNEL);
946 		*out = kzalloc(MLX5_ST_SZ_BYTES(rst2init_qp_out), GFP_KERNEL);
947 		if (!*in || !*out)
948 			goto outerr;
949 
950 		MLX5_SET(rst2init_qp_in, *in, opcode, cmd);
951 		MLX5_SET(rst2init_qp_in, *in, uid, ndev->mvdev.res.uid);
952 		MLX5_SET(rst2init_qp_in, *in, qpn, qpn);
953 		qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
954 		MLX5_SET(qpc, qpc, remote_qpn, rqpn);
955 		MLX5_SET(qpc, qpc, rwe, 1);
956 		pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
957 		MLX5_SET(ads, pp, vhca_port_num, 1);
958 		break;
959 	case MLX5_CMD_OP_INIT2RTR_QP:
960 		*inlen = MLX5_ST_SZ_BYTES(init2rtr_qp_in);
961 		*outlen = MLX5_ST_SZ_BYTES(init2rtr_qp_out);
962 		*in = kzalloc(*inlen, GFP_KERNEL);
963 		*out = kzalloc(MLX5_ST_SZ_BYTES(init2rtr_qp_out), GFP_KERNEL);
964 		if (!*in || !*out)
965 			goto outerr;
966 
967 		MLX5_SET(init2rtr_qp_in, *in, opcode, cmd);
968 		MLX5_SET(init2rtr_qp_in, *in, uid, ndev->mvdev.res.uid);
969 		MLX5_SET(init2rtr_qp_in, *in, qpn, qpn);
970 		qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
971 		MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
972 		MLX5_SET(qpc, qpc, log_msg_max, 30);
973 		MLX5_SET(qpc, qpc, remote_qpn, rqpn);
974 		pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
975 		MLX5_SET(ads, pp, fl, 1);
976 		break;
977 	case MLX5_CMD_OP_RTR2RTS_QP:
978 		*inlen = MLX5_ST_SZ_BYTES(rtr2rts_qp_in);
979 		*outlen = MLX5_ST_SZ_BYTES(rtr2rts_qp_out);
980 		*in = kzalloc(*inlen, GFP_KERNEL);
981 		*out = kzalloc(MLX5_ST_SZ_BYTES(rtr2rts_qp_out), GFP_KERNEL);
982 		if (!*in || !*out)
983 			goto outerr;
984 
985 		MLX5_SET(rtr2rts_qp_in, *in, opcode, cmd);
986 		MLX5_SET(rtr2rts_qp_in, *in, uid, ndev->mvdev.res.uid);
987 		MLX5_SET(rtr2rts_qp_in, *in, qpn, qpn);
988 		qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
989 		pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
990 		MLX5_SET(ads, pp, ack_timeout, 14);
991 		MLX5_SET(qpc, qpc, retry_count, 7);
992 		MLX5_SET(qpc, qpc, rnr_retry, 7);
993 		break;
994 	default:
995 		goto outerr_nullify;
996 	}
997 
998 	return;
999 
1000 outerr:
1001 	kfree(*in);
1002 	kfree(*out);
1003 outerr_nullify:
1004 	*in = NULL;
1005 	*out = NULL;
1006 }
1007 
1008 static void free_inout(void *in, void *out)
1009 {
1010 	kfree(in);
1011 	kfree(out);
1012 }
1013 
1014 /* Two QPs are used by each virtqueue. One is used by the driver and one by
1015  * firmware. The fw argument indicates whether the subjected QP is the one used
1016  * by firmware.
1017  */
1018 static int modify_qp(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, bool fw, int cmd)
1019 {
1020 	int outlen;
1021 	int inlen;
1022 	void *out;
1023 	void *in;
1024 	int err;
1025 
1026 	alloc_inout(ndev, cmd, &in, &inlen, &out, &outlen, get_qpn(mvq, fw), get_rqpn(mvq, fw));
1027 	if (!in || !out)
1028 		return -ENOMEM;
1029 
1030 	err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, outlen);
1031 	free_inout(in, out);
1032 	return err;
1033 }
1034 
1035 static int connect_qps(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1036 {
1037 	int err;
1038 
1039 	err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_2RST_QP);
1040 	if (err)
1041 		return err;
1042 
1043 	err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_2RST_QP);
1044 	if (err)
1045 		return err;
1046 
1047 	err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_RST2INIT_QP);
1048 	if (err)
1049 		return err;
1050 
1051 	err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_RST2INIT_QP);
1052 	if (err)
1053 		return err;
1054 
1055 	err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_INIT2RTR_QP);
1056 	if (err)
1057 		return err;
1058 
1059 	err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_INIT2RTR_QP);
1060 	if (err)
1061 		return err;
1062 
1063 	return modify_qp(ndev, mvq, true, MLX5_CMD_OP_RTR2RTS_QP);
1064 }
1065 
1066 struct mlx5_virtq_attr {
1067 	u8 state;
1068 	u16 available_index;
1069 	u16 used_index;
1070 };
1071 
1072 static int query_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
1073 			   struct mlx5_virtq_attr *attr)
1074 {
1075 	int outlen = MLX5_ST_SZ_BYTES(query_virtio_net_q_out);
1076 	u32 in[MLX5_ST_SZ_DW(query_virtio_net_q_in)] = {};
1077 	void *out;
1078 	void *obj_context;
1079 	void *cmd_hdr;
1080 	int err;
1081 
1082 	out = kzalloc(outlen, GFP_KERNEL);
1083 	if (!out)
1084 		return -ENOMEM;
1085 
1086 	cmd_hdr = MLX5_ADDR_OF(query_virtio_net_q_in, in, general_obj_in_cmd_hdr);
1087 
1088 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_QUERY_GENERAL_OBJECT);
1089 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
1090 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->virtq_id);
1091 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
1092 	err = mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, outlen);
1093 	if (err)
1094 		goto err_cmd;
1095 
1096 	obj_context = MLX5_ADDR_OF(query_virtio_net_q_out, out, obj_context);
1097 	memset(attr, 0, sizeof(*attr));
1098 	attr->state = MLX5_GET(virtio_net_q_object, obj_context, state);
1099 	attr->available_index = MLX5_GET(virtio_net_q_object, obj_context, hw_available_index);
1100 	attr->used_index = MLX5_GET(virtio_net_q_object, obj_context, hw_used_index);
1101 	kfree(out);
1102 	return 0;
1103 
1104 err_cmd:
1105 	kfree(out);
1106 	return err;
1107 }
1108 
1109 static int modify_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int state)
1110 {
1111 	int inlen = MLX5_ST_SZ_BYTES(modify_virtio_net_q_in);
1112 	u32 out[MLX5_ST_SZ_DW(modify_virtio_net_q_out)] = {};
1113 	void *obj_context;
1114 	void *cmd_hdr;
1115 	void *in;
1116 	int err;
1117 
1118 	in = kzalloc(inlen, GFP_KERNEL);
1119 	if (!in)
1120 		return -ENOMEM;
1121 
1122 	cmd_hdr = MLX5_ADDR_OF(modify_virtio_net_q_in, in, general_obj_in_cmd_hdr);
1123 
1124 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_MODIFY_GENERAL_OBJECT);
1125 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
1126 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->virtq_id);
1127 	MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
1128 
1129 	obj_context = MLX5_ADDR_OF(modify_virtio_net_q_in, in, obj_context);
1130 	MLX5_SET64(virtio_net_q_object, obj_context, modify_field_select,
1131 		   MLX5_VIRTQ_MODIFY_MASK_STATE);
1132 	MLX5_SET(virtio_net_q_object, obj_context, state, state);
1133 	err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
1134 	kfree(in);
1135 	if (!err)
1136 		mvq->fw_state = state;
1137 
1138 	return err;
1139 }
1140 
1141 static int setup_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1142 {
1143 	u16 idx = mvq->index;
1144 	int err;
1145 
1146 	if (!mvq->num_ent)
1147 		return 0;
1148 
1149 	if (mvq->initialized)
1150 		return 0;
1151 
1152 	err = cq_create(ndev, idx, mvq->num_ent);
1153 	if (err)
1154 		return err;
1155 
1156 	err = qp_create(ndev, mvq, &mvq->fwqp);
1157 	if (err)
1158 		goto err_fwqp;
1159 
1160 	err = qp_create(ndev, mvq, &mvq->vqqp);
1161 	if (err)
1162 		goto err_vqqp;
1163 
1164 	err = connect_qps(ndev, mvq);
1165 	if (err)
1166 		goto err_connect;
1167 
1168 	err = create_virtqueue(ndev, mvq);
1169 	if (err)
1170 		goto err_connect;
1171 
1172 	if (mvq->ready) {
1173 		err = modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY);
1174 		if (err) {
1175 			mlx5_vdpa_warn(&ndev->mvdev, "failed to modify to ready vq idx %d(%d)\n",
1176 				       idx, err);
1177 			goto err_connect;
1178 		}
1179 	}
1180 
1181 	mvq->initialized = true;
1182 	return 0;
1183 
1184 err_connect:
1185 	qp_destroy(ndev, &mvq->vqqp);
1186 err_vqqp:
1187 	qp_destroy(ndev, &mvq->fwqp);
1188 err_fwqp:
1189 	cq_destroy(ndev, idx);
1190 	return err;
1191 }
1192 
1193 static void suspend_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1194 {
1195 	struct mlx5_virtq_attr attr;
1196 
1197 	if (!mvq->initialized)
1198 		return;
1199 
1200 	if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY)
1201 		return;
1202 
1203 	if (modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND))
1204 		mlx5_vdpa_warn(&ndev->mvdev, "modify to suspend failed\n");
1205 
1206 	if (query_virtqueue(ndev, mvq, &attr)) {
1207 		mlx5_vdpa_warn(&ndev->mvdev, "failed to query virtqueue\n");
1208 		return;
1209 	}
1210 	mvq->avail_idx = attr.available_index;
1211 	mvq->used_idx = attr.used_index;
1212 }
1213 
1214 static void suspend_vqs(struct mlx5_vdpa_net *ndev)
1215 {
1216 	int i;
1217 
1218 	for (i = 0; i < MLX5_MAX_SUPPORTED_VQS; i++)
1219 		suspend_vq(ndev, &ndev->vqs[i]);
1220 }
1221 
1222 static void teardown_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1223 {
1224 	if (!mvq->initialized)
1225 		return;
1226 
1227 	suspend_vq(ndev, mvq);
1228 	destroy_virtqueue(ndev, mvq);
1229 	qp_destroy(ndev, &mvq->vqqp);
1230 	qp_destroy(ndev, &mvq->fwqp);
1231 	cq_destroy(ndev, mvq->index);
1232 	mvq->initialized = false;
1233 }
1234 
1235 static int create_rqt(struct mlx5_vdpa_net *ndev)
1236 {
1237 	__be32 *list;
1238 	int max_rqt;
1239 	void *rqtc;
1240 	int inlen;
1241 	void *in;
1242 	int i, j;
1243 	int err;
1244 
1245 	max_rqt = min_t(int, MLX5_MAX_SUPPORTED_VQS / 2,
1246 			1 << MLX5_CAP_GEN(ndev->mvdev.mdev, log_max_rqt_size));
1247 	if (max_rqt < 1)
1248 		return -EOPNOTSUPP;
1249 
1250 	inlen = MLX5_ST_SZ_BYTES(create_rqt_in) + max_rqt * MLX5_ST_SZ_BYTES(rq_num);
1251 	in = kzalloc(inlen, GFP_KERNEL);
1252 	if (!in)
1253 		return -ENOMEM;
1254 
1255 	MLX5_SET(create_rqt_in, in, uid, ndev->mvdev.res.uid);
1256 	rqtc = MLX5_ADDR_OF(create_rqt_in, in, rqt_context);
1257 
1258 	MLX5_SET(rqtc, rqtc, list_q_type, MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q);
1259 	MLX5_SET(rqtc, rqtc, rqt_max_size, max_rqt);
1260 	list = MLX5_ADDR_OF(rqtc, rqtc, rq_num[0]);
1261 	for (i = 0, j = 0; j < max_rqt; j++) {
1262 		if (!ndev->vqs[j].initialized)
1263 			continue;
1264 
1265 		if (!vq_is_tx(ndev->vqs[j].index)) {
1266 			list[i] = cpu_to_be32(ndev->vqs[j].virtq_id);
1267 			i++;
1268 		}
1269 	}
1270 	MLX5_SET(rqtc, rqtc, rqt_actual_size, i);
1271 
1272 	err = mlx5_vdpa_create_rqt(&ndev->mvdev, in, inlen, &ndev->res.rqtn);
1273 	kfree(in);
1274 	if (err)
1275 		return err;
1276 
1277 	return 0;
1278 }
1279 
1280 #define MLX5_MODIFY_RQT_NUM_RQS ((u64)1)
1281 
1282 static int modify_rqt(struct mlx5_vdpa_net *ndev, int num)
1283 {
1284 	__be32 *list;
1285 	int max_rqt;
1286 	void *rqtc;
1287 	int inlen;
1288 	void *in;
1289 	int i, j;
1290 	int err;
1291 
1292 	max_rqt = min_t(int, ndev->cur_num_vqs / 2,
1293 			1 << MLX5_CAP_GEN(ndev->mvdev.mdev, log_max_rqt_size));
1294 	if (max_rqt < 1)
1295 		return -EOPNOTSUPP;
1296 
1297 	inlen = MLX5_ST_SZ_BYTES(modify_rqt_in) + max_rqt * MLX5_ST_SZ_BYTES(rq_num);
1298 	in = kzalloc(inlen, GFP_KERNEL);
1299 	if (!in)
1300 		return -ENOMEM;
1301 
1302 	MLX5_SET(modify_rqt_in, in, uid, ndev->mvdev.res.uid);
1303 	MLX5_SET64(modify_rqt_in, in, bitmask, MLX5_MODIFY_RQT_NUM_RQS);
1304 	rqtc = MLX5_ADDR_OF(modify_rqt_in, in, ctx);
1305 	MLX5_SET(rqtc, rqtc, list_q_type, MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q);
1306 
1307 	list = MLX5_ADDR_OF(rqtc, rqtc, rq_num[0]);
1308 	for (i = 0, j = 0; j < num; j++) {
1309 		if (!ndev->vqs[j].initialized)
1310 			continue;
1311 
1312 		if (!vq_is_tx(ndev->vqs[j].index)) {
1313 			list[i] = cpu_to_be32(ndev->vqs[j].virtq_id);
1314 			i++;
1315 		}
1316 	}
1317 	MLX5_SET(rqtc, rqtc, rqt_actual_size, i);
1318 	err = mlx5_vdpa_modify_rqt(&ndev->mvdev, in, inlen, ndev->res.rqtn);
1319 	kfree(in);
1320 	if (err)
1321 		return err;
1322 
1323 	return 0;
1324 }
1325 
1326 static void destroy_rqt(struct mlx5_vdpa_net *ndev)
1327 {
1328 	mlx5_vdpa_destroy_rqt(&ndev->mvdev, ndev->res.rqtn);
1329 }
1330 
1331 static int create_tir(struct mlx5_vdpa_net *ndev)
1332 {
1333 #define HASH_IP_L4PORTS                                                                            \
1334 	(MLX5_HASH_FIELD_SEL_SRC_IP | MLX5_HASH_FIELD_SEL_DST_IP | MLX5_HASH_FIELD_SEL_L4_SPORT |  \
1335 	 MLX5_HASH_FIELD_SEL_L4_DPORT)
1336 	static const u8 rx_hash_toeplitz_key[] = { 0x2c, 0xc6, 0x81, 0xd1, 0x5b, 0xdb, 0xf4, 0xf7,
1337 						   0xfc, 0xa2, 0x83, 0x19, 0xdb, 0x1a, 0x3e, 0x94,
1338 						   0x6b, 0x9e, 0x38, 0xd9, 0x2c, 0x9c, 0x03, 0xd1,
1339 						   0xad, 0x99, 0x44, 0xa7, 0xd9, 0x56, 0x3d, 0x59,
1340 						   0x06, 0x3c, 0x25, 0xf3, 0xfc, 0x1f, 0xdc, 0x2a };
1341 	void *rss_key;
1342 	void *outer;
1343 	void *tirc;
1344 	void *in;
1345 	int err;
1346 
1347 	in = kzalloc(MLX5_ST_SZ_BYTES(create_tir_in), GFP_KERNEL);
1348 	if (!in)
1349 		return -ENOMEM;
1350 
1351 	MLX5_SET(create_tir_in, in, uid, ndev->mvdev.res.uid);
1352 	tirc = MLX5_ADDR_OF(create_tir_in, in, ctx);
1353 	MLX5_SET(tirc, tirc, disp_type, MLX5_TIRC_DISP_TYPE_INDIRECT);
1354 
1355 	MLX5_SET(tirc, tirc, rx_hash_symmetric, 1);
1356 	MLX5_SET(tirc, tirc, rx_hash_fn, MLX5_RX_HASH_FN_TOEPLITZ);
1357 	rss_key = MLX5_ADDR_OF(tirc, tirc, rx_hash_toeplitz_key);
1358 	memcpy(rss_key, rx_hash_toeplitz_key, sizeof(rx_hash_toeplitz_key));
1359 
1360 	outer = MLX5_ADDR_OF(tirc, tirc, rx_hash_field_selector_outer);
1361 	MLX5_SET(rx_hash_field_select, outer, l3_prot_type, MLX5_L3_PROT_TYPE_IPV4);
1362 	MLX5_SET(rx_hash_field_select, outer, l4_prot_type, MLX5_L4_PROT_TYPE_TCP);
1363 	MLX5_SET(rx_hash_field_select, outer, selected_fields, HASH_IP_L4PORTS);
1364 
1365 	MLX5_SET(tirc, tirc, indirect_table, ndev->res.rqtn);
1366 	MLX5_SET(tirc, tirc, transport_domain, ndev->res.tdn);
1367 
1368 	err = mlx5_vdpa_create_tir(&ndev->mvdev, in, &ndev->res.tirn);
1369 	kfree(in);
1370 	return err;
1371 }
1372 
1373 static void destroy_tir(struct mlx5_vdpa_net *ndev)
1374 {
1375 	mlx5_vdpa_destroy_tir(&ndev->mvdev, ndev->res.tirn);
1376 }
1377 
1378 static int add_fwd_to_tir(struct mlx5_vdpa_net *ndev)
1379 {
1380 	struct mlx5_flow_destination dest[2] = {};
1381 	struct mlx5_flow_table_attr ft_attr = {};
1382 	struct mlx5_flow_act flow_act = {};
1383 	struct mlx5_flow_namespace *ns;
1384 	int err;
1385 
1386 	/* for now, one entry, match all, forward to tir */
1387 	ft_attr.max_fte = 1;
1388 	ft_attr.autogroup.max_num_groups = 1;
1389 
1390 	ns = mlx5_get_flow_namespace(ndev->mvdev.mdev, MLX5_FLOW_NAMESPACE_BYPASS);
1391 	if (!ns) {
1392 		mlx5_vdpa_warn(&ndev->mvdev, "get flow namespace\n");
1393 		return -EOPNOTSUPP;
1394 	}
1395 
1396 	ndev->rxft = mlx5_create_auto_grouped_flow_table(ns, &ft_attr);
1397 	if (IS_ERR(ndev->rxft))
1398 		return PTR_ERR(ndev->rxft);
1399 
1400 	ndev->rx_counter = mlx5_fc_create(ndev->mvdev.mdev, false);
1401 	if (IS_ERR(ndev->rx_counter)) {
1402 		err = PTR_ERR(ndev->rx_counter);
1403 		goto err_fc;
1404 	}
1405 
1406 	flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_COUNT;
1407 	dest[0].type = MLX5_FLOW_DESTINATION_TYPE_TIR;
1408 	dest[0].tir_num = ndev->res.tirn;
1409 	dest[1].type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
1410 	dest[1].counter_id = mlx5_fc_id(ndev->rx_counter);
1411 	ndev->rx_rule = mlx5_add_flow_rules(ndev->rxft, NULL, &flow_act, dest, 2);
1412 	if (IS_ERR(ndev->rx_rule)) {
1413 		err = PTR_ERR(ndev->rx_rule);
1414 		ndev->rx_rule = NULL;
1415 		goto err_rule;
1416 	}
1417 
1418 	return 0;
1419 
1420 err_rule:
1421 	mlx5_fc_destroy(ndev->mvdev.mdev, ndev->rx_counter);
1422 err_fc:
1423 	mlx5_destroy_flow_table(ndev->rxft);
1424 	return err;
1425 }
1426 
1427 static void remove_fwd_to_tir(struct mlx5_vdpa_net *ndev)
1428 {
1429 	if (!ndev->rx_rule)
1430 		return;
1431 
1432 	mlx5_del_flow_rules(ndev->rx_rule);
1433 	mlx5_fc_destroy(ndev->mvdev.mdev, ndev->rx_counter);
1434 	mlx5_destroy_flow_table(ndev->rxft);
1435 
1436 	ndev->rx_rule = NULL;
1437 }
1438 
1439 static virtio_net_ctrl_ack handle_ctrl_mac(struct mlx5_vdpa_dev *mvdev, u8 cmd)
1440 {
1441 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1442 	struct mlx5_control_vq *cvq = &mvdev->cvq;
1443 	virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
1444 	struct mlx5_core_dev *pfmdev;
1445 	size_t read;
1446 	u8 mac[ETH_ALEN];
1447 
1448 	pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev));
1449 	switch (cmd) {
1450 	case VIRTIO_NET_CTRL_MAC_ADDR_SET:
1451 		read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, (void *)mac, ETH_ALEN);
1452 		if (read != ETH_ALEN)
1453 			break;
1454 
1455 		if (!memcmp(ndev->config.mac, mac, 6)) {
1456 			status = VIRTIO_NET_OK;
1457 			break;
1458 		}
1459 
1460 		if (!is_zero_ether_addr(ndev->config.mac)) {
1461 			if (mlx5_mpfs_del_mac(pfmdev, ndev->config.mac)) {
1462 				mlx5_vdpa_warn(mvdev, "failed to delete old MAC %pM from MPFS table\n",
1463 					       ndev->config.mac);
1464 				break;
1465 			}
1466 		}
1467 
1468 		if (mlx5_mpfs_add_mac(pfmdev, mac)) {
1469 			mlx5_vdpa_warn(mvdev, "failed to insert new MAC %pM into MPFS table\n",
1470 				       mac);
1471 			break;
1472 		}
1473 
1474 		memcpy(ndev->config.mac, mac, ETH_ALEN);
1475 		status = VIRTIO_NET_OK;
1476 		break;
1477 
1478 	default:
1479 		break;
1480 	}
1481 
1482 	return status;
1483 }
1484 
1485 static int change_num_qps(struct mlx5_vdpa_dev *mvdev, int newqps)
1486 {
1487 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1488 	int cur_qps = ndev->cur_num_vqs / 2;
1489 	int err;
1490 	int i;
1491 
1492 	if (cur_qps > newqps) {
1493 		err = modify_rqt(ndev, 2 * newqps);
1494 		if (err)
1495 			return err;
1496 
1497 		for (i = ndev->cur_num_vqs - 1; i >= 2 * newqps; i--)
1498 			teardown_vq(ndev, &ndev->vqs[i]);
1499 
1500 		ndev->cur_num_vqs = 2 * newqps;
1501 	} else {
1502 		ndev->cur_num_vqs = 2 * newqps;
1503 		for (i = cur_qps * 2; i < 2 * newqps; i++) {
1504 			err = setup_vq(ndev, &ndev->vqs[i]);
1505 			if (err)
1506 				goto clean_added;
1507 		}
1508 		err = modify_rqt(ndev, 2 * newqps);
1509 		if (err)
1510 			goto clean_added;
1511 	}
1512 	return 0;
1513 
1514 clean_added:
1515 	for (--i; i >= cur_qps; --i)
1516 		teardown_vq(ndev, &ndev->vqs[i]);
1517 
1518 	return err;
1519 }
1520 
1521 static virtio_net_ctrl_ack handle_ctrl_mq(struct mlx5_vdpa_dev *mvdev, u8 cmd)
1522 {
1523 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1524 	virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
1525 	struct mlx5_control_vq *cvq = &mvdev->cvq;
1526 	struct virtio_net_ctrl_mq mq;
1527 	size_t read;
1528 	u16 newqps;
1529 
1530 	switch (cmd) {
1531 	case VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET:
1532 		read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, (void *)&mq, sizeof(mq));
1533 		if (read != sizeof(mq))
1534 			break;
1535 
1536 		newqps = mlx5vdpa16_to_cpu(mvdev, mq.virtqueue_pairs);
1537 		if (ndev->cur_num_vqs == 2 * newqps) {
1538 			status = VIRTIO_NET_OK;
1539 			break;
1540 		}
1541 
1542 		if (newqps & (newqps - 1))
1543 			break;
1544 
1545 		if (!change_num_qps(mvdev, newqps))
1546 			status = VIRTIO_NET_OK;
1547 
1548 		break;
1549 	default:
1550 		break;
1551 	}
1552 
1553 	return status;
1554 }
1555 
1556 static void mlx5_cvq_kick_handler(struct work_struct *work)
1557 {
1558 	virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
1559 	struct virtio_net_ctrl_hdr ctrl;
1560 	struct mlx5_ctrl_wq_ent *wqent;
1561 	struct mlx5_vdpa_dev *mvdev;
1562 	struct mlx5_control_vq *cvq;
1563 	struct mlx5_vdpa_net *ndev;
1564 	size_t read, write;
1565 	int err;
1566 
1567 	wqent = container_of(work, struct mlx5_ctrl_wq_ent, work);
1568 	mvdev = wqent->mvdev;
1569 	ndev = to_mlx5_vdpa_ndev(mvdev);
1570 	cvq = &mvdev->cvq;
1571 	if (!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
1572 		goto out;
1573 
1574 	if (!cvq->ready)
1575 		goto out;
1576 
1577 	while (true) {
1578 		err = vringh_getdesc_iotlb(&cvq->vring, &cvq->riov, &cvq->wiov, &cvq->head,
1579 					   GFP_ATOMIC);
1580 		if (err <= 0)
1581 			break;
1582 
1583 		read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, &ctrl, sizeof(ctrl));
1584 		if (read != sizeof(ctrl))
1585 			break;
1586 
1587 		switch (ctrl.class) {
1588 		case VIRTIO_NET_CTRL_MAC:
1589 			status = handle_ctrl_mac(mvdev, ctrl.cmd);
1590 			break;
1591 		case VIRTIO_NET_CTRL_MQ:
1592 			status = handle_ctrl_mq(mvdev, ctrl.cmd);
1593 			break;
1594 
1595 		default:
1596 			break;
1597 		}
1598 
1599 		/* Make sure data is written before advancing index */
1600 		smp_wmb();
1601 
1602 		write = vringh_iov_push_iotlb(&cvq->vring, &cvq->wiov, &status, sizeof(status));
1603 		vringh_complete_iotlb(&cvq->vring, cvq->head, write);
1604 		vringh_kiov_cleanup(&cvq->riov);
1605 		vringh_kiov_cleanup(&cvq->wiov);
1606 
1607 		if (vringh_need_notify_iotlb(&cvq->vring))
1608 			vringh_notify(&cvq->vring);
1609 	}
1610 out:
1611 	kfree(wqent);
1612 }
1613 
1614 static void mlx5_vdpa_kick_vq(struct vdpa_device *vdev, u16 idx)
1615 {
1616 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1617 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1618 	struct mlx5_vdpa_virtqueue *mvq;
1619 	struct mlx5_ctrl_wq_ent *wqent;
1620 
1621 	if (!is_index_valid(mvdev, idx))
1622 		return;
1623 
1624 	if (unlikely(is_ctrl_vq_idx(mvdev, idx))) {
1625 		if (!mvdev->cvq.ready)
1626 			return;
1627 
1628 		wqent = kzalloc(sizeof(*wqent), GFP_ATOMIC);
1629 		if (!wqent)
1630 			return;
1631 
1632 		wqent->mvdev = mvdev;
1633 		INIT_WORK(&wqent->work, mlx5_cvq_kick_handler);
1634 		queue_work(mvdev->wq, &wqent->work);
1635 		return;
1636 	}
1637 
1638 	mvq = &ndev->vqs[idx];
1639 	if (unlikely(!mvq->ready))
1640 		return;
1641 
1642 	iowrite16(idx, ndev->mvdev.res.kick_addr);
1643 }
1644 
1645 static int mlx5_vdpa_set_vq_address(struct vdpa_device *vdev, u16 idx, u64 desc_area,
1646 				    u64 driver_area, u64 device_area)
1647 {
1648 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1649 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1650 	struct mlx5_vdpa_virtqueue *mvq;
1651 
1652 	if (!is_index_valid(mvdev, idx))
1653 		return -EINVAL;
1654 
1655 	if (is_ctrl_vq_idx(mvdev, idx)) {
1656 		mvdev->cvq.desc_addr = desc_area;
1657 		mvdev->cvq.device_addr = device_area;
1658 		mvdev->cvq.driver_addr = driver_area;
1659 		return 0;
1660 	}
1661 
1662 	mvq = &ndev->vqs[idx];
1663 	mvq->desc_addr = desc_area;
1664 	mvq->device_addr = device_area;
1665 	mvq->driver_addr = driver_area;
1666 	return 0;
1667 }
1668 
1669 static void mlx5_vdpa_set_vq_num(struct vdpa_device *vdev, u16 idx, u32 num)
1670 {
1671 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1672 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1673 	struct mlx5_vdpa_virtqueue *mvq;
1674 
1675 	if (!is_index_valid(mvdev, idx) || is_ctrl_vq_idx(mvdev, idx))
1676 		return;
1677 
1678 	mvq = &ndev->vqs[idx];
1679 	mvq->num_ent = num;
1680 }
1681 
1682 static void mlx5_vdpa_set_vq_cb(struct vdpa_device *vdev, u16 idx, struct vdpa_callback *cb)
1683 {
1684 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1685 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1686 
1687 	ndev->event_cbs[idx] = *cb;
1688 }
1689 
1690 static void mlx5_cvq_notify(struct vringh *vring)
1691 {
1692 	struct mlx5_control_vq *cvq = container_of(vring, struct mlx5_control_vq, vring);
1693 
1694 	if (!cvq->event_cb.callback)
1695 		return;
1696 
1697 	cvq->event_cb.callback(cvq->event_cb.private);
1698 }
1699 
1700 static void set_cvq_ready(struct mlx5_vdpa_dev *mvdev, bool ready)
1701 {
1702 	struct mlx5_control_vq *cvq = &mvdev->cvq;
1703 
1704 	cvq->ready = ready;
1705 	if (!ready)
1706 		return;
1707 
1708 	cvq->vring.notify = mlx5_cvq_notify;
1709 }
1710 
1711 static void mlx5_vdpa_set_vq_ready(struct vdpa_device *vdev, u16 idx, bool ready)
1712 {
1713 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1714 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1715 	struct mlx5_vdpa_virtqueue *mvq;
1716 
1717 	if (!is_index_valid(mvdev, idx))
1718 		return;
1719 
1720 	if (is_ctrl_vq_idx(mvdev, idx)) {
1721 		set_cvq_ready(mvdev, ready);
1722 		return;
1723 	}
1724 
1725 	mvq = &ndev->vqs[idx];
1726 	if (!ready)
1727 		suspend_vq(ndev, mvq);
1728 
1729 	mvq->ready = ready;
1730 }
1731 
1732 static bool mlx5_vdpa_get_vq_ready(struct vdpa_device *vdev, u16 idx)
1733 {
1734 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1735 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1736 
1737 	if (!is_index_valid(mvdev, idx))
1738 		return false;
1739 
1740 	if (is_ctrl_vq_idx(mvdev, idx))
1741 		return mvdev->cvq.ready;
1742 
1743 	return ndev->vqs[idx].ready;
1744 }
1745 
1746 static int mlx5_vdpa_set_vq_state(struct vdpa_device *vdev, u16 idx,
1747 				  const struct vdpa_vq_state *state)
1748 {
1749 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1750 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1751 	struct mlx5_vdpa_virtqueue *mvq;
1752 
1753 	if (!is_index_valid(mvdev, idx))
1754 		return -EINVAL;
1755 
1756 	if (is_ctrl_vq_idx(mvdev, idx)) {
1757 		mvdev->cvq.vring.last_avail_idx = state->split.avail_index;
1758 		return 0;
1759 	}
1760 
1761 	mvq = &ndev->vqs[idx];
1762 	if (mvq->fw_state == MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY) {
1763 		mlx5_vdpa_warn(mvdev, "can't modify available index\n");
1764 		return -EINVAL;
1765 	}
1766 
1767 	mvq->used_idx = state->split.avail_index;
1768 	mvq->avail_idx = state->split.avail_index;
1769 	return 0;
1770 }
1771 
1772 static int mlx5_vdpa_get_vq_state(struct vdpa_device *vdev, u16 idx, struct vdpa_vq_state *state)
1773 {
1774 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1775 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1776 	struct mlx5_vdpa_virtqueue *mvq;
1777 	struct mlx5_virtq_attr attr;
1778 	int err;
1779 
1780 	if (!is_index_valid(mvdev, idx))
1781 		return -EINVAL;
1782 
1783 	if (is_ctrl_vq_idx(mvdev, idx)) {
1784 		state->split.avail_index = mvdev->cvq.vring.last_avail_idx;
1785 		return 0;
1786 	}
1787 
1788 	mvq = &ndev->vqs[idx];
1789 	/* If the virtq object was destroyed, use the value saved at
1790 	 * the last minute of suspend_vq. This caters for userspace
1791 	 * that cares about emulating the index after vq is stopped.
1792 	 */
1793 	if (!mvq->initialized) {
1794 		/* Firmware returns a wrong value for the available index.
1795 		 * Since both values should be identical, we take the value of
1796 		 * used_idx which is reported correctly.
1797 		 */
1798 		state->split.avail_index = mvq->used_idx;
1799 		return 0;
1800 	}
1801 
1802 	err = query_virtqueue(ndev, mvq, &attr);
1803 	if (err) {
1804 		mlx5_vdpa_warn(mvdev, "failed to query virtqueue\n");
1805 		return err;
1806 	}
1807 	state->split.avail_index = attr.used_index;
1808 	return 0;
1809 }
1810 
1811 static u32 mlx5_vdpa_get_vq_align(struct vdpa_device *vdev)
1812 {
1813 	return PAGE_SIZE;
1814 }
1815 
1816 enum { MLX5_VIRTIO_NET_F_GUEST_CSUM = 1 << 9,
1817 	MLX5_VIRTIO_NET_F_CSUM = 1 << 10,
1818 	MLX5_VIRTIO_NET_F_HOST_TSO6 = 1 << 11,
1819 	MLX5_VIRTIO_NET_F_HOST_TSO4 = 1 << 12,
1820 };
1821 
1822 static u64 mlx_to_vritio_features(u16 dev_features)
1823 {
1824 	u64 result = 0;
1825 
1826 	if (dev_features & MLX5_VIRTIO_NET_F_GUEST_CSUM)
1827 		result |= BIT_ULL(VIRTIO_NET_F_GUEST_CSUM);
1828 	if (dev_features & MLX5_VIRTIO_NET_F_CSUM)
1829 		result |= BIT_ULL(VIRTIO_NET_F_CSUM);
1830 	if (dev_features & MLX5_VIRTIO_NET_F_HOST_TSO6)
1831 		result |= BIT_ULL(VIRTIO_NET_F_HOST_TSO6);
1832 	if (dev_features & MLX5_VIRTIO_NET_F_HOST_TSO4)
1833 		result |= BIT_ULL(VIRTIO_NET_F_HOST_TSO4);
1834 
1835 	return result;
1836 }
1837 
1838 static u64 mlx5_vdpa_get_features(struct vdpa_device *vdev)
1839 {
1840 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1841 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1842 	u16 dev_features;
1843 
1844 	dev_features = MLX5_CAP_DEV_VDPA_EMULATION(mvdev->mdev, device_features_bits_mask);
1845 	ndev->mvdev.mlx_features |= mlx_to_vritio_features(dev_features);
1846 	if (MLX5_CAP_DEV_VDPA_EMULATION(mvdev->mdev, virtio_version_1_0))
1847 		ndev->mvdev.mlx_features |= BIT_ULL(VIRTIO_F_VERSION_1);
1848 	ndev->mvdev.mlx_features |= BIT_ULL(VIRTIO_F_ACCESS_PLATFORM);
1849 	ndev->mvdev.mlx_features |= BIT_ULL(VIRTIO_NET_F_CTRL_VQ);
1850 	ndev->mvdev.mlx_features |= BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR);
1851 	ndev->mvdev.mlx_features |= BIT_ULL(VIRTIO_NET_F_MQ);
1852 
1853 	print_features(mvdev, ndev->mvdev.mlx_features, false);
1854 	return ndev->mvdev.mlx_features;
1855 }
1856 
1857 static int verify_min_features(struct mlx5_vdpa_dev *mvdev, u64 features)
1858 {
1859 	if (!(features & BIT_ULL(VIRTIO_F_ACCESS_PLATFORM)))
1860 		return -EOPNOTSUPP;
1861 
1862 	return 0;
1863 }
1864 
1865 static int setup_virtqueues(struct mlx5_vdpa_dev *mvdev)
1866 {
1867 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1868 	struct mlx5_control_vq *cvq = &mvdev->cvq;
1869 	int err;
1870 	int i;
1871 
1872 	for (i = 0; i < 2 * mlx5_vdpa_max_qps(mvdev->max_vqs); i++) {
1873 		err = setup_vq(ndev, &ndev->vqs[i]);
1874 		if (err)
1875 			goto err_vq;
1876 	}
1877 
1878 	if (mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)) {
1879 		err = vringh_init_iotlb(&cvq->vring, mvdev->actual_features,
1880 					MLX5_CVQ_MAX_ENT, false,
1881 					(struct vring_desc *)(uintptr_t)cvq->desc_addr,
1882 					(struct vring_avail *)(uintptr_t)cvq->driver_addr,
1883 					(struct vring_used *)(uintptr_t)cvq->device_addr);
1884 		if (err)
1885 			goto err_vq;
1886 	}
1887 
1888 	return 0;
1889 
1890 err_vq:
1891 	for (--i; i >= 0; i--)
1892 		teardown_vq(ndev, &ndev->vqs[i]);
1893 
1894 	return err;
1895 }
1896 
1897 static void teardown_virtqueues(struct mlx5_vdpa_net *ndev)
1898 {
1899 	struct mlx5_vdpa_virtqueue *mvq;
1900 	int i;
1901 
1902 	for (i = ndev->mvdev.max_vqs - 1; i >= 0; i--) {
1903 		mvq = &ndev->vqs[i];
1904 		if (!mvq->initialized)
1905 			continue;
1906 
1907 		teardown_vq(ndev, mvq);
1908 	}
1909 }
1910 
1911 static void update_cvq_info(struct mlx5_vdpa_dev *mvdev)
1912 {
1913 	if (MLX5_FEATURE(mvdev, VIRTIO_NET_F_CTRL_VQ)) {
1914 		if (MLX5_FEATURE(mvdev, VIRTIO_NET_F_MQ)) {
1915 			/* MQ supported. CVQ index is right above the last data virtqueue's */
1916 			mvdev->max_idx = mvdev->max_vqs;
1917 		} else {
1918 			/* Only CVQ supportted. data virtqueues occupy indices 0 and 1.
1919 			 * CVQ gets index 2
1920 			 */
1921 			mvdev->max_idx = 2;
1922 		}
1923 	} else {
1924 		/* Two data virtqueues only: one for rx and one for tx */
1925 		mvdev->max_idx = 1;
1926 	}
1927 }
1928 
1929 static int mlx5_vdpa_set_features(struct vdpa_device *vdev, u64 features)
1930 {
1931 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1932 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1933 	int err;
1934 
1935 	print_features(mvdev, features, true);
1936 
1937 	err = verify_min_features(mvdev, features);
1938 	if (err)
1939 		return err;
1940 
1941 	ndev->mvdev.actual_features = features & ndev->mvdev.mlx_features;
1942 	ndev->config.mtu = cpu_to_mlx5vdpa16(mvdev, ndev->mtu);
1943 	ndev->config.status |= cpu_to_mlx5vdpa16(mvdev, VIRTIO_NET_S_LINK_UP);
1944 	update_cvq_info(mvdev);
1945 	return err;
1946 }
1947 
1948 static void mlx5_vdpa_set_config_cb(struct vdpa_device *vdev, struct vdpa_callback *cb)
1949 {
1950 	/* not implemented */
1951 	mlx5_vdpa_warn(to_mvdev(vdev), "set config callback not supported\n");
1952 }
1953 
1954 #define MLX5_VDPA_MAX_VQ_ENTRIES 256
1955 static u16 mlx5_vdpa_get_vq_num_max(struct vdpa_device *vdev)
1956 {
1957 	return MLX5_VDPA_MAX_VQ_ENTRIES;
1958 }
1959 
1960 static u32 mlx5_vdpa_get_device_id(struct vdpa_device *vdev)
1961 {
1962 	return VIRTIO_ID_NET;
1963 }
1964 
1965 static u32 mlx5_vdpa_get_vendor_id(struct vdpa_device *vdev)
1966 {
1967 	return PCI_VENDOR_ID_MELLANOX;
1968 }
1969 
1970 static u8 mlx5_vdpa_get_status(struct vdpa_device *vdev)
1971 {
1972 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
1973 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1974 
1975 	print_status(mvdev, ndev->mvdev.status, false);
1976 	return ndev->mvdev.status;
1977 }
1978 
1979 static int save_channel_info(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1980 {
1981 	struct mlx5_vq_restore_info *ri = &mvq->ri;
1982 	struct mlx5_virtq_attr attr = {};
1983 	int err;
1984 
1985 	if (mvq->initialized) {
1986 		err = query_virtqueue(ndev, mvq, &attr);
1987 		if (err)
1988 			return err;
1989 	}
1990 
1991 	ri->avail_index = attr.available_index;
1992 	ri->used_index = attr.used_index;
1993 	ri->ready = mvq->ready;
1994 	ri->num_ent = mvq->num_ent;
1995 	ri->desc_addr = mvq->desc_addr;
1996 	ri->device_addr = mvq->device_addr;
1997 	ri->driver_addr = mvq->driver_addr;
1998 	ri->restore = true;
1999 	return 0;
2000 }
2001 
2002 static int save_channels_info(struct mlx5_vdpa_net *ndev)
2003 {
2004 	int i;
2005 
2006 	for (i = 0; i < ndev->mvdev.max_vqs; i++) {
2007 		memset(&ndev->vqs[i].ri, 0, sizeof(ndev->vqs[i].ri));
2008 		save_channel_info(ndev, &ndev->vqs[i]);
2009 	}
2010 	return 0;
2011 }
2012 
2013 static void mlx5_clear_vqs(struct mlx5_vdpa_net *ndev)
2014 {
2015 	int i;
2016 
2017 	for (i = 0; i < ndev->mvdev.max_vqs; i++)
2018 		memset(&ndev->vqs[i], 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
2019 }
2020 
2021 static void restore_channels_info(struct mlx5_vdpa_net *ndev)
2022 {
2023 	struct mlx5_vdpa_virtqueue *mvq;
2024 	struct mlx5_vq_restore_info *ri;
2025 	int i;
2026 
2027 	mlx5_clear_vqs(ndev);
2028 	init_mvqs(ndev);
2029 	for (i = 0; i < ndev->mvdev.max_vqs; i++) {
2030 		mvq = &ndev->vqs[i];
2031 		ri = &mvq->ri;
2032 		if (!ri->restore)
2033 			continue;
2034 
2035 		mvq->avail_idx = ri->avail_index;
2036 		mvq->used_idx = ri->used_index;
2037 		mvq->ready = ri->ready;
2038 		mvq->num_ent = ri->num_ent;
2039 		mvq->desc_addr = ri->desc_addr;
2040 		mvq->device_addr = ri->device_addr;
2041 		mvq->driver_addr = ri->driver_addr;
2042 	}
2043 }
2044 
2045 static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb)
2046 {
2047 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2048 	int err;
2049 
2050 	suspend_vqs(ndev);
2051 	err = save_channels_info(ndev);
2052 	if (err)
2053 		goto err_mr;
2054 
2055 	teardown_driver(ndev);
2056 	mlx5_vdpa_destroy_mr(mvdev);
2057 	err = mlx5_vdpa_create_mr(mvdev, iotlb);
2058 	if (err)
2059 		goto err_mr;
2060 
2061 	if (!(mvdev->status & VIRTIO_CONFIG_S_DRIVER_OK))
2062 		return 0;
2063 
2064 	restore_channels_info(ndev);
2065 	err = setup_driver(mvdev);
2066 	if (err)
2067 		goto err_setup;
2068 
2069 	return 0;
2070 
2071 err_setup:
2072 	mlx5_vdpa_destroy_mr(mvdev);
2073 err_mr:
2074 	return err;
2075 }
2076 
2077 static int setup_driver(struct mlx5_vdpa_dev *mvdev)
2078 {
2079 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2080 	int err;
2081 
2082 	mutex_lock(&ndev->reslock);
2083 	if (ndev->setup) {
2084 		mlx5_vdpa_warn(mvdev, "setup driver called for already setup driver\n");
2085 		err = 0;
2086 		goto out;
2087 	}
2088 	err = setup_virtqueues(mvdev);
2089 	if (err) {
2090 		mlx5_vdpa_warn(mvdev, "setup_virtqueues\n");
2091 		goto out;
2092 	}
2093 
2094 	err = create_rqt(ndev);
2095 	if (err) {
2096 		mlx5_vdpa_warn(mvdev, "create_rqt\n");
2097 		goto err_rqt;
2098 	}
2099 
2100 	err = create_tir(ndev);
2101 	if (err) {
2102 		mlx5_vdpa_warn(mvdev, "create_tir\n");
2103 		goto err_tir;
2104 	}
2105 
2106 	err = add_fwd_to_tir(ndev);
2107 	if (err) {
2108 		mlx5_vdpa_warn(mvdev, "add_fwd_to_tir\n");
2109 		goto err_fwd;
2110 	}
2111 	ndev->setup = true;
2112 	mutex_unlock(&ndev->reslock);
2113 
2114 	return 0;
2115 
2116 err_fwd:
2117 	destroy_tir(ndev);
2118 err_tir:
2119 	destroy_rqt(ndev);
2120 err_rqt:
2121 	teardown_virtqueues(ndev);
2122 out:
2123 	mutex_unlock(&ndev->reslock);
2124 	return err;
2125 }
2126 
2127 static void teardown_driver(struct mlx5_vdpa_net *ndev)
2128 {
2129 	mutex_lock(&ndev->reslock);
2130 	if (!ndev->setup)
2131 		goto out;
2132 
2133 	remove_fwd_to_tir(ndev);
2134 	destroy_tir(ndev);
2135 	destroy_rqt(ndev);
2136 	teardown_virtqueues(ndev);
2137 	ndev->setup = false;
2138 out:
2139 	mutex_unlock(&ndev->reslock);
2140 }
2141 
2142 static void clear_vqs_ready(struct mlx5_vdpa_net *ndev)
2143 {
2144 	int i;
2145 
2146 	for (i = 0; i < ndev->mvdev.max_vqs; i++)
2147 		ndev->vqs[i].ready = false;
2148 }
2149 
2150 static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status)
2151 {
2152 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2153 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2154 	int err;
2155 
2156 	print_status(mvdev, status, true);
2157 
2158 	if ((status ^ ndev->mvdev.status) & VIRTIO_CONFIG_S_DRIVER_OK) {
2159 		if (status & VIRTIO_CONFIG_S_DRIVER_OK) {
2160 			err = setup_driver(mvdev);
2161 			if (err) {
2162 				mlx5_vdpa_warn(mvdev, "failed to setup driver\n");
2163 				goto err_setup;
2164 			}
2165 		} else {
2166 			mlx5_vdpa_warn(mvdev, "did not expect DRIVER_OK to be cleared\n");
2167 			return;
2168 		}
2169 	}
2170 
2171 	ndev->mvdev.status = status;
2172 	return;
2173 
2174 err_setup:
2175 	mlx5_vdpa_destroy_mr(&ndev->mvdev);
2176 	ndev->mvdev.status |= VIRTIO_CONFIG_S_FAILED;
2177 }
2178 
2179 static int mlx5_vdpa_reset(struct vdpa_device *vdev)
2180 {
2181 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2182 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2183 
2184 	print_status(mvdev, 0, true);
2185 	mlx5_vdpa_info(mvdev, "performing device reset\n");
2186 	teardown_driver(ndev);
2187 	clear_vqs_ready(ndev);
2188 	mlx5_vdpa_destroy_mr(&ndev->mvdev);
2189 	ndev->mvdev.status = 0;
2190 	ndev->mvdev.mlx_features = 0;
2191 	memset(ndev->event_cbs, 0, sizeof(ndev->event_cbs));
2192 	ndev->mvdev.actual_features = 0;
2193 	++mvdev->generation;
2194 	if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) {
2195 		if (mlx5_vdpa_create_mr(mvdev, NULL))
2196 			mlx5_vdpa_warn(mvdev, "create MR failed\n");
2197 	}
2198 
2199 	return 0;
2200 }
2201 
2202 static size_t mlx5_vdpa_get_config_size(struct vdpa_device *vdev)
2203 {
2204 	return sizeof(struct virtio_net_config);
2205 }
2206 
2207 static void mlx5_vdpa_get_config(struct vdpa_device *vdev, unsigned int offset, void *buf,
2208 				 unsigned int len)
2209 {
2210 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2211 	struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2212 
2213 	if (offset + len <= sizeof(struct virtio_net_config))
2214 		memcpy(buf, (u8 *)&ndev->config + offset, len);
2215 }
2216 
2217 static void mlx5_vdpa_set_config(struct vdpa_device *vdev, unsigned int offset, const void *buf,
2218 				 unsigned int len)
2219 {
2220 	/* not supported */
2221 }
2222 
2223 static u32 mlx5_vdpa_get_generation(struct vdpa_device *vdev)
2224 {
2225 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2226 
2227 	return mvdev->generation;
2228 }
2229 
2230 static int mlx5_vdpa_set_map(struct vdpa_device *vdev, struct vhost_iotlb *iotlb)
2231 {
2232 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2233 	bool change_map;
2234 	int err;
2235 
2236 	err = mlx5_vdpa_handle_set_map(mvdev, iotlb, &change_map);
2237 	if (err) {
2238 		mlx5_vdpa_warn(mvdev, "set map failed(%d)\n", err);
2239 		return err;
2240 	}
2241 
2242 	if (change_map)
2243 		return mlx5_vdpa_change_map(mvdev, iotlb);
2244 
2245 	return 0;
2246 }
2247 
2248 static void mlx5_vdpa_free(struct vdpa_device *vdev)
2249 {
2250 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2251 	struct mlx5_core_dev *pfmdev;
2252 	struct mlx5_vdpa_net *ndev;
2253 
2254 	ndev = to_mlx5_vdpa_ndev(mvdev);
2255 
2256 	free_resources(ndev);
2257 	mlx5_vdpa_destroy_mr(mvdev);
2258 	if (!is_zero_ether_addr(ndev->config.mac)) {
2259 		pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev));
2260 		mlx5_mpfs_del_mac(pfmdev, ndev->config.mac);
2261 	}
2262 	mlx5_vdpa_free_resources(&ndev->mvdev);
2263 	mutex_destroy(&ndev->reslock);
2264 }
2265 
2266 static struct vdpa_notification_area mlx5_get_vq_notification(struct vdpa_device *vdev, u16 idx)
2267 {
2268 	struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2269 	struct vdpa_notification_area ret = {};
2270 	struct mlx5_vdpa_net *ndev;
2271 	phys_addr_t addr;
2272 
2273 	if (!is_index_valid(mvdev, idx) || is_ctrl_vq_idx(mvdev, idx))
2274 		return ret;
2275 
2276 	/* If SF BAR size is smaller than PAGE_SIZE, do not use direct
2277 	 * notification to avoid the risk of mapping pages that contain BAR of more
2278 	 * than one SF
2279 	 */
2280 	if (MLX5_CAP_GEN(mvdev->mdev, log_min_sf_size) + 12 < PAGE_SHIFT)
2281 		return ret;
2282 
2283 	ndev = to_mlx5_vdpa_ndev(mvdev);
2284 	addr = (phys_addr_t)ndev->mvdev.res.phys_kick_addr;
2285 	ret.addr = addr;
2286 	ret.size = PAGE_SIZE;
2287 	return ret;
2288 }
2289 
2290 static int mlx5_get_vq_irq(struct vdpa_device *vdv, u16 idx)
2291 {
2292 	return -EOPNOTSUPP;
2293 }
2294 
2295 static const struct vdpa_config_ops mlx5_vdpa_ops = {
2296 	.set_vq_address = mlx5_vdpa_set_vq_address,
2297 	.set_vq_num = mlx5_vdpa_set_vq_num,
2298 	.kick_vq = mlx5_vdpa_kick_vq,
2299 	.set_vq_cb = mlx5_vdpa_set_vq_cb,
2300 	.set_vq_ready = mlx5_vdpa_set_vq_ready,
2301 	.get_vq_ready = mlx5_vdpa_get_vq_ready,
2302 	.set_vq_state = mlx5_vdpa_set_vq_state,
2303 	.get_vq_state = mlx5_vdpa_get_vq_state,
2304 	.get_vq_notification = mlx5_get_vq_notification,
2305 	.get_vq_irq = mlx5_get_vq_irq,
2306 	.get_vq_align = mlx5_vdpa_get_vq_align,
2307 	.get_features = mlx5_vdpa_get_features,
2308 	.set_features = mlx5_vdpa_set_features,
2309 	.set_config_cb = mlx5_vdpa_set_config_cb,
2310 	.get_vq_num_max = mlx5_vdpa_get_vq_num_max,
2311 	.get_device_id = mlx5_vdpa_get_device_id,
2312 	.get_vendor_id = mlx5_vdpa_get_vendor_id,
2313 	.get_status = mlx5_vdpa_get_status,
2314 	.set_status = mlx5_vdpa_set_status,
2315 	.reset = mlx5_vdpa_reset,
2316 	.get_config_size = mlx5_vdpa_get_config_size,
2317 	.get_config = mlx5_vdpa_get_config,
2318 	.set_config = mlx5_vdpa_set_config,
2319 	.get_generation = mlx5_vdpa_get_generation,
2320 	.set_map = mlx5_vdpa_set_map,
2321 	.free = mlx5_vdpa_free,
2322 };
2323 
2324 static int query_mtu(struct mlx5_core_dev *mdev, u16 *mtu)
2325 {
2326 	u16 hw_mtu;
2327 	int err;
2328 
2329 	err = mlx5_query_nic_vport_mtu(mdev, &hw_mtu);
2330 	if (err)
2331 		return err;
2332 
2333 	*mtu = hw_mtu - MLX5V_ETH_HARD_MTU;
2334 	return 0;
2335 }
2336 
2337 static int alloc_resources(struct mlx5_vdpa_net *ndev)
2338 {
2339 	struct mlx5_vdpa_net_resources *res = &ndev->res;
2340 	int err;
2341 
2342 	if (res->valid) {
2343 		mlx5_vdpa_warn(&ndev->mvdev, "resources already allocated\n");
2344 		return -EEXIST;
2345 	}
2346 
2347 	err = mlx5_vdpa_alloc_transport_domain(&ndev->mvdev, &res->tdn);
2348 	if (err)
2349 		return err;
2350 
2351 	err = create_tis(ndev);
2352 	if (err)
2353 		goto err_tis;
2354 
2355 	res->valid = true;
2356 
2357 	return 0;
2358 
2359 err_tis:
2360 	mlx5_vdpa_dealloc_transport_domain(&ndev->mvdev, res->tdn);
2361 	return err;
2362 }
2363 
2364 static void free_resources(struct mlx5_vdpa_net *ndev)
2365 {
2366 	struct mlx5_vdpa_net_resources *res = &ndev->res;
2367 
2368 	if (!res->valid)
2369 		return;
2370 
2371 	destroy_tis(ndev);
2372 	mlx5_vdpa_dealloc_transport_domain(&ndev->mvdev, res->tdn);
2373 	res->valid = false;
2374 }
2375 
2376 static void init_mvqs(struct mlx5_vdpa_net *ndev)
2377 {
2378 	struct mlx5_vdpa_virtqueue *mvq;
2379 	int i;
2380 
2381 	for (i = 0; i < 2 * mlx5_vdpa_max_qps(ndev->mvdev.max_vqs); ++i) {
2382 		mvq = &ndev->vqs[i];
2383 		memset(mvq, 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
2384 		mvq->index = i;
2385 		mvq->ndev = ndev;
2386 		mvq->fwqp.fw = true;
2387 	}
2388 	for (; i < ndev->mvdev.max_vqs; i++) {
2389 		mvq = &ndev->vqs[i];
2390 		memset(mvq, 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
2391 		mvq->index = i;
2392 		mvq->ndev = ndev;
2393 	}
2394 }
2395 
2396 struct mlx5_vdpa_mgmtdev {
2397 	struct vdpa_mgmt_dev mgtdev;
2398 	struct mlx5_adev *madev;
2399 	struct mlx5_vdpa_net *ndev;
2400 };
2401 
2402 static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name)
2403 {
2404 	struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
2405 	struct virtio_net_config *config;
2406 	struct mlx5_core_dev *pfmdev;
2407 	struct mlx5_vdpa_dev *mvdev;
2408 	struct mlx5_vdpa_net *ndev;
2409 	struct mlx5_core_dev *mdev;
2410 	u32 max_vqs;
2411 	int err;
2412 
2413 	if (mgtdev->ndev)
2414 		return -ENOSPC;
2415 
2416 	mdev = mgtdev->madev->mdev;
2417 	if (!(MLX5_CAP_DEV_VDPA_EMULATION(mdev, virtio_queue_type) &
2418 	    MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT)) {
2419 		dev_warn(mdev->device, "missing support for split virtqueues\n");
2420 		return -EOPNOTSUPP;
2421 	}
2422 
2423 	/* we save one virtqueue for control virtqueue should we require it */
2424 	max_vqs = MLX5_CAP_DEV_VDPA_EMULATION(mdev, max_num_virtio_queues);
2425 	max_vqs = min_t(u32, max_vqs, MLX5_MAX_SUPPORTED_VQS);
2426 
2427 	ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops,
2428 				 name, false);
2429 	if (IS_ERR(ndev))
2430 		return PTR_ERR(ndev);
2431 
2432 	ndev->mvdev.max_vqs = max_vqs;
2433 	mvdev = &ndev->mvdev;
2434 	mvdev->mdev = mdev;
2435 	init_mvqs(ndev);
2436 	mutex_init(&ndev->reslock);
2437 	config = &ndev->config;
2438 	err = query_mtu(mdev, &ndev->mtu);
2439 	if (err)
2440 		goto err_mtu;
2441 
2442 	err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config->mac);
2443 	if (err)
2444 		goto err_mtu;
2445 
2446 	if (!is_zero_ether_addr(config->mac)) {
2447 		pfmdev = pci_get_drvdata(pci_physfn(mdev->pdev));
2448 		err = mlx5_mpfs_add_mac(pfmdev, config->mac);
2449 		if (err)
2450 			goto err_mtu;
2451 
2452 		ndev->mvdev.mlx_features |= BIT_ULL(VIRTIO_NET_F_MAC);
2453 	}
2454 
2455 	config->max_virtqueue_pairs = cpu_to_mlx5vdpa16(mvdev, mlx5_vdpa_max_qps(max_vqs));
2456 	mvdev->vdev.dma_dev = &mdev->pdev->dev;
2457 	err = mlx5_vdpa_alloc_resources(&ndev->mvdev);
2458 	if (err)
2459 		goto err_mpfs;
2460 
2461 	if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) {
2462 		err = mlx5_vdpa_create_mr(mvdev, NULL);
2463 		if (err)
2464 			goto err_res;
2465 	}
2466 
2467 	err = alloc_resources(ndev);
2468 	if (err)
2469 		goto err_mr;
2470 
2471 	mvdev->wq = create_singlethread_workqueue("mlx5_vdpa_ctrl_wq");
2472 	if (!mvdev->wq) {
2473 		err = -ENOMEM;
2474 		goto err_res2;
2475 	}
2476 
2477 	ndev->cur_num_vqs = 2 * mlx5_vdpa_max_qps(max_vqs);
2478 	mvdev->vdev.mdev = &mgtdev->mgtdev;
2479 	err = _vdpa_register_device(&mvdev->vdev, ndev->cur_num_vqs + 1);
2480 	if (err)
2481 		goto err_reg;
2482 
2483 	mgtdev->ndev = ndev;
2484 	return 0;
2485 
2486 err_reg:
2487 	destroy_workqueue(mvdev->wq);
2488 err_res2:
2489 	free_resources(ndev);
2490 err_mr:
2491 	mlx5_vdpa_destroy_mr(mvdev);
2492 err_res:
2493 	mlx5_vdpa_free_resources(&ndev->mvdev);
2494 err_mpfs:
2495 	if (!is_zero_ether_addr(config->mac))
2496 		mlx5_mpfs_del_mac(pfmdev, config->mac);
2497 err_mtu:
2498 	mutex_destroy(&ndev->reslock);
2499 	put_device(&mvdev->vdev.dev);
2500 	return err;
2501 }
2502 
2503 static void mlx5_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev, struct vdpa_device *dev)
2504 {
2505 	struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
2506 	struct mlx5_vdpa_dev *mvdev = to_mvdev(dev);
2507 
2508 	destroy_workqueue(mvdev->wq);
2509 	_vdpa_unregister_device(dev);
2510 	mgtdev->ndev = NULL;
2511 }
2512 
2513 static const struct vdpa_mgmtdev_ops mdev_ops = {
2514 	.dev_add = mlx5_vdpa_dev_add,
2515 	.dev_del = mlx5_vdpa_dev_del,
2516 };
2517 
2518 static struct virtio_device_id id_table[] = {
2519 	{ VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
2520 	{ 0 },
2521 };
2522 
2523 static int mlx5v_probe(struct auxiliary_device *adev,
2524 		       const struct auxiliary_device_id *id)
2525 
2526 {
2527 	struct mlx5_adev *madev = container_of(adev, struct mlx5_adev, adev);
2528 	struct mlx5_core_dev *mdev = madev->mdev;
2529 	struct mlx5_vdpa_mgmtdev *mgtdev;
2530 	int err;
2531 
2532 	mgtdev = kzalloc(sizeof(*mgtdev), GFP_KERNEL);
2533 	if (!mgtdev)
2534 		return -ENOMEM;
2535 
2536 	mgtdev->mgtdev.ops = &mdev_ops;
2537 	mgtdev->mgtdev.device = mdev->device;
2538 	mgtdev->mgtdev.id_table = id_table;
2539 	mgtdev->madev = madev;
2540 
2541 	err = vdpa_mgmtdev_register(&mgtdev->mgtdev);
2542 	if (err)
2543 		goto reg_err;
2544 
2545 	dev_set_drvdata(&adev->dev, mgtdev);
2546 
2547 	return 0;
2548 
2549 reg_err:
2550 	kfree(mgtdev);
2551 	return err;
2552 }
2553 
2554 static void mlx5v_remove(struct auxiliary_device *adev)
2555 {
2556 	struct mlx5_vdpa_mgmtdev *mgtdev;
2557 
2558 	mgtdev = dev_get_drvdata(&adev->dev);
2559 	vdpa_mgmtdev_unregister(&mgtdev->mgtdev);
2560 	kfree(mgtdev);
2561 }
2562 
2563 static const struct auxiliary_device_id mlx5v_id_table[] = {
2564 	{ .name = MLX5_ADEV_NAME ".vnet", },
2565 	{},
2566 };
2567 
2568 MODULE_DEVICE_TABLE(auxiliary, mlx5v_id_table);
2569 
2570 static struct auxiliary_driver mlx5v_driver = {
2571 	.name = "vnet",
2572 	.probe = mlx5v_probe,
2573 	.remove = mlx5v_remove,
2574 	.id_table = mlx5v_id_table,
2575 };
2576 
2577 module_auxiliary_driver(mlx5v_driver);
2578