RTEMS  5.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
cache.h
1 /*
2  * M68K Cache Manager Support
3  */
4 
5 #if (defined(__mc68020__) && !defined(__mcpu32__))
6 # define M68K_INSTRUCTION_CACHE_ALIGNMENT 16
7 #elif defined(__mc68030__)
8 # define M68K_INSTRUCTION_CACHE_ALIGNMENT 16
9 # define M68K_DATA_CACHE_ALIGNMENT 16
10 #elif ( defined(__mc68040__) || defined (__mc68060__) )
11 # define M68K_INSTRUCTION_CACHE_ALIGNMENT 16
12 # define M68K_DATA_CACHE_ALIGNMENT 16
13 #elif ( defined(__mcf5200__) )
14 # define M68K_INSTRUCTION_CACHE_ALIGNMENT 16
15 # if ( defined(__mcf528x__) )
16 # define M68K_DATA_CACHE_ALIGNMENT 16
17 # endif
18 #elif ( defined(__mcf5300__) )
19 # define M68K_INSTRUCTION_CACHE_ALIGNMENT 16
20 # define M68K_DATA_CACHE_ALIGNMENT 16
21 #elif defined(__mcfv4e__)
22 # define M68K_INSTRUCTION_CACHE_ALIGNMENT 16
23 # define M68K_DATA_CACHE_ALIGNMENT 16
24 #endif
25 
26 #if defined(M68K_DATA_CACHE_ALIGNMENT)
27 #define CPU_DATA_CACHE_ALIGNMENT M68K_DATA_CACHE_ALIGNMENT
28 #endif
29 
30 #if defined(M68K_INSTRUCTION_CACHE_ALIGNMENT)
31 #define CPU_INSTRUCTION_CACHE_ALIGNMENT M68K_INSTRUCTION_CACHE_ALIGNMENT
32 #endif
33 
34 /*
35  * Since the cacr is common to all mc680x0, provide macros
36  * for masking values in that register.
37  */
38 
39 /*
40  * Used to clear bits in the cacr.
41  */
42 #define _CPU_CACR_AND(mask) \
43  { \
44  register unsigned long _value = mask; \
45  register unsigned long _ctl = 0; \
46  __asm__ volatile ( "movec %%cacr, %0; /* read the cacr */ \
47  andl %2, %0; /* and with _val */ \
48  movec %1, %%cacr" /* write the cacr */ \
49  : "=d" (_ctl) : "0" (_ctl), "d" (_value) : "%%cc" ); \
50  }
51 
52 
53 /*
54  * Used to set bits in the cacr.
55  */
56 #define _CPU_CACR_OR(mask) \
57  { \
58  register unsigned long _value = mask; \
59  register unsigned long _ctl = 0; \
60  __asm__ volatile ( "movec %%cacr, %0; /* read the cacr */ \
61  orl %2, %0; /* or with _val */ \
62  movec %1, %%cacr" /* write the cacr */ \
63  : "=d" (_ctl) : "0" (_ctl), "d" (_value) : "%%cc" ); \
64  }
65 
66 
67 /*
68  * CACHE MANAGER: The following functions are CPU-specific.
69  * They provide the basic implementation for the rtems_* cache
70  * management routines. If a given function has no meaning for the CPU,
71  * it does nothing by default.
72  */
73 #if ( (defined(__mc68020__) && !defined(__mcpu32__)) || defined(__mc68030__) )
74 
75 #if defined(__mc68030__)
76 
77 /* Only the mc68030 has a data cache; it is writethrough only. */
78 
79 RTEMS_INLINE_ROUTINE void _CPU_cache_flush_1_data_line(const void * d_addr) {}
80 RTEMS_INLINE_ROUTINE void _CPU_cache_flush_entire_data(void) {}
81 
82 RTEMS_INLINE_ROUTINE void _CPU_cache_invalidate_1_data_line(
83  const void * d_addr
84 )
85 {
86  void * p_address = (void *) _CPU_virtual_to_physical( d_addr );
87  __asm__ volatile ( "movec %0, %%caar" :: "a" (p_address) ); /* write caar */
88  _CPU_CACR_OR(0x00000400);
89 }
90 
91 RTEMS_INLINE_ROUTINE void _CPU_cache_invalidate_entire_data(void)
92 {
93  _CPU_CACR_OR( 0x00000800 );
94 }
95 
96 RTEMS_INLINE_ROUTINE void _CPU_cache_freeze_data(void)
97 {
98  _CPU_CACR_OR( 0x00000200 );
99 }
100 
101 RTEMS_INLINE_ROUTINE void _CPU_cache_unfreeze_data(void)
102 {
103  _CPU_CACR_AND( 0xFFFFFDFF );
104 }
105 
106 RTEMS_INLINE_ROUTINE void _CPU_cache_enable_data(void)
107 {
108  _CPU_CACR_OR( 0x00000100 );
109 }
110 
111 RTEMS_INLINE_ROUTINE void _CPU_cache_disable_data(void)
112 {
113  _CPU_CACR_AND( 0xFFFFFEFF );
114 }
115 #endif
116 
117 
118 /* Both the 68020 and 68030 have instruction caches */
119 
120 RTEMS_INLINE_ROUTINE void _CPU_cache_invalidate_1_instruction_line(
121  const void * d_addr
122 )
123 {
124  void * p_address = (void *) _CPU_virtual_to_physical( d_addr );
125  __asm__ volatile ( "movec %0, %%caar" :: "a" (p_address) ); /* write caar */
126  _CPU_CACR_OR( 0x00000004 );
127 }
128 
129 RTEMS_INLINE_ROUTINE void _CPU_cache_invalidate_entire_instruction(void)
130 {
131  _CPU_CACR_OR( 0x00000008 );
132 }
133 
134 RTEMS_INLINE_ROUTINE void _CPU_cache_freeze_instruction(void)
135 {
136  _CPU_CACR_OR( 0x00000002);
137 }
138 
139 RTEMS_INLINE_ROUTINE void _CPU_cache_unfreeze_instruction(void)
140 {
141  _CPU_CACR_AND( 0xFFFFFFFD );
142 }
143 
144 RTEMS_INLINE_ROUTINE void _CPU_cache_enable_instruction(void)
145 {
146  _CPU_CACR_OR( 0x00000001 );
147 }
148 
149 RTEMS_INLINE_ROUTINE void _CPU_cache_disable_instruction(void)
150 {
151  _CPU_CACR_AND( 0xFFFFFFFE );
152 }
153 
154 
155 #elif ( defined(__mc68040__) || defined (__mc68060__) )
156 
157 /* Cannot be frozen */
158 RTEMS_INLINE_ROUTINE void _CPU_cache_freeze_data(void) {}
159 RTEMS_INLINE_ROUTINE void _CPU_cache_unfreeze_data(void) {}
160 RTEMS_INLINE_ROUTINE void _CPU_cache_freeze_instruction(void) {}
161 RTEMS_INLINE_ROUTINE void _CPU_cache_unfreeze_instruction(void) {}
162 
163 RTEMS_INLINE_ROUTINE void _CPU_cache_flush_1_data_line(
164  const void * d_addr
165 )
166 {
167  void * p_address = (void *) _CPU_virtual_to_physical( d_addr );
168  __asm__ volatile ( "cpushl %%dc,(%0)" :: "a" (p_address) );
169 }
170 
171 RTEMS_INLINE_ROUTINE void _CPU_cache_invalidate_1_data_line(
172  const void * d_addr
173 )
174 {
175  void * p_address = (void *) _CPU_virtual_to_physical( d_addr );
176  __asm__ volatile ( "cinvl %%dc,(%0)" :: "a" (p_address) );
177 }
178 
179 RTEMS_INLINE_ROUTINE void _CPU_cache_flush_entire_data(void)
180 {
181  __asm__ volatile ( "cpusha %%dc" :: );
182 }
183 
184 RTEMS_INLINE_ROUTINE void _CPU_cache_invalidate_entire_data(void)
185 {
186  __asm__ volatile ( "cinva %%dc" :: );
187 }
188 
189 RTEMS_INLINE_ROUTINE void _CPU_cache_enable_data(void)
190 {
191  _CPU_CACR_OR( 0x80000000 );
192 }
193 
194 RTEMS_INLINE_ROUTINE void _CPU_cache_disable_data(void)
195 {
196  _CPU_CACR_AND( 0x7FFFFFFF );
197 }
198 
199 RTEMS_INLINE_ROUTINE void _CPU_cache_invalidate_1_instruction_line(
200  const void * i_addr )
201 {
202  void * p_address = (void *) _CPU_virtual_to_physical( i_addr );
203  __asm__ volatile ( "cinvl %%ic,(%0)" :: "a" (p_address) );
204 }
205 
206 RTEMS_INLINE_ROUTINE void _CPU_cache_invalidate_entire_instruction(void)
207 {
208  __asm__ volatile ( "cinva %%ic" :: );
209 }
210 
211 RTEMS_INLINE_ROUTINE void _CPU_cache_enable_instruction(void)
212 {
213  _CPU_CACR_OR( 0x00008000 );
214 }
215 
216 RTEMS_INLINE_ROUTINE void _CPU_cache_disable_instruction(void)
217 {
218  _CPU_CACR_AND( 0xFFFF7FFF );
219 }
220 #endif
#define RTEMS_INLINE_ROUTINE
Definition: basedefs.h:65
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.