diff options
Diffstat (limited to 'firmware/export')
-rw-r--r-- | firmware/export/general.h | 2 | ||||
-rw-r--r-- | firmware/export/system.h | 32 |
2 files changed, 34 insertions, 0 deletions
diff --git a/firmware/export/general.h b/firmware/export/general.h index 427e2773b8..f4ea9e206a 100644 --- a/firmware/export/general.h +++ b/firmware/export/general.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #define GENERAL_H | 21 | #define GENERAL_H |
22 | 22 | ||
23 | #include <stdbool.h> | 23 | #include <stdbool.h> |
24 | #include <stddef.h> | ||
24 | 25 | ||
25 | /* round a signed/unsigned 32bit value to the closest of a list of values */ | 26 | /* round a signed/unsigned 32bit value to the closest of a list of values */ |
26 | /* returns the index of the closest value */ | 27 | /* returns the index of the closest value */ |
@@ -34,5 +35,6 @@ int make_list_from_caps32(unsigned long src_mask, | |||
34 | unsigned long caps_mask, | 35 | unsigned long caps_mask, |
35 | unsigned long *caps_list); | 36 | unsigned long *caps_list); |
36 | 37 | ||
38 | size_t align_buffer(void **start, size_t size, size_t align); | ||
37 | 39 | ||
38 | #endif /* GENERAL_H */ | 40 | #endif /* GENERAL_H */ |
diff --git a/firmware/export/system.h b/firmware/export/system.h index dc10c4545f..cba4b81631 100644 --- a/firmware/export/system.h +++ b/firmware/export/system.h | |||
@@ -229,4 +229,36 @@ static inline uint32_t swap_odd_even32(uint32_t value) | |||
229 | #define flush_icache() | 229 | #define flush_icache() |
230 | #endif | 230 | #endif |
231 | 231 | ||
232 | #ifdef PROC_NEEDS_CACHEALIGN | ||
233 | /* Cache alignment attributes and sizes are enabled */ | ||
234 | |||
235 | /* 2^CACHEALIGN_BITS = the byte size */ | ||
236 | #define CACHEALIGN_SIZE (1u << CACHEALIGN_BITS) | ||
237 | |||
238 | #define CACHEALIGN_ATTR __attribute__((aligned(CACHEALIGN_SIZE))) | ||
239 | /* Aligns x up to a CACHEALIGN_SIZE boundary */ | ||
240 | #define CACHEALIGN_UP(x) \ | ||
241 | ((typeof (x))ALIGN_UP_P2((uintptr_t)(x), CACHEALIGN_BITS)) | ||
242 | /* Aligns x down to a CACHEALIGN_SIZE boundary */ | ||
243 | #define CACHEALIGN_DOWN(x) \ | ||
244 | ((typeof (x))ALIGN_DOWN_P2((uintptr_t)(x), CACHEALIGN_BITS)) | ||
245 | /* Aligns at least to the greater of size x or CACHEALIGN_SIZE */ | ||
246 | #define CACHEALIGN_AT_LEAST_ATTR(x) __attribute__((aligned(CACHEALIGN_UP(x)))) | ||
247 | /* Aligns a buffer pointer and size to proper boundaries */ | ||
248 | #define CACHEALIGN_BUFFER(start, size) \ | ||
249 | ({ align_buffer((start), (size), CACHEALIGN_SIZE); }) | ||
250 | |||
251 | #else /* ndef PROC_NEEDS_CACHEALIGN */ | ||
252 | |||
253 | /* Cache alignment attributes and sizes are not enabled */ | ||
254 | #define CACHEALIGN_ATTR | ||
255 | #define CACHEALIGN_AT_LEAST_ATTR(x) __attribute__((aligned(x))) | ||
256 | #define CACHEALIGN_UP(x) (x) | ||
257 | #define CACHEALIGN_DOWN(x) (x) | ||
258 | /* Make no adjustments */ | ||
259 | #define CACHEALIGN_BUFFER(start, size) \ | ||
260 | ({ (void)(start); (size); }) | ||
261 | |||
262 | #endif /* PROC_NEEDS_CACHEALIGN */ | ||
263 | |||
232 | #endif /* __SYSTEM_H__ */ | 264 | #endif /* __SYSTEM_H__ */ |