xref: /dpdk/drivers/common/mlx5/windows/mlx5_common_os.c (revision 1f37cb2bb46b1fd403faa7c3bf8884e6a4dfde66)
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>
10*1f37cb2bSDavid Marchand #include <bus_pci_driver.h>
11e11fe027SOphir Munk #include <rte_malloc.h>
12e11fe027SOphir Munk #include <rte_errno.h>
13e11fe027SOphir Munk 
14e11fe027SOphir Munk #include "mlx5_devx_cmds.h"
1525245d5dSShiri Kuzin #include "../mlx5_common_log.h"
16e11fe027SOphir Munk #include "mlx5_common.h"
17ba420719SOphir Munk #include "mlx5_common_os.h"
18ba420719SOphir Munk #include "mlx5_malloc.h"
19e11fe027SOphir Munk 
20e11fe027SOphir Munk /**
21ca1418ceSMichael Baum  * Initialization routine for run-time dependency on external lib.
22e11fe027SOphir Munk  */
23e11fe027SOphir Munk void
mlx5_glue_constructor(void)24e11fe027SOphir Munk mlx5_glue_constructor(void)
25e11fe027SOphir Munk {
26e11fe027SOphir Munk }
271552fb28STal Shnaiderman 
281552fb28STal Shnaiderman /**
299d936f4fSMichael Baum  * Validate user arguments for remote PD and CTX.
309d936f4fSMichael Baum  *
319d936f4fSMichael Baum  * @param config
329d936f4fSMichael Baum  *   Pointer to device configuration structure.
339d936f4fSMichael Baum  *
349d936f4fSMichael Baum  * @return
359d936f4fSMichael Baum  *   0 on success, a negative errno value otherwise and rte_errno is set.
369d936f4fSMichael Baum  */
379d936f4fSMichael Baum int
mlx5_os_remote_pd_and_ctx_validate(struct mlx5_common_dev_config * config)389d936f4fSMichael Baum mlx5_os_remote_pd_and_ctx_validate(struct mlx5_common_dev_config *config)
399d936f4fSMichael Baum {
409d936f4fSMichael Baum 	int device_fd = config->device_fd;
419d936f4fSMichael Baum 	int pd_handle = config->pd_handle;
429d936f4fSMichael Baum 
439d936f4fSMichael Baum 	if (pd_handle != MLX5_ARG_UNSET || device_fd != MLX5_ARG_UNSET) {
449d936f4fSMichael Baum 		DRV_LOG(ERR, "Remote PD and CTX is not supported on Windows.");
459d936f4fSMichael Baum 		rte_errno = ENOTSUP;
469d936f4fSMichael Baum 		return -rte_errno;
479d936f4fSMichael Baum 	}
489d936f4fSMichael Baum 	return 0;
499d936f4fSMichael Baum }
509d936f4fSMichael Baum 
519d936f4fSMichael Baum /**
521552fb28STal Shnaiderman  * Release PD. Releases a given mlx5_pd object
531552fb28STal Shnaiderman  *
549d936f4fSMichael Baum  * @param[in] cdev
559d936f4fSMichael Baum  *   Pointer to the mlx5 device.
561552fb28STal Shnaiderman  *
571552fb28STal Shnaiderman  * @return
581552fb28STal Shnaiderman  *   Zero if pd is released successfully, negative number otherwise.
591552fb28STal Shnaiderman  */
601552fb28STal Shnaiderman int
mlx5_os_pd_release(struct mlx5_common_device * cdev)619d936f4fSMichael Baum mlx5_os_pd_release(struct mlx5_common_device *cdev)
621552fb28STal Shnaiderman {
639d936f4fSMichael Baum 	struct mlx5_pd *pd = cdev->pd;
649d936f4fSMichael Baum 
651552fb28STal Shnaiderman 	if (!pd)
661552fb28STal Shnaiderman 		return -EINVAL;
679d936f4fSMichael Baum 	mlx5_devx_cmd_destroy(pd->obj);
681552fb28STal Shnaiderman 	mlx5_free(pd);
691552fb28STal Shnaiderman 	return 0;
701552fb28STal Shnaiderman }
711969ee42STal Shnaiderman 
721969ee42STal Shnaiderman /**
73e35ccf24SMichael Baum  * Allocate Protection Domain object and extract its pdn using DV API.
74e35ccf24SMichael Baum  *
759d936f4fSMichael Baum  * @param[out] cdev
76e35ccf24SMichael Baum  *   Pointer to the mlx5 device.
77e35ccf24SMichael Baum  *
78e35ccf24SMichael Baum  * @return
79e35ccf24SMichael Baum  *   0 on success, a negative value otherwise.
80e35ccf24SMichael Baum  */
81e35ccf24SMichael Baum int
mlx5_os_pd_prepare(struct mlx5_common_device * cdev)829d936f4fSMichael Baum mlx5_os_pd_prepare(struct mlx5_common_device *cdev)
83e35ccf24SMichael Baum {
84e35ccf24SMichael Baum 	struct mlx5_pd *pd;
85e35ccf24SMichael Baum 
86e35ccf24SMichael Baum 	pd = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*pd), 0, SOCKET_ID_ANY);
87e35ccf24SMichael Baum 	if (!pd)
88e35ccf24SMichael Baum 		return -1;
89e35ccf24SMichael Baum 	struct mlx5_devx_obj *obj = mlx5_devx_cmd_alloc_pd(cdev->ctx);
90e35ccf24SMichael Baum 	if (!obj) {
91e35ccf24SMichael Baum 		mlx5_free(pd);
92e35ccf24SMichael Baum 		return -1;
93e35ccf24SMichael Baum 	}
94e35ccf24SMichael Baum 	pd->obj = obj;
95e35ccf24SMichael Baum 	pd->pdn = obj->id;
96e35ccf24SMichael Baum 	pd->devx_ctx = cdev->ctx;
97e35ccf24SMichael Baum 	cdev->pd = pd;
98e35ccf24SMichael Baum 	cdev->pdn = pd->pdn;
99e35ccf24SMichael Baum 	return 0;
100e35ccf24SMichael Baum }
101e35ccf24SMichael Baum 
102e35ccf24SMichael Baum /**
103887183efSMichael Baum  * Detect if a devx_device_bdf object has identical DBDF values to the
104887183efSMichael Baum  * rte_pci_addr found in bus/pci probing.
105887183efSMichael Baum  *
106887183efSMichael Baum  * @param[in] devx_bdf
107887183efSMichael Baum  *   Pointer to the devx_device_bdf structure.
108887183efSMichael Baum  * @param[in] addr
109887183efSMichael Baum  *   Pointer to the rte_pci_addr structure.
110887183efSMichael Baum  *
111887183efSMichael Baum  * @return
112887183efSMichael Baum  *   1 on Device match, 0 on mismatch.
113887183efSMichael Baum  */
114887183efSMichael Baum static int
mlx5_match_devx_bdf_to_addr(struct devx_device_bdf * devx_bdf,struct rte_pci_addr * addr)115887183efSMichael Baum mlx5_match_devx_bdf_to_addr(struct devx_device_bdf *devx_bdf,
116887183efSMichael Baum 			    struct rte_pci_addr *addr)
117887183efSMichael Baum {
118887183efSMichael Baum 	if (addr->domain != (devx_bdf->bus_id >> 8) ||
119887183efSMichael Baum 	    addr->bus != (devx_bdf->bus_id & 0xff) ||
120887183efSMichael Baum 	    addr->devid != devx_bdf->dev_id ||
121887183efSMichael Baum 	    addr->function != devx_bdf->fnc_id) {
122887183efSMichael Baum 		return 0;
123887183efSMichael Baum 	}
124887183efSMichael Baum 	return 1;
125887183efSMichael Baum }
126887183efSMichael Baum 
127887183efSMichael Baum /**
128887183efSMichael Baum  * Detect if a devx_device_bdf object matches the rte_pci_addr
129887183efSMichael Baum  * found in bus/pci probing
130887183efSMichael Baum  * Compare both the Native/PF BDF and the raw_bdf representing a VF BDF.
131887183efSMichael Baum  *
132887183efSMichael Baum  * @param[in] devx_bdf
133887183efSMichael Baum  *   Pointer to the devx_device_bdf structure.
134887183efSMichael Baum  * @param[in] addr
135887183efSMichael Baum  *   Pointer to the rte_pci_addr structure.
136887183efSMichael Baum  *
137887183efSMichael Baum  * @return
138887183efSMichael Baum  *   1 on Device match, 0 on mismatch, rte_errno code on failure.
139887183efSMichael Baum  */
140887183efSMichael Baum static int
mlx5_match_devx_devices_to_addr(struct devx_device_bdf * devx_bdf,struct rte_pci_addr * addr)141887183efSMichael Baum mlx5_match_devx_devices_to_addr(struct devx_device_bdf *devx_bdf,
142887183efSMichael Baum 				struct rte_pci_addr *addr)
143887183efSMichael Baum {
144887183efSMichael Baum 	int err;
145887183efSMichael Baum 	struct devx_device mlx5_dev;
146887183efSMichael Baum 
147887183efSMichael Baum 	if (mlx5_match_devx_bdf_to_addr(devx_bdf, addr))
148887183efSMichael Baum 		return 1;
149887183efSMichael Baum 	/*
150887183efSMichael Baum 	 * Didn't match on Native/PF BDF, could still match a VF BDF,
151887183efSMichael Baum 	 * check it next.
152887183efSMichael Baum 	 */
153887183efSMichael Baum 	err = mlx5_glue->query_device(devx_bdf, &mlx5_dev);
154887183efSMichael Baum 	if (err) {
155887183efSMichael Baum 		DRV_LOG(ERR, "query_device failed");
156887183efSMichael Baum 		rte_errno = err;
157887183efSMichael Baum 		return rte_errno;
158887183efSMichael Baum 	}
159887183efSMichael Baum 	if (mlx5_match_devx_bdf_to_addr(&mlx5_dev.raw_bdf, addr))
160887183efSMichael Baum 		return 1;
161887183efSMichael Baum 	return 0;
162887183efSMichael Baum }
163887183efSMichael Baum 
164887183efSMichael Baum /**
165887183efSMichael Baum  * Look for DevX device that match to given rte_device.
166887183efSMichael Baum  *
167887183efSMichael Baum  * @param dev
168887183efSMichael Baum  *   Pointer to the generic device.
169887183efSMichael Baum  * @param devx_list
170887183efSMichael Baum  *   Pointer to head of DevX devices list.
171887183efSMichael Baum  * @param n
172887183efSMichael Baum  *   Number of devices in given DevX devices list.
173887183efSMichael Baum  *
174887183efSMichael Baum  * @return
175887183efSMichael Baum  *   A device match on success, NULL otherwise and rte_errno is set.
176887183efSMichael Baum  */
177887183efSMichael Baum static struct devx_device_bdf *
mlx5_os_get_devx_device(struct rte_device * dev,struct devx_device_bdf * devx_list,int n)178887183efSMichael Baum mlx5_os_get_devx_device(struct rte_device *dev,
179887183efSMichael Baum 			struct devx_device_bdf *devx_list, int n)
180887183efSMichael Baum {
181887183efSMichael Baum 	struct devx_device_bdf *devx_match = NULL;
182887183efSMichael Baum 	struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(dev);
183887183efSMichael Baum 	struct rte_pci_addr *addr = &pci_dev->addr;
184887183efSMichael Baum 
185887183efSMichael Baum 	while (n-- > 0) {
186887183efSMichael Baum 		int ret = mlx5_match_devx_devices_to_addr(devx_list, addr);
187887183efSMichael Baum 		if (!ret) {
188887183efSMichael Baum 			devx_list++;
189887183efSMichael Baum 			continue;
190887183efSMichael Baum 		}
191887183efSMichael Baum 		if (ret != 1) {
192887183efSMichael Baum 			rte_errno = ret;
193887183efSMichael Baum 			return NULL;
194887183efSMichael Baum 		}
195887183efSMichael Baum 		devx_match = devx_list;
196887183efSMichael Baum 		break;
197887183efSMichael Baum 	}
198887183efSMichael Baum 	if (devx_match == NULL) {
199887183efSMichael Baum 		/* No device matches, just complain and bail out. */
200887183efSMichael Baum 		DRV_LOG(WARNING,
201887183efSMichael Baum 			"No DevX device matches PCI device " PCI_PRI_FMT ","
202887183efSMichael Baum 			" is DevX Configured?",
203887183efSMichael Baum 			addr->domain, addr->bus, addr->devid, addr->function);
204887183efSMichael Baum 		rte_errno = ENOENT;
205887183efSMichael Baum 	}
206887183efSMichael Baum 	return devx_match;
207887183efSMichael Baum }
208887183efSMichael Baum 
209887183efSMichael Baum /**
210887183efSMichael Baum  * Function API open device under Windows.
211887183efSMichael Baum  *
212887183efSMichael Baum  * This function calls the Windows glue APIs to open a device.
213887183efSMichael Baum  *
214ca1418ceSMichael Baum  * @param cdev
215887183efSMichael Baum  *   Pointer to mlx5 device structure.
216ca1418ceSMichael Baum  * @param classes
217ca1418ceSMichael Baum  *   Chosen classes come from user device arguments.
218887183efSMichael Baum  *
219887183efSMichael Baum  * @return
220887183efSMichael Baum  *   0 on success, a negative errno value otherwise and rte_errno is set.
221887183efSMichael Baum  */
222887183efSMichael Baum int
mlx5_os_open_device(struct mlx5_common_device * cdev,uint32_t classes)223ca1418ceSMichael Baum mlx5_os_open_device(struct mlx5_common_device *cdev, uint32_t classes)
224887183efSMichael Baum {
225887183efSMichael Baum 	struct devx_device_bdf *devx_bdf_dev = NULL;
226887183efSMichael Baum 	struct devx_device_bdf *devx_list;
227887183efSMichael Baum 	struct mlx5_context *mlx5_ctx = NULL;
228887183efSMichael Baum 	int n;
229887183efSMichael Baum 
230b4a4fb7eSTal Shnaiderman 	if (classes != MLX5_CLASS_ETH && classes != MLX5_CLASS_CRYPTO) {
231ca1418ceSMichael Baum 		DRV_LOG(ERR,
232ca1418ceSMichael Baum 			"The chosen classes are not supported on Windows.");
233ca1418ceSMichael Baum 		rte_errno = ENOTSUP;
234ca1418ceSMichael Baum 		return -rte_errno;
235ca1418ceSMichael Baum 	}
236887183efSMichael Baum 	errno = 0;
237887183efSMichael Baum 	devx_list = mlx5_glue->get_device_list(&n);
238887183efSMichael Baum 	if (devx_list == NULL) {
239887183efSMichael Baum 		rte_errno = errno ? errno : ENOSYS;
240887183efSMichael Baum 		DRV_LOG(ERR, "Cannot list devices, is DevX enabled?");
241887183efSMichael Baum 		return -rte_errno;
242887183efSMichael Baum 	}
243887183efSMichael Baum 	devx_bdf_dev = mlx5_os_get_devx_device(cdev->dev, devx_list, n);
244887183efSMichael Baum 	if (devx_bdf_dev == NULL)
245887183efSMichael Baum 		goto error;
246887183efSMichael Baum 	/* Try to open DevX device with DV. */
247887183efSMichael Baum 	mlx5_ctx = mlx5_glue->open_device(devx_bdf_dev);
248887183efSMichael Baum 	if (mlx5_ctx == NULL) {
249887183efSMichael Baum 		DRV_LOG(ERR, "Failed to open DevX device.");
250887183efSMichael Baum 		rte_errno = errno;
251887183efSMichael Baum 		goto error;
252887183efSMichael Baum 	}
253887183efSMichael Baum 	if (mlx5_glue->query_device(devx_bdf_dev, &mlx5_ctx->mlx5_dev)) {
254887183efSMichael Baum 		DRV_LOG(ERR, "Failed to query device context fields.");
255887183efSMichael Baum 		rte_errno = errno;
256887183efSMichael Baum 		goto error;
257887183efSMichael Baum 	}
258887183efSMichael Baum 	cdev->config.devx = 1;
259ca1418ceSMichael Baum 	cdev->ctx = mlx5_ctx;
260887183efSMichael Baum 	mlx5_glue->free_device_list(devx_list);
261887183efSMichael Baum 	return 0;
262887183efSMichael Baum error:
263887183efSMichael Baum 	if (mlx5_ctx != NULL)
264887183efSMichael Baum 		claim_zero(mlx5_glue->close_device(mlx5_ctx));
265887183efSMichael Baum 	mlx5_glue->free_device_list(devx_list);
266887183efSMichael Baum 	return -rte_errno;
267887183efSMichael Baum }
268887183efSMichael Baum 
269887183efSMichael Baum /**
2701969ee42STal Shnaiderman  * Register umem.
2711969ee42STal Shnaiderman  *
2721969ee42STal Shnaiderman  * @param[in] ctx
2731969ee42STal Shnaiderman  *   Pointer to context.
2741969ee42STal Shnaiderman  * @param[in] addr
2751969ee42STal Shnaiderman  *   Pointer to memory start address.
2761969ee42STal Shnaiderman  * @param[in] size
2771969ee42STal Shnaiderman  *   Size of the memory to register.
2781969ee42STal Shnaiderman  * @param[out] access
2791969ee42STal Shnaiderman  *   UMEM access type
2801969ee42STal Shnaiderman  *
2811969ee42STal Shnaiderman  * @return
2821969ee42STal Shnaiderman  *   umem on successful registration, NULL and errno otherwise
2831969ee42STal Shnaiderman  */
2841969ee42STal Shnaiderman void *
mlx5_os_umem_reg(void * ctx,void * addr,size_t size,uint32_t access)2851969ee42STal Shnaiderman mlx5_os_umem_reg(void *ctx, void *addr, size_t size, uint32_t access)
2861969ee42STal Shnaiderman {
2871969ee42STal Shnaiderman 	struct mlx5_devx_umem *umem;
2881969ee42STal Shnaiderman 
2891969ee42STal Shnaiderman 	umem = mlx5_malloc(MLX5_MEM_ZERO,
2901969ee42STal Shnaiderman 		(sizeof(*umem)), 0, SOCKET_ID_ANY);
2911969ee42STal Shnaiderman 	if (!umem) {
2921969ee42STal Shnaiderman 		errno = ENOMEM;
2931969ee42STal Shnaiderman 		return NULL;
2941969ee42STal Shnaiderman 	}
2951969ee42STal Shnaiderman 	umem->umem_hdl = mlx5_glue->devx_umem_reg(ctx, addr, size, access,
2961969ee42STal Shnaiderman 		&umem->umem_id);
2971969ee42STal Shnaiderman 	if (!umem->umem_hdl) {
2981969ee42STal Shnaiderman 		mlx5_free(umem);
2991969ee42STal Shnaiderman 		return NULL;
3001969ee42STal Shnaiderman 	}
3011969ee42STal Shnaiderman 	umem->addr = addr;
3021969ee42STal Shnaiderman 	return umem;
3031969ee42STal Shnaiderman }
3041969ee42STal Shnaiderman 
3051969ee42STal Shnaiderman /**
3061969ee42STal Shnaiderman  * Deregister umem.
3071969ee42STal Shnaiderman  *
3081969ee42STal Shnaiderman  * @param[in] pumem
3091969ee42STal Shnaiderman  *   Pointer to umem.
3101969ee42STal Shnaiderman  *
3111969ee42STal Shnaiderman  * @return
3121969ee42STal Shnaiderman  *   0 on successful release, negative number otherwise
3131969ee42STal Shnaiderman  */
3141969ee42STal Shnaiderman int
mlx5_os_umem_dereg(void * pumem)3151969ee42STal Shnaiderman mlx5_os_umem_dereg(void *pumem)
3161969ee42STal Shnaiderman {
3171969ee42STal Shnaiderman 	struct mlx5_devx_umem *umem;
3181969ee42STal Shnaiderman 	int err = 0;
3191969ee42STal Shnaiderman 
3201969ee42STal Shnaiderman 	if (!pumem)
3211969ee42STal Shnaiderman 		return err;
3221969ee42STal Shnaiderman 	umem = pumem;
3231969ee42STal Shnaiderman 	if (umem->umem_hdl)
3241969ee42STal Shnaiderman 		err = mlx5_glue->devx_umem_dereg(umem->umem_hdl);
3251969ee42STal Shnaiderman 	mlx5_free(umem);
3261969ee42STal Shnaiderman 	return err;
3271969ee42STal Shnaiderman }
328ba420719SOphir Munk 
329ba420719SOphir Munk /**
3307be78d02SJosh Soref  * Register mr. Given protection domain pointer, pointer to addr and length
331ba420719SOphir Munk  * register the memory region.
332ba420719SOphir Munk  *
333ba420719SOphir Munk  * @param[in] pd
334ba420719SOphir Munk  *   Pointer to protection domain context (type mlx5_pd).
335ba420719SOphir Munk  * @param[in] addr
336ba420719SOphir Munk  *   Pointer to memory start address (type devx_device_ctx).
337ba420719SOphir Munk  * @param[in] length
3387be78d02SJosh Soref  *   Length of the memory to register.
339ba420719SOphir Munk  * @param[out] pmd_mr
340ba420719SOphir Munk  *   pmd_mr struct set with lkey, address, length, pointer to mr object, mkey
341ba420719SOphir Munk  *
342ba420719SOphir Munk  * @return
343ba420719SOphir Munk  *   0 on successful registration, -1 otherwise
344ba420719SOphir Munk  */
3455fbc75acSMichael Baum static int
mlx5_os_reg_mr(void * pd,void * addr,size_t length,struct mlx5_pmd_mr * pmd_mr)346ba420719SOphir Munk mlx5_os_reg_mr(void *pd,
347ba420719SOphir Munk 	       void *addr, size_t length, struct mlx5_pmd_mr *pmd_mr)
348ba420719SOphir Munk {
349ba420719SOphir Munk 	struct mlx5_devx_mkey_attr mkey_attr;
350ba420719SOphir Munk 	struct mlx5_pd *mlx5_pd = (struct mlx5_pd *)pd;
351ba420719SOphir Munk 	struct mlx5_hca_attr attr;
352cd414f81SMichael Baum 	struct mlx5_devx_obj *mkey;
353cd414f81SMichael Baum 	void *obj;
354ba420719SOphir Munk 
355ba420719SOphir Munk 	if (!pd || !addr) {
356ba420719SOphir Munk 		rte_errno = EINVAL;
357ba420719SOphir Munk 		return -1;
358ba420719SOphir Munk 	}
359ba420719SOphir Munk 	if (mlx5_devx_cmd_query_hca_attr(mlx5_pd->devx_ctx, &attr))
360ba420719SOphir Munk 		return -1;
361cd414f81SMichael Baum 	obj = mlx5_os_umem_reg(mlx5_pd->devx_ctx, addr, length,
362cd414f81SMichael Baum 			       IBV_ACCESS_LOCAL_WRITE);
363cd414f81SMichael Baum 	if (!obj)
364ba420719SOphir Munk 		return -1;
3659f39076bSShiri Kuzin 	memset(&mkey_attr, 0, sizeof(mkey_attr));
366ba420719SOphir Munk 	mkey_attr.addr = (uintptr_t)addr;
367ba420719SOphir Munk 	mkey_attr.size = length;
368cd414f81SMichael Baum 	mkey_attr.umem_id = ((struct mlx5_devx_umem *)(obj))->umem_id;
369ba420719SOphir Munk 	mkey_attr.pd = mlx5_pd->pdn;
370ba420719SOphir Munk 	if (!haswell_broadwell_cpu) {
371ba420719SOphir Munk 		mkey_attr.relaxed_ordering_write = attr.relaxed_ordering_write;
372ba420719SOphir Munk 		mkey_attr.relaxed_ordering_read = attr.relaxed_ordering_read;
373ba420719SOphir Munk 	}
374cd414f81SMichael Baum 	mkey = mlx5_devx_cmd_mkey_create(mlx5_pd->devx_ctx, &mkey_attr);
375cd414f81SMichael Baum 	if (!mkey) {
376cd414f81SMichael Baum 		claim_zero(mlx5_os_umem_dereg(obj));
377ba420719SOphir Munk 		return -1;
378ba420719SOphir Munk 	}
379cd414f81SMichael Baum 	pmd_mr->addr = addr;
380cd414f81SMichael Baum 	pmd_mr->len = length;
381cd414f81SMichael Baum 	pmd_mr->obj = obj;
382cd414f81SMichael Baum 	pmd_mr->mkey = mkey;
383ba420719SOphir Munk 	pmd_mr->lkey = pmd_mr->mkey->id;
384ba420719SOphir Munk 	return 0;
385ba420719SOphir Munk }
386ba420719SOphir Munk 
387ba420719SOphir Munk /**
388ba420719SOphir Munk  * De-register mr.
389ba420719SOphir Munk  *
390ba420719SOphir Munk  * @param[in] pmd_mr
391ba420719SOphir Munk  *  Pointer to PMD mr object
392ba420719SOphir Munk  */
3935fbc75acSMichael Baum static void
mlx5_os_dereg_mr(struct mlx5_pmd_mr * pmd_mr)394ba420719SOphir Munk mlx5_os_dereg_mr(struct mlx5_pmd_mr *pmd_mr)
395ba420719SOphir Munk {
396f550a49dSMichael Baum 	if (!pmd_mr)
397f550a49dSMichael Baum 		return;
398f550a49dSMichael Baum 	if (pmd_mr->mkey)
399f550a49dSMichael Baum 		claim_zero(mlx5_devx_cmd_destroy(pmd_mr->mkey));
400f550a49dSMichael Baum 	if (pmd_mr->obj)
401ba420719SOphir Munk 		claim_zero(mlx5_os_umem_dereg(pmd_mr->obj));
402ba420719SOphir Munk 	memset(pmd_mr, 0, sizeof(*pmd_mr));
403ba420719SOphir Munk }
4045fbc75acSMichael Baum 
4055fbc75acSMichael Baum /**
4065fbc75acSMichael Baum  * Set the reg_mr and dereg_mr callbacks.
4075fbc75acSMichael Baum  *
4085fbc75acSMichael Baum  * @param[out] reg_mr_cb
4095fbc75acSMichael Baum  *   Pointer to reg_mr func
4105fbc75acSMichael Baum  * @param[out] dereg_mr_cb
4115fbc75acSMichael Baum  *   Pointer to dereg_mr func
4125fbc75acSMichael Baum  *
4135fbc75acSMichael Baum  */
4145fbc75acSMichael Baum void
mlx5_os_set_reg_mr_cb(mlx5_reg_mr_t * reg_mr_cb,mlx5_dereg_mr_t * dereg_mr_cb)4155fbc75acSMichael Baum mlx5_os_set_reg_mr_cb(mlx5_reg_mr_t *reg_mr_cb, mlx5_dereg_mr_t *dereg_mr_cb)
4165fbc75acSMichael Baum {
4175fbc75acSMichael Baum 	*reg_mr_cb = mlx5_os_reg_mr;
4185fbc75acSMichael Baum 	*dereg_mr_cb = mlx5_os_dereg_mr;
4195fbc75acSMichael Baum }
42076b5bdf8SMatan Azrad 
42176b5bdf8SMatan Azrad /*
42276b5bdf8SMatan Azrad  * In Windows, no need to wrap the MR, no known issue for it in kernel.
42376b5bdf8SMatan Azrad  * Use the regular function to create direct MR.
42476b5bdf8SMatan Azrad  */
42576b5bdf8SMatan Azrad int
mlx5_os_wrapped_mkey_create(void * ctx,void * pd,uint32_t pdn,void * addr,size_t length,struct mlx5_pmd_wrapped_mr * wpmd_mr)42676b5bdf8SMatan Azrad mlx5_os_wrapped_mkey_create(void *ctx, void *pd, uint32_t pdn, void *addr,
42776b5bdf8SMatan Azrad 			    size_t length, struct mlx5_pmd_wrapped_mr *wpmd_mr)
42876b5bdf8SMatan Azrad {
42976b5bdf8SMatan Azrad 	struct mlx5_pmd_mr pmd_mr = {0};
43076b5bdf8SMatan Azrad 	int ret = mlx5_os_reg_mr(pd, addr, length, &pmd_mr);
43176b5bdf8SMatan Azrad 
43276b5bdf8SMatan Azrad 	(void)pdn;
43376b5bdf8SMatan Azrad 	(void)ctx;
43476b5bdf8SMatan Azrad 	if (ret != 0)
43576b5bdf8SMatan Azrad 		return -1;
43676b5bdf8SMatan Azrad 	wpmd_mr->addr = addr;
43776b5bdf8SMatan Azrad 	wpmd_mr->len = length;
43876b5bdf8SMatan Azrad 	wpmd_mr->obj = pmd_mr.obj;
43976b5bdf8SMatan Azrad 	wpmd_mr->imkey = pmd_mr.mkey;
44076b5bdf8SMatan Azrad 	wpmd_mr->lkey = pmd_mr.mkey->id;
44176b5bdf8SMatan Azrad 	return 0;
44276b5bdf8SMatan Azrad }
44376b5bdf8SMatan Azrad 
44476b5bdf8SMatan Azrad void
mlx5_os_wrapped_mkey_destroy(struct mlx5_pmd_wrapped_mr * wpmd_mr)44576b5bdf8SMatan Azrad mlx5_os_wrapped_mkey_destroy(struct mlx5_pmd_wrapped_mr *wpmd_mr)
44676b5bdf8SMatan Azrad {
44776b5bdf8SMatan Azrad 	struct mlx5_pmd_mr pmd_mr;
44876b5bdf8SMatan Azrad 
44976b5bdf8SMatan Azrad 	if (!wpmd_mr)
45076b5bdf8SMatan Azrad 		return;
45176b5bdf8SMatan Azrad 	pmd_mr.addr = wpmd_mr->addr;
45276b5bdf8SMatan Azrad 	pmd_mr.len = wpmd_mr->len;
45376b5bdf8SMatan Azrad 	pmd_mr.obj = wpmd_mr->obj;
45476b5bdf8SMatan Azrad 	pmd_mr.mkey = wpmd_mr->imkey;
45576b5bdf8SMatan Azrad 	pmd_mr.lkey = wpmd_mr->lkey;
45676b5bdf8SMatan Azrad 	mlx5_os_dereg_mr(&pmd_mr);
45776b5bdf8SMatan Azrad 	memset(wpmd_mr, 0, sizeof(*wpmd_mr));
45876b5bdf8SMatan Azrad }
459