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