* Create WQ resources using DevX API. * * @param[in] ctx * Context returned from mlx5 open_device() glue function. * @param[in] wqe_size * Size of WQE structure. * @param[in] log_wqbb_n * Log of number of WQBBs in queue. * @param[in] socket * Socket to use for allocation. * @param[out] wq_attr * Pointer to WQ attributes structure. * @param[out] wq_res * Pointer to WQ resou
| 457 | * 0 on success, a negative errno value otherwise and rte_errno is set. |
| 458 | */ |
| 459 | static int |
| 460 | mlx5_devx_wq_init(void *ctx, uint32_t wqe_size, uint16_t log_wqbb_n, int socket, |
| 461 | struct mlx5_devx_wq_attr *wq_attr, |
| 462 | struct mlx5_devx_wq_res *wq_res) |
| 463 | { |
| 464 | struct mlx5dv_devx_umem *umem_obj = NULL; |
| 465 | void *umem_buf = NULL; |
| 466 | size_t alignment = MLX5_WQE_BUF_ALIGNMENT; |
| 467 | uint32_t umem_size, umem_dbrec; |
| 468 | int ret; |
| 469 | |
| 470 | if (alignment == (size_t)-1) { |
| 471 | DRV_LOG(ERR, "Failed to get WQE buf alignment."); |
| 472 | rte_errno = ENOMEM; |
| 473 | return -rte_errno; |
| 474 | } |
| 475 | /* Allocate memory buffer for WQEs and doorbell record. */ |
| 476 | umem_size = wqe_size * (1 << log_wqbb_n); |
| 477 | umem_dbrec = RTE_ALIGN(umem_size, MLX5_DBR_SIZE); |
| 478 | umem_size += MLX5_DBR_SIZE; |
| 479 | umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, umem_size, |
| 480 | alignment, socket); |
| 481 | if (!umem_buf) { |
| 482 | DRV_LOG(ERR, "Failed to allocate memory for RQ."); |
| 483 | rte_errno = ENOMEM; |
| 484 | return -rte_errno; |
| 485 | } |
| 486 | /* Register allocated buffer in user space with DevX. */ |
| 487 | umem_obj = mlx5_os_umem_reg(ctx, (void *)(uintptr_t)umem_buf, |
| 488 | umem_size, 0); |
| 489 | if (!umem_obj) { |
| 490 | DRV_LOG(ERR, "Failed to register umem for RQ."); |
| 491 | rte_errno = errno; |
| 492 | goto error; |
| 493 | } |
| 494 | /* Fill WQ attributes for RQ/RMP object creation. */ |
| 495 | wq_attr->wq_umem_valid = 1; |
| 496 | wq_attr->wq_umem_id = mlx5_os_get_umem_id(umem_obj); |
| 497 | wq_attr->wq_umem_offset = 0; |
| 498 | wq_attr->dbr_umem_valid = 1; |
| 499 | wq_attr->dbr_umem_id = wq_attr->wq_umem_id; |
| 500 | wq_attr->dbr_addr = umem_dbrec; |
| 501 | wq_attr->log_wq_pg_sz = MLX5_LOG_PAGE_SIZE; |
| 502 | /* Fill attributes for RQ object creation. */ |
| 503 | wq_res->umem_buf = umem_buf; |
| 504 | wq_res->umem_obj = umem_obj; |
| 505 | wq_res->db_rec = RTE_PTR_ADD(umem_buf, umem_dbrec); |
| 506 | return 0; |
| 507 | error: |
| 508 | ret = rte_errno; |
| 509 | if (umem_obj) |
| 510 | claim_zero(mlx5_os_umem_dereg(umem_obj)); |
| 511 | if (umem_buf) |
| 512 | mlx5_free((void *)(uintptr_t)umem_buf); |
| 513 | rte_errno = ret; |
| 514 | return -rte_errno; |
| 515 | } |
| 516 |
no test coverage detected