1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2020 Mellanox Technologies, Ltd
9 #include <rte_mempool.h>
10 #include <rte_malloc.h>
11 #include <rte_errno.h>
13 #include "mlx5_devx_cmds.h"
14 #include "../mlx5_common_log.h"
15 #include "mlx5_common.h"
16 #include "mlx5_common_os.h"
17 #include "mlx5_malloc.h"
20 * Initialization routine for run-time dependency on external lib
23 mlx5_glue_constructor(void)
28 * Allocate PD. Given a devx context object
29 * return an mlx5-pd object.
35 * The mlx5_pd if pd is valid, NULL and errno otherwise.
38 mlx5_os_alloc_pd(void *ctx)
40 struct mlx5_pd *ppd = mlx5_malloc(MLX5_MEM_ZERO,
41 sizeof(struct mlx5_pd), 0, SOCKET_ID_ANY);
45 struct mlx5_devx_obj *obj = mlx5_devx_cmd_alloc_pd(ctx);
57 * Release PD. Releases a given mlx5_pd object
63 * Zero if pd is released successfully, negative number otherwise.
66 mlx5_os_dealloc_pd(void *pd)
70 mlx5_devx_cmd_destroy(((struct mlx5_pd *)pd)->obj);
81 * Pointer to memory start address.
83 * Size of the memory to register.
88 * umem on successful registration, NULL and errno otherwise
91 mlx5_os_umem_reg(void *ctx, void *addr, size_t size, uint32_t access)
93 struct mlx5_devx_umem *umem;
95 umem = mlx5_malloc(MLX5_MEM_ZERO,
96 (sizeof(*umem)), 0, SOCKET_ID_ANY);
101 umem->umem_hdl = mlx5_glue->devx_umem_reg(ctx, addr, size, access,
103 if (!umem->umem_hdl) {
118 * 0 on successful release, negative number otherwise
121 mlx5_os_umem_dereg(void *pumem)
123 struct mlx5_devx_umem *umem;
130 err = mlx5_glue->devx_umem_dereg(umem->umem_hdl);
136 * Register mr. Given protection doamin pointer, pointer to addr and length
137 * register the memory region.
140 * Pointer to protection domain context (type mlx5_pd).
142 * Pointer to memory start address (type devx_device_ctx).
144 * Lengtoh of the memory to register.
146 * pmd_mr struct set with lkey, address, length, pointer to mr object, mkey
149 * 0 on successful registration, -1 otherwise
152 mlx5_os_reg_mr(void *pd,
153 void *addr, size_t length, struct mlx5_pmd_mr *pmd_mr)
155 struct mlx5_devx_mkey_attr mkey_attr;
156 struct mlx5_pd *mlx5_pd = (struct mlx5_pd *)pd;
157 struct mlx5_hca_attr attr;
163 memset(pmd_mr, 0, sizeof(*pmd_mr));
164 if (mlx5_devx_cmd_query_hca_attr(mlx5_pd->devx_ctx, &attr))
167 pmd_mr->len = length;
168 pmd_mr->obj = mlx5_os_umem_reg(mlx5_pd->devx_ctx, pmd_mr->addr,
169 pmd_mr->len, IBV_ACCESS_LOCAL_WRITE);
172 mkey_attr.addr = (uintptr_t)addr;
173 mkey_attr.size = length;
174 mkey_attr.umem_id = ((struct mlx5_devx_umem *)(pmd_mr->obj))->umem_id;
175 mkey_attr.pd = mlx5_pd->pdn;
176 mkey_attr.log_entity_size = 0;
177 mkey_attr.pg_access = 0;
178 mkey_attr.klm_array = NULL;
179 mkey_attr.klm_num = 0;
180 mkey_attr.relaxed_ordering_read = 0;
181 mkey_attr.relaxed_ordering_write = 0;
182 if (!haswell_broadwell_cpu) {
183 mkey_attr.relaxed_ordering_write = attr.relaxed_ordering_write;
184 mkey_attr.relaxed_ordering_read = attr.relaxed_ordering_read;
186 pmd_mr->mkey = mlx5_devx_cmd_mkey_create(mlx5_pd->devx_ctx, &mkey_attr);
188 claim_zero(mlx5_os_umem_dereg(pmd_mr->obj));
191 pmd_mr->lkey = pmd_mr->mkey->id;
199 * Pointer to PMD mr object
202 mlx5_os_dereg_mr(struct mlx5_pmd_mr *pmd_mr)
204 if (pmd_mr && pmd_mr->mkey)
205 claim_zero(mlx5_glue->devx_obj_destroy(pmd_mr->mkey->obj));
206 if (pmd_mr && pmd_mr->obj)
207 claim_zero(mlx5_os_umem_dereg(pmd_mr->obj));
208 memset(pmd_mr, 0, sizeof(*pmd_mr));