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 } 1991