int octeon_phy_mem_named_block_free(cvmx_bootmem_desc_t *bootmem_desc_ptr, char *name)
{
    cvmx_bootmem_named_block_desc_t *named_block_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 free/name free need to be atomic */
    octeon_lock(CAST64(&(bootmem_desc_ptr->lock)));
    named_block_ptr = octeon_phy_mem_named_block_find_internal(bootmem_desc_ptr, name);
    if (named_block_ptr)
    {
	octeon_phy_mem_block_free(bootmem_desc_ptr, named_block_ptr->base_addr, named_block_ptr->size);
	named_block_ptr->size = 0;
	/* Set size to zero to indicate block not used. */


    }
    octeon_unlock(CAST64(&(bootmem_desc_ptr->lock)));
    return(!!named_block_ptr);  /* 0 on failure, 1 on success */

}
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;
}
/**
 * Finds a named memory block by name.
 *
 * @param bootmem_desc_ptr
 *               Pointer to bootmem memory descriptor block (cvmx_bootmem_desc_t).
 * @param name   Name of memory block to find.
 *               If NULL pointer given, then finds unused descriptor, if available.
 *
 * @return Pointer to memory block descriptor, NULL if not found.
 *         If NULL returned when name parameter is NULL, then no memory
 *         block descriptors are available.
 */
cvmx_bootmem_named_block_desc_t * octeon_phy_mem_named_block_find(cvmx_bootmem_desc_t *bootmem_desc_ptr, char *name)
{
    cvmx_bootmem_named_block_desc_t *block_ptr;

    /* Lock the structure to make sure that it is not being changed while we are
    ** examining it.
    */
    octeon_lock(CAST64(&(bootmem_desc_ptr->lock)));
    block_ptr = octeon_phy_mem_named_block_find_internal(bootmem_desc_ptr, name);
    octeon_unlock(CAST64(&(bootmem_desc_ptr->lock)));
    return(block_ptr);

}