Merge tag 'powerpc-6.6-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[platform/kernel/linux-starfive.git] / drivers / vdpa / mlx5 / net / mlx5_vnet.c
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 <uapi/linux/vdpa.h>
10 #include <linux/virtio_config.h>
11 #include <linux/auxiliary_bus.h>
12 #include <linux/mlx5/cq.h>
13 #include <linux/mlx5/qp.h>
14 #include <linux/mlx5/device.h>
15 #include <linux/mlx5/driver.h>
16 #include <linux/mlx5/vport.h>
17 #include <linux/mlx5/fs.h>
18 #include <linux/mlx5/mlx5_ifc_vdpa.h>
19 #include <linux/mlx5/mpfs.h>
20 #include "mlx5_vdpa.h"
21 #include "mlx5_vnet.h"
22
23 MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>");
24 MODULE_DESCRIPTION("Mellanox VDPA driver");
25 MODULE_LICENSE("Dual BSD/GPL");
26
27 #define VALID_FEATURES_MASK                                                                        \
28         (BIT_ULL(VIRTIO_NET_F_CSUM) | BIT_ULL(VIRTIO_NET_F_GUEST_CSUM) |                                   \
29          BIT_ULL(VIRTIO_NET_F_CTRL_GUEST_OFFLOADS) | BIT_ULL(VIRTIO_NET_F_MTU) | BIT_ULL(VIRTIO_NET_F_MAC) |   \
30          BIT_ULL(VIRTIO_NET_F_GUEST_TSO4) | BIT_ULL(VIRTIO_NET_F_GUEST_TSO6) |                             \
31          BIT_ULL(VIRTIO_NET_F_GUEST_ECN) | BIT_ULL(VIRTIO_NET_F_GUEST_UFO) | BIT_ULL(VIRTIO_NET_F_HOST_TSO4) | \
32          BIT_ULL(VIRTIO_NET_F_HOST_TSO6) | BIT_ULL(VIRTIO_NET_F_HOST_ECN) | BIT_ULL(VIRTIO_NET_F_HOST_UFO) |   \
33          BIT_ULL(VIRTIO_NET_F_MRG_RXBUF) | BIT_ULL(VIRTIO_NET_F_STATUS) | BIT_ULL(VIRTIO_NET_F_CTRL_VQ) |      \
34          BIT_ULL(VIRTIO_NET_F_CTRL_RX) | BIT_ULL(VIRTIO_NET_F_CTRL_VLAN) |                                 \
35          BIT_ULL(VIRTIO_NET_F_CTRL_RX_EXTRA) | BIT_ULL(VIRTIO_NET_F_GUEST_ANNOUNCE) |                      \
36          BIT_ULL(VIRTIO_NET_F_MQ) | BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR) | BIT_ULL(VIRTIO_NET_F_HASH_REPORT) |  \
37          BIT_ULL(VIRTIO_NET_F_RSS) | BIT_ULL(VIRTIO_NET_F_RSC_EXT) | BIT_ULL(VIRTIO_NET_F_STANDBY) |           \
38          BIT_ULL(VIRTIO_NET_F_SPEED_DUPLEX) | BIT_ULL(VIRTIO_F_NOTIFY_ON_EMPTY) |                          \
39          BIT_ULL(VIRTIO_F_ANY_LAYOUT) | BIT_ULL(VIRTIO_F_VERSION_1) | BIT_ULL(VIRTIO_F_ACCESS_PLATFORM) |      \
40          BIT_ULL(VIRTIO_F_RING_PACKED) | BIT_ULL(VIRTIO_F_ORDER_PLATFORM) | BIT_ULL(VIRTIO_F_SR_IOV))
41
42 #define VALID_STATUS_MASK                                                                          \
43         (VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK |        \
44          VIRTIO_CONFIG_S_FEATURES_OK | VIRTIO_CONFIG_S_NEEDS_RESET | VIRTIO_CONFIG_S_FAILED)
45
46 #define MLX5_FEATURE(_mvdev, _feature) (!!((_mvdev)->actual_features & BIT_ULL(_feature)))
47
48 #define MLX5V_UNTAGGED 0x1000
49
50 struct mlx5_vdpa_cq_buf {
51         struct mlx5_frag_buf_ctrl fbc;
52         struct mlx5_frag_buf frag_buf;
53         int cqe_size;
54         int nent;
55 };
56
57 struct mlx5_vdpa_cq {
58         struct mlx5_core_cq mcq;
59         struct mlx5_vdpa_cq_buf buf;
60         struct mlx5_db db;
61         int cqe;
62 };
63
64 struct mlx5_vdpa_umem {
65         struct mlx5_frag_buf_ctrl fbc;
66         struct mlx5_frag_buf frag_buf;
67         int size;
68         u32 id;
69 };
70
71 struct mlx5_vdpa_qp {
72         struct mlx5_core_qp mqp;
73         struct mlx5_frag_buf frag_buf;
74         struct mlx5_db db;
75         u16 head;
76         bool fw;
77 };
78
79 struct mlx5_vq_restore_info {
80         u32 num_ent;
81         u64 desc_addr;
82         u64 device_addr;
83         u64 driver_addr;
84         u16 avail_index;
85         u16 used_index;
86         struct msi_map map;
87         bool ready;
88         bool restore;
89 };
90
91 struct mlx5_vdpa_virtqueue {
92         bool ready;
93         u64 desc_addr;
94         u64 device_addr;
95         u64 driver_addr;
96         u32 num_ent;
97
98         /* Resources for implementing the notification channel from the device
99          * to the driver. fwqp is the firmware end of an RC connection; the
100          * other end is vqqp used by the driver. cq is where completions are
101          * reported.
102          */
103         struct mlx5_vdpa_cq cq;
104         struct mlx5_vdpa_qp fwqp;
105         struct mlx5_vdpa_qp vqqp;
106
107         /* umem resources are required for the virtqueue operation. They're use
108          * is internal and they must be provided by the driver.
109          */
110         struct mlx5_vdpa_umem umem1;
111         struct mlx5_vdpa_umem umem2;
112         struct mlx5_vdpa_umem umem3;
113
114         u32 counter_set_id;
115         bool initialized;
116         int index;
117         u32 virtq_id;
118         struct mlx5_vdpa_net *ndev;
119         u16 avail_idx;
120         u16 used_idx;
121         int fw_state;
122         struct msi_map map;
123
124         /* keep last in the struct */
125         struct mlx5_vq_restore_info ri;
126 };
127
128 static bool is_index_valid(struct mlx5_vdpa_dev *mvdev, u16 idx)
129 {
130         if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_MQ))) {
131                 if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
132                         return idx < 2;
133                 else
134                         return idx < 3;
135         }
136
137         return idx <= mvdev->max_idx;
138 }
139
140 static void free_resources(struct mlx5_vdpa_net *ndev);
141 static void init_mvqs(struct mlx5_vdpa_net *ndev);
142 static int setup_driver(struct mlx5_vdpa_dev *mvdev);
143 static void teardown_driver(struct mlx5_vdpa_net *ndev);
144
145 static bool mlx5_vdpa_debug;
146
147 #define MLX5_CVQ_MAX_ENT 16
148
149 #define MLX5_LOG_VIO_FLAG(_feature)                                                                \
150         do {                                                                                       \
151                 if (features & BIT_ULL(_feature))                                                  \
152                         mlx5_vdpa_info(mvdev, "%s\n", #_feature);                                  \
153         } while (0)
154
155 #define MLX5_LOG_VIO_STAT(_status)                                                                 \
156         do {                                                                                       \
157                 if (status & (_status))                                                            \
158                         mlx5_vdpa_info(mvdev, "%s\n", #_status);                                   \
159         } while (0)
160
161 /* TODO: cross-endian support */
162 static inline bool mlx5_vdpa_is_little_endian(struct mlx5_vdpa_dev *mvdev)
163 {
164         return virtio_legacy_is_little_endian() ||
165                 (mvdev->actual_features & BIT_ULL(VIRTIO_F_VERSION_1));
166 }
167
168 static u16 mlx5vdpa16_to_cpu(struct mlx5_vdpa_dev *mvdev, __virtio16 val)
169 {
170         return __virtio16_to_cpu(mlx5_vdpa_is_little_endian(mvdev), val);
171 }
172
173 static __virtio16 cpu_to_mlx5vdpa16(struct mlx5_vdpa_dev *mvdev, u16 val)
174 {
175         return __cpu_to_virtio16(mlx5_vdpa_is_little_endian(mvdev), val);
176 }
177
178 static u16 ctrl_vq_idx(struct mlx5_vdpa_dev *mvdev)
179 {
180         if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_MQ)))
181                 return 2;
182
183         return mvdev->max_vqs;
184 }
185
186 static bool is_ctrl_vq_idx(struct mlx5_vdpa_dev *mvdev, u16 idx)
187 {
188         return idx == ctrl_vq_idx(mvdev);
189 }
190
191 static void print_status(struct mlx5_vdpa_dev *mvdev, u8 status, bool set)
192 {
193         if (status & ~VALID_STATUS_MASK)
194                 mlx5_vdpa_warn(mvdev, "Warning: there are invalid status bits 0x%x\n",
195                                status & ~VALID_STATUS_MASK);
196
197         if (!mlx5_vdpa_debug)
198                 return;
199
200         mlx5_vdpa_info(mvdev, "driver status %s", set ? "set" : "get");
201         if (set && !status) {
202                 mlx5_vdpa_info(mvdev, "driver resets the device\n");
203                 return;
204         }
205
206         MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_ACKNOWLEDGE);
207         MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_DRIVER);
208         MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_DRIVER_OK);
209         MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_FEATURES_OK);
210         MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_NEEDS_RESET);
211         MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_FAILED);
212 }
213
214 static void print_features(struct mlx5_vdpa_dev *mvdev, u64 features, bool set)
215 {
216         if (features & ~VALID_FEATURES_MASK)
217                 mlx5_vdpa_warn(mvdev, "There are invalid feature bits 0x%llx\n",
218                                features & ~VALID_FEATURES_MASK);
219
220         if (!mlx5_vdpa_debug)
221                 return;
222
223         mlx5_vdpa_info(mvdev, "driver %s feature bits:\n", set ? "sets" : "reads");
224         if (!features)
225                 mlx5_vdpa_info(mvdev, "all feature bits are cleared\n");
226
227         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CSUM);
228         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_CSUM);
229         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_GUEST_OFFLOADS);
230         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MTU);
231         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MAC);
232         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_TSO4);
233         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_TSO6);
234         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_ECN);
235         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_UFO);
236         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_TSO4);
237         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_TSO6);
238         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_ECN);
239         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_UFO);
240         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MRG_RXBUF);
241         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_STATUS);
242         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_VQ);
243         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_RX);
244         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_VLAN);
245         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_RX_EXTRA);
246         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_ANNOUNCE);
247         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MQ);
248         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_MAC_ADDR);
249         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HASH_REPORT);
250         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_RSS);
251         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_RSC_EXT);
252         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_STANDBY);
253         MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_SPEED_DUPLEX);
254         MLX5_LOG_VIO_FLAG(VIRTIO_F_NOTIFY_ON_EMPTY);
255         MLX5_LOG_VIO_FLAG(VIRTIO_F_ANY_LAYOUT);
256         MLX5_LOG_VIO_FLAG(VIRTIO_F_VERSION_1);
257         MLX5_LOG_VIO_FLAG(VIRTIO_F_ACCESS_PLATFORM);
258         MLX5_LOG_VIO_FLAG(VIRTIO_F_RING_PACKED);
259         MLX5_LOG_VIO_FLAG(VIRTIO_F_ORDER_PLATFORM);
260         MLX5_LOG_VIO_FLAG(VIRTIO_F_SR_IOV);
261 }
262
263 static int create_tis(struct mlx5_vdpa_net *ndev)
264 {
265         struct mlx5_vdpa_dev *mvdev = &ndev->mvdev;
266         u32 in[MLX5_ST_SZ_DW(create_tis_in)] = {};
267         void *tisc;
268         int err;
269
270         tisc = MLX5_ADDR_OF(create_tis_in, in, ctx);
271         MLX5_SET(tisc, tisc, transport_domain, ndev->res.tdn);
272         err = mlx5_vdpa_create_tis(mvdev, in, &ndev->res.tisn);
273         if (err)
274                 mlx5_vdpa_warn(mvdev, "create TIS (%d)\n", err);
275
276         return err;
277 }
278
279 static void destroy_tis(struct mlx5_vdpa_net *ndev)
280 {
281         mlx5_vdpa_destroy_tis(&ndev->mvdev, ndev->res.tisn);
282 }
283
284 #define MLX5_VDPA_CQE_SIZE 64
285 #define MLX5_VDPA_LOG_CQE_SIZE ilog2(MLX5_VDPA_CQE_SIZE)
286
287 static int cq_frag_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_cq_buf *buf, int nent)
288 {
289         struct mlx5_frag_buf *frag_buf = &buf->frag_buf;
290         u8 log_wq_stride = MLX5_VDPA_LOG_CQE_SIZE;
291         u8 log_wq_sz = MLX5_VDPA_LOG_CQE_SIZE;
292         int err;
293
294         err = mlx5_frag_buf_alloc_node(ndev->mvdev.mdev, nent * MLX5_VDPA_CQE_SIZE, frag_buf,
295                                        ndev->mvdev.mdev->priv.numa_node);
296         if (err)
297                 return err;
298
299         mlx5_init_fbc(frag_buf->frags, log_wq_stride, log_wq_sz, &buf->fbc);
300
301         buf->cqe_size = MLX5_VDPA_CQE_SIZE;
302         buf->nent = nent;
303
304         return 0;
305 }
306
307 static int umem_frag_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_umem *umem, int size)
308 {
309         struct mlx5_frag_buf *frag_buf = &umem->frag_buf;
310
311         return mlx5_frag_buf_alloc_node(ndev->mvdev.mdev, size, frag_buf,
312                                         ndev->mvdev.mdev->priv.numa_node);
313 }
314
315 static void cq_frag_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_cq_buf *buf)
316 {
317         mlx5_frag_buf_free(ndev->mvdev.mdev, &buf->frag_buf);
318 }
319
320 static void *get_cqe(struct mlx5_vdpa_cq *vcq, int n)
321 {
322         return mlx5_frag_buf_get_wqe(&vcq->buf.fbc, n);
323 }
324
325 static void cq_frag_buf_init(struct mlx5_vdpa_cq *vcq, struct mlx5_vdpa_cq_buf *buf)
326 {
327         struct mlx5_cqe64 *cqe64;
328         void *cqe;
329         int i;
330
331         for (i = 0; i < buf->nent; i++) {
332                 cqe = get_cqe(vcq, i);
333                 cqe64 = cqe;
334                 cqe64->op_own = MLX5_CQE_INVALID << 4;
335         }
336 }
337
338 static void *get_sw_cqe(struct mlx5_vdpa_cq *cq, int n)
339 {
340         struct mlx5_cqe64 *cqe64 = get_cqe(cq, n & (cq->cqe - 1));
341
342         if (likely(get_cqe_opcode(cqe64) != MLX5_CQE_INVALID) &&
343             !((cqe64->op_own & MLX5_CQE_OWNER_MASK) ^ !!(n & cq->cqe)))
344                 return cqe64;
345
346         return NULL;
347 }
348
349 static void rx_post(struct mlx5_vdpa_qp *vqp, int n)
350 {
351         vqp->head += n;
352         vqp->db.db[0] = cpu_to_be32(vqp->head);
353 }
354
355 static void qp_prepare(struct mlx5_vdpa_net *ndev, bool fw, void *in,
356                        struct mlx5_vdpa_virtqueue *mvq, u32 num_ent)
357 {
358         struct mlx5_vdpa_qp *vqp;
359         __be64 *pas;
360         void *qpc;
361
362         vqp = fw ? &mvq->fwqp : &mvq->vqqp;
363         MLX5_SET(create_qp_in, in, uid, ndev->mvdev.res.uid);
364         qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
365         if (vqp->fw) {
366                 /* Firmware QP is allocated by the driver for the firmware's
367                  * use so we can skip part of the params as they will be chosen by firmware
368                  */
369                 qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
370                 MLX5_SET(qpc, qpc, rq_type, MLX5_ZERO_LEN_RQ);
371                 MLX5_SET(qpc, qpc, no_sq, 1);
372                 return;
373         }
374
375         MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
376         MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
377         MLX5_SET(qpc, qpc, pd, ndev->mvdev.res.pdn);
378         MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
379         MLX5_SET(qpc, qpc, uar_page, ndev->mvdev.res.uar->index);
380         MLX5_SET(qpc, qpc, log_page_size, vqp->frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
381         MLX5_SET(qpc, qpc, no_sq, 1);
382         MLX5_SET(qpc, qpc, cqn_rcv, mvq->cq.mcq.cqn);
383         MLX5_SET(qpc, qpc, log_rq_size, ilog2(num_ent));
384         MLX5_SET(qpc, qpc, rq_type, MLX5_NON_ZERO_RQ);
385         pas = (__be64 *)MLX5_ADDR_OF(create_qp_in, in, pas);
386         mlx5_fill_page_frag_array(&vqp->frag_buf, pas);
387 }
388
389 static int rq_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp, u32 num_ent)
390 {
391         return mlx5_frag_buf_alloc_node(ndev->mvdev.mdev,
392                                         num_ent * sizeof(struct mlx5_wqe_data_seg), &vqp->frag_buf,
393                                         ndev->mvdev.mdev->priv.numa_node);
394 }
395
396 static void rq_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp)
397 {
398         mlx5_frag_buf_free(ndev->mvdev.mdev, &vqp->frag_buf);
399 }
400
401 static int qp_create(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
402                      struct mlx5_vdpa_qp *vqp)
403 {
404         struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
405         int inlen = MLX5_ST_SZ_BYTES(create_qp_in);
406         u32 out[MLX5_ST_SZ_DW(create_qp_out)] = {};
407         void *qpc;
408         void *in;
409         int err;
410
411         if (!vqp->fw) {
412                 vqp = &mvq->vqqp;
413                 err = rq_buf_alloc(ndev, vqp, mvq->num_ent);
414                 if (err)
415                         return err;
416
417                 err = mlx5_db_alloc(ndev->mvdev.mdev, &vqp->db);
418                 if (err)
419                         goto err_db;
420                 inlen += vqp->frag_buf.npages * sizeof(__be64);
421         }
422
423         in = kzalloc(inlen, GFP_KERNEL);
424         if (!in) {
425                 err = -ENOMEM;
426                 goto err_kzalloc;
427         }
428
429         qp_prepare(ndev, vqp->fw, in, mvq, mvq->num_ent);
430         qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
431         MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
432         MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
433         MLX5_SET(qpc, qpc, pd, ndev->mvdev.res.pdn);
434         MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
435         if (!vqp->fw)
436                 MLX5_SET64(qpc, qpc, dbr_addr, vqp->db.dma);
437         MLX5_SET(create_qp_in, in, opcode, MLX5_CMD_OP_CREATE_QP);
438         err = mlx5_cmd_exec(mdev, in, inlen, out, sizeof(out));
439         kfree(in);
440         if (err)
441                 goto err_kzalloc;
442
443         vqp->mqp.uid = ndev->mvdev.res.uid;
444         vqp->mqp.qpn = MLX5_GET(create_qp_out, out, qpn);
445
446         if (!vqp->fw)
447                 rx_post(vqp, mvq->num_ent);
448
449         return 0;
450
451 err_kzalloc:
452         if (!vqp->fw)
453                 mlx5_db_free(ndev->mvdev.mdev, &vqp->db);
454 err_db:
455         if (!vqp->fw)
456                 rq_buf_free(ndev, vqp);
457
458         return err;
459 }
460
461 static void qp_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp)
462 {
463         u32 in[MLX5_ST_SZ_DW(destroy_qp_in)] = {};
464
465         MLX5_SET(destroy_qp_in, in, opcode, MLX5_CMD_OP_DESTROY_QP);
466         MLX5_SET(destroy_qp_in, in, qpn, vqp->mqp.qpn);
467         MLX5_SET(destroy_qp_in, in, uid, ndev->mvdev.res.uid);
468         if (mlx5_cmd_exec_in(ndev->mvdev.mdev, destroy_qp, in))
469                 mlx5_vdpa_warn(&ndev->mvdev, "destroy qp 0x%x\n", vqp->mqp.qpn);
470         if (!vqp->fw) {
471                 mlx5_db_free(ndev->mvdev.mdev, &vqp->db);
472                 rq_buf_free(ndev, vqp);
473         }
474 }
475
476 static void *next_cqe_sw(struct mlx5_vdpa_cq *cq)
477 {
478         return get_sw_cqe(cq, cq->mcq.cons_index);
479 }
480
481 static int mlx5_vdpa_poll_one(struct mlx5_vdpa_cq *vcq)
482 {
483         struct mlx5_cqe64 *cqe64;
484
485         cqe64 = next_cqe_sw(vcq);
486         if (!cqe64)
487                 return -EAGAIN;
488
489         vcq->mcq.cons_index++;
490         return 0;
491 }
492
493 static void mlx5_vdpa_handle_completions(struct mlx5_vdpa_virtqueue *mvq, int num)
494 {
495         struct mlx5_vdpa_net *ndev = mvq->ndev;
496         struct vdpa_callback *event_cb;
497
498         event_cb = &ndev->event_cbs[mvq->index];
499         mlx5_cq_set_ci(&mvq->cq.mcq);
500
501         /* make sure CQ cosumer update is visible to the hardware before updating
502          * RX doorbell record.
503          */
504         dma_wmb();
505         rx_post(&mvq->vqqp, num);
506         if (event_cb->callback)
507                 event_cb->callback(event_cb->private);
508 }
509
510 static void mlx5_vdpa_cq_comp(struct mlx5_core_cq *mcq, struct mlx5_eqe *eqe)
511 {
512         struct mlx5_vdpa_virtqueue *mvq = container_of(mcq, struct mlx5_vdpa_virtqueue, cq.mcq);
513         struct mlx5_vdpa_net *ndev = mvq->ndev;
514         void __iomem *uar_page = ndev->mvdev.res.uar->map;
515         int num = 0;
516
517         while (!mlx5_vdpa_poll_one(&mvq->cq)) {
518                 num++;
519                 if (num > mvq->num_ent / 2) {
520                         /* If completions keep coming while we poll, we want to
521                          * let the hardware know that we consumed them by
522                          * updating the doorbell record.  We also let vdpa core
523                          * know about this so it passes it on the virtio driver
524                          * on the guest.
525                          */
526                         mlx5_vdpa_handle_completions(mvq, num);
527                         num = 0;
528                 }
529         }
530
531         if (num)
532                 mlx5_vdpa_handle_completions(mvq, num);
533
534         mlx5_cq_arm(&mvq->cq.mcq, MLX5_CQ_DB_REQ_NOT, uar_page, mvq->cq.mcq.cons_index);
535 }
536
537 static int cq_create(struct mlx5_vdpa_net *ndev, u16 idx, u32 num_ent)
538 {
539         struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
540         struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
541         void __iomem *uar_page = ndev->mvdev.res.uar->map;
542         u32 out[MLX5_ST_SZ_DW(create_cq_out)];
543         struct mlx5_vdpa_cq *vcq = &mvq->cq;
544         __be64 *pas;
545         int inlen;
546         void *cqc;
547         void *in;
548         int err;
549         int eqn;
550
551         err = mlx5_db_alloc(mdev, &vcq->db);
552         if (err)
553                 return err;
554
555         vcq->mcq.set_ci_db = vcq->db.db;
556         vcq->mcq.arm_db = vcq->db.db + 1;
557         vcq->mcq.cqe_sz = 64;
558
559         err = cq_frag_buf_alloc(ndev, &vcq->buf, num_ent);
560         if (err)
561                 goto err_db;
562
563         cq_frag_buf_init(vcq, &vcq->buf);
564
565         inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
566                 MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) * vcq->buf.frag_buf.npages;
567         in = kzalloc(inlen, GFP_KERNEL);
568         if (!in) {
569                 err = -ENOMEM;
570                 goto err_vzalloc;
571         }
572
573         MLX5_SET(create_cq_in, in, uid, ndev->mvdev.res.uid);
574         pas = (__be64 *)MLX5_ADDR_OF(create_cq_in, in, pas);
575         mlx5_fill_page_frag_array(&vcq->buf.frag_buf, pas);
576
577         cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
578         MLX5_SET(cqc, cqc, log_page_size, vcq->buf.frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
579
580         /* Use vector 0 by default. Consider adding code to choose least used
581          * vector.
582          */
583         err = mlx5_comp_eqn_get(mdev, 0, &eqn);
584         if (err)
585                 goto err_vec;
586
587         cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
588         MLX5_SET(cqc, cqc, log_cq_size, ilog2(num_ent));
589         MLX5_SET(cqc, cqc, uar_page, ndev->mvdev.res.uar->index);
590         MLX5_SET(cqc, cqc, c_eqn_or_apu_element, eqn);
591         MLX5_SET64(cqc, cqc, dbr_addr, vcq->db.dma);
592
593         err = mlx5_core_create_cq(mdev, &vcq->mcq, in, inlen, out, sizeof(out));
594         if (err)
595                 goto err_vec;
596
597         vcq->mcq.comp = mlx5_vdpa_cq_comp;
598         vcq->cqe = num_ent;
599         vcq->mcq.set_ci_db = vcq->db.db;
600         vcq->mcq.arm_db = vcq->db.db + 1;
601         mlx5_cq_arm(&mvq->cq.mcq, MLX5_CQ_DB_REQ_NOT, uar_page, mvq->cq.mcq.cons_index);
602         kfree(in);
603         return 0;
604
605 err_vec:
606         kfree(in);
607 err_vzalloc:
608         cq_frag_buf_free(ndev, &vcq->buf);
609 err_db:
610         mlx5_db_free(ndev->mvdev.mdev, &vcq->db);
611         return err;
612 }
613
614 static void cq_destroy(struct mlx5_vdpa_net *ndev, u16 idx)
615 {
616         struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
617         struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
618         struct mlx5_vdpa_cq *vcq = &mvq->cq;
619
620         if (mlx5_core_destroy_cq(mdev, &vcq->mcq)) {
621                 mlx5_vdpa_warn(&ndev->mvdev, "destroy CQ 0x%x\n", vcq->mcq.cqn);
622                 return;
623         }
624         cq_frag_buf_free(ndev, &vcq->buf);
625         mlx5_db_free(ndev->mvdev.mdev, &vcq->db);
626 }
627
628 static int read_umem_params(struct mlx5_vdpa_net *ndev)
629 {
630         u32 in[MLX5_ST_SZ_DW(query_hca_cap_in)] = {};
631         u16 opmod = (MLX5_CAP_VDPA_EMULATION << 1) | (HCA_CAP_OPMOD_GET_CUR & 0x01);
632         struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
633         int out_size;
634         void *caps;
635         void *out;
636         int err;
637
638         out_size = MLX5_ST_SZ_BYTES(query_hca_cap_out);
639         out = kzalloc(out_size, GFP_KERNEL);
640         if (!out)
641                 return -ENOMEM;
642
643         MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
644         MLX5_SET(query_hca_cap_in, in, op_mod, opmod);
645         err = mlx5_cmd_exec_inout(mdev, query_hca_cap, in, out);
646         if (err) {
647                 mlx5_vdpa_warn(&ndev->mvdev,
648                         "Failed reading vdpa umem capabilities with err %d\n", err);
649                 goto out;
650         }
651
652         caps =  MLX5_ADDR_OF(query_hca_cap_out, out, capability);
653
654         ndev->umem_1_buffer_param_a = MLX5_GET(virtio_emulation_cap, caps, umem_1_buffer_param_a);
655         ndev->umem_1_buffer_param_b = MLX5_GET(virtio_emulation_cap, caps, umem_1_buffer_param_b);
656
657         ndev->umem_2_buffer_param_a = MLX5_GET(virtio_emulation_cap, caps, umem_2_buffer_param_a);
658         ndev->umem_2_buffer_param_b = MLX5_GET(virtio_emulation_cap, caps, umem_2_buffer_param_b);
659
660         ndev->umem_3_buffer_param_a = MLX5_GET(virtio_emulation_cap, caps, umem_3_buffer_param_a);
661         ndev->umem_3_buffer_param_b = MLX5_GET(virtio_emulation_cap, caps, umem_3_buffer_param_b);
662
663 out:
664         kfree(out);
665         return 0;
666 }
667
668 static void set_umem_size(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num,
669                           struct mlx5_vdpa_umem **umemp)
670 {
671         u32 p_a;
672         u32 p_b;
673
674         switch (num) {
675         case 1:
676                 p_a = ndev->umem_1_buffer_param_a;
677                 p_b = ndev->umem_1_buffer_param_b;
678                 *umemp = &mvq->umem1;
679                 break;
680         case 2:
681                 p_a = ndev->umem_2_buffer_param_a;
682                 p_b = ndev->umem_2_buffer_param_b;
683                 *umemp = &mvq->umem2;
684                 break;
685         case 3:
686                 p_a = ndev->umem_3_buffer_param_a;
687                 p_b = ndev->umem_3_buffer_param_b;
688                 *umemp = &mvq->umem3;
689                 break;
690         }
691
692         (*umemp)->size = p_a * mvq->num_ent + p_b;
693 }
694
695 static void umem_frag_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_umem *umem)
696 {
697         mlx5_frag_buf_free(ndev->mvdev.mdev, &umem->frag_buf);
698 }
699
700 static int create_umem(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num)
701 {
702         int inlen;
703         u32 out[MLX5_ST_SZ_DW(create_umem_out)] = {};
704         void *um;
705         void *in;
706         int err;
707         __be64 *pas;
708         struct mlx5_vdpa_umem *umem;
709
710         set_umem_size(ndev, mvq, num, &umem);
711         err = umem_frag_buf_alloc(ndev, umem, umem->size);
712         if (err)
713                 return err;
714
715         inlen = MLX5_ST_SZ_BYTES(create_umem_in) + MLX5_ST_SZ_BYTES(mtt) * umem->frag_buf.npages;
716
717         in = kzalloc(inlen, GFP_KERNEL);
718         if (!in) {
719                 err = -ENOMEM;
720                 goto err_in;
721         }
722
723         MLX5_SET(create_umem_in, in, opcode, MLX5_CMD_OP_CREATE_UMEM);
724         MLX5_SET(create_umem_in, in, uid, ndev->mvdev.res.uid);
725         um = MLX5_ADDR_OF(create_umem_in, in, umem);
726         MLX5_SET(umem, um, log_page_size, umem->frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
727         MLX5_SET64(umem, um, num_of_mtt, umem->frag_buf.npages);
728
729         pas = (__be64 *)MLX5_ADDR_OF(umem, um, mtt[0]);
730         mlx5_fill_page_frag_array_perm(&umem->frag_buf, pas, MLX5_MTT_PERM_RW);
731
732         err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
733         if (err) {
734                 mlx5_vdpa_warn(&ndev->mvdev, "create umem(%d)\n", err);
735                 goto err_cmd;
736         }
737
738         kfree(in);
739         umem->id = MLX5_GET(create_umem_out, out, umem_id);
740
741         return 0;
742
743 err_cmd:
744         kfree(in);
745 err_in:
746         umem_frag_buf_free(ndev, umem);
747         return err;
748 }
749
750 static void umem_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num)
751 {
752         u32 in[MLX5_ST_SZ_DW(destroy_umem_in)] = {};
753         u32 out[MLX5_ST_SZ_DW(destroy_umem_out)] = {};
754         struct mlx5_vdpa_umem *umem;
755
756         switch (num) {
757         case 1:
758                 umem = &mvq->umem1;
759                 break;
760         case 2:
761                 umem = &mvq->umem2;
762                 break;
763         case 3:
764                 umem = &mvq->umem3;
765                 break;
766         }
767
768         MLX5_SET(destroy_umem_in, in, opcode, MLX5_CMD_OP_DESTROY_UMEM);
769         MLX5_SET(destroy_umem_in, in, umem_id, umem->id);
770         if (mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out)))
771                 return;
772
773         umem_frag_buf_free(ndev, umem);
774 }
775
776 static int umems_create(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
777 {
778         int num;
779         int err;
780
781         for (num = 1; num <= 3; num++) {
782                 err = create_umem(ndev, mvq, num);
783                 if (err)
784                         goto err_umem;
785         }
786         return 0;
787
788 err_umem:
789         for (num--; num > 0; num--)
790                 umem_destroy(ndev, mvq, num);
791
792         return err;
793 }
794
795 static void umems_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
796 {
797         int num;
798
799         for (num = 3; num > 0; num--)
800                 umem_destroy(ndev, mvq, num);
801 }
802
803 static int get_queue_type(struct mlx5_vdpa_net *ndev)
804 {
805         u32 type_mask;
806
807         type_mask = MLX5_CAP_DEV_VDPA_EMULATION(ndev->mvdev.mdev, virtio_queue_type);
808
809         /* prefer split queue */
810         if (type_mask & MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT)
811                 return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT;
812
813         WARN_ON(!(type_mask & MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_PACKED));
814
815         return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED;
816 }
817
818 static bool vq_is_tx(u16 idx)
819 {
820         return idx % 2;
821 }
822
823 enum {
824         MLX5_VIRTIO_NET_F_MRG_RXBUF = 2,
825         MLX5_VIRTIO_NET_F_HOST_ECN = 4,
826         MLX5_VIRTIO_NET_F_GUEST_ECN = 6,
827         MLX5_VIRTIO_NET_F_GUEST_TSO6 = 7,
828         MLX5_VIRTIO_NET_F_GUEST_TSO4 = 8,
829         MLX5_VIRTIO_NET_F_GUEST_CSUM = 9,
830         MLX5_VIRTIO_NET_F_CSUM = 10,
831         MLX5_VIRTIO_NET_F_HOST_TSO6 = 11,
832         MLX5_VIRTIO_NET_F_HOST_TSO4 = 12,
833 };
834
835 static u16 get_features(u64 features)
836 {
837         return (!!(features & BIT_ULL(VIRTIO_NET_F_MRG_RXBUF)) << MLX5_VIRTIO_NET_F_MRG_RXBUF) |
838                (!!(features & BIT_ULL(VIRTIO_NET_F_HOST_ECN)) << MLX5_VIRTIO_NET_F_HOST_ECN) |
839                (!!(features & BIT_ULL(VIRTIO_NET_F_GUEST_ECN)) << MLX5_VIRTIO_NET_F_GUEST_ECN) |
840                (!!(features & BIT_ULL(VIRTIO_NET_F_GUEST_TSO6)) << MLX5_VIRTIO_NET_F_GUEST_TSO6) |
841                (!!(features & BIT_ULL(VIRTIO_NET_F_GUEST_TSO4)) << MLX5_VIRTIO_NET_F_GUEST_TSO4) |
842                (!!(features & BIT_ULL(VIRTIO_NET_F_CSUM)) << MLX5_VIRTIO_NET_F_CSUM) |
843                (!!(features & BIT_ULL(VIRTIO_NET_F_HOST_TSO6)) << MLX5_VIRTIO_NET_F_HOST_TSO6) |
844                (!!(features & BIT_ULL(VIRTIO_NET_F_HOST_TSO4)) << MLX5_VIRTIO_NET_F_HOST_TSO4);
845 }
846
847 static bool counters_supported(const struct mlx5_vdpa_dev *mvdev)
848 {
849         return MLX5_CAP_GEN_64(mvdev->mdev, general_obj_types) &
850                BIT_ULL(MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS);
851 }
852
853 static bool msix_mode_supported(struct mlx5_vdpa_dev *mvdev)
854 {
855         return MLX5_CAP_DEV_VDPA_EMULATION(mvdev->mdev, event_mode) &
856                 (1 << MLX5_VIRTIO_Q_EVENT_MODE_MSIX_MODE) &&
857                 pci_msix_can_alloc_dyn(mvdev->mdev->pdev);
858 }
859
860 static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
861 {
862         int inlen = MLX5_ST_SZ_BYTES(create_virtio_net_q_in);
863         u32 out[MLX5_ST_SZ_DW(create_virtio_net_q_out)] = {};
864         void *obj_context;
865         u16 mlx_features;
866         void *cmd_hdr;
867         void *vq_ctx;
868         void *in;
869         int err;
870
871         err = umems_create(ndev, mvq);
872         if (err)
873                 return err;
874
875         in = kzalloc(inlen, GFP_KERNEL);
876         if (!in) {
877                 err = -ENOMEM;
878                 goto err_alloc;
879         }
880
881         mlx_features = get_features(ndev->mvdev.actual_features);
882         cmd_hdr = MLX5_ADDR_OF(create_virtio_net_q_in, in, general_obj_in_cmd_hdr);
883
884         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
885         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
886         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
887
888         obj_context = MLX5_ADDR_OF(create_virtio_net_q_in, in, obj_context);
889         MLX5_SET(virtio_net_q_object, obj_context, hw_available_index, mvq->avail_idx);
890         MLX5_SET(virtio_net_q_object, obj_context, hw_used_index, mvq->used_idx);
891         MLX5_SET(virtio_net_q_object, obj_context, queue_feature_bit_mask_12_3,
892                  mlx_features >> 3);
893         MLX5_SET(virtio_net_q_object, obj_context, queue_feature_bit_mask_2_0,
894                  mlx_features & 7);
895         vq_ctx = MLX5_ADDR_OF(virtio_net_q_object, obj_context, virtio_q_context);
896         MLX5_SET(virtio_q, vq_ctx, virtio_q_type, get_queue_type(ndev));
897
898         if (vq_is_tx(mvq->index))
899                 MLX5_SET(virtio_net_q_object, obj_context, tisn_or_qpn, ndev->res.tisn);
900
901         if (mvq->map.virq) {
902                 MLX5_SET(virtio_q, vq_ctx, event_mode, MLX5_VIRTIO_Q_EVENT_MODE_MSIX_MODE);
903                 MLX5_SET(virtio_q, vq_ctx, event_qpn_or_msix, mvq->map.index);
904         } else {
905                 MLX5_SET(virtio_q, vq_ctx, event_mode, MLX5_VIRTIO_Q_EVENT_MODE_QP_MODE);
906                 MLX5_SET(virtio_q, vq_ctx, event_qpn_or_msix, mvq->fwqp.mqp.qpn);
907         }
908
909         MLX5_SET(virtio_q, vq_ctx, queue_index, mvq->index);
910         MLX5_SET(virtio_q, vq_ctx, queue_size, mvq->num_ent);
911         MLX5_SET(virtio_q, vq_ctx, virtio_version_1_0,
912                  !!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_F_VERSION_1)));
913         MLX5_SET64(virtio_q, vq_ctx, desc_addr, mvq->desc_addr);
914         MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr);
915         MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr);
916         MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, ndev->mvdev.mr.mkey);
917         MLX5_SET(virtio_q, vq_ctx, umem_1_id, mvq->umem1.id);
918         MLX5_SET(virtio_q, vq_ctx, umem_1_size, mvq->umem1.size);
919         MLX5_SET(virtio_q, vq_ctx, umem_2_id, mvq->umem2.id);
920         MLX5_SET(virtio_q, vq_ctx, umem_2_size, mvq->umem2.size);
921         MLX5_SET(virtio_q, vq_ctx, umem_3_id, mvq->umem3.id);
922         MLX5_SET(virtio_q, vq_ctx, umem_3_size, mvq->umem3.size);
923         MLX5_SET(virtio_q, vq_ctx, pd, ndev->mvdev.res.pdn);
924         if (counters_supported(&ndev->mvdev))
925                 MLX5_SET(virtio_q, vq_ctx, counter_set_id, mvq->counter_set_id);
926
927         err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
928         if (err)
929                 goto err_cmd;
930
931         mvq->fw_state = MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT;
932         kfree(in);
933         mvq->virtq_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
934
935         return 0;
936
937 err_cmd:
938         kfree(in);
939 err_alloc:
940         umems_destroy(ndev, mvq);
941         return err;
942 }
943
944 static void destroy_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
945 {
946         u32 in[MLX5_ST_SZ_DW(destroy_virtio_net_q_in)] = {};
947         u32 out[MLX5_ST_SZ_DW(destroy_virtio_net_q_out)] = {};
948
949         MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.opcode,
950                  MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
951         MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.obj_id, mvq->virtq_id);
952         MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.uid, ndev->mvdev.res.uid);
953         MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.obj_type,
954                  MLX5_OBJ_TYPE_VIRTIO_NET_Q);
955         if (mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out))) {
956                 mlx5_vdpa_warn(&ndev->mvdev, "destroy virtqueue 0x%x\n", mvq->virtq_id);
957                 return;
958         }
959         mvq->fw_state = MLX5_VIRTIO_NET_Q_OBJECT_NONE;
960         umems_destroy(ndev, mvq);
961 }
962
963 static u32 get_rqpn(struct mlx5_vdpa_virtqueue *mvq, bool fw)
964 {
965         return fw ? mvq->vqqp.mqp.qpn : mvq->fwqp.mqp.qpn;
966 }
967
968 static u32 get_qpn(struct mlx5_vdpa_virtqueue *mvq, bool fw)
969 {
970         return fw ? mvq->fwqp.mqp.qpn : mvq->vqqp.mqp.qpn;
971 }
972
973 static void alloc_inout(struct mlx5_vdpa_net *ndev, int cmd, void **in, int *inlen, void **out,
974                         int *outlen, u32 qpn, u32 rqpn)
975 {
976         void *qpc;
977         void *pp;
978
979         switch (cmd) {
980         case MLX5_CMD_OP_2RST_QP:
981                 *inlen = MLX5_ST_SZ_BYTES(qp_2rst_in);
982                 *outlen = MLX5_ST_SZ_BYTES(qp_2rst_out);
983                 *in = kzalloc(*inlen, GFP_KERNEL);
984                 *out = kzalloc(*outlen, GFP_KERNEL);
985                 if (!*in || !*out)
986                         goto outerr;
987
988                 MLX5_SET(qp_2rst_in, *in, opcode, cmd);
989                 MLX5_SET(qp_2rst_in, *in, uid, ndev->mvdev.res.uid);
990                 MLX5_SET(qp_2rst_in, *in, qpn, qpn);
991                 break;
992         case MLX5_CMD_OP_RST2INIT_QP:
993                 *inlen = MLX5_ST_SZ_BYTES(rst2init_qp_in);
994                 *outlen = MLX5_ST_SZ_BYTES(rst2init_qp_out);
995                 *in = kzalloc(*inlen, GFP_KERNEL);
996                 *out = kzalloc(MLX5_ST_SZ_BYTES(rst2init_qp_out), GFP_KERNEL);
997                 if (!*in || !*out)
998                         goto outerr;
999
1000                 MLX5_SET(rst2init_qp_in, *in, opcode, cmd);
1001                 MLX5_SET(rst2init_qp_in, *in, uid, ndev->mvdev.res.uid);
1002                 MLX5_SET(rst2init_qp_in, *in, qpn, qpn);
1003                 qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
1004                 MLX5_SET(qpc, qpc, remote_qpn, rqpn);
1005                 MLX5_SET(qpc, qpc, rwe, 1);
1006                 pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
1007                 MLX5_SET(ads, pp, vhca_port_num, 1);
1008                 break;
1009         case MLX5_CMD_OP_INIT2RTR_QP:
1010                 *inlen = MLX5_ST_SZ_BYTES(init2rtr_qp_in);
1011                 *outlen = MLX5_ST_SZ_BYTES(init2rtr_qp_out);
1012                 *in = kzalloc(*inlen, GFP_KERNEL);
1013                 *out = kzalloc(MLX5_ST_SZ_BYTES(init2rtr_qp_out), GFP_KERNEL);
1014                 if (!*in || !*out)
1015                         goto outerr;
1016
1017                 MLX5_SET(init2rtr_qp_in, *in, opcode, cmd);
1018                 MLX5_SET(init2rtr_qp_in, *in, uid, ndev->mvdev.res.uid);
1019                 MLX5_SET(init2rtr_qp_in, *in, qpn, qpn);
1020                 qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
1021                 MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
1022                 MLX5_SET(qpc, qpc, log_msg_max, 30);
1023                 MLX5_SET(qpc, qpc, remote_qpn, rqpn);
1024                 pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
1025                 MLX5_SET(ads, pp, fl, 1);
1026                 break;
1027         case MLX5_CMD_OP_RTR2RTS_QP:
1028                 *inlen = MLX5_ST_SZ_BYTES(rtr2rts_qp_in);
1029                 *outlen = MLX5_ST_SZ_BYTES(rtr2rts_qp_out);
1030                 *in = kzalloc(*inlen, GFP_KERNEL);
1031                 *out = kzalloc(MLX5_ST_SZ_BYTES(rtr2rts_qp_out), GFP_KERNEL);
1032                 if (!*in || !*out)
1033                         goto outerr;
1034
1035                 MLX5_SET(rtr2rts_qp_in, *in, opcode, cmd);
1036                 MLX5_SET(rtr2rts_qp_in, *in, uid, ndev->mvdev.res.uid);
1037                 MLX5_SET(rtr2rts_qp_in, *in, qpn, qpn);
1038                 qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
1039                 pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
1040                 MLX5_SET(ads, pp, ack_timeout, 14);
1041                 MLX5_SET(qpc, qpc, retry_count, 7);
1042                 MLX5_SET(qpc, qpc, rnr_retry, 7);
1043                 break;
1044         default:
1045                 goto outerr_nullify;
1046         }
1047
1048         return;
1049
1050 outerr:
1051         kfree(*in);
1052         kfree(*out);
1053 outerr_nullify:
1054         *in = NULL;
1055         *out = NULL;
1056 }
1057
1058 static void free_inout(void *in, void *out)
1059 {
1060         kfree(in);
1061         kfree(out);
1062 }
1063
1064 /* Two QPs are used by each virtqueue. One is used by the driver and one by
1065  * firmware. The fw argument indicates whether the subjected QP is the one used
1066  * by firmware.
1067  */
1068 static int modify_qp(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, bool fw, int cmd)
1069 {
1070         int outlen;
1071         int inlen;
1072         void *out;
1073         void *in;
1074         int err;
1075
1076         alloc_inout(ndev, cmd, &in, &inlen, &out, &outlen, get_qpn(mvq, fw), get_rqpn(mvq, fw));
1077         if (!in || !out)
1078                 return -ENOMEM;
1079
1080         err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, outlen);
1081         free_inout(in, out);
1082         return err;
1083 }
1084
1085 static int connect_qps(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1086 {
1087         int err;
1088
1089         err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_2RST_QP);
1090         if (err)
1091                 return err;
1092
1093         err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_2RST_QP);
1094         if (err)
1095                 return err;
1096
1097         err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_RST2INIT_QP);
1098         if (err)
1099                 return err;
1100
1101         err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_RST2INIT_QP);
1102         if (err)
1103                 return err;
1104
1105         err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_INIT2RTR_QP);
1106         if (err)
1107                 return err;
1108
1109         err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_INIT2RTR_QP);
1110         if (err)
1111                 return err;
1112
1113         return modify_qp(ndev, mvq, true, MLX5_CMD_OP_RTR2RTS_QP);
1114 }
1115
1116 struct mlx5_virtq_attr {
1117         u8 state;
1118         u16 available_index;
1119         u16 used_index;
1120 };
1121
1122 static int query_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
1123                            struct mlx5_virtq_attr *attr)
1124 {
1125         int outlen = MLX5_ST_SZ_BYTES(query_virtio_net_q_out);
1126         u32 in[MLX5_ST_SZ_DW(query_virtio_net_q_in)] = {};
1127         void *out;
1128         void *obj_context;
1129         void *cmd_hdr;
1130         int err;
1131
1132         out = kzalloc(outlen, GFP_KERNEL);
1133         if (!out)
1134                 return -ENOMEM;
1135
1136         cmd_hdr = MLX5_ADDR_OF(query_virtio_net_q_in, in, general_obj_in_cmd_hdr);
1137
1138         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_QUERY_GENERAL_OBJECT);
1139         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
1140         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->virtq_id);
1141         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
1142         err = mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, outlen);
1143         if (err)
1144                 goto err_cmd;
1145
1146         obj_context = MLX5_ADDR_OF(query_virtio_net_q_out, out, obj_context);
1147         memset(attr, 0, sizeof(*attr));
1148         attr->state = MLX5_GET(virtio_net_q_object, obj_context, state);
1149         attr->available_index = MLX5_GET(virtio_net_q_object, obj_context, hw_available_index);
1150         attr->used_index = MLX5_GET(virtio_net_q_object, obj_context, hw_used_index);
1151         kfree(out);
1152         return 0;
1153
1154 err_cmd:
1155         kfree(out);
1156         return err;
1157 }
1158
1159 static bool is_valid_state_change(int oldstate, int newstate)
1160 {
1161         switch (oldstate) {
1162         case MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT:
1163                 return newstate == MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY;
1164         case MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY:
1165                 return newstate == MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND;
1166         case MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND:
1167         case MLX5_VIRTIO_NET_Q_OBJECT_STATE_ERR:
1168         default:
1169                 return false;
1170         }
1171 }
1172
1173 static int modify_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int state)
1174 {
1175         int inlen = MLX5_ST_SZ_BYTES(modify_virtio_net_q_in);
1176         u32 out[MLX5_ST_SZ_DW(modify_virtio_net_q_out)] = {};
1177         void *obj_context;
1178         void *cmd_hdr;
1179         void *in;
1180         int err;
1181
1182         if (mvq->fw_state == MLX5_VIRTIO_NET_Q_OBJECT_NONE)
1183                 return 0;
1184
1185         if (!is_valid_state_change(mvq->fw_state, state))
1186                 return -EINVAL;
1187
1188         in = kzalloc(inlen, GFP_KERNEL);
1189         if (!in)
1190                 return -ENOMEM;
1191
1192         cmd_hdr = MLX5_ADDR_OF(modify_virtio_net_q_in, in, general_obj_in_cmd_hdr);
1193
1194         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_MODIFY_GENERAL_OBJECT);
1195         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
1196         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->virtq_id);
1197         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
1198
1199         obj_context = MLX5_ADDR_OF(modify_virtio_net_q_in, in, obj_context);
1200         MLX5_SET64(virtio_net_q_object, obj_context, modify_field_select,
1201                    MLX5_VIRTQ_MODIFY_MASK_STATE);
1202         MLX5_SET(virtio_net_q_object, obj_context, state, state);
1203         err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
1204         kfree(in);
1205         if (!err)
1206                 mvq->fw_state = state;
1207
1208         return err;
1209 }
1210
1211 static int counter_set_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1212 {
1213         u32 in[MLX5_ST_SZ_DW(create_virtio_q_counters_in)] = {};
1214         u32 out[MLX5_ST_SZ_DW(create_virtio_q_counters_out)] = {};
1215         void *cmd_hdr;
1216         int err;
1217
1218         if (!counters_supported(&ndev->mvdev))
1219                 return 0;
1220
1221         cmd_hdr = MLX5_ADDR_OF(create_virtio_q_counters_in, in, hdr);
1222
1223         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
1224         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS);
1225         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
1226
1227         err = mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out));
1228         if (err)
1229                 return err;
1230
1231         mvq->counter_set_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
1232
1233         return 0;
1234 }
1235
1236 static void counter_set_dealloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1237 {
1238         u32 in[MLX5_ST_SZ_DW(destroy_virtio_q_counters_in)] = {};
1239         u32 out[MLX5_ST_SZ_DW(destroy_virtio_q_counters_out)] = {};
1240
1241         if (!counters_supported(&ndev->mvdev))
1242                 return;
1243
1244         MLX5_SET(destroy_virtio_q_counters_in, in, hdr.opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
1245         MLX5_SET(destroy_virtio_q_counters_in, in, hdr.obj_id, mvq->counter_set_id);
1246         MLX5_SET(destroy_virtio_q_counters_in, in, hdr.uid, ndev->mvdev.res.uid);
1247         MLX5_SET(destroy_virtio_q_counters_in, in, hdr.obj_type, MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS);
1248         if (mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out)))
1249                 mlx5_vdpa_warn(&ndev->mvdev, "dealloc counter set 0x%x\n", mvq->counter_set_id);
1250 }
1251
1252 static irqreturn_t mlx5_vdpa_int_handler(int irq, void *priv)
1253 {
1254         struct vdpa_callback *cb = priv;
1255
1256         if (cb->callback)
1257                 return cb->callback(cb->private);
1258
1259         return IRQ_HANDLED;
1260 }
1261
1262 static void alloc_vector(struct mlx5_vdpa_net *ndev,
1263                          struct mlx5_vdpa_virtqueue *mvq)
1264 {
1265         struct mlx5_vdpa_irq_pool *irqp = &ndev->irqp;
1266         struct mlx5_vdpa_irq_pool_entry *ent;
1267         int err;
1268         int i;
1269
1270         for (i = 0; i < irqp->num_ent; i++) {
1271                 ent = &irqp->entries[i];
1272                 if (!ent->used) {
1273                         snprintf(ent->name, MLX5_VDPA_IRQ_NAME_LEN, "%s-vq-%d",
1274                                  dev_name(&ndev->mvdev.vdev.dev), mvq->index);
1275                         ent->dev_id = &ndev->event_cbs[mvq->index];
1276                         err = request_irq(ent->map.virq, mlx5_vdpa_int_handler, 0,
1277                                           ent->name, ent->dev_id);
1278                         if (err)
1279                                 return;
1280
1281                         ent->used = true;
1282                         mvq->map = ent->map;
1283                         return;
1284                 }
1285         }
1286 }
1287
1288 static void dealloc_vector(struct mlx5_vdpa_net *ndev,
1289                            struct mlx5_vdpa_virtqueue *mvq)
1290 {
1291         struct mlx5_vdpa_irq_pool *irqp = &ndev->irqp;
1292         int i;
1293
1294         for (i = 0; i < irqp->num_ent; i++)
1295                 if (mvq->map.virq == irqp->entries[i].map.virq) {
1296                         free_irq(mvq->map.virq, irqp->entries[i].dev_id);
1297                         irqp->entries[i].used = false;
1298                         return;
1299                 }
1300 }
1301
1302 static int setup_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1303 {
1304         u16 idx = mvq->index;
1305         int err;
1306
1307         if (!mvq->num_ent)
1308                 return 0;
1309
1310         if (mvq->initialized)
1311                 return 0;
1312
1313         err = cq_create(ndev, idx, mvq->num_ent);
1314         if (err)
1315                 return err;
1316
1317         err = qp_create(ndev, mvq, &mvq->fwqp);
1318         if (err)
1319                 goto err_fwqp;
1320
1321         err = qp_create(ndev, mvq, &mvq->vqqp);
1322         if (err)
1323                 goto err_vqqp;
1324
1325         err = connect_qps(ndev, mvq);
1326         if (err)
1327                 goto err_connect;
1328
1329         err = counter_set_alloc(ndev, mvq);
1330         if (err)
1331                 goto err_connect;
1332
1333         alloc_vector(ndev, mvq);
1334         err = create_virtqueue(ndev, mvq);
1335         if (err)
1336                 goto err_vq;
1337
1338         if (mvq->ready) {
1339                 err = modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY);
1340                 if (err) {
1341                         mlx5_vdpa_warn(&ndev->mvdev, "failed to modify to ready vq idx %d(%d)\n",
1342                                        idx, err);
1343                         goto err_modify;
1344                 }
1345         }
1346
1347         mvq->initialized = true;
1348         return 0;
1349
1350 err_modify:
1351         destroy_virtqueue(ndev, mvq);
1352 err_vq:
1353         dealloc_vector(ndev, mvq);
1354         counter_set_dealloc(ndev, mvq);
1355 err_connect:
1356         qp_destroy(ndev, &mvq->vqqp);
1357 err_vqqp:
1358         qp_destroy(ndev, &mvq->fwqp);
1359 err_fwqp:
1360         cq_destroy(ndev, idx);
1361         return err;
1362 }
1363
1364 static void suspend_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1365 {
1366         struct mlx5_virtq_attr attr;
1367
1368         if (!mvq->initialized)
1369                 return;
1370
1371         if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY)
1372                 return;
1373
1374         if (modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND))
1375                 mlx5_vdpa_warn(&ndev->mvdev, "modify to suspend failed\n");
1376
1377         if (query_virtqueue(ndev, mvq, &attr)) {
1378                 mlx5_vdpa_warn(&ndev->mvdev, "failed to query virtqueue\n");
1379                 return;
1380         }
1381         mvq->avail_idx = attr.available_index;
1382         mvq->used_idx = attr.used_index;
1383 }
1384
1385 static void suspend_vqs(struct mlx5_vdpa_net *ndev)
1386 {
1387         int i;
1388
1389         for (i = 0; i < ndev->mvdev.max_vqs; i++)
1390                 suspend_vq(ndev, &ndev->vqs[i]);
1391 }
1392
1393 static void teardown_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1394 {
1395         if (!mvq->initialized)
1396                 return;
1397
1398         suspend_vq(ndev, mvq);
1399         destroy_virtqueue(ndev, mvq);
1400         dealloc_vector(ndev, mvq);
1401         counter_set_dealloc(ndev, mvq);
1402         qp_destroy(ndev, &mvq->vqqp);
1403         qp_destroy(ndev, &mvq->fwqp);
1404         cq_destroy(ndev, mvq->index);
1405         mvq->initialized = false;
1406 }
1407
1408 static int create_rqt(struct mlx5_vdpa_net *ndev)
1409 {
1410         int rqt_table_size = roundup_pow_of_two(ndev->rqt_size);
1411         int act_sz = roundup_pow_of_two(ndev->cur_num_vqs / 2);
1412         __be32 *list;
1413         void *rqtc;
1414         int inlen;
1415         void *in;
1416         int i, j;
1417         int err;
1418
1419         inlen = MLX5_ST_SZ_BYTES(create_rqt_in) + rqt_table_size * MLX5_ST_SZ_BYTES(rq_num);
1420         in = kzalloc(inlen, GFP_KERNEL);
1421         if (!in)
1422                 return -ENOMEM;
1423
1424         MLX5_SET(create_rqt_in, in, uid, ndev->mvdev.res.uid);
1425         rqtc = MLX5_ADDR_OF(create_rqt_in, in, rqt_context);
1426
1427         MLX5_SET(rqtc, rqtc, list_q_type, MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q);
1428         MLX5_SET(rqtc, rqtc, rqt_max_size, rqt_table_size);
1429         list = MLX5_ADDR_OF(rqtc, rqtc, rq_num[0]);
1430         for (i = 0, j = 0; i < act_sz; i++, j += 2)
1431                 list[i] = cpu_to_be32(ndev->vqs[j % ndev->cur_num_vqs].virtq_id);
1432
1433         MLX5_SET(rqtc, rqtc, rqt_actual_size, act_sz);
1434         err = mlx5_vdpa_create_rqt(&ndev->mvdev, in, inlen, &ndev->res.rqtn);
1435         kfree(in);
1436         if (err)
1437                 return err;
1438
1439         return 0;
1440 }
1441
1442 #define MLX5_MODIFY_RQT_NUM_RQS ((u64)1)
1443
1444 static int modify_rqt(struct mlx5_vdpa_net *ndev, int num)
1445 {
1446         int act_sz = roundup_pow_of_two(num / 2);
1447         __be32 *list;
1448         void *rqtc;
1449         int inlen;
1450         void *in;
1451         int i, j;
1452         int err;
1453
1454         inlen = MLX5_ST_SZ_BYTES(modify_rqt_in) + act_sz * MLX5_ST_SZ_BYTES(rq_num);
1455         in = kzalloc(inlen, GFP_KERNEL);
1456         if (!in)
1457                 return -ENOMEM;
1458
1459         MLX5_SET(modify_rqt_in, in, uid, ndev->mvdev.res.uid);
1460         MLX5_SET64(modify_rqt_in, in, bitmask, MLX5_MODIFY_RQT_NUM_RQS);
1461         rqtc = MLX5_ADDR_OF(modify_rqt_in, in, ctx);
1462         MLX5_SET(rqtc, rqtc, list_q_type, MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q);
1463
1464         list = MLX5_ADDR_OF(rqtc, rqtc, rq_num[0]);
1465         for (i = 0, j = 0; i < act_sz; i++, j = j + 2)
1466                 list[i] = cpu_to_be32(ndev->vqs[j % num].virtq_id);
1467
1468         MLX5_SET(rqtc, rqtc, rqt_actual_size, act_sz);
1469         err = mlx5_vdpa_modify_rqt(&ndev->mvdev, in, inlen, ndev->res.rqtn);
1470         kfree(in);
1471         if (err)
1472                 return err;
1473
1474         return 0;
1475 }
1476
1477 static void destroy_rqt(struct mlx5_vdpa_net *ndev)
1478 {
1479         mlx5_vdpa_destroy_rqt(&ndev->mvdev, ndev->res.rqtn);
1480 }
1481
1482 static int create_tir(struct mlx5_vdpa_net *ndev)
1483 {
1484 #define HASH_IP_L4PORTS                                                                            \
1485         (MLX5_HASH_FIELD_SEL_SRC_IP | MLX5_HASH_FIELD_SEL_DST_IP | MLX5_HASH_FIELD_SEL_L4_SPORT |  \
1486          MLX5_HASH_FIELD_SEL_L4_DPORT)
1487         static const u8 rx_hash_toeplitz_key[] = { 0x2c, 0xc6, 0x81, 0xd1, 0x5b, 0xdb, 0xf4, 0xf7,
1488                                                    0xfc, 0xa2, 0x83, 0x19, 0xdb, 0x1a, 0x3e, 0x94,
1489                                                    0x6b, 0x9e, 0x38, 0xd9, 0x2c, 0x9c, 0x03, 0xd1,
1490                                                    0xad, 0x99, 0x44, 0xa7, 0xd9, 0x56, 0x3d, 0x59,
1491                                                    0x06, 0x3c, 0x25, 0xf3, 0xfc, 0x1f, 0xdc, 0x2a };
1492         void *rss_key;
1493         void *outer;
1494         void *tirc;
1495         void *in;
1496         int err;
1497
1498         in = kzalloc(MLX5_ST_SZ_BYTES(create_tir_in), GFP_KERNEL);
1499         if (!in)
1500                 return -ENOMEM;
1501
1502         MLX5_SET(create_tir_in, in, uid, ndev->mvdev.res.uid);
1503         tirc = MLX5_ADDR_OF(create_tir_in, in, ctx);
1504         MLX5_SET(tirc, tirc, disp_type, MLX5_TIRC_DISP_TYPE_INDIRECT);
1505
1506         MLX5_SET(tirc, tirc, rx_hash_symmetric, 1);
1507         MLX5_SET(tirc, tirc, rx_hash_fn, MLX5_RX_HASH_FN_TOEPLITZ);
1508         rss_key = MLX5_ADDR_OF(tirc, tirc, rx_hash_toeplitz_key);
1509         memcpy(rss_key, rx_hash_toeplitz_key, sizeof(rx_hash_toeplitz_key));
1510
1511         outer = MLX5_ADDR_OF(tirc, tirc, rx_hash_field_selector_outer);
1512         MLX5_SET(rx_hash_field_select, outer, l3_prot_type, MLX5_L3_PROT_TYPE_IPV4);
1513         MLX5_SET(rx_hash_field_select, outer, l4_prot_type, MLX5_L4_PROT_TYPE_TCP);
1514         MLX5_SET(rx_hash_field_select, outer, selected_fields, HASH_IP_L4PORTS);
1515
1516         MLX5_SET(tirc, tirc, indirect_table, ndev->res.rqtn);
1517         MLX5_SET(tirc, tirc, transport_domain, ndev->res.tdn);
1518
1519         err = mlx5_vdpa_create_tir(&ndev->mvdev, in, &ndev->res.tirn);
1520         kfree(in);
1521         if (err)
1522                 return err;
1523
1524         mlx5_vdpa_add_tirn(ndev);
1525         return err;
1526 }
1527
1528 static void destroy_tir(struct mlx5_vdpa_net *ndev)
1529 {
1530         mlx5_vdpa_remove_tirn(ndev);
1531         mlx5_vdpa_destroy_tir(&ndev->mvdev, ndev->res.tirn);
1532 }
1533
1534 #define MAX_STEERING_ENT 0x8000
1535 #define MAX_STEERING_GROUPS 2
1536
1537 #if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG)
1538        #define NUM_DESTS 2
1539 #else
1540        #define NUM_DESTS 1
1541 #endif
1542
1543 static int add_steering_counters(struct mlx5_vdpa_net *ndev,
1544                                  struct macvlan_node *node,
1545                                  struct mlx5_flow_act *flow_act,
1546                                  struct mlx5_flow_destination *dests)
1547 {
1548 #if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG)
1549         int err;
1550
1551         node->ucast_counter.counter = mlx5_fc_create(ndev->mvdev.mdev, false);
1552         if (IS_ERR(node->ucast_counter.counter))
1553                 return PTR_ERR(node->ucast_counter.counter);
1554
1555         node->mcast_counter.counter = mlx5_fc_create(ndev->mvdev.mdev, false);
1556         if (IS_ERR(node->mcast_counter.counter)) {
1557                 err = PTR_ERR(node->mcast_counter.counter);
1558                 goto err_mcast_counter;
1559         }
1560
1561         dests[1].type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
1562         flow_act->action |= MLX5_FLOW_CONTEXT_ACTION_COUNT;
1563         return 0;
1564
1565 err_mcast_counter:
1566         mlx5_fc_destroy(ndev->mvdev.mdev, node->ucast_counter.counter);
1567         return err;
1568 #else
1569         return 0;
1570 #endif
1571 }
1572
1573 static void remove_steering_counters(struct mlx5_vdpa_net *ndev,
1574                                      struct macvlan_node *node)
1575 {
1576 #if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG)
1577         mlx5_fc_destroy(ndev->mvdev.mdev, node->mcast_counter.counter);
1578         mlx5_fc_destroy(ndev->mvdev.mdev, node->ucast_counter.counter);
1579 #endif
1580 }
1581
1582 static int mlx5_vdpa_add_mac_vlan_rules(struct mlx5_vdpa_net *ndev, u8 *mac,
1583                                         struct macvlan_node *node)
1584 {
1585         struct mlx5_flow_destination dests[NUM_DESTS] = {};
1586         struct mlx5_flow_act flow_act = {};
1587         struct mlx5_flow_spec *spec;
1588         void *headers_c;
1589         void *headers_v;
1590         u8 *dmac_c;
1591         u8 *dmac_v;
1592         int err;
1593         u16 vid;
1594
1595         spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
1596         if (!spec)
1597                 return -ENOMEM;
1598
1599         vid = key2vid(node->macvlan);
1600         spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
1601         headers_c = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, outer_headers);
1602         headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, outer_headers);
1603         dmac_c = MLX5_ADDR_OF(fte_match_param, headers_c, outer_headers.dmac_47_16);
1604         dmac_v = MLX5_ADDR_OF(fte_match_param, headers_v, outer_headers.dmac_47_16);
1605         eth_broadcast_addr(dmac_c);
1606         ether_addr_copy(dmac_v, mac);
1607         if (ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VLAN)) {
1608                 MLX5_SET(fte_match_set_lyr_2_4, headers_c, cvlan_tag, 1);
1609                 MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, first_vid);
1610         }
1611         if (node->tagged) {
1612                 MLX5_SET(fte_match_set_lyr_2_4, headers_v, cvlan_tag, 1);
1613                 MLX5_SET(fte_match_set_lyr_2_4, headers_v, first_vid, vid);
1614         }
1615         flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
1616         dests[0].type = MLX5_FLOW_DESTINATION_TYPE_TIR;
1617         dests[0].tir_num = ndev->res.tirn;
1618         err = add_steering_counters(ndev, node, &flow_act, dests);
1619         if (err)
1620                 goto out_free;
1621
1622 #if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG)
1623         dests[1].counter_id = mlx5_fc_id(node->ucast_counter.counter);
1624 #endif
1625         node->ucast_rule = mlx5_add_flow_rules(ndev->rxft, spec, &flow_act, dests, NUM_DESTS);
1626         if (IS_ERR(node->ucast_rule)) {
1627                 err = PTR_ERR(node->ucast_rule);
1628                 goto err_ucast;
1629         }
1630
1631 #if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG)
1632         dests[1].counter_id = mlx5_fc_id(node->mcast_counter.counter);
1633 #endif
1634
1635         memset(dmac_c, 0, ETH_ALEN);
1636         memset(dmac_v, 0, ETH_ALEN);
1637         dmac_c[0] = 1;
1638         dmac_v[0] = 1;
1639         node->mcast_rule = mlx5_add_flow_rules(ndev->rxft, spec, &flow_act, dests, NUM_DESTS);
1640         if (IS_ERR(node->mcast_rule)) {
1641                 err = PTR_ERR(node->mcast_rule);
1642                 goto err_mcast;
1643         }
1644         kvfree(spec);
1645         mlx5_vdpa_add_rx_counters(ndev, node);
1646         return 0;
1647
1648 err_mcast:
1649         mlx5_del_flow_rules(node->ucast_rule);
1650 err_ucast:
1651         remove_steering_counters(ndev, node);
1652 out_free:
1653         kvfree(spec);
1654         return err;
1655 }
1656
1657 static void mlx5_vdpa_del_mac_vlan_rules(struct mlx5_vdpa_net *ndev,
1658                                          struct macvlan_node *node)
1659 {
1660         mlx5_vdpa_remove_rx_counters(ndev, node);
1661         mlx5_del_flow_rules(node->ucast_rule);
1662         mlx5_del_flow_rules(node->mcast_rule);
1663 }
1664
1665 static u64 search_val(u8 *mac, u16 vlan, bool tagged)
1666 {
1667         u64 val;
1668
1669         if (!tagged)
1670                 vlan = MLX5V_UNTAGGED;
1671
1672         val = (u64)vlan << 48 |
1673               (u64)mac[0] << 40 |
1674               (u64)mac[1] << 32 |
1675               (u64)mac[2] << 24 |
1676               (u64)mac[3] << 16 |
1677               (u64)mac[4] << 8 |
1678               (u64)mac[5];
1679
1680         return val;
1681 }
1682
1683 static struct macvlan_node *mac_vlan_lookup(struct mlx5_vdpa_net *ndev, u64 value)
1684 {
1685         struct macvlan_node *pos;
1686         u32 idx;
1687
1688         idx = hash_64(value, 8); // tbd 8
1689         hlist_for_each_entry(pos, &ndev->macvlan_hash[idx], hlist) {
1690                 if (pos->macvlan == value)
1691                         return pos;
1692         }
1693         return NULL;
1694 }
1695
1696 static int mac_vlan_add(struct mlx5_vdpa_net *ndev, u8 *mac, u16 vid, bool tagged)
1697 {
1698         struct macvlan_node *ptr;
1699         u64 val;
1700         u32 idx;
1701         int err;
1702
1703         val = search_val(mac, vid, tagged);
1704         if (mac_vlan_lookup(ndev, val))
1705                 return -EEXIST;
1706
1707         ptr = kzalloc(sizeof(*ptr), GFP_KERNEL);
1708         if (!ptr)
1709                 return -ENOMEM;
1710
1711         ptr->tagged = tagged;
1712         ptr->macvlan = val;
1713         ptr->ndev = ndev;
1714         err = mlx5_vdpa_add_mac_vlan_rules(ndev, ndev->config.mac, ptr);
1715         if (err)
1716                 goto err_add;
1717
1718         idx = hash_64(val, 8);
1719         hlist_add_head(&ptr->hlist, &ndev->macvlan_hash[idx]);
1720         return 0;
1721
1722 err_add:
1723         kfree(ptr);
1724         return err;
1725 }
1726
1727 static void mac_vlan_del(struct mlx5_vdpa_net *ndev, u8 *mac, u16 vlan, bool tagged)
1728 {
1729         struct macvlan_node *ptr;
1730
1731         ptr = mac_vlan_lookup(ndev, search_val(mac, vlan, tagged));
1732         if (!ptr)
1733                 return;
1734
1735         hlist_del(&ptr->hlist);
1736         mlx5_vdpa_del_mac_vlan_rules(ndev, ptr);
1737         remove_steering_counters(ndev, ptr);
1738         kfree(ptr);
1739 }
1740
1741 static void clear_mac_vlan_table(struct mlx5_vdpa_net *ndev)
1742 {
1743         struct macvlan_node *pos;
1744         struct hlist_node *n;
1745         int i;
1746
1747         for (i = 0; i < MLX5V_MACVLAN_SIZE; i++) {
1748                 hlist_for_each_entry_safe(pos, n, &ndev->macvlan_hash[i], hlist) {
1749                         hlist_del(&pos->hlist);
1750                         mlx5_vdpa_del_mac_vlan_rules(ndev, pos);
1751                         remove_steering_counters(ndev, pos);
1752                         kfree(pos);
1753                 }
1754         }
1755 }
1756
1757 static int setup_steering(struct mlx5_vdpa_net *ndev)
1758 {
1759         struct mlx5_flow_table_attr ft_attr = {};
1760         struct mlx5_flow_namespace *ns;
1761         int err;
1762
1763         ft_attr.max_fte = MAX_STEERING_ENT;
1764         ft_attr.autogroup.max_num_groups = MAX_STEERING_GROUPS;
1765
1766         ns = mlx5_get_flow_namespace(ndev->mvdev.mdev, MLX5_FLOW_NAMESPACE_BYPASS);
1767         if (!ns) {
1768                 mlx5_vdpa_warn(&ndev->mvdev, "failed to get flow namespace\n");
1769                 return -EOPNOTSUPP;
1770         }
1771
1772         ndev->rxft = mlx5_create_auto_grouped_flow_table(ns, &ft_attr);
1773         if (IS_ERR(ndev->rxft)) {
1774                 mlx5_vdpa_warn(&ndev->mvdev, "failed to create flow table\n");
1775                 return PTR_ERR(ndev->rxft);
1776         }
1777         mlx5_vdpa_add_rx_flow_table(ndev);
1778
1779         err = mac_vlan_add(ndev, ndev->config.mac, 0, false);
1780         if (err)
1781                 goto err_add;
1782
1783         return 0;
1784
1785 err_add:
1786         mlx5_vdpa_remove_rx_flow_table(ndev);
1787         mlx5_destroy_flow_table(ndev->rxft);
1788         return err;
1789 }
1790
1791 static void teardown_steering(struct mlx5_vdpa_net *ndev)
1792 {
1793         clear_mac_vlan_table(ndev);
1794         mlx5_vdpa_remove_rx_flow_table(ndev);
1795         mlx5_destroy_flow_table(ndev->rxft);
1796 }
1797
1798 static virtio_net_ctrl_ack handle_ctrl_mac(struct mlx5_vdpa_dev *mvdev, u8 cmd)
1799 {
1800         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1801         struct mlx5_control_vq *cvq = &mvdev->cvq;
1802         virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
1803         struct mlx5_core_dev *pfmdev;
1804         size_t read;
1805         u8 mac[ETH_ALEN], mac_back[ETH_ALEN];
1806
1807         pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev));
1808         switch (cmd) {
1809         case VIRTIO_NET_CTRL_MAC_ADDR_SET:
1810                 read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, (void *)mac, ETH_ALEN);
1811                 if (read != ETH_ALEN)
1812                         break;
1813
1814                 if (!memcmp(ndev->config.mac, mac, 6)) {
1815                         status = VIRTIO_NET_OK;
1816                         break;
1817                 }
1818
1819                 if (is_zero_ether_addr(mac))
1820                         break;
1821
1822                 if (!is_zero_ether_addr(ndev->config.mac)) {
1823                         if (mlx5_mpfs_del_mac(pfmdev, ndev->config.mac)) {
1824                                 mlx5_vdpa_warn(mvdev, "failed to delete old MAC %pM from MPFS table\n",
1825                                                ndev->config.mac);
1826                                 break;
1827                         }
1828                 }
1829
1830                 if (mlx5_mpfs_add_mac(pfmdev, mac)) {
1831                         mlx5_vdpa_warn(mvdev, "failed to insert new MAC %pM into MPFS table\n",
1832                                        mac);
1833                         break;
1834                 }
1835
1836                 /* backup the original mac address so that if failed to add the forward rules
1837                  * we could restore it
1838                  */
1839                 memcpy(mac_back, ndev->config.mac, ETH_ALEN);
1840
1841                 memcpy(ndev->config.mac, mac, ETH_ALEN);
1842
1843                 /* Need recreate the flow table entry, so that the packet could forward back
1844                  */
1845                 mac_vlan_del(ndev, mac_back, 0, false);
1846
1847                 if (mac_vlan_add(ndev, ndev->config.mac, 0, false)) {
1848                         mlx5_vdpa_warn(mvdev, "failed to insert forward rules, try to restore\n");
1849
1850                         /* Although it hardly run here, we still need double check */
1851                         if (is_zero_ether_addr(mac_back)) {
1852                                 mlx5_vdpa_warn(mvdev, "restore mac failed: Original MAC is zero\n");
1853                                 break;
1854                         }
1855
1856                         /* Try to restore original mac address to MFPS table, and try to restore
1857                          * the forward rule entry.
1858                          */
1859                         if (mlx5_mpfs_del_mac(pfmdev, ndev->config.mac)) {
1860                                 mlx5_vdpa_warn(mvdev, "restore mac failed: delete MAC %pM from MPFS table failed\n",
1861                                                ndev->config.mac);
1862                         }
1863
1864                         if (mlx5_mpfs_add_mac(pfmdev, mac_back)) {
1865                                 mlx5_vdpa_warn(mvdev, "restore mac failed: insert old MAC %pM into MPFS table failed\n",
1866                                                mac_back);
1867                         }
1868
1869                         memcpy(ndev->config.mac, mac_back, ETH_ALEN);
1870
1871                         if (mac_vlan_add(ndev, ndev->config.mac, 0, false))
1872                                 mlx5_vdpa_warn(mvdev, "restore forward rules failed: insert forward rules failed\n");
1873
1874                         break;
1875                 }
1876
1877                 status = VIRTIO_NET_OK;
1878                 break;
1879
1880         default:
1881                 break;
1882         }
1883
1884         return status;
1885 }
1886
1887 static int change_num_qps(struct mlx5_vdpa_dev *mvdev, int newqps)
1888 {
1889         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1890         int cur_qps = ndev->cur_num_vqs / 2;
1891         int err;
1892         int i;
1893
1894         if (cur_qps > newqps) {
1895                 err = modify_rqt(ndev, 2 * newqps);
1896                 if (err)
1897                         return err;
1898
1899                 for (i = ndev->cur_num_vqs - 1; i >= 2 * newqps; i--)
1900                         teardown_vq(ndev, &ndev->vqs[i]);
1901
1902                 ndev->cur_num_vqs = 2 * newqps;
1903         } else {
1904                 ndev->cur_num_vqs = 2 * newqps;
1905                 for (i = cur_qps * 2; i < 2 * newqps; i++) {
1906                         err = setup_vq(ndev, &ndev->vqs[i]);
1907                         if (err)
1908                                 goto clean_added;
1909                 }
1910                 err = modify_rqt(ndev, 2 * newqps);
1911                 if (err)
1912                         goto clean_added;
1913         }
1914         return 0;
1915
1916 clean_added:
1917         for (--i; i >= 2 * cur_qps; --i)
1918                 teardown_vq(ndev, &ndev->vqs[i]);
1919
1920         ndev->cur_num_vqs = 2 * cur_qps;
1921
1922         return err;
1923 }
1924
1925 static virtio_net_ctrl_ack handle_ctrl_mq(struct mlx5_vdpa_dev *mvdev, u8 cmd)
1926 {
1927         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1928         virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
1929         struct mlx5_control_vq *cvq = &mvdev->cvq;
1930         struct virtio_net_ctrl_mq mq;
1931         size_t read;
1932         u16 newqps;
1933
1934         switch (cmd) {
1935         case VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET:
1936                 /* This mq feature check aligns with pre-existing userspace
1937                  * implementation.
1938                  *
1939                  * Without it, an untrusted driver could fake a multiqueue config
1940                  * request down to a non-mq device that may cause kernel to
1941                  * panic due to uninitialized resources for extra vqs. Even with
1942                  * a well behaving guest driver, it is not expected to allow
1943                  * changing the number of vqs on a non-mq device.
1944                  */
1945                 if (!MLX5_FEATURE(mvdev, VIRTIO_NET_F_MQ))
1946                         break;
1947
1948                 read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, (void *)&mq, sizeof(mq));
1949                 if (read != sizeof(mq))
1950                         break;
1951
1952                 newqps = mlx5vdpa16_to_cpu(mvdev, mq.virtqueue_pairs);
1953                 if (newqps < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN ||
1954                     newqps > ndev->rqt_size)
1955                         break;
1956
1957                 if (ndev->cur_num_vqs == 2 * newqps) {
1958                         status = VIRTIO_NET_OK;
1959                         break;
1960                 }
1961
1962                 if (!change_num_qps(mvdev, newqps))
1963                         status = VIRTIO_NET_OK;
1964
1965                 break;
1966         default:
1967                 break;
1968         }
1969
1970         return status;
1971 }
1972
1973 static virtio_net_ctrl_ack handle_ctrl_vlan(struct mlx5_vdpa_dev *mvdev, u8 cmd)
1974 {
1975         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
1976         virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
1977         struct mlx5_control_vq *cvq = &mvdev->cvq;
1978         __virtio16 vlan;
1979         size_t read;
1980         u16 id;
1981
1982         if (!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VLAN)))
1983                 return status;
1984
1985         switch (cmd) {
1986         case VIRTIO_NET_CTRL_VLAN_ADD:
1987                 read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, &vlan, sizeof(vlan));
1988                 if (read != sizeof(vlan))
1989                         break;
1990
1991                 id = mlx5vdpa16_to_cpu(mvdev, vlan);
1992                 if (mac_vlan_add(ndev, ndev->config.mac, id, true))
1993                         break;
1994
1995                 status = VIRTIO_NET_OK;
1996                 break;
1997         case VIRTIO_NET_CTRL_VLAN_DEL:
1998                 read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, &vlan, sizeof(vlan));
1999                 if (read != sizeof(vlan))
2000                         break;
2001
2002                 id = mlx5vdpa16_to_cpu(mvdev, vlan);
2003                 mac_vlan_del(ndev, ndev->config.mac, id, true);
2004                 status = VIRTIO_NET_OK;
2005                 break;
2006         default:
2007                 break;
2008         }
2009
2010         return status;
2011 }
2012
2013 static void mlx5_cvq_kick_handler(struct work_struct *work)
2014 {
2015         virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
2016         struct virtio_net_ctrl_hdr ctrl;
2017         struct mlx5_vdpa_wq_ent *wqent;
2018         struct mlx5_vdpa_dev *mvdev;
2019         struct mlx5_control_vq *cvq;
2020         struct mlx5_vdpa_net *ndev;
2021         size_t read, write;
2022         int err;
2023
2024         wqent = container_of(work, struct mlx5_vdpa_wq_ent, work);
2025         mvdev = wqent->mvdev;
2026         ndev = to_mlx5_vdpa_ndev(mvdev);
2027         cvq = &mvdev->cvq;
2028
2029         down_write(&ndev->reslock);
2030
2031         if (!(mvdev->status & VIRTIO_CONFIG_S_DRIVER_OK))
2032                 goto out;
2033
2034         if (!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
2035                 goto out;
2036
2037         if (!cvq->ready)
2038                 goto out;
2039
2040         while (true) {
2041                 err = vringh_getdesc_iotlb(&cvq->vring, &cvq->riov, &cvq->wiov, &cvq->head,
2042                                            GFP_ATOMIC);
2043                 if (err <= 0)
2044                         break;
2045
2046                 read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, &ctrl, sizeof(ctrl));
2047                 if (read != sizeof(ctrl))
2048                         break;
2049
2050                 cvq->received_desc++;
2051                 switch (ctrl.class) {
2052                 case VIRTIO_NET_CTRL_MAC:
2053                         status = handle_ctrl_mac(mvdev, ctrl.cmd);
2054                         break;
2055                 case VIRTIO_NET_CTRL_MQ:
2056                         status = handle_ctrl_mq(mvdev, ctrl.cmd);
2057                         break;
2058                 case VIRTIO_NET_CTRL_VLAN:
2059                         status = handle_ctrl_vlan(mvdev, ctrl.cmd);
2060                         break;
2061                 default:
2062                         break;
2063                 }
2064
2065                 /* Make sure data is written before advancing index */
2066                 smp_wmb();
2067
2068                 write = vringh_iov_push_iotlb(&cvq->vring, &cvq->wiov, &status, sizeof(status));
2069                 vringh_complete_iotlb(&cvq->vring, cvq->head, write);
2070                 vringh_kiov_cleanup(&cvq->riov);
2071                 vringh_kiov_cleanup(&cvq->wiov);
2072
2073                 if (vringh_need_notify_iotlb(&cvq->vring))
2074                         vringh_notify(&cvq->vring);
2075
2076                 cvq->completed_desc++;
2077                 queue_work(mvdev->wq, &wqent->work);
2078                 break;
2079         }
2080
2081 out:
2082         up_write(&ndev->reslock);
2083 }
2084
2085 static void mlx5_vdpa_kick_vq(struct vdpa_device *vdev, u16 idx)
2086 {
2087         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2088         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2089         struct mlx5_vdpa_virtqueue *mvq;
2090
2091         if (!is_index_valid(mvdev, idx))
2092                 return;
2093
2094         if (unlikely(is_ctrl_vq_idx(mvdev, idx))) {
2095                 if (!mvdev->wq || !mvdev->cvq.ready)
2096                         return;
2097
2098                 queue_work(mvdev->wq, &ndev->cvq_ent.work);
2099                 return;
2100         }
2101
2102         mvq = &ndev->vqs[idx];
2103         if (unlikely(!mvq->ready))
2104                 return;
2105
2106         iowrite16(idx, ndev->mvdev.res.kick_addr);
2107 }
2108
2109 static int mlx5_vdpa_set_vq_address(struct vdpa_device *vdev, u16 idx, u64 desc_area,
2110                                     u64 driver_area, u64 device_area)
2111 {
2112         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2113         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2114         struct mlx5_vdpa_virtqueue *mvq;
2115
2116         if (!is_index_valid(mvdev, idx))
2117                 return -EINVAL;
2118
2119         if (is_ctrl_vq_idx(mvdev, idx)) {
2120                 mvdev->cvq.desc_addr = desc_area;
2121                 mvdev->cvq.device_addr = device_area;
2122                 mvdev->cvq.driver_addr = driver_area;
2123                 return 0;
2124         }
2125
2126         mvq = &ndev->vqs[idx];
2127         mvq->desc_addr = desc_area;
2128         mvq->device_addr = device_area;
2129         mvq->driver_addr = driver_area;
2130         return 0;
2131 }
2132
2133 static void mlx5_vdpa_set_vq_num(struct vdpa_device *vdev, u16 idx, u32 num)
2134 {
2135         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2136         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2137         struct mlx5_vdpa_virtqueue *mvq;
2138
2139         if (!is_index_valid(mvdev, idx) || is_ctrl_vq_idx(mvdev, idx))
2140                 return;
2141
2142         mvq = &ndev->vqs[idx];
2143         mvq->num_ent = num;
2144 }
2145
2146 static void mlx5_vdpa_set_vq_cb(struct vdpa_device *vdev, u16 idx, struct vdpa_callback *cb)
2147 {
2148         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2149         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2150
2151         ndev->event_cbs[idx] = *cb;
2152         if (is_ctrl_vq_idx(mvdev, idx))
2153                 mvdev->cvq.event_cb = *cb;
2154 }
2155
2156 static void mlx5_cvq_notify(struct vringh *vring)
2157 {
2158         struct mlx5_control_vq *cvq = container_of(vring, struct mlx5_control_vq, vring);
2159
2160         if (!cvq->event_cb.callback)
2161                 return;
2162
2163         cvq->event_cb.callback(cvq->event_cb.private);
2164 }
2165
2166 static void set_cvq_ready(struct mlx5_vdpa_dev *mvdev, bool ready)
2167 {
2168         struct mlx5_control_vq *cvq = &mvdev->cvq;
2169
2170         cvq->ready = ready;
2171         if (!ready)
2172                 return;
2173
2174         cvq->vring.notify = mlx5_cvq_notify;
2175 }
2176
2177 static void mlx5_vdpa_set_vq_ready(struct vdpa_device *vdev, u16 idx, bool ready)
2178 {
2179         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2180         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2181         struct mlx5_vdpa_virtqueue *mvq;
2182         int err;
2183
2184         if (!mvdev->actual_features)
2185                 return;
2186
2187         if (!is_index_valid(mvdev, idx))
2188                 return;
2189
2190         if (is_ctrl_vq_idx(mvdev, idx)) {
2191                 set_cvq_ready(mvdev, ready);
2192                 return;
2193         }
2194
2195         mvq = &ndev->vqs[idx];
2196         if (!ready) {
2197                 suspend_vq(ndev, mvq);
2198         } else {
2199                 err = modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY);
2200                 if (err) {
2201                         mlx5_vdpa_warn(mvdev, "modify VQ %d to ready failed (%d)\n", idx, err);
2202                         ready = false;
2203                 }
2204         }
2205
2206
2207         mvq->ready = ready;
2208 }
2209
2210 static bool mlx5_vdpa_get_vq_ready(struct vdpa_device *vdev, u16 idx)
2211 {
2212         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2213         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2214
2215         if (!is_index_valid(mvdev, idx))
2216                 return false;
2217
2218         if (is_ctrl_vq_idx(mvdev, idx))
2219                 return mvdev->cvq.ready;
2220
2221         return ndev->vqs[idx].ready;
2222 }
2223
2224 static int mlx5_vdpa_set_vq_state(struct vdpa_device *vdev, u16 idx,
2225                                   const struct vdpa_vq_state *state)
2226 {
2227         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2228         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2229         struct mlx5_vdpa_virtqueue *mvq;
2230
2231         if (!is_index_valid(mvdev, idx))
2232                 return -EINVAL;
2233
2234         if (is_ctrl_vq_idx(mvdev, idx)) {
2235                 mvdev->cvq.vring.last_avail_idx = state->split.avail_index;
2236                 return 0;
2237         }
2238
2239         mvq = &ndev->vqs[idx];
2240         if (mvq->fw_state == MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY) {
2241                 mlx5_vdpa_warn(mvdev, "can't modify available index\n");
2242                 return -EINVAL;
2243         }
2244
2245         mvq->used_idx = state->split.avail_index;
2246         mvq->avail_idx = state->split.avail_index;
2247         return 0;
2248 }
2249
2250 static int mlx5_vdpa_get_vq_state(struct vdpa_device *vdev, u16 idx, struct vdpa_vq_state *state)
2251 {
2252         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2253         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2254         struct mlx5_vdpa_virtqueue *mvq;
2255         struct mlx5_virtq_attr attr;
2256         int err;
2257
2258         if (!is_index_valid(mvdev, idx))
2259                 return -EINVAL;
2260
2261         if (is_ctrl_vq_idx(mvdev, idx)) {
2262                 state->split.avail_index = mvdev->cvq.vring.last_avail_idx;
2263                 return 0;
2264         }
2265
2266         mvq = &ndev->vqs[idx];
2267         /* If the virtq object was destroyed, use the value saved at
2268          * the last minute of suspend_vq. This caters for userspace
2269          * that cares about emulating the index after vq is stopped.
2270          */
2271         if (!mvq->initialized) {
2272                 /* Firmware returns a wrong value for the available index.
2273                  * Since both values should be identical, we take the value of
2274                  * used_idx which is reported correctly.
2275                  */
2276                 state->split.avail_index = mvq->used_idx;
2277                 return 0;
2278         }
2279
2280         err = query_virtqueue(ndev, mvq, &attr);
2281         if (err) {
2282                 mlx5_vdpa_warn(mvdev, "failed to query virtqueue\n");
2283                 return err;
2284         }
2285         state->split.avail_index = attr.used_index;
2286         return 0;
2287 }
2288
2289 static u32 mlx5_vdpa_get_vq_align(struct vdpa_device *vdev)
2290 {
2291         return PAGE_SIZE;
2292 }
2293
2294 static u32 mlx5_vdpa_get_vq_group(struct vdpa_device *vdev, u16 idx)
2295 {
2296         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2297
2298         if (is_ctrl_vq_idx(mvdev, idx))
2299                 return MLX5_VDPA_CVQ_GROUP;
2300
2301         return MLX5_VDPA_DATAVQ_GROUP;
2302 }
2303
2304 static u64 mlx_to_vritio_features(u16 dev_features)
2305 {
2306         u64 result = 0;
2307
2308         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_MRG_RXBUF))
2309                 result |= BIT_ULL(VIRTIO_NET_F_MRG_RXBUF);
2310         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_HOST_ECN))
2311                 result |= BIT_ULL(VIRTIO_NET_F_HOST_ECN);
2312         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_GUEST_ECN))
2313                 result |= BIT_ULL(VIRTIO_NET_F_GUEST_ECN);
2314         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_GUEST_TSO6))
2315                 result |= BIT_ULL(VIRTIO_NET_F_GUEST_TSO6);
2316         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_GUEST_TSO4))
2317                 result |= BIT_ULL(VIRTIO_NET_F_GUEST_TSO4);
2318         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_GUEST_CSUM))
2319                 result |= BIT_ULL(VIRTIO_NET_F_GUEST_CSUM);
2320         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_CSUM))
2321                 result |= BIT_ULL(VIRTIO_NET_F_CSUM);
2322         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_HOST_TSO6))
2323                 result |= BIT_ULL(VIRTIO_NET_F_HOST_TSO6);
2324         if (dev_features & BIT_ULL(MLX5_VIRTIO_NET_F_HOST_TSO4))
2325                 result |= BIT_ULL(VIRTIO_NET_F_HOST_TSO4);
2326
2327         return result;
2328 }
2329
2330 static u64 get_supported_features(struct mlx5_core_dev *mdev)
2331 {
2332         u64 mlx_vdpa_features = 0;
2333         u16 dev_features;
2334
2335         dev_features = MLX5_CAP_DEV_VDPA_EMULATION(mdev, device_features_bits_mask);
2336         mlx_vdpa_features |= mlx_to_vritio_features(dev_features);
2337         if (MLX5_CAP_DEV_VDPA_EMULATION(mdev, virtio_version_1_0))
2338                 mlx_vdpa_features |= BIT_ULL(VIRTIO_F_VERSION_1);
2339         mlx_vdpa_features |= BIT_ULL(VIRTIO_F_ACCESS_PLATFORM);
2340         mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_CTRL_VQ);
2341         mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR);
2342         mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_MQ);
2343         mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_STATUS);
2344         mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_MTU);
2345         mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_CTRL_VLAN);
2346         mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_MAC);
2347
2348         return mlx_vdpa_features;
2349 }
2350
2351 static u64 mlx5_vdpa_get_device_features(struct vdpa_device *vdev)
2352 {
2353         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2354         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2355
2356         print_features(mvdev, ndev->mvdev.mlx_features, false);
2357         return ndev->mvdev.mlx_features;
2358 }
2359
2360 static int verify_driver_features(struct mlx5_vdpa_dev *mvdev, u64 features)
2361 {
2362         /* Minimum features to expect */
2363         if (!(features & BIT_ULL(VIRTIO_F_ACCESS_PLATFORM)))
2364                 return -EOPNOTSUPP;
2365
2366         /* Double check features combination sent down by the driver.
2367          * Fail invalid features due to absence of the depended feature.
2368          *
2369          * Per VIRTIO v1.1 specification, section 5.1.3.1 Feature bit
2370          * requirements: "VIRTIO_NET_F_MQ Requires VIRTIO_NET_F_CTRL_VQ".
2371          * By failing the invalid features sent down by untrusted drivers,
2372          * we're assured the assumption made upon is_index_valid() and
2373          * is_ctrl_vq_idx() will not be compromised.
2374          */
2375         if ((features & (BIT_ULL(VIRTIO_NET_F_MQ) | BIT_ULL(VIRTIO_NET_F_CTRL_VQ))) ==
2376             BIT_ULL(VIRTIO_NET_F_MQ))
2377                 return -EINVAL;
2378
2379         return 0;
2380 }
2381
2382 static int setup_virtqueues(struct mlx5_vdpa_dev *mvdev)
2383 {
2384         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2385         int err;
2386         int i;
2387
2388         for (i = 0; i < mvdev->max_vqs; i++) {
2389                 err = setup_vq(ndev, &ndev->vqs[i]);
2390                 if (err)
2391                         goto err_vq;
2392         }
2393
2394         return 0;
2395
2396 err_vq:
2397         for (--i; i >= 0; i--)
2398                 teardown_vq(ndev, &ndev->vqs[i]);
2399
2400         return err;
2401 }
2402
2403 static void teardown_virtqueues(struct mlx5_vdpa_net *ndev)
2404 {
2405         struct mlx5_vdpa_virtqueue *mvq;
2406         int i;
2407
2408         for (i = ndev->mvdev.max_vqs - 1; i >= 0; i--) {
2409                 mvq = &ndev->vqs[i];
2410                 if (!mvq->initialized)
2411                         continue;
2412
2413                 teardown_vq(ndev, mvq);
2414         }
2415 }
2416
2417 static void update_cvq_info(struct mlx5_vdpa_dev *mvdev)
2418 {
2419         if (MLX5_FEATURE(mvdev, VIRTIO_NET_F_CTRL_VQ)) {
2420                 if (MLX5_FEATURE(mvdev, VIRTIO_NET_F_MQ)) {
2421                         /* MQ supported. CVQ index is right above the last data virtqueue's */
2422                         mvdev->max_idx = mvdev->max_vqs;
2423                 } else {
2424                         /* Only CVQ supportted. data virtqueues occupy indices 0 and 1.
2425                          * CVQ gets index 2
2426                          */
2427                         mvdev->max_idx = 2;
2428                 }
2429         } else {
2430                 /* Two data virtqueues only: one for rx and one for tx */
2431                 mvdev->max_idx = 1;
2432         }
2433 }
2434
2435 static u8 query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport)
2436 {
2437         u32 out[MLX5_ST_SZ_DW(query_vport_state_out)] = {};
2438         u32 in[MLX5_ST_SZ_DW(query_vport_state_in)] = {};
2439         int err;
2440
2441         MLX5_SET(query_vport_state_in, in, opcode, MLX5_CMD_OP_QUERY_VPORT_STATE);
2442         MLX5_SET(query_vport_state_in, in, op_mod, opmod);
2443         MLX5_SET(query_vport_state_in, in, vport_number, vport);
2444         if (vport)
2445                 MLX5_SET(query_vport_state_in, in, other_vport, 1);
2446
2447         err = mlx5_cmd_exec_inout(mdev, query_vport_state, in, out);
2448         if (err)
2449                 return 0;
2450
2451         return MLX5_GET(query_vport_state_out, out, state);
2452 }
2453
2454 static bool get_link_state(struct mlx5_vdpa_dev *mvdev)
2455 {
2456         if (query_vport_state(mvdev->mdev, MLX5_VPORT_STATE_OP_MOD_VNIC_VPORT, 0) ==
2457             VPORT_STATE_UP)
2458                 return true;
2459
2460         return false;
2461 }
2462
2463 static void update_carrier(struct work_struct *work)
2464 {
2465         struct mlx5_vdpa_wq_ent *wqent;
2466         struct mlx5_vdpa_dev *mvdev;
2467         struct mlx5_vdpa_net *ndev;
2468
2469         wqent = container_of(work, struct mlx5_vdpa_wq_ent, work);
2470         mvdev = wqent->mvdev;
2471         ndev = to_mlx5_vdpa_ndev(mvdev);
2472         if (get_link_state(mvdev))
2473                 ndev->config.status |= cpu_to_mlx5vdpa16(mvdev, VIRTIO_NET_S_LINK_UP);
2474         else
2475                 ndev->config.status &= cpu_to_mlx5vdpa16(mvdev, ~VIRTIO_NET_S_LINK_UP);
2476
2477         if (ndev->config_cb.callback)
2478                 ndev->config_cb.callback(ndev->config_cb.private);
2479
2480         kfree(wqent);
2481 }
2482
2483 static int queue_link_work(struct mlx5_vdpa_net *ndev)
2484 {
2485         struct mlx5_vdpa_wq_ent *wqent;
2486
2487         wqent = kzalloc(sizeof(*wqent), GFP_ATOMIC);
2488         if (!wqent)
2489                 return -ENOMEM;
2490
2491         wqent->mvdev = &ndev->mvdev;
2492         INIT_WORK(&wqent->work, update_carrier);
2493         queue_work(ndev->mvdev.wq, &wqent->work);
2494         return 0;
2495 }
2496
2497 static int event_handler(struct notifier_block *nb, unsigned long event, void *param)
2498 {
2499         struct mlx5_vdpa_net *ndev = container_of(nb, struct mlx5_vdpa_net, nb);
2500         struct mlx5_eqe *eqe = param;
2501         int ret = NOTIFY_DONE;
2502
2503         if (event == MLX5_EVENT_TYPE_PORT_CHANGE) {
2504                 switch (eqe->sub_type) {
2505                 case MLX5_PORT_CHANGE_SUBTYPE_DOWN:
2506                 case MLX5_PORT_CHANGE_SUBTYPE_ACTIVE:
2507                         if (queue_link_work(ndev))
2508                                 return NOTIFY_DONE;
2509
2510                         ret = NOTIFY_OK;
2511                         break;
2512                 default:
2513                         return NOTIFY_DONE;
2514                 }
2515                 return ret;
2516         }
2517         return ret;
2518 }
2519
2520 static void register_link_notifier(struct mlx5_vdpa_net *ndev)
2521 {
2522         if (!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_STATUS)))
2523                 return;
2524
2525         ndev->nb.notifier_call = event_handler;
2526         mlx5_notifier_register(ndev->mvdev.mdev, &ndev->nb);
2527         ndev->nb_registered = true;
2528         queue_link_work(ndev);
2529 }
2530
2531 static void unregister_link_notifier(struct mlx5_vdpa_net *ndev)
2532 {
2533         if (!ndev->nb_registered)
2534                 return;
2535
2536         ndev->nb_registered = false;
2537         mlx5_notifier_unregister(ndev->mvdev.mdev, &ndev->nb);
2538         if (ndev->mvdev.wq)
2539                 flush_workqueue(ndev->mvdev.wq);
2540 }
2541
2542 static int mlx5_vdpa_set_driver_features(struct vdpa_device *vdev, u64 features)
2543 {
2544         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2545         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2546         int err;
2547
2548         print_features(mvdev, features, true);
2549
2550         err = verify_driver_features(mvdev, features);
2551         if (err)
2552                 return err;
2553
2554         ndev->mvdev.actual_features = features & ndev->mvdev.mlx_features;
2555         if (ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_MQ))
2556                 ndev->rqt_size = mlx5vdpa16_to_cpu(mvdev, ndev->config.max_virtqueue_pairs);
2557         else
2558                 ndev->rqt_size = 1;
2559
2560         /* Device must start with 1 queue pair, as per VIRTIO v1.2 spec, section
2561          * 5.1.6.5.5 "Device operation in multiqueue mode":
2562          *
2563          * Multiqueue is disabled by default.
2564          * The driver enables multiqueue by sending a command using class
2565          * VIRTIO_NET_CTRL_MQ. The command selects the mode of multiqueue
2566          * operation, as follows: ...
2567          */
2568         ndev->cur_num_vqs = 2;
2569
2570         update_cvq_info(mvdev);
2571         return err;
2572 }
2573
2574 static void mlx5_vdpa_set_config_cb(struct vdpa_device *vdev, struct vdpa_callback *cb)
2575 {
2576         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2577         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2578
2579         ndev->config_cb = *cb;
2580 }
2581
2582 #define MLX5_VDPA_MAX_VQ_ENTRIES 256
2583 static u16 mlx5_vdpa_get_vq_num_max(struct vdpa_device *vdev)
2584 {
2585         return MLX5_VDPA_MAX_VQ_ENTRIES;
2586 }
2587
2588 static u32 mlx5_vdpa_get_device_id(struct vdpa_device *vdev)
2589 {
2590         return VIRTIO_ID_NET;
2591 }
2592
2593 static u32 mlx5_vdpa_get_vendor_id(struct vdpa_device *vdev)
2594 {
2595         return PCI_VENDOR_ID_MELLANOX;
2596 }
2597
2598 static u8 mlx5_vdpa_get_status(struct vdpa_device *vdev)
2599 {
2600         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2601         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2602
2603         print_status(mvdev, ndev->mvdev.status, false);
2604         return ndev->mvdev.status;
2605 }
2606
2607 static int save_channel_info(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
2608 {
2609         struct mlx5_vq_restore_info *ri = &mvq->ri;
2610         struct mlx5_virtq_attr attr = {};
2611         int err;
2612
2613         if (mvq->initialized) {
2614                 err = query_virtqueue(ndev, mvq, &attr);
2615                 if (err)
2616                         return err;
2617         }
2618
2619         ri->avail_index = attr.available_index;
2620         ri->used_index = attr.used_index;
2621         ri->ready = mvq->ready;
2622         ri->num_ent = mvq->num_ent;
2623         ri->desc_addr = mvq->desc_addr;
2624         ri->device_addr = mvq->device_addr;
2625         ri->driver_addr = mvq->driver_addr;
2626         ri->map = mvq->map;
2627         ri->restore = true;
2628         return 0;
2629 }
2630
2631 static int save_channels_info(struct mlx5_vdpa_net *ndev)
2632 {
2633         int i;
2634
2635         for (i = 0; i < ndev->mvdev.max_vqs; i++) {
2636                 memset(&ndev->vqs[i].ri, 0, sizeof(ndev->vqs[i].ri));
2637                 save_channel_info(ndev, &ndev->vqs[i]);
2638         }
2639         return 0;
2640 }
2641
2642 static void mlx5_clear_vqs(struct mlx5_vdpa_net *ndev)
2643 {
2644         int i;
2645
2646         for (i = 0; i < ndev->mvdev.max_vqs; i++)
2647                 memset(&ndev->vqs[i], 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
2648 }
2649
2650 static void restore_channels_info(struct mlx5_vdpa_net *ndev)
2651 {
2652         struct mlx5_vdpa_virtqueue *mvq;
2653         struct mlx5_vq_restore_info *ri;
2654         int i;
2655
2656         mlx5_clear_vqs(ndev);
2657         init_mvqs(ndev);
2658         for (i = 0; i < ndev->mvdev.max_vqs; i++) {
2659                 mvq = &ndev->vqs[i];
2660                 ri = &mvq->ri;
2661                 if (!ri->restore)
2662                         continue;
2663
2664                 mvq->avail_idx = ri->avail_index;
2665                 mvq->used_idx = ri->used_index;
2666                 mvq->ready = ri->ready;
2667                 mvq->num_ent = ri->num_ent;
2668                 mvq->desc_addr = ri->desc_addr;
2669                 mvq->device_addr = ri->device_addr;
2670                 mvq->driver_addr = ri->driver_addr;
2671                 mvq->map = ri->map;
2672         }
2673 }
2674
2675 static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev,
2676                                 struct vhost_iotlb *iotlb, unsigned int asid)
2677 {
2678         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2679         int err;
2680
2681         suspend_vqs(ndev);
2682         err = save_channels_info(ndev);
2683         if (err)
2684                 goto err_mr;
2685
2686         teardown_driver(ndev);
2687         mlx5_vdpa_destroy_mr_asid(mvdev, asid);
2688         err = mlx5_vdpa_create_mr(mvdev, iotlb, asid);
2689         if (err)
2690                 goto err_mr;
2691
2692         if (!(mvdev->status & VIRTIO_CONFIG_S_DRIVER_OK) || mvdev->suspended)
2693                 goto err_mr;
2694
2695         restore_channels_info(ndev);
2696         err = setup_driver(mvdev);
2697         if (err)
2698                 goto err_setup;
2699
2700         return 0;
2701
2702 err_setup:
2703         mlx5_vdpa_destroy_mr_asid(mvdev, asid);
2704 err_mr:
2705         return err;
2706 }
2707
2708 /* reslock must be held for this function */
2709 static int setup_driver(struct mlx5_vdpa_dev *mvdev)
2710 {
2711         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2712         int err;
2713
2714         WARN_ON(!rwsem_is_locked(&ndev->reslock));
2715
2716         if (ndev->setup) {
2717                 mlx5_vdpa_warn(mvdev, "setup driver called for already setup driver\n");
2718                 err = 0;
2719                 goto out;
2720         }
2721         mlx5_vdpa_add_debugfs(ndev);
2722
2723         err = read_umem_params(ndev);
2724         if (err)
2725                 goto err_setup;
2726
2727         err = setup_virtqueues(mvdev);
2728         if (err) {
2729                 mlx5_vdpa_warn(mvdev, "setup_virtqueues\n");
2730                 goto err_setup;
2731         }
2732
2733         err = create_rqt(ndev);
2734         if (err) {
2735                 mlx5_vdpa_warn(mvdev, "create_rqt\n");
2736                 goto err_rqt;
2737         }
2738
2739         err = create_tir(ndev);
2740         if (err) {
2741                 mlx5_vdpa_warn(mvdev, "create_tir\n");
2742                 goto err_tir;
2743         }
2744
2745         err = setup_steering(ndev);
2746         if (err) {
2747                 mlx5_vdpa_warn(mvdev, "setup_steering\n");
2748                 goto err_fwd;
2749         }
2750         ndev->setup = true;
2751
2752         return 0;
2753
2754 err_fwd:
2755         destroy_tir(ndev);
2756 err_tir:
2757         destroy_rqt(ndev);
2758 err_rqt:
2759         teardown_virtqueues(ndev);
2760 err_setup:
2761         mlx5_vdpa_remove_debugfs(ndev);
2762 out:
2763         return err;
2764 }
2765
2766 /* reslock must be held for this function */
2767 static void teardown_driver(struct mlx5_vdpa_net *ndev)
2768 {
2769
2770         WARN_ON(!rwsem_is_locked(&ndev->reslock));
2771
2772         if (!ndev->setup)
2773                 return;
2774
2775         mlx5_vdpa_remove_debugfs(ndev);
2776         teardown_steering(ndev);
2777         destroy_tir(ndev);
2778         destroy_rqt(ndev);
2779         teardown_virtqueues(ndev);
2780         ndev->setup = false;
2781 }
2782
2783 static void clear_vqs_ready(struct mlx5_vdpa_net *ndev)
2784 {
2785         int i;
2786
2787         for (i = 0; i < ndev->mvdev.max_vqs; i++)
2788                 ndev->vqs[i].ready = false;
2789
2790         ndev->mvdev.cvq.ready = false;
2791 }
2792
2793 static int setup_cvq_vring(struct mlx5_vdpa_dev *mvdev)
2794 {
2795         struct mlx5_control_vq *cvq = &mvdev->cvq;
2796         int err = 0;
2797
2798         if (mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ))
2799                 err = vringh_init_iotlb(&cvq->vring, mvdev->actual_features,
2800                                         MLX5_CVQ_MAX_ENT, false,
2801                                         (struct vring_desc *)(uintptr_t)cvq->desc_addr,
2802                                         (struct vring_avail *)(uintptr_t)cvq->driver_addr,
2803                                         (struct vring_used *)(uintptr_t)cvq->device_addr);
2804
2805         return err;
2806 }
2807
2808 static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status)
2809 {
2810         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2811         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2812         int err;
2813
2814         print_status(mvdev, status, true);
2815
2816         down_write(&ndev->reslock);
2817
2818         if ((status ^ ndev->mvdev.status) & VIRTIO_CONFIG_S_DRIVER_OK) {
2819                 if (status & VIRTIO_CONFIG_S_DRIVER_OK) {
2820                         err = setup_cvq_vring(mvdev);
2821                         if (err) {
2822                                 mlx5_vdpa_warn(mvdev, "failed to setup control VQ vring\n");
2823                                 goto err_setup;
2824                         }
2825                         register_link_notifier(ndev);
2826                         err = setup_driver(mvdev);
2827                         if (err) {
2828                                 mlx5_vdpa_warn(mvdev, "failed to setup driver\n");
2829                                 goto err_driver;
2830                         }
2831                 } else {
2832                         mlx5_vdpa_warn(mvdev, "did not expect DRIVER_OK to be cleared\n");
2833                         goto err_clear;
2834                 }
2835         }
2836
2837         ndev->mvdev.status = status;
2838         up_write(&ndev->reslock);
2839         return;
2840
2841 err_driver:
2842         unregister_link_notifier(ndev);
2843 err_setup:
2844         mlx5_vdpa_destroy_mr(&ndev->mvdev);
2845         ndev->mvdev.status |= VIRTIO_CONFIG_S_FAILED;
2846 err_clear:
2847         up_write(&ndev->reslock);
2848 }
2849
2850 static void init_group_to_asid_map(struct mlx5_vdpa_dev *mvdev)
2851 {
2852         int i;
2853
2854         /* default mapping all groups are mapped to asid 0 */
2855         for (i = 0; i < MLX5_VDPA_NUMVQ_GROUPS; i++)
2856                 mvdev->group2asid[i] = 0;
2857 }
2858
2859 static int mlx5_vdpa_reset(struct vdpa_device *vdev)
2860 {
2861         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2862         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2863
2864         print_status(mvdev, 0, true);
2865         mlx5_vdpa_info(mvdev, "performing device reset\n");
2866
2867         down_write(&ndev->reslock);
2868         unregister_link_notifier(ndev);
2869         teardown_driver(ndev);
2870         clear_vqs_ready(ndev);
2871         mlx5_vdpa_destroy_mr(&ndev->mvdev);
2872         ndev->mvdev.status = 0;
2873         ndev->mvdev.suspended = false;
2874         ndev->cur_num_vqs = 0;
2875         ndev->mvdev.cvq.received_desc = 0;
2876         ndev->mvdev.cvq.completed_desc = 0;
2877         memset(ndev->event_cbs, 0, sizeof(*ndev->event_cbs) * (mvdev->max_vqs + 1));
2878         ndev->mvdev.actual_features = 0;
2879         init_group_to_asid_map(mvdev);
2880         ++mvdev->generation;
2881
2882         if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) {
2883                 if (mlx5_vdpa_create_mr(mvdev, NULL, 0))
2884                         mlx5_vdpa_warn(mvdev, "create MR failed\n");
2885         }
2886         up_write(&ndev->reslock);
2887
2888         return 0;
2889 }
2890
2891 static size_t mlx5_vdpa_get_config_size(struct vdpa_device *vdev)
2892 {
2893         return sizeof(struct virtio_net_config);
2894 }
2895
2896 static void mlx5_vdpa_get_config(struct vdpa_device *vdev, unsigned int offset, void *buf,
2897                                  unsigned int len)
2898 {
2899         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2900         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2901
2902         if (offset + len <= sizeof(struct virtio_net_config))
2903                 memcpy(buf, (u8 *)&ndev->config + offset, len);
2904 }
2905
2906 static void mlx5_vdpa_set_config(struct vdpa_device *vdev, unsigned int offset, const void *buf,
2907                                  unsigned int len)
2908 {
2909         /* not supported */
2910 }
2911
2912 static u32 mlx5_vdpa_get_generation(struct vdpa_device *vdev)
2913 {
2914         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2915
2916         return mvdev->generation;
2917 }
2918
2919 static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb,
2920                         unsigned int asid)
2921 {
2922         bool change_map;
2923         int err;
2924
2925         err = mlx5_vdpa_handle_set_map(mvdev, iotlb, &change_map, asid);
2926         if (err) {
2927                 mlx5_vdpa_warn(mvdev, "set map failed(%d)\n", err);
2928                 return err;
2929         }
2930
2931         if (change_map)
2932                 err = mlx5_vdpa_change_map(mvdev, iotlb, asid);
2933
2934         return err;
2935 }
2936
2937 static int mlx5_vdpa_set_map(struct vdpa_device *vdev, unsigned int asid,
2938                              struct vhost_iotlb *iotlb)
2939 {
2940         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2941         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
2942         int err = -EINVAL;
2943
2944         down_write(&ndev->reslock);
2945         err = set_map_data(mvdev, iotlb, asid);
2946         up_write(&ndev->reslock);
2947         return err;
2948 }
2949
2950 static struct device *mlx5_get_vq_dma_dev(struct vdpa_device *vdev, u16 idx)
2951 {
2952         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2953
2954         if (is_ctrl_vq_idx(mvdev, idx))
2955                 return &vdev->dev;
2956
2957         return mvdev->vdev.dma_dev;
2958 }
2959
2960 static void free_irqs(struct mlx5_vdpa_net *ndev)
2961 {
2962         struct mlx5_vdpa_irq_pool_entry *ent;
2963         int i;
2964
2965         if (!msix_mode_supported(&ndev->mvdev))
2966                 return;
2967
2968         if (!ndev->irqp.entries)
2969                 return;
2970
2971         for (i = ndev->irqp.num_ent - 1; i >= 0; i--) {
2972                 ent = ndev->irqp.entries + i;
2973                 if (ent->map.virq)
2974                         pci_msix_free_irq(ndev->mvdev.mdev->pdev, ent->map);
2975         }
2976         kfree(ndev->irqp.entries);
2977 }
2978
2979 static void mlx5_vdpa_free(struct vdpa_device *vdev)
2980 {
2981         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
2982         struct mlx5_core_dev *pfmdev;
2983         struct mlx5_vdpa_net *ndev;
2984
2985         ndev = to_mlx5_vdpa_ndev(mvdev);
2986
2987         free_resources(ndev);
2988         mlx5_vdpa_destroy_mr(mvdev);
2989         if (!is_zero_ether_addr(ndev->config.mac)) {
2990                 pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev));
2991                 mlx5_mpfs_del_mac(pfmdev, ndev->config.mac);
2992         }
2993         mlx5_vdpa_free_resources(&ndev->mvdev);
2994         free_irqs(ndev);
2995         kfree(ndev->event_cbs);
2996         kfree(ndev->vqs);
2997 }
2998
2999 static struct vdpa_notification_area mlx5_get_vq_notification(struct vdpa_device *vdev, u16 idx)
3000 {
3001         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
3002         struct vdpa_notification_area ret = {};
3003         struct mlx5_vdpa_net *ndev;
3004         phys_addr_t addr;
3005
3006         if (!is_index_valid(mvdev, idx) || is_ctrl_vq_idx(mvdev, idx))
3007                 return ret;
3008
3009         /* If SF BAR size is smaller than PAGE_SIZE, do not use direct
3010          * notification to avoid the risk of mapping pages that contain BAR of more
3011          * than one SF
3012          */
3013         if (MLX5_CAP_GEN(mvdev->mdev, log_min_sf_size) + 12 < PAGE_SHIFT)
3014                 return ret;
3015
3016         ndev = to_mlx5_vdpa_ndev(mvdev);
3017         addr = (phys_addr_t)ndev->mvdev.res.phys_kick_addr;
3018         ret.addr = addr;
3019         ret.size = PAGE_SIZE;
3020         return ret;
3021 }
3022
3023 static int mlx5_get_vq_irq(struct vdpa_device *vdev, u16 idx)
3024 {
3025         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
3026         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
3027         struct mlx5_vdpa_virtqueue *mvq;
3028
3029         if (!is_index_valid(mvdev, idx))
3030                 return -EINVAL;
3031
3032         if (is_ctrl_vq_idx(mvdev, idx))
3033                 return -EOPNOTSUPP;
3034
3035         mvq = &ndev->vqs[idx];
3036         if (!mvq->map.virq)
3037                 return -EOPNOTSUPP;
3038
3039         return mvq->map.virq;
3040 }
3041
3042 static u64 mlx5_vdpa_get_driver_features(struct vdpa_device *vdev)
3043 {
3044         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
3045
3046         return mvdev->actual_features;
3047 }
3048
3049 static int counter_set_query(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
3050                              u64 *received_desc, u64 *completed_desc)
3051 {
3052         u32 in[MLX5_ST_SZ_DW(query_virtio_q_counters_in)] = {};
3053         u32 out[MLX5_ST_SZ_DW(query_virtio_q_counters_out)] = {};
3054         void *cmd_hdr;
3055         void *ctx;
3056         int err;
3057
3058         if (!counters_supported(&ndev->mvdev))
3059                 return -EOPNOTSUPP;
3060
3061         if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY)
3062                 return -EAGAIN;
3063
3064         cmd_hdr = MLX5_ADDR_OF(query_virtio_q_counters_in, in, hdr);
3065
3066         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_QUERY_GENERAL_OBJECT);
3067         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS);
3068         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
3069         MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->counter_set_id);
3070
3071         err = mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out));
3072         if (err)
3073                 return err;
3074
3075         ctx = MLX5_ADDR_OF(query_virtio_q_counters_out, out, counters);
3076         *received_desc = MLX5_GET64(virtio_q_counters, ctx, received_desc);
3077         *completed_desc = MLX5_GET64(virtio_q_counters, ctx, completed_desc);
3078         return 0;
3079 }
3080
3081 static int mlx5_vdpa_get_vendor_vq_stats(struct vdpa_device *vdev, u16 idx,
3082                                          struct sk_buff *msg,
3083                                          struct netlink_ext_ack *extack)
3084 {
3085         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
3086         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
3087         struct mlx5_vdpa_virtqueue *mvq;
3088         struct mlx5_control_vq *cvq;
3089         u64 received_desc;
3090         u64 completed_desc;
3091         int err = 0;
3092
3093         down_read(&ndev->reslock);
3094         if (!is_index_valid(mvdev, idx)) {
3095                 NL_SET_ERR_MSG_MOD(extack, "virtqueue index is not valid");
3096                 err = -EINVAL;
3097                 goto out_err;
3098         }
3099
3100         if (idx == ctrl_vq_idx(mvdev)) {
3101                 cvq = &mvdev->cvq;
3102                 received_desc = cvq->received_desc;
3103                 completed_desc = cvq->completed_desc;
3104                 goto out;
3105         }
3106
3107         mvq = &ndev->vqs[idx];
3108         err = counter_set_query(ndev, mvq, &received_desc, &completed_desc);
3109         if (err) {
3110                 NL_SET_ERR_MSG_MOD(extack, "failed to query hardware");
3111                 goto out_err;
3112         }
3113
3114 out:
3115         err = -EMSGSIZE;
3116         if (nla_put_string(msg, VDPA_ATTR_DEV_VENDOR_ATTR_NAME, "received_desc"))
3117                 goto out_err;
3118
3119         if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_VENDOR_ATTR_VALUE, received_desc,
3120                               VDPA_ATTR_PAD))
3121                 goto out_err;
3122
3123         if (nla_put_string(msg, VDPA_ATTR_DEV_VENDOR_ATTR_NAME, "completed_desc"))
3124                 goto out_err;
3125
3126         if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_VENDOR_ATTR_VALUE, completed_desc,
3127                               VDPA_ATTR_PAD))
3128                 goto out_err;
3129
3130         err = 0;
3131 out_err:
3132         up_read(&ndev->reslock);
3133         return err;
3134 }
3135
3136 static void mlx5_vdpa_cvq_suspend(struct mlx5_vdpa_dev *mvdev)
3137 {
3138         struct mlx5_control_vq *cvq;
3139
3140         if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
3141                 return;
3142
3143         cvq = &mvdev->cvq;
3144         cvq->ready = false;
3145 }
3146
3147 static int mlx5_vdpa_suspend(struct vdpa_device *vdev)
3148 {
3149         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
3150         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
3151         struct mlx5_vdpa_virtqueue *mvq;
3152         int i;
3153
3154         mlx5_vdpa_info(mvdev, "suspending device\n");
3155
3156         down_write(&ndev->reslock);
3157         unregister_link_notifier(ndev);
3158         for (i = 0; i < ndev->cur_num_vqs; i++) {
3159                 mvq = &ndev->vqs[i];
3160                 suspend_vq(ndev, mvq);
3161         }
3162         mlx5_vdpa_cvq_suspend(mvdev);
3163         mvdev->suspended = true;
3164         up_write(&ndev->reslock);
3165         return 0;
3166 }
3167
3168 static int mlx5_set_group_asid(struct vdpa_device *vdev, u32 group,
3169                                unsigned int asid)
3170 {
3171         struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
3172
3173         if (group >= MLX5_VDPA_NUMVQ_GROUPS)
3174                 return -EINVAL;
3175
3176         mvdev->group2asid[group] = asid;
3177         return 0;
3178 }
3179
3180 static const struct vdpa_config_ops mlx5_vdpa_ops = {
3181         .set_vq_address = mlx5_vdpa_set_vq_address,
3182         .set_vq_num = mlx5_vdpa_set_vq_num,
3183         .kick_vq = mlx5_vdpa_kick_vq,
3184         .set_vq_cb = mlx5_vdpa_set_vq_cb,
3185         .set_vq_ready = mlx5_vdpa_set_vq_ready,
3186         .get_vq_ready = mlx5_vdpa_get_vq_ready,
3187         .set_vq_state = mlx5_vdpa_set_vq_state,
3188         .get_vq_state = mlx5_vdpa_get_vq_state,
3189         .get_vendor_vq_stats = mlx5_vdpa_get_vendor_vq_stats,
3190         .get_vq_notification = mlx5_get_vq_notification,
3191         .get_vq_irq = mlx5_get_vq_irq,
3192         .get_vq_align = mlx5_vdpa_get_vq_align,
3193         .get_vq_group = mlx5_vdpa_get_vq_group,
3194         .get_device_features = mlx5_vdpa_get_device_features,
3195         .set_driver_features = mlx5_vdpa_set_driver_features,
3196         .get_driver_features = mlx5_vdpa_get_driver_features,
3197         .set_config_cb = mlx5_vdpa_set_config_cb,
3198         .get_vq_num_max = mlx5_vdpa_get_vq_num_max,
3199         .get_device_id = mlx5_vdpa_get_device_id,
3200         .get_vendor_id = mlx5_vdpa_get_vendor_id,
3201         .get_status = mlx5_vdpa_get_status,
3202         .set_status = mlx5_vdpa_set_status,
3203         .reset = mlx5_vdpa_reset,
3204         .get_config_size = mlx5_vdpa_get_config_size,
3205         .get_config = mlx5_vdpa_get_config,
3206         .set_config = mlx5_vdpa_set_config,
3207         .get_generation = mlx5_vdpa_get_generation,
3208         .set_map = mlx5_vdpa_set_map,
3209         .set_group_asid = mlx5_set_group_asid,
3210         .get_vq_dma_dev = mlx5_get_vq_dma_dev,
3211         .free = mlx5_vdpa_free,
3212         .suspend = mlx5_vdpa_suspend,
3213 };
3214
3215 static int query_mtu(struct mlx5_core_dev *mdev, u16 *mtu)
3216 {
3217         u16 hw_mtu;
3218         int err;
3219
3220         err = mlx5_query_nic_vport_mtu(mdev, &hw_mtu);
3221         if (err)
3222                 return err;
3223
3224         *mtu = hw_mtu - MLX5V_ETH_HARD_MTU;
3225         return 0;
3226 }
3227
3228 static int alloc_resources(struct mlx5_vdpa_net *ndev)
3229 {
3230         struct mlx5_vdpa_net_resources *res = &ndev->res;
3231         int err;
3232
3233         if (res->valid) {
3234                 mlx5_vdpa_warn(&ndev->mvdev, "resources already allocated\n");
3235                 return -EEXIST;
3236         }
3237
3238         err = mlx5_vdpa_alloc_transport_domain(&ndev->mvdev, &res->tdn);
3239         if (err)
3240                 return err;
3241
3242         err = create_tis(ndev);
3243         if (err)
3244                 goto err_tis;
3245
3246         res->valid = true;
3247
3248         return 0;
3249
3250 err_tis:
3251         mlx5_vdpa_dealloc_transport_domain(&ndev->mvdev, res->tdn);
3252         return err;
3253 }
3254
3255 static void free_resources(struct mlx5_vdpa_net *ndev)
3256 {
3257         struct mlx5_vdpa_net_resources *res = &ndev->res;
3258
3259         if (!res->valid)
3260                 return;
3261
3262         destroy_tis(ndev);
3263         mlx5_vdpa_dealloc_transport_domain(&ndev->mvdev, res->tdn);
3264         res->valid = false;
3265 }
3266
3267 static void init_mvqs(struct mlx5_vdpa_net *ndev)
3268 {
3269         struct mlx5_vdpa_virtqueue *mvq;
3270         int i;
3271
3272         for (i = 0; i < ndev->mvdev.max_vqs; ++i) {
3273                 mvq = &ndev->vqs[i];
3274                 memset(mvq, 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
3275                 mvq->index = i;
3276                 mvq->ndev = ndev;
3277                 mvq->fwqp.fw = true;
3278                 mvq->fw_state = MLX5_VIRTIO_NET_Q_OBJECT_NONE;
3279         }
3280         for (; i < ndev->mvdev.max_vqs; i++) {
3281                 mvq = &ndev->vqs[i];
3282                 memset(mvq, 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
3283                 mvq->index = i;
3284                 mvq->ndev = ndev;
3285         }
3286 }
3287
3288 struct mlx5_vdpa_mgmtdev {
3289         struct vdpa_mgmt_dev mgtdev;
3290         struct mlx5_adev *madev;
3291         struct mlx5_vdpa_net *ndev;
3292 };
3293
3294 static int config_func_mtu(struct mlx5_core_dev *mdev, u16 mtu)
3295 {
3296         int inlen = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in);
3297         void *in;
3298         int err;
3299
3300         in = kvzalloc(inlen, GFP_KERNEL);
3301         if (!in)
3302                 return -ENOMEM;
3303
3304         MLX5_SET(modify_nic_vport_context_in, in, field_select.mtu, 1);
3305         MLX5_SET(modify_nic_vport_context_in, in, nic_vport_context.mtu,
3306                  mtu + MLX5V_ETH_HARD_MTU);
3307         MLX5_SET(modify_nic_vport_context_in, in, opcode,
3308                  MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT);
3309
3310         err = mlx5_cmd_exec_in(mdev, modify_nic_vport_context, in);
3311
3312         kvfree(in);
3313         return err;
3314 }
3315
3316 static void allocate_irqs(struct mlx5_vdpa_net *ndev)
3317 {
3318         struct mlx5_vdpa_irq_pool_entry *ent;
3319         int i;
3320
3321         if (!msix_mode_supported(&ndev->mvdev))
3322                 return;
3323
3324         if (!ndev->mvdev.mdev->pdev)
3325                 return;
3326
3327         ndev->irqp.entries = kcalloc(ndev->mvdev.max_vqs, sizeof(*ndev->irqp.entries), GFP_KERNEL);
3328         if (!ndev->irqp.entries)
3329                 return;
3330
3331
3332         for (i = 0; i < ndev->mvdev.max_vqs; i++) {
3333                 ent = ndev->irqp.entries + i;
3334                 snprintf(ent->name, MLX5_VDPA_IRQ_NAME_LEN, "%s-vq-%d",
3335                          dev_name(&ndev->mvdev.vdev.dev), i);
3336                 ent->map = pci_msix_alloc_irq_at(ndev->mvdev.mdev->pdev, MSI_ANY_INDEX, NULL);
3337                 if (!ent->map.virq)
3338                         return;
3339
3340                 ndev->irqp.num_ent++;
3341         }
3342 }
3343
3344 static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
3345                              const struct vdpa_dev_set_config *add_config)
3346 {
3347         struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
3348         struct virtio_net_config *config;
3349         struct mlx5_core_dev *pfmdev;
3350         struct mlx5_vdpa_dev *mvdev;
3351         struct mlx5_vdpa_net *ndev;
3352         struct mlx5_core_dev *mdev;
3353         u64 device_features;
3354         u32 max_vqs;
3355         u16 mtu;
3356         int err;
3357
3358         if (mgtdev->ndev)
3359                 return -ENOSPC;
3360
3361         mdev = mgtdev->madev->mdev;
3362         device_features = mgtdev->mgtdev.supported_features;
3363         if (add_config->mask & BIT_ULL(VDPA_ATTR_DEV_FEATURES)) {
3364                 if (add_config->device_features & ~device_features) {
3365                         dev_warn(mdev->device,
3366                                  "The provisioned features 0x%llx are not supported by this device with features 0x%llx\n",
3367                                  add_config->device_features, device_features);
3368                         return -EINVAL;
3369                 }
3370                 device_features &= add_config->device_features;
3371         } else {
3372                 device_features &= ~BIT_ULL(VIRTIO_NET_F_MRG_RXBUF);
3373         }
3374         if (!(device_features & BIT_ULL(VIRTIO_F_VERSION_1) &&
3375               device_features & BIT_ULL(VIRTIO_F_ACCESS_PLATFORM))) {
3376                 dev_warn(mdev->device,
3377                          "Must provision minimum features 0x%llx for this device",
3378                          BIT_ULL(VIRTIO_F_VERSION_1) | BIT_ULL(VIRTIO_F_ACCESS_PLATFORM));
3379                 return -EOPNOTSUPP;
3380         }
3381
3382         if (!(MLX5_CAP_DEV_VDPA_EMULATION(mdev, virtio_queue_type) &
3383             MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT)) {
3384                 dev_warn(mdev->device, "missing support for split virtqueues\n");
3385                 return -EOPNOTSUPP;
3386         }
3387
3388         max_vqs = min_t(int, MLX5_CAP_DEV_VDPA_EMULATION(mdev, max_num_virtio_queues),
3389                         1 << MLX5_CAP_GEN(mdev, log_max_rqt_size));
3390         if (max_vqs < 2) {
3391                 dev_warn(mdev->device,
3392                          "%d virtqueues are supported. At least 2 are required\n",
3393                          max_vqs);
3394                 return -EAGAIN;
3395         }
3396
3397         if (add_config->mask & BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MAX_VQP)) {
3398                 if (add_config->net.max_vq_pairs > max_vqs / 2)
3399                         return -EINVAL;
3400                 max_vqs = min_t(u32, max_vqs, 2 * add_config->net.max_vq_pairs);
3401         } else {
3402                 max_vqs = 2;
3403         }
3404
3405         ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops,
3406                                  MLX5_VDPA_NUMVQ_GROUPS, MLX5_VDPA_NUM_AS, name, false);
3407         if (IS_ERR(ndev))
3408                 return PTR_ERR(ndev);
3409
3410         ndev->mvdev.max_vqs = max_vqs;
3411         mvdev = &ndev->mvdev;
3412         mvdev->mdev = mdev;
3413
3414         ndev->vqs = kcalloc(max_vqs, sizeof(*ndev->vqs), GFP_KERNEL);
3415         ndev->event_cbs = kcalloc(max_vqs + 1, sizeof(*ndev->event_cbs), GFP_KERNEL);
3416         if (!ndev->vqs || !ndev->event_cbs) {
3417                 err = -ENOMEM;
3418                 goto err_alloc;
3419         }
3420
3421         init_mvqs(ndev);
3422         allocate_irqs(ndev);
3423         init_rwsem(&ndev->reslock);
3424         config = &ndev->config;
3425
3426         if (add_config->mask & BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MTU)) {
3427                 err = config_func_mtu(mdev, add_config->net.mtu);
3428                 if (err)
3429                         goto err_alloc;
3430         }
3431
3432         if (device_features & BIT_ULL(VIRTIO_NET_F_MTU)) {
3433                 err = query_mtu(mdev, &mtu);
3434                 if (err)
3435                         goto err_alloc;
3436
3437                 ndev->config.mtu = cpu_to_mlx5vdpa16(mvdev, mtu);
3438         }
3439
3440         if (device_features & BIT_ULL(VIRTIO_NET_F_STATUS)) {
3441                 if (get_link_state(mvdev))
3442                         ndev->config.status |= cpu_to_mlx5vdpa16(mvdev, VIRTIO_NET_S_LINK_UP);
3443                 else
3444                         ndev->config.status &= cpu_to_mlx5vdpa16(mvdev, ~VIRTIO_NET_S_LINK_UP);
3445         }
3446
3447         if (add_config->mask & (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR)) {
3448                 memcpy(ndev->config.mac, add_config->net.mac, ETH_ALEN);
3449         /* No bother setting mac address in config if not going to provision _F_MAC */
3450         } else if ((add_config->mask & BIT_ULL(VDPA_ATTR_DEV_FEATURES)) == 0 ||
3451                    device_features & BIT_ULL(VIRTIO_NET_F_MAC)) {
3452                 err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config->mac);
3453                 if (err)
3454                         goto err_alloc;
3455         }
3456
3457         if (!is_zero_ether_addr(config->mac)) {
3458                 pfmdev = pci_get_drvdata(pci_physfn(mdev->pdev));
3459                 err = mlx5_mpfs_add_mac(pfmdev, config->mac);
3460                 if (err)
3461                         goto err_alloc;
3462         } else if ((add_config->mask & BIT_ULL(VDPA_ATTR_DEV_FEATURES)) == 0) {
3463                 /*
3464                  * We used to clear _F_MAC feature bit if seeing
3465                  * zero mac address when device features are not
3466                  * specifically provisioned. Keep the behaviour
3467                  * so old scripts do not break.
3468                  */
3469                 device_features &= ~BIT_ULL(VIRTIO_NET_F_MAC);
3470         } else if (device_features & BIT_ULL(VIRTIO_NET_F_MAC)) {
3471                 /* Don't provision zero mac address for _F_MAC */
3472                 mlx5_vdpa_warn(&ndev->mvdev,
3473                                "No mac address provisioned?\n");
3474                 err = -EINVAL;
3475                 goto err_alloc;
3476         }
3477
3478         if (device_features & BIT_ULL(VIRTIO_NET_F_MQ))
3479                 config->max_virtqueue_pairs = cpu_to_mlx5vdpa16(mvdev, max_vqs / 2);
3480
3481         ndev->mvdev.mlx_features = device_features;
3482         mvdev->vdev.dma_dev = &mdev->pdev->dev;
3483         err = mlx5_vdpa_alloc_resources(&ndev->mvdev);
3484         if (err)
3485                 goto err_mpfs;
3486
3487         if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) {
3488                 err = mlx5_vdpa_create_mr(mvdev, NULL, 0);
3489                 if (err)
3490                         goto err_res;
3491         }
3492
3493         err = alloc_resources(ndev);
3494         if (err)
3495                 goto err_mr;
3496
3497         ndev->cvq_ent.mvdev = mvdev;
3498         INIT_WORK(&ndev->cvq_ent.work, mlx5_cvq_kick_handler);
3499         mvdev->wq = create_singlethread_workqueue("mlx5_vdpa_wq");
3500         if (!mvdev->wq) {
3501                 err = -ENOMEM;
3502                 goto err_res2;
3503         }
3504
3505         mvdev->vdev.mdev = &mgtdev->mgtdev;
3506         err = _vdpa_register_device(&mvdev->vdev, max_vqs + 1);
3507         if (err)
3508                 goto err_reg;
3509
3510         mgtdev->ndev = ndev;
3511         return 0;
3512
3513 err_reg:
3514         destroy_workqueue(mvdev->wq);
3515 err_res2:
3516         free_resources(ndev);
3517 err_mr:
3518         mlx5_vdpa_destroy_mr(mvdev);
3519 err_res:
3520         mlx5_vdpa_free_resources(&ndev->mvdev);
3521 err_mpfs:
3522         if (!is_zero_ether_addr(config->mac))
3523                 mlx5_mpfs_del_mac(pfmdev, config->mac);
3524 err_alloc:
3525         put_device(&mvdev->vdev.dev);
3526         return err;
3527 }
3528
3529 static void mlx5_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev, struct vdpa_device *dev)
3530 {
3531         struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
3532         struct mlx5_vdpa_dev *mvdev = to_mvdev(dev);
3533         struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
3534         struct workqueue_struct *wq;
3535
3536         unregister_link_notifier(ndev);
3537         _vdpa_unregister_device(dev);
3538         wq = mvdev->wq;
3539         mvdev->wq = NULL;
3540         destroy_workqueue(wq);
3541         mgtdev->ndev = NULL;
3542 }
3543
3544 static const struct vdpa_mgmtdev_ops mdev_ops = {
3545         .dev_add = mlx5_vdpa_dev_add,
3546         .dev_del = mlx5_vdpa_dev_del,
3547 };
3548
3549 static struct virtio_device_id id_table[] = {
3550         { VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
3551         { 0 },
3552 };
3553
3554 static int mlx5v_probe(struct auxiliary_device *adev,
3555                        const struct auxiliary_device_id *id)
3556
3557 {
3558         struct mlx5_adev *madev = container_of(adev, struct mlx5_adev, adev);
3559         struct mlx5_core_dev *mdev = madev->mdev;
3560         struct mlx5_vdpa_mgmtdev *mgtdev;
3561         int err;
3562
3563         mgtdev = kzalloc(sizeof(*mgtdev), GFP_KERNEL);
3564         if (!mgtdev)
3565                 return -ENOMEM;
3566
3567         mgtdev->mgtdev.ops = &mdev_ops;
3568         mgtdev->mgtdev.device = mdev->device;
3569         mgtdev->mgtdev.id_table = id_table;
3570         mgtdev->mgtdev.config_attr_mask = BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MACADDR) |
3571                                           BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MAX_VQP) |
3572                                           BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MTU) |
3573                                           BIT_ULL(VDPA_ATTR_DEV_FEATURES);
3574         mgtdev->mgtdev.max_supported_vqs =
3575                 MLX5_CAP_DEV_VDPA_EMULATION(mdev, max_num_virtio_queues) + 1;
3576         mgtdev->mgtdev.supported_features = get_supported_features(mdev);
3577         mgtdev->madev = madev;
3578
3579         err = vdpa_mgmtdev_register(&mgtdev->mgtdev);
3580         if (err)
3581                 goto reg_err;
3582
3583         auxiliary_set_drvdata(adev, mgtdev);
3584
3585         return 0;
3586
3587 reg_err:
3588         kfree(mgtdev);
3589         return err;
3590 }
3591
3592 static void mlx5v_remove(struct auxiliary_device *adev)
3593 {
3594         struct mlx5_vdpa_mgmtdev *mgtdev;
3595
3596         mgtdev = auxiliary_get_drvdata(adev);
3597         vdpa_mgmtdev_unregister(&mgtdev->mgtdev);
3598         kfree(mgtdev);
3599 }
3600
3601 static const struct auxiliary_device_id mlx5v_id_table[] = {
3602         { .name = MLX5_ADEV_NAME ".vnet", },
3603         {},
3604 };
3605
3606 MODULE_DEVICE_TABLE(auxiliary, mlx5v_id_table);
3607
3608 static struct auxiliary_driver mlx5v_driver = {
3609         .name = "vnet",
3610         .probe = mlx5v_probe,
3611         .remove = mlx5v_remove,
3612         .id_table = mlx5v_id_table,
3613 };
3614
3615 module_auxiliary_driver(mlx5v_driver);