1*9207f9d2SChandrakanth patil /* 2*9207f9d2SChandrakanth patil * Copyright (c) 2024, Broadcom. All rights reserved. The term 3*9207f9d2SChandrakanth patil * Broadcom refers to Broadcom Limited and/or its subsidiaries. 4*9207f9d2SChandrakanth patil * 5*9207f9d2SChandrakanth patil * Redistribution and use in source and binary forms, with or without 6*9207f9d2SChandrakanth patil * modification, are permitted provided that the following conditions 7*9207f9d2SChandrakanth patil * are met: 8*9207f9d2SChandrakanth patil * 9*9207f9d2SChandrakanth patil * 1. Redistributions of source code must retain the above copyright 10*9207f9d2SChandrakanth patil * notice, this list of conditions and the following disclaimer. 11*9207f9d2SChandrakanth patil * 2. Redistributions in binary form must reproduce the above copyright 12*9207f9d2SChandrakanth patil * notice, this list of conditions and the following disclaimer in 13*9207f9d2SChandrakanth patil * the documentation and/or other materials provided with the 14*9207f9d2SChandrakanth patil * distribution. 15*9207f9d2SChandrakanth patil * 16*9207f9d2SChandrakanth patil * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' 17*9207f9d2SChandrakanth patil * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 18*9207f9d2SChandrakanth patil * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19*9207f9d2SChandrakanth patil * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 20*9207f9d2SChandrakanth patil * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*9207f9d2SChandrakanth patil * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*9207f9d2SChandrakanth patil * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23*9207f9d2SChandrakanth patil * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24*9207f9d2SChandrakanth patil * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25*9207f9d2SChandrakanth patil * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26*9207f9d2SChandrakanth patil * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*9207f9d2SChandrakanth patil * 28*9207f9d2SChandrakanth patil */ 29*9207f9d2SChandrakanth patil 30*9207f9d2SChandrakanth patil #include <sys/mman.h> 31*9207f9d2SChandrakanth patil 32*9207f9d2SChandrakanth patil #include <malloc.h> 33*9207f9d2SChandrakanth patil #include <string.h> 34*9207f9d2SChandrakanth patil 35*9207f9d2SChandrakanth patil #include "main.h" 36*9207f9d2SChandrakanth patil 37*9207f9d2SChandrakanth patil void bnxt_re_free_mem(struct bnxt_re_mem *mem) 38*9207f9d2SChandrakanth patil { 39*9207f9d2SChandrakanth patil if (mem->va_head) { 40*9207f9d2SChandrakanth patil ibv_dofork_range(mem->va_head, mem->size); 41*9207f9d2SChandrakanth patil munmap(mem->va_head, mem->size); 42*9207f9d2SChandrakanth patil } 43*9207f9d2SChandrakanth patil 44*9207f9d2SChandrakanth patil free(mem); 45*9207f9d2SChandrakanth patil } 46*9207f9d2SChandrakanth patil 47*9207f9d2SChandrakanth patil void *bnxt_re_alloc_mem(size_t size, uint32_t pg_size) 48*9207f9d2SChandrakanth patil { 49*9207f9d2SChandrakanth patil struct bnxt_re_mem *mem; 50*9207f9d2SChandrakanth patil 51*9207f9d2SChandrakanth patil mem = calloc(1, sizeof(*mem)); 52*9207f9d2SChandrakanth patil if (!mem) 53*9207f9d2SChandrakanth patil return NULL; 54*9207f9d2SChandrakanth patil 55*9207f9d2SChandrakanth patil size = get_aligned(size, pg_size); 56*9207f9d2SChandrakanth patil mem->size = size; 57*9207f9d2SChandrakanth patil mem->va_head = mmap(NULL, size, PROT_READ | PROT_WRITE, 58*9207f9d2SChandrakanth patil MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 59*9207f9d2SChandrakanth patil if (mem->va_head == MAP_FAILED) 60*9207f9d2SChandrakanth patil goto bail; 61*9207f9d2SChandrakanth patil 62*9207f9d2SChandrakanth patil if (ibv_dontfork_range(mem->va_head, size)) 63*9207f9d2SChandrakanth patil goto unmap; 64*9207f9d2SChandrakanth patil 65*9207f9d2SChandrakanth patil mem->head = 0; 66*9207f9d2SChandrakanth patil mem->tail = 0; 67*9207f9d2SChandrakanth patil mem->va_tail = (void *)((char *)mem->va_head + size); 68*9207f9d2SChandrakanth patil return mem; 69*9207f9d2SChandrakanth patil unmap: 70*9207f9d2SChandrakanth patil munmap(mem->va_head, size); 71*9207f9d2SChandrakanth patil bail: 72*9207f9d2SChandrakanth patil free(mem); 73*9207f9d2SChandrakanth patil return NULL; 74*9207f9d2SChandrakanth patil } 75*9207f9d2SChandrakanth patil 76*9207f9d2SChandrakanth patil void *bnxt_re_get_obj(struct bnxt_re_mem *mem, size_t req) 77*9207f9d2SChandrakanth patil { 78*9207f9d2SChandrakanth patil void *va; 79*9207f9d2SChandrakanth patil 80*9207f9d2SChandrakanth patil if ((mem->size - mem->tail - req) < mem->head) 81*9207f9d2SChandrakanth patil return NULL; 82*9207f9d2SChandrakanth patil mem->tail += req; 83*9207f9d2SChandrakanth patil va = (void *)((char *)mem->va_tail - mem->tail); 84*9207f9d2SChandrakanth patil return va; 85*9207f9d2SChandrakanth patil } 86*9207f9d2SChandrakanth patil 87*9207f9d2SChandrakanth patil void *bnxt_re_get_ring(struct bnxt_re_mem *mem, size_t req) 88*9207f9d2SChandrakanth patil { 89*9207f9d2SChandrakanth patil void *va; 90*9207f9d2SChandrakanth patil 91*9207f9d2SChandrakanth patil if ((mem->head + req) > (mem->size - mem->tail)) 92*9207f9d2SChandrakanth patil return NULL; 93*9207f9d2SChandrakanth patil va = (void *)((char *)mem->va_head + mem->head); 94*9207f9d2SChandrakanth patil mem->head += req; 95*9207f9d2SChandrakanth patil return va; 96*9207f9d2SChandrakanth patil } 97