From 57d71e4267ecf66c84173f8ff3606091187b93b1 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Thu, 8 Nov 2007 05:17:20 +0000 Subject: Add some CACHEALIGN_* macros and a helper function to assist in aligning data and buffers on PortalPlayer processors to cache line boundaries. They're noops when PROC_NEED_CACHEALIGN isn't defined. Go safe and increase the value to 32 since I'm not sure yet if 16 is sufficient - changing that is a one-liner. Add helper to plugin API which will be needed shortly. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15523 a1c6a512-1295-4272-9138-f99709370657 --- firmware/export/general.h | 2 ++ firmware/export/system.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) (limited to 'firmware/export') 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 @@ #define GENERAL_H #include +#include /* round a signed/unsigned 32bit value to the closest of a list of values */ /* returns the index of the closest value */ @@ -34,5 +35,6 @@ int make_list_from_caps32(unsigned long src_mask, unsigned long caps_mask, unsigned long *caps_list); +size_t align_buffer(void **start, size_t size, size_t align); #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) #define flush_icache() #endif +#ifdef PROC_NEEDS_CACHEALIGN +/* Cache alignment attributes and sizes are enabled */ + +/* 2^CACHEALIGN_BITS = the byte size */ +#define CACHEALIGN_SIZE (1u << CACHEALIGN_BITS) + +#define CACHEALIGN_ATTR __attribute__((aligned(CACHEALIGN_SIZE))) +/* Aligns x up to a CACHEALIGN_SIZE boundary */ +#define CACHEALIGN_UP(x) \ + ((typeof (x))ALIGN_UP_P2((uintptr_t)(x), CACHEALIGN_BITS)) +/* Aligns x down to a CACHEALIGN_SIZE boundary */ +#define CACHEALIGN_DOWN(x) \ + ((typeof (x))ALIGN_DOWN_P2((uintptr_t)(x), CACHEALIGN_BITS)) +/* Aligns at least to the greater of size x or CACHEALIGN_SIZE */ +#define CACHEALIGN_AT_LEAST_ATTR(x) __attribute__((aligned(CACHEALIGN_UP(x)))) +/* Aligns a buffer pointer and size to proper boundaries */ +#define CACHEALIGN_BUFFER(start, size) \ + ({ align_buffer((start), (size), CACHEALIGN_SIZE); }) + +#else /* ndef PROC_NEEDS_CACHEALIGN */ + +/* Cache alignment attributes and sizes are not enabled */ +#define CACHEALIGN_ATTR +#define CACHEALIGN_AT_LEAST_ATTR(x) __attribute__((aligned(x))) +#define CACHEALIGN_UP(x) (x) +#define CACHEALIGN_DOWN(x) (x) +/* Make no adjustments */ +#define CACHEALIGN_BUFFER(start, size) \ + ({ (void)(start); (size); }) + +#endif /* PROC_NEEDS_CACHEALIGN */ + #endif /* __SYSTEM_H__ */ -- cgit v1.2.3