xref: /dpdk/drivers/common/mlx5/windows/mlx5_common_os.c (revision 25245d5dc9ecfa8bc9964c69a756beca6ee1ca72)
1e11fe027SOphir Munk /* SPDX-License-Identifier: BSD-3-Clause
2e11fe027SOphir Munk  * Copyright 2020 Mellanox Technologies, Ltd
3e11fe027SOphir Munk  */
4e11fe027SOphir Munk 
5e11fe027SOphir Munk #include <unistd.h>
6e11fe027SOphir Munk #include <string.h>
7e11fe027SOphir Munk #include <stdio.h>
8e11fe027SOphir Munk 
9e11fe027SOphir Munk #include <rte_mempool.h>
10e11fe027SOphir Munk #include <rte_malloc.h>
11e11fe027SOphir Munk #include <rte_errno.h>
12e11fe027SOphir Munk 
13e11fe027SOphir Munk #include "mlx5_devx_cmds.h"
14*25245d5dSShiri Kuzin #include "../mlx5_common_log.h"
15e11fe027SOphir Munk #include "mlx5_common.h"
16ba420719SOphir Munk #include "mlx5_common_os.h"
17ba420719SOphir Munk #include "mlx5_malloc.h"
18e11fe027SOphir Munk 
19e11fe027SOphir Munk /**
20e11fe027SOphir Munk  * Initialization routine for run-time dependency on external lib
21e11fe027SOphir Munk  */
22e11fe027SOphir Munk void
23e11fe027SOphir Munk mlx5_glue_constructor(void)
24e11fe027SOphir Munk {
25e11fe027SOphir Munk }
261552fb28STal Shnaiderman 
271552fb28STal Shnaiderman /**
281552fb28STal Shnaiderman  * Allocate PD. Given a devx context object
291552fb28STal Shnaiderman  * return an mlx5-pd object.
301552fb28STal Shnaiderman  *
311552fb28STal Shnaiderman  * @param[in] ctx
321552fb28STal Shnaiderman  *   Pointer to context.
331552fb28STal Shnaiderman  *
341552fb28STal Shnaiderman  * @return
351552fb28STal Shnaiderman  *    The mlx5_pd if pd is valid, NULL and errno otherwise.
361552fb28STal Shnaiderman  */
371552fb28STal Shnaiderman void *
381552fb28STal Shnaiderman mlx5_os_alloc_pd(void *ctx)
391552fb28STal Shnaiderman {
401552fb28STal Shnaiderman 	struct mlx5_pd *ppd =  mlx5_malloc(MLX5_MEM_ZERO,
411552fb28STal Shnaiderman 		sizeof(struct mlx5_pd), 0, SOCKET_ID_ANY);
421552fb28STal Shnaiderman 	if (!ppd)
431552fb28STal Shnaiderman 		return NULL;
441552fb28STal Shnaiderman 
451552fb28STal Shnaiderman 	struct mlx5_devx_obj *obj = mlx5_devx_cmd_alloc_pd(ctx);
461552fb28STal Shnaiderman 	if (!obj) {
471552fb28STal Shnaiderman 		mlx5_free(ppd);
481552fb28STal Shnaiderman 		return NULL;
491552fb28STal Shnaiderman 	}
501552fb28STal Shnaiderman 	ppd->obj = obj;
511552fb28STal Shnaiderman 	ppd->pdn = obj->id;
521552fb28STal Shnaiderman 	ppd->devx_ctx = ctx;
531552fb28STal Shnaiderman 	return ppd;
541552fb28STal Shnaiderman }
551552fb28STal Shnaiderman 
561552fb28STal Shnaiderman /**
571552fb28STal Shnaiderman  * Release PD. Releases a given mlx5_pd object
581552fb28STal Shnaiderman  *
591552fb28STal Shnaiderman  * @param[in] pd
601552fb28STal Shnaiderman  *   Pointer to mlx5_pd.
611552fb28STal Shnaiderman  *
621552fb28STal Shnaiderman  * @return
631552fb28STal Shnaiderman  *    Zero if pd is released successfully, negative number otherwise.
641552fb28STal Shnaiderman  */
651552fb28STal Shnaiderman int
661552fb28STal Shnaiderman mlx5_os_dealloc_pd(void *pd)
671552fb28STal Shnaiderman {
681552fb28STal Shnaiderman 	if (!pd)
691552fb28STal Shnaiderman 		return -EINVAL;
701552fb28STal Shnaiderman 	mlx5_devx_cmd_destroy(((struct mlx5_pd *)pd)->obj);
711552fb28STal Shnaiderman 	mlx5_free(pd);
721552fb28STal Shnaiderman 	return 0;
731552fb28STal Shnaiderman }
741969ee42STal Shnaiderman 
751969ee42STal Shnaiderman /**
761969ee42STal Shnaiderman  * Register umem.
771969ee42STal Shnaiderman  *
781969ee42STal Shnaiderman  * @param[in] ctx
791969ee42STal Shnaiderman  *   Pointer to context.
801969ee42STal Shnaiderman  * @param[in] addr
811969ee42STal Shnaiderman  *   Pointer to memory start address.
821969ee42STal Shnaiderman  * @param[in] size
831969ee42STal Shnaiderman  *   Size of the memory to register.
841969ee42STal Shnaiderman  * @param[out] access
851969ee42STal Shnaiderman  *   UMEM access type
861969ee42STal Shnaiderman  *
871969ee42STal Shnaiderman  * @return
881969ee42STal Shnaiderman  *   umem on successful registration, NULL and errno otherwise
891969ee42STal Shnaiderman  */
901969ee42STal Shnaiderman void *
911969ee42STal Shnaiderman mlx5_os_umem_reg(void *ctx, void *addr, size_t size, uint32_t access)
921969ee42STal Shnaiderman {
931969ee42STal Shnaiderman 	struct mlx5_devx_umem *umem;
941969ee42STal Shnaiderman 
951969ee42STal Shnaiderman 	umem = mlx5_malloc(MLX5_MEM_ZERO,
961969ee42STal Shnaiderman 		(sizeof(*umem)), 0, SOCKET_ID_ANY);
971969ee42STal Shnaiderman 	if (!umem) {
981969ee42STal Shnaiderman 		errno = ENOMEM;
991969ee42STal Shnaiderman 		return NULL;
1001969ee42STal Shnaiderman 	}
1011969ee42STal Shnaiderman 	umem->umem_hdl = mlx5_glue->devx_umem_reg(ctx, addr, size, access,
1021969ee42STal Shnaiderman 		&umem->umem_id);
1031969ee42STal Shnaiderman 	if (!umem->umem_hdl) {
1041969ee42STal Shnaiderman 		mlx5_free(umem);
1051969ee42STal Shnaiderman 		return NULL;
1061969ee42STal Shnaiderman 	}
1071969ee42STal Shnaiderman 	umem->addr = addr;
1081969ee42STal Shnaiderman 	return umem;
1091969ee42STal Shnaiderman }
1101969ee42STal Shnaiderman 
1111969ee42STal Shnaiderman /**
1121969ee42STal Shnaiderman  * Deregister umem.
1131969ee42STal Shnaiderman  *
1141969ee42STal Shnaiderman  * @param[in] pumem
1151969ee42STal Shnaiderman  *   Pointer to umem.
1161969ee42STal Shnaiderman  *
1171969ee42STal Shnaiderman  * @return
1181969ee42STal Shnaiderman  *   0 on successful release, negative number otherwise
1191969ee42STal Shnaiderman  */
1201969ee42STal Shnaiderman int
1211969ee42STal Shnaiderman mlx5_os_umem_dereg(void *pumem)
1221969ee42STal Shnaiderman {
1231969ee42STal Shnaiderman 	struct mlx5_devx_umem *umem;
1241969ee42STal Shnaiderman 	int err = 0;
1251969ee42STal Shnaiderman 
1261969ee42STal Shnaiderman 	if (!pumem)
1271969ee42STal Shnaiderman 		return err;
1281969ee42STal Shnaiderman 	umem = pumem;
1291969ee42STal Shnaiderman 	if (umem->umem_hdl)
1301969ee42STal Shnaiderman 		err = mlx5_glue->devx_umem_dereg(umem->umem_hdl);
1311969ee42STal Shnaiderman 	mlx5_free(umem);
1321969ee42STal Shnaiderman 	return err;
1331969ee42STal Shnaiderman }
134ba420719SOphir Munk 
135ba420719SOphir Munk /**
136ba420719SOphir Munk  * Register mr. Given protection doamin pointer, pointer to addr and length
137ba420719SOphir Munk  * register the memory region.
138ba420719SOphir Munk  *
139ba420719SOphir Munk  * @param[in] pd
140ba420719SOphir Munk  *   Pointer to protection domain context (type mlx5_pd).
141ba420719SOphir Munk  * @param[in] addr
142ba420719SOphir Munk  *   Pointer to memory start address (type devx_device_ctx).
143ba420719SOphir Munk  * @param[in] length
144ba420719SOphir Munk  *   Lengtoh of the memory to register.
145ba420719SOphir Munk  * @param[out] pmd_mr
146ba420719SOphir Munk  *   pmd_mr struct set with lkey, address, length, pointer to mr object, mkey
147ba420719SOphir Munk  *
148ba420719SOphir Munk  * @return
149ba420719SOphir Munk  *   0 on successful registration, -1 otherwise
150ba420719SOphir Munk  */
151ba420719SOphir Munk int
152ba420719SOphir Munk mlx5_os_reg_mr(void *pd,
153ba420719SOphir Munk 	       void *addr, size_t length, struct mlx5_pmd_mr *pmd_mr)
154ba420719SOphir Munk {
155ba420719SOphir Munk 	struct mlx5_devx_mkey_attr mkey_attr;
156ba420719SOphir Munk 	struct mlx5_pd *mlx5_pd = (struct mlx5_pd *)pd;
157ba420719SOphir Munk 	struct mlx5_hca_attr attr;
158ba420719SOphir Munk 
159ba420719SOphir Munk 	if (!pd || !addr) {
160ba420719SOphir Munk 		rte_errno = EINVAL;
161ba420719SOphir Munk 		return -1;
162ba420719SOphir Munk 	}
163ba420719SOphir Munk 	memset(pmd_mr, 0, sizeof(*pmd_mr));
164ba420719SOphir Munk 	if (mlx5_devx_cmd_query_hca_attr(mlx5_pd->devx_ctx, &attr))
165ba420719SOphir Munk 		return -1;
166ba420719SOphir Munk 	pmd_mr->addr = addr;
167ba420719SOphir Munk 	pmd_mr->len = length;
168ba420719SOphir Munk 	pmd_mr->obj = mlx5_os_umem_reg(mlx5_pd->devx_ctx, pmd_mr->addr,
169ba420719SOphir Munk 				       pmd_mr->len, IBV_ACCESS_LOCAL_WRITE);
170ba420719SOphir Munk 	if (!pmd_mr->obj)
171ba420719SOphir Munk 		return -1;
172ba420719SOphir Munk 	mkey_attr.addr = (uintptr_t)addr;
173ba420719SOphir Munk 	mkey_attr.size = length;
174ba420719SOphir Munk 	mkey_attr.umem_id = ((struct mlx5_devx_umem *)(pmd_mr->obj))->umem_id;
175ba420719SOphir Munk 	mkey_attr.pd = mlx5_pd->pdn;
176ba420719SOphir Munk 	mkey_attr.log_entity_size = 0;
177ba420719SOphir Munk 	mkey_attr.pg_access = 0;
178ba420719SOphir Munk 	mkey_attr.klm_array = NULL;
179ba420719SOphir Munk 	mkey_attr.klm_num = 0;
180ba420719SOphir Munk 	mkey_attr.relaxed_ordering_read = 0;
181ba420719SOphir Munk 	mkey_attr.relaxed_ordering_write = 0;
182ba420719SOphir Munk 	if (!haswell_broadwell_cpu) {
183ba420719SOphir Munk 		mkey_attr.relaxed_ordering_write = attr.relaxed_ordering_write;
184ba420719SOphir Munk 		mkey_attr.relaxed_ordering_read = attr.relaxed_ordering_read;
185ba420719SOphir Munk 	}
186ba420719SOphir Munk 	pmd_mr->mkey = mlx5_devx_cmd_mkey_create(mlx5_pd->devx_ctx, &mkey_attr);
187ba420719SOphir Munk 	if (!pmd_mr->mkey) {
188ba420719SOphir Munk 		claim_zero(mlx5_os_umem_dereg(pmd_mr->obj));
189ba420719SOphir Munk 		return -1;
190ba420719SOphir Munk 	}
191ba420719SOphir Munk 	pmd_mr->lkey = pmd_mr->mkey->id;
192ba420719SOphir Munk 	return 0;
193ba420719SOphir Munk }
194ba420719SOphir Munk 
195ba420719SOphir Munk /**
196ba420719SOphir Munk  * De-register mr.
197ba420719SOphir Munk  *
198ba420719SOphir Munk  * @param[in] pmd_mr
199ba420719SOphir Munk  *  Pointer to PMD mr object
200ba420719SOphir Munk  */
201ba420719SOphir Munk void
202ba420719SOphir Munk mlx5_os_dereg_mr(struct mlx5_pmd_mr *pmd_mr)
203ba420719SOphir Munk {
204ba420719SOphir Munk 	if (pmd_mr && pmd_mr->mkey)
205ba420719SOphir Munk 		claim_zero(mlx5_glue->devx_obj_destroy(pmd_mr->mkey->obj));
206ba420719SOphir Munk 	if (pmd_mr && pmd_mr->obj)
207ba420719SOphir Munk 		claim_zero(mlx5_os_umem_dereg(pmd_mr->obj));
208ba420719SOphir Munk 	memset(pmd_mr, 0, sizeof(*pmd_mr));
209ba420719SOphir Munk }
210