diff options
Diffstat (limited to 'include/common.h')
| -rw-r--r-- | include/common.h | 20 | 
1 files changed, 17 insertions, 3 deletions
| diff --git a/include/common.h b/include/common.h index d1dd65a85..39859d323 100644 --- a/include/common.h +++ b/include/common.h @@ -944,11 +944,25 @@ int cpu_release(int nr, int argc, char * const argv[]);   * of a function scoped static buffer.  It can not be used to create a cache   * line aligned global buffer.   */ +#define ALLOC_ALIGN_BUFFER(type, name, size, align)			\ +	char __##name[ROUND(size * sizeof(type), align) + (align - 1)];	\ +									\ +	type *name = (type *) ALIGN((uintptr_t)__##name, align)  #define ALLOC_CACHE_ALIGN_BUFFER(type, name, size)			\ -	char __##name[ROUND(size * sizeof(type), ARCH_DMA_MINALIGN) +	\ -		      ARCH_DMA_MINALIGN - 1];				\ +	ALLOC_ALIGN_BUFFER(type, name, size, ARCH_DMA_MINALIGN) + +/* + * DEFINE_CACHE_ALIGN_BUFFER() is similar to ALLOC_CACHE_ALIGN_BUFFER, but it's + * purpose is to allow allocating aligned buffers outside of function scope. + * Usage of this macro shall be avoided or used with extreme care! + */ +#define DEFINE_ALIGN_BUFFER(type, name, size, align)			\ +	static char __##name[roundup(size * sizeof(type), align)]	\ +			__attribute__((aligned(align)));				\  									\ -	type *name = (type *) ALIGN((uintptr_t)__##name, ARCH_DMA_MINALIGN) +	static type *name = (type *)__##name +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)			\ +	DEFINE_ALIGN_BUFFER(type, name, size, ARCH_DMA_MINALIGN)  /* Pull in stuff for the build system */  #ifdef DO_DEPS_ONLY |