void *mpc85xx_cache_sram_alloc(unsigned int size, phys_addr_t *phys, unsigned int align) { unsigned long offset; unsigned long flags; if (unlikely(cache_sram == NULL)) return NULL; if (!size || (size > cache_sram->size) || (align > cache_sram->size)) { pr_err("%s(): size(=%x) or align(=%x) zero or too big\n", __func__, size, align); return NULL; } if ((align & (align - 1)) || align <= 1) { pr_err("%s(): align(=%x) must be power of two and >1\n", __func__, align); return NULL; } spin_lock_irqsave(&cache_sram->lock, flags); offset = rh_alloc_align(cache_sram->rh, size, align, NULL); spin_unlock_irqrestore(&cache_sram->lock, flags); if (IS_ERR_VALUE(offset)) return NULL; *phys = cache_sram->base_phys + offset; return (unsigned char *)cache_sram->base_virt + offset; }
/* This function returns an index into the MURAM area. */ unsigned long qe_muram_alloc(int size, int align) { unsigned long start; unsigned long flags; spin_lock_irqsave(&qe_muram_lock, flags); start = rh_alloc_align(&qe_muram_info, size, align, "QE"); spin_unlock_irqrestore(&qe_muram_lock, flags); return start; }
void* bcom_sram_alloc(int size, int align, phys_addr_t *phys) { unsigned long offset; spin_lock(&bcom_sram->lock); offset = rh_alloc_align(bcom_sram->rh, size, align, NULL); spin_unlock(&bcom_sram->lock); if (IS_ERR_VALUE(offset)) return NULL; *phys = bcom_sram->base_phys + offset; return bcom_sram->base_virt + offset; }
void *starlet_ioh_kzalloc_aligned(size_t size, size_t align) { struct starlet_ioh *ioh = starlet_ioh_get(); unsigned long offset; void *ptr; unsigned long flags; if (!ioh) return NULL; spin_lock_irqsave(&ioh->lock, flags); offset = rh_alloc_align(ioh->rheap, size, align, NULL); spin_unlock_irqrestore(&ioh->lock, flags); if (IS_ERR_VALUE(offset)) return NULL; ptr = ioh->base + offset; memset(ptr, 0, size); return ptr; }