1210284Sjmallett/***********************license start***************
2232812Sjmallett * Copyright (c) 2003-2010  Cavium Inc. (support@cavium.com). All rights
3215990Sjmallett * reserved.
4210284Sjmallett *
5210284Sjmallett *
6215990Sjmallett * Redistribution and use in source and binary forms, with or without
7215990Sjmallett * modification, are permitted provided that the following conditions are
8215990Sjmallett * met:
9210284Sjmallett *
10215990Sjmallett *   * Redistributions of source code must retain the above copyright
11215990Sjmallett *     notice, this list of conditions and the following disclaimer.
12210284Sjmallett *
13215990Sjmallett *   * Redistributions in binary form must reproduce the above
14215990Sjmallett *     copyright notice, this list of conditions and the following
15215990Sjmallett *     disclaimer in the documentation and/or other materials provided
16215990Sjmallett *     with the distribution.
17215990Sjmallett
18232812Sjmallett *   * Neither the name of Cavium Inc. nor the names of
19215990Sjmallett *     its contributors may be used to endorse or promote products
20215990Sjmallett *     derived from this software without specific prior written
21215990Sjmallett *     permission.
22215990Sjmallett
23215990Sjmallett * This Software, including technical data, may be subject to U.S. export  control
24215990Sjmallett * laws, including the U.S. Export Administration Act and its  associated
25215990Sjmallett * regulations, and may be subject to export or import  regulations in other
26215990Sjmallett * countries.
27215990Sjmallett
28215990Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
29232812Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
30215990Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
31215990Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
32215990Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
33215990Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
34215990Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
35215990Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
36215990Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
37215990Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
38210284Sjmallett ***********************license end**************************************/
39210284Sjmallett
40210284Sjmallett
41210284Sjmallett
42210284Sjmallett
43210284Sjmallett
44215990Sjmallett
45210284Sjmallett/**
46210284Sjmallett * @file
47210284Sjmallett *
48210284Sjmallett * This file provides prototypes for the memory management library functions.
49210284Sjmallett * Two different allocators are provided: an arena based allocator that is derived from a
50210284Sjmallett * modified version of ptmalloc2 (used in glibc), and a zone allocator for allocating fixed
51210284Sjmallett * size memory blocks.
52210284Sjmallett *
53232812Sjmallett * <hr>$Revision: 70030 $<hr>
54210284Sjmallett */
55210284Sjmallett
56210284Sjmallett#ifndef __CVMX_MALLOC_H__
57210284Sjmallett#define __CVMX_MALLOC_H__
58210284Sjmallett
59210284Sjmallett#include "cvmx-spinlock.h"
60210284Sjmallett#ifdef __cplusplus
61210284Sjmallettextern "C" {
62210284Sjmallett#endif
63210284Sjmallett
64210284Sjmallett
65210284Sjmallettstruct malloc_state; /* forward declaration */
66210284Sjmalletttypedef struct malloc_state *cvmx_arena_list_t;
67210284Sjmallett
68210284Sjmallett
69215990Sjmallett#ifndef CVMX_BUILD_FOR_LINUX_USER
70210284Sjmallett/**
71210284Sjmallett * Creates an arena from the memory region specified and adds it
72210284Sjmallett * to the supplied arena list.
73210284Sjmallett *
74210284Sjmallett * @param arena_list Pointer to an arena list to add new arena to.
75210284Sjmallett *                   If NULL, new list is created.
76210284Sjmallett * @param ptr        pointer to memory region to create arena from
77210284Sjmallett *
78210284Sjmallett * @param size       Size of memory region available at ptr in bytes.
79210284Sjmallett *
80210284Sjmallett * @return -1 on Failure
81210284Sjmallett *         0 on success
82210284Sjmallett */
83210284Sjmallettint cvmx_add_arena(cvmx_arena_list_t *arena_list, void *ptr, size_t size);
84210284Sjmallett
85210284Sjmallett/**
86210284Sjmallett * allocate buffer from an arena list
87210284Sjmallett *
88210284Sjmallett * @param arena_list arena list to allocate buffer from
89210284Sjmallett * @param size       size of buffer to allocate (in bytes)
90210284Sjmallett *
91210284Sjmallett * @return pointer to buffer or NULL if allocation failed
92210284Sjmallett */
93210284Sjmallettvoid *cvmx_malloc(cvmx_arena_list_t arena_list, size_t size);
94210284Sjmallett/**
95210284Sjmallett * Allocate zero initialized buffer
96210284Sjmallett *
97210284Sjmallett * @param arena_list arena list to allocate from
98210284Sjmallett * @param n          number of elements
99210284Sjmallett * @param elem_size  size of elementes
100210284Sjmallett *
101210284Sjmallett * @return pointer to (n*elem_size) byte zero initialized buffer or NULL
102210284Sjmallett *         on allocation failure
103210284Sjmallett */
104210284Sjmallettvoid *cvmx_calloc(cvmx_arena_list_t arena_list, size_t n, size_t elem_size);
105210284Sjmallett/**
106210284Sjmallett * attempt to increase the size of an already allocated buffer
107210284Sjmallett * This function may allocate a new buffer and copy
108210284Sjmallett * the data if current buffer can't be extended.
109210284Sjmallett *
110210284Sjmallett * @param arena_list arena list to allocate from
111210284Sjmallett * @param ptr        pointer to buffer to extend
112210284Sjmallett * @param size       new buffer size
113210284Sjmallett *
114210284Sjmallett * @return pointer to expanded buffer (may differ from ptr)
115210284Sjmallett *         or NULL on failure
116210284Sjmallett */
117210284Sjmallettvoid *cvmx_realloc(cvmx_arena_list_t arena_list, void *ptr, size_t size);
118210284Sjmallett/**
119210284Sjmallett * allocate a buffer with a specified alignment
120210284Sjmallett *
121210284Sjmallett * @param arena_list arena list to allocate from
122210284Sjmallett * @param alignment  alignment of buffer.  Must be a power of 2
123210284Sjmallett * @param bytes      size of buffer in bytes
124210284Sjmallett *
125210284Sjmallett * @return pointer to buffer on success
126210284Sjmallett *         NULL on failure
127210284Sjmallett */
128210284Sjmallettvoid *cvmx_memalign(cvmx_arena_list_t arena_list, size_t alignment, size_t bytes);
129210284Sjmallett/**
130210284Sjmallett * free a previously allocated buffer
131210284Sjmallett *
132210284Sjmallett * @param ptr    pointer of buffer to deallocate
133210284Sjmallett */
134210284Sjmallettvoid cvmx_free(void *ptr);
135215990Sjmallett#endif
136210284Sjmallett
137210284Sjmallett
138210284Sjmallett
139210284Sjmallett
140210284Sjmallett#define CVMX_ZONE_OVERHEAD  (64)
141210284Sjmallett/** Zone allocator definitions
142210284Sjmallett *
143210284Sjmallett */
144210284Sjmallettstruct cvmx_zone
145210284Sjmallett{
146210284Sjmallett	cvmx_spinlock_t lock;
147210284Sjmallett	char *baseptr;
148210284Sjmallett	char *name;
149210284Sjmallett	void *freelist;
150210284Sjmallett	uint32_t num_elem;
151210284Sjmallett	uint32_t elem_size;
152210284Sjmallett	uint32_t align;
153210284Sjmallett};
154210284Sjmalletttypedef struct cvmx_zone * cvmx_zone_t;
155210284Sjmallett
156210284Sjmallettstatic inline uint32_t cvmx_zone_size(cvmx_zone_t zone)
157210284Sjmallett{
158210284Sjmallett    return(zone->elem_size);
159210284Sjmallett}
160210284Sjmallettstatic inline char *cvmx_zone_name(cvmx_zone_t zone)
161210284Sjmallett{
162210284Sjmallett    return(zone->name);
163210284Sjmallett}
164210284Sjmallett
165210284Sjmallett
166215990Sjmallett#ifndef CVMX_BUILD_FOR_LINUX_USER
167210284Sjmallett/**
168210284Sjmallett * Creates a memory zone for efficient allocation/deallocation of
169210284Sjmallett * fixed size memory blocks from a specified memory region.
170210284Sjmallett *
171210284Sjmallett * @param name      name of zone.
172210284Sjmallett * @param elem_size size of blocks that will be requested from zone
173210284Sjmallett * @param num_elem  number of elements to allocate
174210284Sjmallett * @param mem_ptr   pointer to memory to allocate zone from
175210284Sjmallett * @param mem_size  size of memory region available
176210284Sjmallett *                  (must be at least elem_size * num_elem + CVMX_ZONE_OVERHEAD bytes)
177210284Sjmallett * @param flags     flags for zone.  Currently unused.
178210284Sjmallett *
179210284Sjmallett * @return pointer to zone on success or
180210284Sjmallett *         NULL on failure
181210284Sjmallett */
182210284Sjmallettcvmx_zone_t cvmx_zone_create_from_addr(char *name, uint32_t elem_size, uint32_t num_elem,
183210284Sjmallett                             void* mem_ptr, uint64_t mem_size, uint32_t flags);
184210284Sjmallett/**
185210284Sjmallett * Creates a memory zone for efficient allocation/deallocation of
186210284Sjmallett * fixed size memory blocks from a previously initialized arena list.
187210284Sjmallett *
188210284Sjmallett * @param name       name of zone.
189210284Sjmallett * @param elem_size  size of blocks that will be requested from zone
190210284Sjmallett * @param num_elem   number of elements to allocate
191210284Sjmallett * @param align      alignment of buffers (must be power of 2)
192210284Sjmallett *                   Elements are allocated contiguously, so the buffer size
193210284Sjmallett *                   must be a multiple of the requested alignment for all
194210284Sjmallett *                   buffers to have the requested alignment.
195210284Sjmallett * @param arena_list arena list to allocate memory from
196210284Sjmallett * @param flags      flags for zone.  Currently unused.
197210284Sjmallett *
198210284Sjmallett * @return pointer to zone on success or
199210284Sjmallett *         NULL on failure
200210284Sjmallett */
201210284Sjmallettcvmx_zone_t cvmx_zone_create_from_arena(char *name, uint32_t elem_size, uint32_t num_elem, uint32_t align,
202210284Sjmallett                             cvmx_arena_list_t arena_list, uint32_t flags);
203215990Sjmallett#endif
204210284Sjmallett/**
205210284Sjmallett * Allocate a buffer from a memory zone
206210284Sjmallett *
207210284Sjmallett * @param zone   zone to allocate buffer from
208210284Sjmallett * @param flags  flags (currently unused)
209210284Sjmallett *
210210284Sjmallett * @return pointer to buffer or NULL on failure
211210284Sjmallett */
212210284Sjmallettvoid * cvmx_zone_alloc(cvmx_zone_t zone, uint32_t flags);
213210284Sjmallett/**
214210284Sjmallett * Free a previously allocated buffer
215210284Sjmallett *
216210284Sjmallett * @param zone   zone that buffer was allocated from
217210284Sjmallett * @param ptr    pointer to buffer to be freed
218210284Sjmallett */
219210284Sjmallettvoid cvmx_zone_free(cvmx_zone_t zone, void *ptr);
220210284Sjmallett
221210284Sjmallett#ifdef __cplusplus
222210284Sjmallett}
223210284Sjmallett#endif
224210284Sjmallett
225210284Sjmallett#endif // __CVMX_MALLOC_H__
226