diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2007-11-08 05:17:20 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2007-11-08 05:17:20 +0000 |
commit | 57d71e4267ecf66c84173f8ff3606091187b93b1 (patch) | |
tree | 7992814f1dfbcf7c5251cad0fdc6da9a5ebb70a3 /firmware/general.c | |
parent | 194a66ef83664b0ebd23b9bea031c67c3b80f6ac (diff) | |
download | rockbox-57d71e4267ecf66c84173f8ff3606091187b93b1.tar.gz 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.c | 24 |
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 @@ | |||
17 | * | 17 | * |
18 | ****************************************************************************/ | 18 | ****************************************************************************/ |
19 | #include <limits.h> | 19 | #include <limits.h> |
20 | #include "system.h" | ||
20 | #include "config.h" | 21 | #include "config.h" |
21 | #include "general.h" | 22 | #include "general.h" |
22 | 23 | ||
@@ -75,3 +76,26 @@ int make_list_from_caps32(unsigned long src_mask, | |||
75 | 76 | ||
76 | return count; | 77 | return count; |
77 | } /* make_list_from_caps32 */ | 78 | } /* make_list_from_caps32 */ |
79 | |||
80 | /* Only needed for cache aligning atm */ | ||
81 | #ifdef PROC_NEEDS_CACHEALIGN | ||
82 | /* Align a buffer and size to a size boundary while remaining within | ||
83 | * the original boundaries */ | ||
84 | size_t align_buffer(void **start, size_t size, size_t align) | ||
85 | { | ||
86 | void *newstart = *start; | ||
87 | void *newend = newstart + size; | ||
88 | |||
89 | /* Align the end down and the start up */ | ||
90 | newend = (void *)ALIGN_DOWN((intptr_t)newend, align); | ||
91 | newstart = (void *)ALIGN_UP((intptr_t)newstart, align); | ||
92 | |||
93 | /* Hmmm - too small for this */ | ||
94 | if (newend <= newstart) | ||
95 | return 0; | ||
96 | |||
97 | /* Return adjusted pointer and size */ | ||
98 | *start = newstart; | ||
99 | return newend - newstart; | ||
100 | } | ||
101 | #endif /* PROC_NEEDS_CACHEALIGN */ | ||