summaryrefslogtreecommitdiffstats
path: root/bsps/m68k/genmcf548x
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-01-27 14:37:51 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-01-31 12:49:09 +0100
commit4cf93658eff5cf6b0c02e98a0d1ec33dea5ed85c (patch)
tree8ce105a37991b79f38da9da31c1cb6ce13ef6beb /bsps/m68k/genmcf548x
parentbsps: Move network define to source files (diff)
downloadrtems-4cf93658eff5cf6b0c02e98a0d1ec33dea5ed85c.tar.bz2
bsps: Rework cache manager implementation
The previous cache manager support used a single souce file (cache_manager.c) which included an implementation header (cache_.h). This required the use of specialized include paths to find the right header file. Change this to include a generic implementation header (cacheimpl.h) in specialized source files. Use the following directories and files: * bsps/shared/cache * bsps/@RTEMS_CPU@/shared/cache * bsps/@RTEMS_CPU@/@RTEMS_BSP_FAMILY/start/cache.c Update #3285.
Diffstat (limited to 'bsps/m68k/genmcf548x')
-rw-r--r--bsps/m68k/genmcf548x/start/cache.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/bsps/m68k/genmcf548x/start/cache.c b/bsps/m68k/genmcf548x/start/cache.c
new file mode 100644
index 0000000000..18aa929b3d
--- /dev/null
+++ b/bsps/m68k/genmcf548x/start/cache.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2007-2014 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp.h>
+
+#define CPU_DATA_CACHE_ALIGNMENT 16
+
+#define CPU_INSTRUCTION_CACHE_ALIGNMENT 16
+
+/*
+ * There is no complete cache lock (only 2 ways of 4 can be locked)
+ */
+static inline void _CPU_cache_freeze_data(void)
+{
+ /* Do nothing */
+}
+
+static inline void _CPU_cache_unfreeze_data(void)
+{
+ /* Do nothing */
+}
+
+static inline void _CPU_cache_freeze_instruction(void)
+{
+ /* Do nothing */
+}
+
+static inline void _CPU_cache_unfreeze_instruction(void)
+{
+ /* Do nothing */
+}
+
+static inline void _CPU_cache_enable_instruction(void)
+{
+ bsp_cacr_clear_flags( MCF548X_CACR_IDCM);
+}
+
+static inline void _CPU_cache_disable_instruction(void)
+{
+ bsp_cacr_set_flags( MCF548X_CACR_IDCM);
+}
+
+static inline void _CPU_cache_invalidate_entire_instruction(void)
+{
+ bsp_cacr_set_self_clear_flags( MCF548X_CACR_ICINVA);
+}
+
+static inline void _CPU_cache_invalidate_1_instruction_line(const void *addr)
+{
+ uint32_t a = (uint32_t) addr & ~0x3;
+
+ __asm__ volatile ("cpushl %%ic,(%0)" :: "a" (a | 0x0));
+ __asm__ volatile ("cpushl %%ic,(%0)" :: "a" (a | 0x1));
+ __asm__ volatile ("cpushl %%ic,(%0)" :: "a" (a | 0x2));
+ __asm__ volatile ("cpushl %%ic,(%0)" :: "a" (a | 0x3));
+}
+
+static inline void _CPU_cache_enable_data(void)
+{
+ bsp_cacr_clear_flags( MCF548X_CACR_DDCM( DCACHE_OFF_IMPRECISE));
+}
+
+static inline void _CPU_cache_disable_data(void)
+{
+ bsp_cacr_set_flags( MCF548X_CACR_DDCM( DCACHE_OFF_IMPRECISE));
+}
+
+static inline void _CPU_cache_invalidate_entire_data(void)
+{
+ bsp_cacr_set_self_clear_flags( MCF548X_CACR_DCINVA);
+}
+
+static inline void _CPU_cache_invalidate_1_data_line( const void *addr)
+{
+ uint32_t a = (uint32_t) addr & ~0x3;
+
+ __asm__ volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x0));
+ __asm__ volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x1));
+ __asm__ volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x2));
+ __asm__ volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x3));
+}
+
+static inline void _CPU_cache_flush_1_data_line( const void *addr)
+{
+ uint32_t a = (uint32_t) addr & ~0x3;
+
+ __asm__ volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x0));
+ __asm__ volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x1));
+ __asm__ volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x2));
+ __asm__ volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x3));
+}
+
+static inline void _CPU_cache_flush_entire_data( void)
+{
+ uint32_t line = 0;
+
+ for (line = 0; line < 512; ++line) {
+ _CPU_cache_flush_1_data_line( (const void *) (line * 16));
+ }
+}
+
+#include "../../../shared/cache/cacheimpl.h"