The mlx5_common_verbs_reg_mr() and mlx5_common_verbs_dereg_mr()
APIs are equivalent to their Linux counterparts

Signed-off-by: Srikanth Kaka <srikant...@oneconvergence.com>
Signed-off-by: Vag Singh <vag.si...@oneconvergence.com>
Signed-off-by: Anand Thulasiram <av...@juniper.net>
---
 drivers/common/mlx5/freebsd/meson.build       |  1 +
 .../common/mlx5/freebsd/mlx5_common_verbs.c   | 73 +++++++++++++++++++
 2 files changed, 74 insertions(+)
 create mode 100644 drivers/common/mlx5/freebsd/mlx5_common_verbs.c

diff --git a/drivers/common/mlx5/freebsd/meson.build 
b/drivers/common/mlx5/freebsd/meson.build
index 8e4bb1659e..4112fdb155 100644
--- a/drivers/common/mlx5/freebsd/meson.build
+++ b/drivers/common/mlx5/freebsd/meson.build
@@ -33,6 +33,7 @@ endif
 
 sources += files('mlx5_common_os.c')
 sources += files('mlx5_glue.c')
+sources += files('mlx5_common_verbs.c')
 
 # To maintain the compatibility with the make build system
 # mlx5_autoconf.h file is still generated.
diff --git a/drivers/common/mlx5/freebsd/mlx5_common_verbs.c 
b/drivers/common/mlx5/freebsd/mlx5_common_verbs.c
new file mode 100644
index 0000000000..efb039c53d
--- /dev/null
+++ b/drivers/common/mlx5/freebsd/mlx5_common_verbs.c
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2020 Mellanox Technologies, Ltd
+ */
+
+#include <stddef.h>
+#include <errno.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <inttypes.h>
+
+#include "mlx5_common_utils.h"
+#include "mlx5_common_log.h"
+#include "mlx5_common_private.h"
+#include "mlx5_autoconf.h"
+#include <mlx5_glue.h>
+#include <mlx5_common.h>
+#include <mlx5_common_mr.h>
+
+/**
+ * Register mr. Given protection domain pointer, pointer to addr and length
+ * register the memory region.
+ *
+ * @param[in] pd
+ *   Pointer to protection domain context.
+ * @param[in] addr
+ *   Pointer to memory start address.
+ * @param[in] length
+ *   Length of the memory to register.
+ * @param[out] pmd_mr
+ *   pmd_mr struct set with lkey, address, length and pointer to mr object
+ *
+ * @return
+ *   0 on successful registration, -1 otherwise
+ */
+int
+mlx5_common_verbs_reg_mr(void *pd, void *addr, size_t length,
+                        struct mlx5_pmd_mr *pmd_mr)
+{
+       struct ibv_mr *ibv_mr;
+
+       ibv_mr = mlx5_glue->reg_mr(pd, addr, length,
+                                  IBV_ACCESS_LOCAL_WRITE |
+                                  (haswell_broadwell_cpu ? 0 :
+                                  IBV_ACCESS_RELAXED_ORDERING));
+       if (!ibv_mr)
+               return -1;
+
+       *pmd_mr = (struct mlx5_pmd_mr){
+               .lkey = ibv_mr->lkey,
+               .addr = ibv_mr->addr,
+               .len = ibv_mr->length,
+               .obj = (void *)ibv_mr,
+       };
+       return 0;
+}
+
+/**
+ * Deregister mr. Given the mlx5 pmd MR - deregister the MR
+ *
+ * @param[in] pmd_mr
+ *   pmd_mr struct set with lkey, address, length and pointer to mr object
+ *
+ */
+void
+mlx5_common_verbs_dereg_mr(struct mlx5_pmd_mr *pmd_mr)
+{
+       if (pmd_mr && pmd_mr->obj != NULL) {
+               claim_zero(mlx5_glue->dereg_mr(pmd_mr->obj));
+               memset(pmd_mr, 0, sizeof(*pmd_mr));
+       }
+}
-- 
2.30.2

Reply via email to