summaryrefslogtreecommitdiffstats
path: root/firmware/general.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-11-08 05:17:20 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-11-08 05:17:20 +0000
commit57d71e4267ecf66c84173f8ff3606091187b93b1 (patch)
tree7992814f1dfbcf7c5251cad0fdc6da9a5ebb70a3 /firmware/general.c
parent194a66ef83664b0ebd23b9bea031c67c3b80f6ac (diff)
downloadrockbox-57d71e4267ecf66c84173f8ff3606091187b93b1.tar.gz
rockbox-57d71e4267ecf66c84173f8ff3606091187b93b1.tar.bz2
rockbox-57d71e4267ecf66c84173f8ff3606091187b93b1.zip
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
Diffstat (limited to 'firmware/general.c')
-rw-r--r--firmware/general.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/firmware/general.c b/firmware/general.c
index 7f4348046c..cc3710c8f3 100644
--- a/firmware/general.c
+++ b/firmware/general.c
@@ -17,6 +17,7 @@
*
****************************************************************************/
#include <limits.h>
+#include "system.h"
#include "config.h"
#include "general.h"
@@ -75,3 +76,26 @@ int make_list_from_caps32(unsigned long src_mask,
return count;
} /* make_list_from_caps32 */
+
+/* Only needed for cache aligning atm */
+#ifdef PROC_NEEDS_CACHEALIGN
+/* Align a buffer and size to a size boundary while remaining within
+ * the original boundaries */
+size_t align_buffer(void **start, size_t size, size_t align)
+{
+ void *newstart = *start;
+ void *newend = newstart + size;
+
+ /* Align the end down and the start up */
+ newend = (void *)ALIGN_DOWN((intptr_t)newend, align);
+ newstart = (void *)ALIGN_UP((intptr_t)newstart, align);
+
+ /* Hmmm - too small for this */
+ if (newend <= newstart)
+ return 0;
+
+ /* Return adjusted pointer and size */
+ *start = newstart;
+ return newend - newstart;
+}
+#endif /* PROC_NEEDS_CACHEALIGN */