Loading...
Searching...
No Matches
Go to the documentation of this file.
9#ifndef __SOF_COMMON_H__
10#define __SOF_COMMON_H__
15#define __must_check __attribute__((warn_unused_result))
18#include <zephyr/sys/util.h>
23#define IS_ALIGNED(size, alignment) ((size) % (alignment) == 0)
27#define is_power_of_2(x) ((x) && !((x) & ((x) - 1)))
29#define compile_check(x) (sizeof(struct { int _f[2 * (x) - 1]; }) != 0)
31#define ALIGN_UP_INTERNAL(val, align) (((val) + (align) - 1) & ~((align) - 1))
33#if !defined(__ASSEMBLER__) && defined(__XTENSA__)
48#define ALIGN_UP_COMPILE(size, alignment) \
49 (compile_check(is_power_of_2(alignment)) ? \
50 ALIGN_UP_INTERNAL(size, alignment) : 0xBADCAFE)
52#if defined(__XCC__) || defined(__clang__)
59#define ALIGN_UP(size, alignment) ({ \
60 if (!is_power_of_2(alignment)) \
61 sof_panic(SOF_IPC_PANIC_ASSERT); \
62 ALIGN_UP_INTERNAL(size, alignment); \
65#define ALIGN_DOWN(size, alignment) ({ \
66 if (!is_power_of_2(alignment)) \
67 sof_panic(SOF_IPC_PANIC_ASSERT); \
68 (size) & ~((alignment) - 1); \
74#define COMPILE_TIME_ALIGNED(align) (!__builtin_constant_p(align) || \
77#define ALIGN_UP(size, alignment) ({ \
78 if (!compile_check(COMPILE_TIME_ALIGNED(alignment)) || \
79 !is_power_of_2(alignment)) \
80 sof_panic(SOF_IPC_PANIC_ASSERT); \
81 ALIGN_UP_INTERNAL(size, alignment); \
84#define ALIGN_DOWN(size, alignment) ({ \
85 if (!compile_check(COMPILE_TIME_ALIGNED(alignment)) || \
86 !is_power_of_2(alignment)) \
87 sof_panic(SOF_IPC_PANIC_ASSERT); \
88 (size) & ~((alignment) - 1); \
95#define ALIGN_UP(size, alignment) ALIGN_UP_INTERNAL(size, alignment)
96#define ALIGN_UP_COMPILE ALIGN_UP
97#define ALIGN_DOWN(size, alignment) ((size) & ~((alignment) - 1))
106#define ALIGN(val, align) ALIGN_UP_INTERNAL(val, align)
107#define SOF_DIV_ROUND_UP(val, div) (((val) + (div) - 1) / (div))
109#if !defined(__ASSEMBLER__)
111#include <rtos/string_macro.h>
112#include <sof/compiler_attributes.h>
117#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
119#define container_of(ptr, type, member) \
120 ({const __typeof__(((type *)0)->member)*__memberptr = (ptr); \
121 (type *)((char *)__memberptr - offsetof(type, member)); })
129#define attr_container_of(ptr, type, member, attr) \
130 ({const __typeof__(((type *)0)->member) attr *__memberptr = (ptr); \
131 (type *)((char attr *)__memberptr - offsetof(type, member)); })
133#define ffs(i) __builtin_ffs(i)
134#define ffsl(i) __builtin_ffsl(i)
135#define ffsll(i) __builtin_ffsll(i)
137#define clz(i) __builtin_clz(i)
138#define clzl(i) __builtin_clzl(i)
139#define clzll(i) __builtin_clzll(i)
141#define popcount(x) __builtin_popcount(x)
144#define PP_NARG(...) (sizeof((unsigned int[]){0, ##__VA_ARGS__}) \
145 / sizeof(unsigned int) - 1)
158#define STATIC_ASSERT(COND, MESSAGE) \
159 __attribute__((unused)) \
160 typedef char _CONCAT(assertion_failed_, MESSAGE)[(COND) ? 1 : -1]
173#define IS_ENABLED(config) IS_ENABLED_STEP_1(config)
174#define IS_ENABLED_DUMMY_1 0,
175#define IS_ENABLED_STEP_1(config) IS_ENABLED_STEP_2(IS_ENABLED_DUMMY_ ## config)
176#define IS_ENABLED_STEP_2(values) IS_ENABLED_STEP_3(values 1, 0)
177#define IS_ENABLED_STEP_3(ignore, value, ...) (!!(value))
180#define SOF_CONFIG_HIFI(level, component) (CONFIG_ ## component ## _HIFI_ ## level)
187#define SOF_USE_HIFI(level, component) (SOF_CONFIG_HIFI(level, component) || \
188 (SOF_CONFIG_HIFI(MAX, component) && level == SOF_MAX_XCHAL_HIFI))
198#define SOF_USE_MIN_HIFI(minlevel, component) (SOF_CONFIG_HIFI(minlevel, component) || \
199 (SOF_CONFIG_HIFI(MAX, component) && minlevel <= SOF_MAX_XCHAL_HIFI))
202# define SOF_MAX_XCHAL_HIFI NONE
204# include <xtensa/config/core-isa.h>
208# define SOF_MAX_XCHAL_HIFI 5
209# define SOF_FRAME_BYTE_ALIGN 16
210# elif XCHAL_HAVE_HIFI4
211# define SOF_MAX_XCHAL_HIFI 4
212# define SOF_FRAME_BYTE_ALIGN 8
213# elif XCHAL_HAVE_HIFI3
214# define SOF_MAX_XCHAL_HIFI 3
215# define SOF_FRAME_BYTE_ALIGN 8
217# define SOF_MAX_XCHAL_HIFI NONE
222#ifndef SOF_FRAME_BYTE_ALIGN
223# define SOF_FRAME_BYTE_ALIGN 4
227#define SOF_FRAME_COUNT_ALIGN 1
230#define __GLIBC_USE(x) 0
233#if defined(__XCC__) || defined(__CHECKER__)
237#define ASSUME_ALIGNED(x, a) x
244#define ASSUME_ALIGNED(x, a) ((__typeof__(x))__builtin_assume_aligned((x), a))
250#define ALIGN_UP_INTERNAL(val, align) (((val) + (align) - 1) & ~((align) - 1))