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); }