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