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