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