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