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 * Simple allocate only memory allocator. Used to allocate memory at application 48210284Sjmallett * start time. 49210284Sjmallett * 50232812Sjmallett * <hr>$Revision: 70030 $<hr> 51210284Sjmallett * 52210284Sjmallett */ 53210284Sjmallett 54210284Sjmallett#ifndef __CVMX_BOOTMEM_H__ 55210284Sjmallett#define __CVMX_BOOTMEM_H__ 56210284Sjmallett 57210284Sjmallett#ifdef __cplusplus 58210284Sjmallettextern "C" { 59210284Sjmallett#endif 60210284Sjmallett 61210284Sjmallett#define CVMX_BOOTMEM_NAME_LEN 128 /* Must be multiple of 8, changing breaks ABI */ 62210284Sjmallett#define CVMX_BOOTMEM_NUM_NAMED_BLOCKS 64 /* Can change without breaking ABI */ 63210284Sjmallett#define CVMX_BOOTMEM_ALIGNMENT_SIZE (16ull) /* minimum alignment of bootmem alloced blocks */ 64210284Sjmallett 65210284Sjmallett/* Flags for cvmx_bootmem_phy_mem* functions */ 66210284Sjmallett#define CVMX_BOOTMEM_FLAG_END_ALLOC (1 << 0) /* Allocate from end of block instead of beginning */ 67210284Sjmallett#define CVMX_BOOTMEM_FLAG_NO_LOCKING (1 << 1) /* Don't do any locking. */ 68210284Sjmallett 69232812Sjmallett/* Real physical addresses of memory regions */ 70232812Sjmallett#define OCTEON_DDR0_BASE (0x0ULL) 71232812Sjmallett#define OCTEON_DDR0_SIZE (0x010000000ULL) 72232812Sjmallett#define OCTEON_DDR1_BASE ((OCTEON_IS_MODEL(OCTEON_CN6XXX) || OCTEON_IS_MODEL(OCTEON_CNF7XXX)) ? 0x20000000ULL : 0x410000000ULL) 73232812Sjmallett#define OCTEON_DDR1_SIZE (0x010000000ULL) 74232812Sjmallett#define OCTEON_DDR2_BASE ((OCTEON_IS_MODEL(OCTEON_CN6XXX) || OCTEON_IS_MODEL(OCTEON_CNF7XXX)) ? 0x30000000ULL : 0x20000000ULL) 75232812Sjmallett#define OCTEON_DDR2_SIZE ((OCTEON_IS_MODEL(OCTEON_CN6XXX) || OCTEON_IS_MODEL(OCTEON_CNF7XXX)) ? 0x7d0000000ULL : 0x3e0000000ULL) 76232812Sjmallett#define OCTEON_MAX_PHY_MEM_SIZE ((OCTEON_IS_MODEL(OCTEON_CN68XX)) ? 128*1024*1024*1024ULL : (OCTEON_IS_MODEL(OCTEON_CN6XXX) || OCTEON_IS_MODEL(OCTEON_CNF7XXX)) ? 32*1024*1024*1024ull : 16*1024*1024*1024ULL) 77210284Sjmallett 78210284Sjmallett/* First bytes of each free physical block of memory contain this structure, 79210284Sjmallett * which is used to maintain the free memory list. Since the bootloader is 80210284Sjmallett * only 32 bits, there is a union providing 64 and 32 bit versions. The 81210284Sjmallett * application init code converts addresses to 64 bit addresses before the 82210284Sjmallett * application starts. 83210284Sjmallett */ 84210284Sjmalletttypedef struct 85210284Sjmallett{ 86210284Sjmallett /* Note: these are referenced from assembly routines in the bootloader, so this structure 87210284Sjmallett ** should not be changed without changing those routines as well. */ 88210284Sjmallett uint64_t next_block_addr; 89210284Sjmallett uint64_t size; 90210284Sjmallett 91210284Sjmallett} cvmx_bootmem_block_header_t; 92210284Sjmallett 93210284Sjmallett 94210284Sjmallett/* Structure for named memory blocks 95210284Sjmallett** Number of descriptors 96210284Sjmallett** available can be changed without affecting compatiblity, 97210284Sjmallett** but name length changes require a bump in the bootmem 98210284Sjmallett** descriptor version 99210284Sjmallett** Note: This structure must be naturally 64 bit aligned, as a single 100210284Sjmallett** memory image will be used by both 32 and 64 bit programs. 101210284Sjmallett*/ 102215990Sjmallettstruct cvmx_bootmem_named_block_desc 103210284Sjmallett{ 104210284Sjmallett uint64_t base_addr; /**< Base address of named block */ 105210284Sjmallett uint64_t size; /**< Size actually allocated for named block (may differ from requested) */ 106210284Sjmallett char name[CVMX_BOOTMEM_NAME_LEN]; /**< name of named block */ 107215990Sjmallett}; 108210284Sjmallett 109215990Sjmalletttypedef struct cvmx_bootmem_named_block_desc cvmx_bootmem_named_block_desc_t; 110210284Sjmallett 111210284Sjmallett/* Current descriptor versions */ 112210284Sjmallett#define CVMX_BOOTMEM_DESC_MAJ_VER 3 /* CVMX bootmem descriptor major version */ 113210284Sjmallett#define CVMX_BOOTMEM_DESC_MIN_VER 0 /* CVMX bootmem descriptor minor version */ 114210284Sjmallett 115210284Sjmallett/* First three members of cvmx_bootmem_desc_t are left in original 116210284Sjmallett** positions for backwards compatibility. 117210284Sjmallett*/ 118210284Sjmalletttypedef struct 119210284Sjmallett{ 120210284Sjmallett uint32_t lock; /**< spinlock to control access to list */ 121210284Sjmallett uint32_t flags; /**< flags for indicating various conditions */ 122210284Sjmallett uint64_t head_addr; 123210284Sjmallett 124210284Sjmallett uint32_t major_version; /**< incremented changed when incompatible changes made */ 125210284Sjmallett uint32_t minor_version; /**< incremented changed when compatible changes made, reset to zero when major incremented */ 126210284Sjmallett uint64_t app_data_addr; 127210284Sjmallett uint64_t app_data_size; 128210284Sjmallett 129210284Sjmallett uint32_t named_block_num_blocks; /**< number of elements in named blocks array */ 130210284Sjmallett uint32_t named_block_name_len; /**< length of name array in bootmem blocks */ 131210284Sjmallett uint64_t named_block_array_addr; /**< address of named memory block descriptors */ 132210284Sjmallett 133210284Sjmallett} cvmx_bootmem_desc_t; 134210284Sjmallett 135210284Sjmallett 136210284Sjmallett/** 137210284Sjmallett * Initialize the boot alloc memory structures. This is 138210284Sjmallett * normally called inside of cvmx_user_app_init() 139210284Sjmallett * 140215990Sjmallett * @param mem_desc_addr Address of the free memory list 141210284Sjmallett * @return 142210284Sjmallett */ 143215990Sjmallettextern int cvmx_bootmem_init(uint64_t mem_desc_addr); 144210284Sjmallett 145210284Sjmallett 146210284Sjmallett/** 147210284Sjmallett * Allocate a block of memory from the free list that was passed 148210284Sjmallett * to the application by the bootloader. 149210284Sjmallett * This is an allocate-only algorithm, so freeing memory is not possible. 150210284Sjmallett * 151210284Sjmallett * @param size Size in bytes of block to allocate 152210284Sjmallett * @param alignment Alignment required - must be power of 2 153210284Sjmallett * 154210284Sjmallett * @return pointer to block of memory, NULL on error 155210284Sjmallett */ 156210284Sjmallettextern void *cvmx_bootmem_alloc(uint64_t size, uint64_t alignment); 157210284Sjmallett 158210284Sjmallett/** 159210284Sjmallett * Allocate a block of memory from the free list that was 160210284Sjmallett * passed to the application by the bootloader at a specific 161210284Sjmallett * address. This is an allocate-only algorithm, so 162210284Sjmallett * freeing memory is not possible. Allocation will fail if 163210284Sjmallett * memory cannot be allocated at the specified address. 164210284Sjmallett * 165210284Sjmallett * @param size Size in bytes of block to allocate 166210284Sjmallett * @param address Physical address to allocate memory at. If this memory is not 167210284Sjmallett * available, the allocation fails. 168210284Sjmallett * @param alignment Alignment required - must be power of 2 169210284Sjmallett * @return pointer to block of memory, NULL on error 170210284Sjmallett */ 171210284Sjmallettextern void *cvmx_bootmem_alloc_address(uint64_t size, uint64_t address, uint64_t alignment); 172210284Sjmallett 173232812Sjmallett/** 174232812Sjmallett * Allocate a block of memory from the free list that was 175232812Sjmallett * passed to the application by the bootloader within a specified 176232812Sjmallett * address range. This is an allocate-only algorithm, so 177232812Sjmallett * freeing memory is not possible. Allocation will fail if 178232812Sjmallett * memory cannot be allocated in the requested range. 179232812Sjmallett * 180232812Sjmallett * @param size Size in bytes of block to allocate 181232812Sjmallett * @param min_addr defines the minimum address of the range 182232812Sjmallett * @param max_addr defines the maximum address of the range 183232812Sjmallett * @param alignment Alignment required - must be power of 2 184232812Sjmallett * @param flags Flags to control options for the allocation. 185232812Sjmallett * @return pointer to block of memory, NULL on error 186232812Sjmallett */ 187232812Sjmallettextern void *cvmx_bootmem_alloc_range_flags(uint64_t size, uint64_t alignment, uint64_t min_addr, uint64_t max_addr, uint32_t flags); 188210284Sjmallett 189210284Sjmallett 190210284Sjmallett/** 191210284Sjmallett * Allocate a block of memory from the free list that was 192210284Sjmallett * passed to the application by the bootloader within a specified 193210284Sjmallett * address range. This is an allocate-only algorithm, so 194210284Sjmallett * freeing memory is not possible. Allocation will fail if 195210284Sjmallett * memory cannot be allocated in the requested range. 196210284Sjmallett * 197210284Sjmallett * @param size Size in bytes of block to allocate 198210284Sjmallett * @param min_addr defines the minimum address of the range 199210284Sjmallett * @param max_addr defines the maximum address of the range 200210284Sjmallett * @param alignment Alignment required - must be power of 2 201210284Sjmallett * @return pointer to block of memory, NULL on error 202210284Sjmallett */ 203210284Sjmallettextern void *cvmx_bootmem_alloc_range(uint64_t size, uint64_t alignment, uint64_t min_addr, uint64_t max_addr); 204210284Sjmallett 205210284Sjmallett 206210284Sjmallett/** 207210284Sjmallett * Allocate a block of memory from the free list that was passed 208210284Sjmallett * to the application by the bootloader, and assign it a name in the 209210284Sjmallett * global named block table. (part of the cvmx_bootmem_descriptor_t structure) 210210284Sjmallett * Named blocks can later be freed. 211210284Sjmallett * 212210284Sjmallett * @param size Size in bytes of block to allocate 213210284Sjmallett * @param alignment Alignment required - must be power of 2 214210284Sjmallett * @param name name of block - must be less than CVMX_BOOTMEM_NAME_LEN bytes 215210284Sjmallett * 216210284Sjmallett * @return pointer to block of memory, NULL on error 217210284Sjmallett */ 218215990Sjmallettextern void *cvmx_bootmem_alloc_named(uint64_t size, uint64_t alignment, const char *name); 219210284Sjmallett 220232812Sjmallett/** 221232812Sjmallett * Allocate a block of memory from the free list that was passed 222232812Sjmallett * to the application by the bootloader, and assign it a name in the 223232812Sjmallett * global named block table. (part of the cvmx_bootmem_descriptor_t structure) 224232812Sjmallett * Named blocks can later be freed. 225232812Sjmallett * 226232812Sjmallett * @param size Size in bytes of block to allocate 227232812Sjmallett * @param alignment Alignment required - must be power of 2 228232812Sjmallett * @param name name of block - must be less than CVMX_BOOTMEM_NAME_LEN bytes 229232812Sjmallett * @param flags Flags to control options for the allocation. 230232812Sjmallett * 231232812Sjmallett * @return pointer to block of memory, NULL on error 232232812Sjmallett */ 233232812Sjmallettextern void *cvmx_bootmem_alloc_named_flags(uint64_t size, uint64_t alignment, const char *name, uint32_t flags); 234210284Sjmallett 235210284Sjmallett 236232812Sjmallett 237210284Sjmallett/** 238210284Sjmallett * Allocate a block of memory from the free list that was passed 239210284Sjmallett * to the application by the bootloader, and assign it a name in the 240210284Sjmallett * global named block table. (part of the cvmx_bootmem_descriptor_t structure) 241210284Sjmallett * Named blocks can later be freed. 242210284Sjmallett * 243210284Sjmallett * @param size Size in bytes of block to allocate 244210284Sjmallett * @param address Physical address to allocate memory at. If this memory is not 245210284Sjmallett * available, the allocation fails. 246210284Sjmallett * @param name name of block - must be less than CVMX_BOOTMEM_NAME_LEN bytes 247210284Sjmallett * 248210284Sjmallett * @return pointer to block of memory, NULL on error 249210284Sjmallett */ 250215990Sjmallettextern void *cvmx_bootmem_alloc_named_address(uint64_t size, uint64_t address, const char *name); 251210284Sjmallett 252210284Sjmallett 253210284Sjmallett 254210284Sjmallett/** 255210284Sjmallett * Allocate a block of memory from a specific range of the free list that was passed 256210284Sjmallett * to the application by the bootloader, and assign it a name in the 257210284Sjmallett * global named block table. (part of the cvmx_bootmem_descriptor_t structure) 258210284Sjmallett * Named blocks can later be freed. 259210284Sjmallett * If request cannot be satisfied within the address range specified, NULL is returned 260210284Sjmallett * 261210284Sjmallett * @param size Size in bytes of block to allocate 262210284Sjmallett * @param min_addr minimum address of range 263210284Sjmallett * @param max_addr maximum address of range 264210284Sjmallett * @param align Alignment of memory to be allocated. (must be a power of 2) 265210284Sjmallett * @param name name of block - must be less than CVMX_BOOTMEM_NAME_LEN bytes 266210284Sjmallett * 267210284Sjmallett * @return pointer to block of memory, NULL on error 268210284Sjmallett */ 269215990Sjmallettextern void *cvmx_bootmem_alloc_named_range(uint64_t size, uint64_t min_addr, uint64_t max_addr, uint64_t align, const char *name); 270210284Sjmallett 271210284Sjmallett/** 272232812Sjmallett * Allocate if needed a block of memory from a specific range of the free list that was passed 273232812Sjmallett * to the application by the bootloader, and assign it a name in the 274232812Sjmallett * global named block table. (part of the cvmx_bootmem_descriptor_t structure) 275232812Sjmallett * Named blocks can later be freed. 276232812Sjmallett * If the requested name block is already allocated, return the pointer to block of memory. 277232812Sjmallett * If request cannot be satisfied within the address range specified, NULL is returned 278232812Sjmallett * 279232812Sjmallett * @param size Size in bytes of block to allocate 280232812Sjmallett * @param min_addr minimum address of range 281232812Sjmallett * @param max_addr maximum address of range 282232812Sjmallett * @param align Alignment of memory to be allocated. (must be a power of 2) 283232812Sjmallett * @param name name of block - must be less than CVMX_BOOTMEM_NAME_LEN bytes 284232812Sjmallett * @param init Initialization function 285232812Sjmallett * 286232812Sjmallett * @return pointer to block of memory, NULL on error 287232812Sjmallett */ 288232812Sjmallettextern void *cvmx_bootmem_alloc_named_range_once(uint64_t size, uint64_t min_addr, uint64_t max_addr, uint64_t align, const char *name, void (*init)(void*)); 289232812Sjmallett 290232812Sjmallett/** 291210284Sjmallett * Frees a previously allocated named bootmem block. 292210284Sjmallett * 293210284Sjmallett * @param name name of block to free 294210284Sjmallett * 295210284Sjmallett * @return 0 on failure, 296210284Sjmallett * !0 on success 297210284Sjmallett */ 298215990Sjmallettextern int cvmx_bootmem_free_named(const char *name); 299210284Sjmallett 300210284Sjmallett 301210284Sjmallett/** 302210284Sjmallett * Finds a named bootmem block by name. 303210284Sjmallett * 304210284Sjmallett * @param name name of block to free 305210284Sjmallett * 306210284Sjmallett * @return pointer to named block descriptor on success 307210284Sjmallett * 0 on failure 308210284Sjmallett */ 309215990Sjmallettconst cvmx_bootmem_named_block_desc_t *cvmx_bootmem_find_named_block(const char *name); 310210284Sjmallett 311210284Sjmallett 312210284Sjmallett 313210284Sjmallett/** 314210284Sjmallett * Returns the size of available memory in bytes, only 315210284Sjmallett * counting blocks that are at least as big as the minimum block 316210284Sjmallett * size. 317210284Sjmallett * 318210284Sjmallett * @param min_block_size 319210284Sjmallett * Minimum block size to count in total. 320210284Sjmallett * 321210284Sjmallett * @return Number of bytes available for allocation that meet the block size requirement 322210284Sjmallett */ 323210284Sjmallettuint64_t cvmx_bootmem_available_mem(uint64_t min_block_size); 324210284Sjmallett 325210284Sjmallett 326210284Sjmallett 327210284Sjmallett/** 328210284Sjmallett * Prints out the list of named blocks that have been allocated 329210284Sjmallett * along with their addresses and sizes. 330210284Sjmallett * This is primarily used for debugging purposes 331210284Sjmallett */ 332210284Sjmallettvoid cvmx_bootmem_print_named(void); 333210284Sjmallett 334210284Sjmallett 335210284Sjmallett/** 336210284Sjmallett * Allocates a block of physical memory from the free list, at (optional) requested address and alignment. 337210284Sjmallett * 338210284Sjmallett * @param req_size size of region to allocate. All requests are rounded up to be a multiple CVMX_BOOTMEM_ALIGNMENT_SIZE bytes size 339210284Sjmallett * @param address_min 340210284Sjmallett * Minimum address that block can occupy. 341210284Sjmallett * @param address_max 342210284Sjmallett * Specifies the maximum address_min (inclusive) that the allocation can use. 343210284Sjmallett * @param alignment Requested alignment of the block. If this alignment cannot be met, the allocation fails. 344210284Sjmallett * This must be a power of 2. 345210284Sjmallett * (Note: Alignment of CVMX_BOOTMEM_ALIGNMENT_SIZE bytes is required, and internally enforced. Requested alignments of 346210284Sjmallett * less than CVMX_BOOTMEM_ALIGNMENT_SIZE are set to CVMX_BOOTMEM_ALIGNMENT_SIZE.) 347210284Sjmallett * @param flags Flags to control options for the allocation. 348210284Sjmallett * 349210284Sjmallett * @return physical address of block allocated, or -1 on failure 350210284Sjmallett */ 351210284Sjmallettint64_t cvmx_bootmem_phy_alloc(uint64_t req_size, uint64_t address_min, uint64_t address_max, uint64_t alignment, uint32_t flags); 352210284Sjmallett 353210284Sjmallett 354210284Sjmallett 355210284Sjmallett/** 356210284Sjmallett * Allocates a named block of physical memory from the free list, at (optional) requested address and alignment. 357210284Sjmallett * 358210284Sjmallett * @param size size of region to allocate. All requests are rounded up to be a multiple CVMX_BOOTMEM_ALIGNMENT_SIZE bytes size 359210284Sjmallett * @param min_addr 360210284Sjmallett * Minimum address that block can occupy. 361210284Sjmallett * @param max_addr 362210284Sjmallett * Specifies the maximum address_min (inclusive) that the allocation can use. 363210284Sjmallett * @param alignment Requested alignment of the block. If this alignment cannot be met, the allocation fails. 364210284Sjmallett * This must be a power of 2. 365210284Sjmallett * (Note: Alignment of CVMX_BOOTMEM_ALIGNMENT_SIZE bytes is required, and internally enforced. Requested alignments of 366210284Sjmallett * less than CVMX_BOOTMEM_ALIGNMENT_SIZE are set to CVMX_BOOTMEM_ALIGNMENT_SIZE.) 367210284Sjmallett * @param name name to assign to named block 368210284Sjmallett * @param flags Flags to control options for the allocation. 369210284Sjmallett * 370210284Sjmallett * @return physical address of block allocated, or -1 on failure 371210284Sjmallett */ 372215990Sjmallettint64_t cvmx_bootmem_phy_named_block_alloc(uint64_t size, uint64_t min_addr, uint64_t max_addr, uint64_t alignment, const char *name, uint32_t flags); 373210284Sjmallett 374210284Sjmallett 375210284Sjmallett/** 376210284Sjmallett * Finds a named memory block by name. 377210284Sjmallett * Also used for finding an unused entry in the named block table. 378210284Sjmallett * 379210284Sjmallett * @param name Name of memory block to find. 380210284Sjmallett * If NULL pointer given, then finds unused descriptor, if available. 381215990Sjmallett * @param flags Flags to control options for the allocation. 382210284Sjmallett * 383215990Sjmallett * @return Physical address of the memory block descriptor, zero if not 384215990Sjmallett * found. If zero returned when name parameter is NULL, then no 385215990Sjmallett * memory block descriptors are available. 386210284Sjmallett */ 387215990Sjmallettuint64_t cvmx_bootmem_phy_named_block_find(const char *name, uint32_t flags); 388210284Sjmallett 389210284Sjmallett 390210284Sjmallett/** 391210284Sjmallett * Returns the size of available memory in bytes, only 392210284Sjmallett * counting blocks that are at least as big as the minimum block 393210284Sjmallett * size. 394210284Sjmallett * 395210284Sjmallett * @param min_block_size 396210284Sjmallett * Minimum block size to count in total. 397210284Sjmallett * 398210284Sjmallett * @return Number of bytes available for allocation that meet the block size requirement 399210284Sjmallett */ 400210284Sjmallettuint64_t cvmx_bootmem_phy_available_mem(uint64_t min_block_size); 401210284Sjmallett 402210284Sjmallett/** 403210284Sjmallett * Frees a named block. 404210284Sjmallett * 405210284Sjmallett * @param name name of block to free 406210284Sjmallett * @param flags flags for passing options 407210284Sjmallett * 408210284Sjmallett * @return 0 on failure 409210284Sjmallett * 1 on success 410210284Sjmallett */ 411215990Sjmallettint cvmx_bootmem_phy_named_block_free(const char *name, uint32_t flags); 412210284Sjmallett 413210284Sjmallett/** 414210284Sjmallett * Frees a block to the bootmem allocator list. This must 415210284Sjmallett * be used with care, as the size provided must match the size 416210284Sjmallett * of the block that was allocated, or the list will become 417210284Sjmallett * corrupted. 418210284Sjmallett * 419210284Sjmallett * IMPORTANT: This is only intended to be used as part of named block 420210284Sjmallett * frees and initial population of the free memory list. 421210284Sjmallett * * 422210284Sjmallett * 423210284Sjmallett * @param phy_addr physical address of block 424210284Sjmallett * @param size size of block in bytes. 425210284Sjmallett * @param flags flags for passing options 426210284Sjmallett * 427210284Sjmallett * @return 1 on success, 428210284Sjmallett * 0 on failure 429210284Sjmallett */ 430210284Sjmallettint __cvmx_bootmem_phy_free(uint64_t phy_addr, uint64_t size, uint32_t flags); 431210284Sjmallett 432210284Sjmallett 433210284Sjmallett/** 434210284Sjmallett * Prints the list of currently allocated named blocks 435210284Sjmallett * 436210284Sjmallett */ 437210284Sjmallettvoid cvmx_bootmem_phy_named_block_print(void); 438210284Sjmallett 439210284Sjmallett 440210284Sjmallett/** 441210284Sjmallett * Prints the list of available memory. 442210284Sjmallett * 443210284Sjmallett */ 444210284Sjmallettvoid cvmx_bootmem_phy_list_print(void); 445210284Sjmallett 446210284Sjmallett 447210284Sjmallett 448210284Sjmallett/** 449210284Sjmallett * This function initializes the free memory list used by cvmx_bootmem. 450210284Sjmallett * This must be called before any allocations can be done. 451210284Sjmallett * 452210284Sjmallett * @param mem_size Total memory available, in bytes 453210284Sjmallett * @param low_reserved_bytes 454210284Sjmallett * Number of bytes to reserve (leave out of free list) at address 0x0. 455210284Sjmallett * @param desc_buffer 456210284Sjmallett * Buffer for the bootmem descriptor. This must be a 32 bit addressable 457210284Sjmallett * address. 458210284Sjmallett * 459210284Sjmallett * @return 1 on success 460210284Sjmallett * 0 on failure 461210284Sjmallett */ 462210284Sjmallettint64_t cvmx_bootmem_phy_mem_list_init(uint64_t mem_size, uint32_t low_reserved_bytes, cvmx_bootmem_desc_t *desc_buffer); 463210284Sjmallett 464210284Sjmallett/** 465210284Sjmallett * Locks the bootmem allocator. This is useful in certain situations 466210284Sjmallett * where multiple allocations must be made without being interrupted. 467210284Sjmallett * This should be used with the CVMX_BOOTMEM_FLAG_NO_LOCKING flag. 468210284Sjmallett * 469210284Sjmallett */ 470210284Sjmallettvoid cvmx_bootmem_lock(void); 471210284Sjmallett 472210284Sjmallett/** 473210284Sjmallett * Unlocks the bootmem allocator. This is useful in certain situations 474210284Sjmallett * where multiple allocations must be made without being interrupted. 475210284Sjmallett * This should be used with the CVMX_BOOTMEM_FLAG_NO_LOCKING flag. 476210284Sjmallett * 477210284Sjmallett */ 478210284Sjmallettvoid cvmx_bootmem_unlock(void); 479210284Sjmallett 480210284Sjmallett/** 481210284Sjmallett * Internal use function to get the current descriptor pointer */ 482210284Sjmallettvoid *__cvmx_bootmem_internal_get_desc_ptr(void); 483210284Sjmallett 484210284Sjmallett#ifdef __cplusplus 485210284Sjmallett} 486210284Sjmallett#endif 487210284Sjmallett 488210284Sjmallett#endif /* __CVMX_BOOTMEM_H__ */ 489