source: rtems/c/src/lib/libcpu/m68k/mcf5282/cache/cachepd.c @ c7e77ee

4.115
Last change on this file since c7e77ee was c7e77ee, checked in by Joel Sherrill <joel.sherrill@…>, on 10/14/14 at 17:39:57

mcf5282: Move cache to libcpu and update av5282 and uC5282 BSPs

  • Property mode set to 100644
File size: 2.8 KB
RevLine 
[c7e77ee]1/**
2 *  @file
3 *
4 *  Cache Management Support Routines for the MCF5282
5 */
6
7#include <rtems.h>
8#include <mcf5282/mcf5282.h>   /* internal MCF5282 modules */
9#include "cache_.h"
10
11/*
12 * CPU-space access
13 */
14#define m68k_set_acr0(_acr0) \
15  __asm__ volatile ("movec %0,%%acr0" : : "d" (_acr0))
16#define m68k_set_acr1(_acr1) \
17  __asm__ volatile ("movec %0,%%acr1" : : "d" (_acr1))
18
19#define NOP __asm__ volatile ("nop");
20
21/*
22 * DEFAULT WHEN mcf5xxx_initialize_cacr not called
23 *   Read/write copy of common cache
24 *   Split I/D cache
25 *   Allow CPUSHL to invalidate a cache line
26 *   Enable buffered writes
27 *   No burst transfers on non-cacheable accesses
28 *   Default cache mode is *disabled* (cache only ACRx areas)
29 */
30static uint32_t cacr_mode = MCF5XXX_CACR_CENB |
31                            MCF5XXX_CACR_DBWE |
32                            MCF5XXX_CACR_DCM;
33
34void mcf5xxx_initialize_cacr(uint32_t cacr)
35{
36  cacr_mode = cacr;
37  m68k_set_cacr( cacr_mode );
38}
39
40/*
41 * Cannot be frozen
42 */
43void _CPU_cache_freeze_data(void) {}
44void _CPU_cache_unfreeze_data(void) {}
45void _CPU_cache_freeze_instruction(void) {}
46void _CPU_cache_unfreeze_instruction(void) {}
47
48/*
49 * Write-through data cache -- flushes are unnecessary
50 */
51void _CPU_cache_flush_1_data_line(const void *d_addr) {}
52void _CPU_cache_flush_entire_data(void) {}
53
54void _CPU_cache_enable_instruction(void)
55{
56  rtems_interrupt_level level;
57
58  rtems_interrupt_disable(level);
59    cacr_mode &= ~MCF5XXX_CACR_DIDI;
60    m68k_set_cacr(cacr_mode | MCF5XXX_CACR_CINV | MCF5XXX_CACR_INVI );
61    NOP;
62  rtems_interrupt_enable(level);
63}
64
65void _CPU_cache_disable_instruction(void)
66{
67  rtems_interrupt_level level;
68
69  rtems_interrupt_disable(level);
70    cacr_mode |= MCF5XXX_CACR_DIDI;
71    m68k_set_cacr(cacr_mode);
72  rtems_interrupt_enable(level);
73}
74
75void _CPU_cache_invalidate_entire_instruction(void)
76{
77  m68k_set_cacr(cacr_mode | MCF5XXX_CACR_CINV | MCF5XXX_CACR_INVI);
78  NOP;
79}
80
81void _CPU_cache_invalidate_1_instruction_line(const void *addr)
82{
83  /*
84   * Top half of cache is I-space
85   */
86  addr = (void *)((int)addr | 0x400);
87  __asm__ volatile ("cpushl %%bc,(%0)" :: "a" (addr));
88}
89
90void _CPU_cache_enable_data(void)
91{
92  rtems_interrupt_level level;
93
94  rtems_interrupt_disable(level);
95    cacr_mode &= ~MCF5XXX_CACR_DISD;
96    m68k_set_cacr(cacr_mode | MCF5XXX_CACR_CINV | MCF5XXX_CACR_INVD);
97  rtems_interrupt_enable(level);
98}
99
100void _CPU_cache_disable_data(void)
101{
102  rtems_interrupt_level level;
103
104  rtems_interrupt_disable(level);
105    cacr_mode |= MCF5XXX_CACR_DISD;
106    m68k_set_cacr(cacr_mode);
107  rtems_interrupt_enable(level);
108}
109
110void _CPU_cache_invalidate_entire_data(void)
111{
112  m68k_set_cacr(cacr_mode | MCF5XXX_CACR_CINV | MCF5XXX_CACR_INVD);
113}
114
115void _CPU_cache_invalidate_1_data_line(const void *addr)
116{
117  /*
118   * Bottom half of cache is D-space
119   */
120  addr = (void *)((int)addr & ~0x400);
121  __asm__ volatile ("cpushl %%bc,(%0)" :: "a" (addr));
122}
Note: See TracBrowser for help on using the repository browser.