xref: /freebsd/contrib/ofed/libbnxtre/memory.c (revision 9207f9d206a4017001f01ca27d3d25a26c268a95)
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