summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/smpimpl.h
diff options
context:
space:
mode:
authorDaniel Cederman <cederman@gaisler.com>2014-07-11 16:37:56 +0200
committerDaniel Hellstrom <daniel@gaisler.com>2014-08-22 13:10:59 +0200
commitddbc3f8d83678313ca61d2936e6efd50b3e044b0 (patch)
tree305f3c4a7df80244bac626682d43718e7284e714 /cpukit/score/include/rtems/score/smpimpl.h
parentbsp/sparc: Flush only instruction cache (diff)
downloadrtems-ddbc3f8d83678313ca61d2936e6efd50b3e044b0.tar.bz2
score: Add SMP support to the cache manager
Adds functions that allows the user to specify which cores that should perform the cache operation. SMP messages are sent to all the specified cores and the caller waits until all cores have acknowledged that they have flushed their cache. If CPU_CACHE_NO_INSTRUCTION_CACHE_SNOOPING is defined the instruction cache invalidation function will perform the operation on all cores using the previous method.
Diffstat (limited to 'cpukit/score/include/rtems/score/smpimpl.h')
-rw-r--r--cpukit/score/include/rtems/score/smpimpl.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/cpukit/score/include/rtems/score/smpimpl.h b/cpukit/score/include/rtems/score/smpimpl.h
index cbc64280de..dca8a6bec8 100644
--- a/cpukit/score/include/rtems/score/smpimpl.h
+++ b/cpukit/score/include/rtems/score/smpimpl.h
@@ -21,6 +21,7 @@
#include <rtems/score/smp.h>
#include <rtems/score/percpu.h>
#include <rtems/fatal.h>
+#include <rtems/rtems/cache.h>
#ifdef __cplusplus
extern "C" {
@@ -51,6 +52,13 @@ extern "C" {
#define SMP_MESSAGE_TEST 0x2UL
/**
+ * @brief SMP message to request a cache manager invocation.
+ *
+ * @see _SMP_Send_message().
+ */
+#define SMP_MESSAGE_CACHE_MANAGER 0x4UL
+
+/**
* @brief SMP fatal codes.
*/
typedef enum {
@@ -127,6 +135,12 @@ static inline void _SMP_Set_test_message_handler(
}
/**
+ * @brief Handles cache invalidation/flush requests from a remote processor.
+ *
+ */
+void _SMP_Cache_manager_message_handler( void );
+
+/**
* @brief Interrupt handler for inter-processor interrupts.
*/
static inline void _SMP_Inter_processor_interrupt_handler( void )
@@ -148,6 +162,11 @@ static inline void _SMP_Inter_processor_interrupt_handler( void )
if ( ( message & SMP_MESSAGE_TEST ) != 0 ) {
( *_SMP_Test_message_handler )( cpu_self );
}
+
+ if ( ( message & SMP_MESSAGE_CACHE_MANAGER ) != 0 ) {
+ _SMP_Cache_manager_message_handler();
+ }
+
}
}