uint64_t octeon_phy_mem_named_block_alloc(cvmx_bootmem_desc_t *bootmem_desc_ptr, uint64_t size, uint64_t min_addr, uint64_t max_addr, uint64_t alignment, char *name) { uint64_t addr_allocated; cvmx_bootmem_named_block_desc_t *named_block_desc_ptr; if (bootmem_desc_ptr->major_version != 3) { printf("ERROR: Incompatible bootmem descriptor version: %d.%d\n", bootmem_desc_ptr->major_version, bootmem_desc_ptr->minor_version); return(0); } /* Take lock here, as name lookup/block alloc/name add need to be atomic */ octeon_lock(CAST64(&(bootmem_desc_ptr->lock))); /* Get pointer to first available named block descriptor */ named_block_desc_ptr = octeon_phy_mem_named_block_find_internal(bootmem_desc_ptr, NULL); /* Check to see if name already in use, return error if name ** not available or no more room for blocks. */ if (octeon_phy_mem_named_block_find_internal(bootmem_desc_ptr, name) || !named_block_desc_ptr) { octeon_unlock(CAST64(&(bootmem_desc_ptr->lock))); return(0); } /* Round size up to mult of minimum alignment bytes ** We need the actual size allocated to allow for blocks to be coallesced ** when they are freed. The alloc routine does the same rounding up ** on all allocations. */ size = (size + (CVMX_BOOTMEM_ALIGNMENT_SIZE - 1)) & ~(CVMX_BOOTMEM_ALIGNMENT_SIZE - 1); addr_allocated = octeon_phy_mem_block_alloc(bootmem_desc_ptr, size, min_addr, max_addr, alignment); if (addr_allocated) { named_block_desc_ptr->base_addr = addr_allocated; named_block_desc_ptr->size = size; strncpy(named_block_desc_ptr->name, name, bootmem_desc_ptr->named_block_name_len); named_block_desc_ptr->name[bootmem_desc_ptr->named_block_name_len - 1] = 0; } else { printf("octeon_phy_mem_named_block_alloc: alloc failed!\n"); } octeon_unlock(CAST64(&(bootmem_desc_ptr->lock))); return(addr_allocated); }
void *cvmx_bootmem_alloc_range(uint64_t size, uint64_t alignment, uint64_t min_addr, uint64_t max_addr) { uint64_t address; octeon_lock(CAST64(&(cvmx_bootmem_desc->lock))); address = octeon_phy_mem_block_alloc(cvmx_bootmem_desc, size, min_addr, max_addr, alignment); octeon_unlock(CAST64(&(cvmx_bootmem_desc->lock))); if (address) return cvmx_phys_to_ptr(address); else return NULL; }