source: rtems/c/src/lib/libbsp/m68k/genmcf548x/startup/bspstart.c @ 57d29cd

4.10
Last change on this file since 57d29cd was 57d29cd, checked in by Sebastian Huber <sebastian.huber@…>, on Apr 20, 2012 at 12:03:39 PM

bsp/genmcf548x: Enable FPU in BSP startup code

  • Property mode set to 100644
File size: 9.7 KB
Line 
1/*===============================================================*\
2| Project: RTEMS generic mcf548x BSP                              |
3+-----------------------------------------------------------------+
4| File: bspstart.c                                                |
5+-----------------------------------------------------------------+
6| The file contains the startup code of generic MCF548x BSP       |
7+-----------------------------------------------------------------+
8|                    Copyright (c) 2007                           |
9|                    Embedded Brains GmbH                         |
10|                    Obere Lagerstr. 30                           |
11|                    D-82178 Puchheim                             |
12|                    Germany                                      |
13|                    rtems@embedded-brains.de                     |
14+-----------------------------------------------------------------+
15|                                                                 |
16| Parts of the code has been derived from the "dBUG source code"  |
17| package Freescale is providing for M548X EVBs. The usage of     |
18| the modified or unmodified code and it's integration into the   |
19| generic mcf548x BSP has been done according to the Freescale    |
20| license terms.                                                  |
21|                                                                 |
22| The Freescale license terms can be reviewed in the file         |
23|                                                                 |
24|    Freescale_license.txt                                        |
25|                                                                 |
26+-----------------------------------------------------------------+
27|                                                                 |
28| The generic mcf548x BSP has been developed on the basic         |
29| structures and modules of the av5282 BSP.                       |
30|                                                                 |
31+-----------------------------------------------------------------+
32|                                                                 |
33| The license and distribution terms for this file may be         |
34| found in the file LICENSE in this distribution or at            |
35|                                                                 |
36| http://www.rtems.com/license/LICENSE.                           |
37|                                                                 |
38+-----------------------------------------------------------------+
39|                                                                 |
40|   date                      history                        ID   |
41| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
42| 12.11.07                    1.0                            ras  |
43|                                                                 |
44\*===============================================================*/
45
46#include <bsp.h>
47
48extern uint32_t _CPU_cacr_shadow;
49
50/*
51* These labels (!) are defined in the linker command file or when the linker is
52* invoked.
53* NOTE: The information (size) is the address of the object, not the object
54* itself.
55*/
56
57extern char _SdramBase[];
58extern char _BootFlashBase[];
59extern char _CodeFlashBase[];
60extern char _SdramSize[];
61extern char _BootFlashSize[];
62extern char _CodeFlashSize[];
63extern char _TopRamReserved [];
64extern char WorkAreaBase [];
65
66/*
67 * CPU-space access
68 */
69#define m68k_set_acr2(_acr2) asm volatile ("movec %0,#0x0005" : : "d" (_acr2))
70#define m68k_set_acr3(_acr3) asm volatile ("movec %0,#0x0007" : : "d" (_acr3))
71
72/*
73 * Set initial CACR mode, mainly enables branch/instruction/data cache.  The
74 * FPU must be switched on in the BSP startup code since the
75 * _Thread_Start_multitasking() will restore the floating-point context of the
76 * initialization task if necessary.
77 */
78static const uint32_t BSP_CACR_INIT = MCF548X_CACR_DEC /* enable data cache */
79  | MCF548X_CACR_BEC /* enable branch cache */
80  | MCF548X_CACR_IEC /* enable instruction cache */
81  | MCF548X_CACR_DDCM(DCACHE_ON_WRIGHTTHROUGH)
82      /* set data cache mode to write-through */
83  | MCF548X_CACR_DESB /* enable data store buffer */
84  | MCF548X_CACR_DDSP /* data access only in supv. mode */
85  | MCF548X_CACR_IDSP; /* instr. access only in supv. mode */
86
87/*
88 * CACR maintenance functions
89 */
90
91void bsp_cacr_set_flags( uint32_t flags)
92{
93  rtems_interrupt_level level;
94
95  rtems_interrupt_disable( level);
96  _CPU_cacr_shadow |= flags;
97  m68k_set_cacr( _CPU_cacr_shadow);
98  rtems_interrupt_enable( level);
99}
100
101void bsp_cacr_set_self_clear_flags( uint32_t flags)
102{
103  rtems_interrupt_level level;
104  uint32_t cacr = 0;
105
106  rtems_interrupt_disable( level);
107  cacr = _CPU_cacr_shadow | flags;
108  m68k_set_cacr( cacr);
109  rtems_interrupt_enable( level);
110}
111
112void bsp_cacr_clear_flags( uint32_t flags)
113{
114  rtems_interrupt_level level;
115
116  rtems_interrupt_disable( level);
117  _CPU_cacr_shadow &= ~flags;
118  m68k_set_cacr( _CPU_cacr_shadow);
119  rtems_interrupt_enable( level);
120}
121
122/*
123 * There is no complete cache lock (only 2 ways of 4 can be locked)
124 */
125void _CPU_cache_freeze_data(void)
126{
127  /* Do nothing */
128}
129
130void _CPU_cache_unfreeze_data(void)
131{
132  /* Do nothing */
133}
134
135void _CPU_cache_freeze_instruction(void)
136{
137  /* Do nothing */
138}
139
140void _CPU_cache_unfreeze_instruction(void)
141{
142  /* Do nothing */
143}
144
145void _CPU_cache_enable_instruction(void)
146{
147  bsp_cacr_clear_flags( MCF548X_CACR_IDCM);
148}
149
150void _CPU_cache_disable_instruction(void)
151{
152  bsp_cacr_set_flags( MCF548X_CACR_IDCM);
153}
154
155void _CPU_cache_invalidate_entire_instruction(void)
156{
157  bsp_cacr_set_self_clear_flags( MCF548X_CACR_ICINVA);
158}
159
160void _CPU_cache_invalidate_1_instruction_line(const void *addr)
161{
162  uint32_t a = (uint32_t) addr & ~0x3;
163
164  asm volatile ("cpushl %%ic,(%0)" :: "a" (a | 0x0));
165  asm volatile ("cpushl %%ic,(%0)" :: "a" (a | 0x1));
166  asm volatile ("cpushl %%ic,(%0)" :: "a" (a | 0x2));
167  asm volatile ("cpushl %%ic,(%0)" :: "a" (a | 0x3));
168}
169
170void _CPU_cache_enable_data(void)
171{
172  bsp_cacr_clear_flags( MCF548X_CACR_DDCM( DCACHE_OFF_IMPRECISE));
173}
174
175void _CPU_cache_disable_data(void)
176{
177  bsp_cacr_set_flags( MCF548X_CACR_DDCM( DCACHE_OFF_IMPRECISE));
178}
179
180void _CPU_cache_invalidate_entire_data(void)
181{
182  bsp_cacr_set_self_clear_flags( MCF548X_CACR_DCINVA);
183}
184
185void _CPU_cache_invalidate_1_data_line( const void *addr)
186{
187  uint32_t a = (uint32_t) addr & ~0x3;
188
189  asm volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x0));
190  asm volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x1));
191  asm volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x2));
192  asm volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x3));
193}
194
195void _CPU_cache_flush_1_data_line( const void *addr)
196{
197  uint32_t a = (uint32_t) addr & ~0x3;
198
199  asm volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x0));
200  asm volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x1));
201  asm volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x2));
202  asm volatile ("cpushl %%dc,(%0)" :: "a" (a | 0x3));
203}
204
205void _CPU_cache_flush_entire_data( void)
206{
207  uint32_t line = 0;
208
209  for (line = 0; line < 512; ++line) {
210    _CPU_cache_flush_1_data_line( (const void *) (line * 16));
211  }
212}
213
214/*
215 * Coldfire acr and mmu settings
216 */
217 void acr_mmu_mapping(void)
218   {
219
220  /*
221   * Cache disabled for internal register area (256 kB).
222   * Choose the smallest maskable size of 1MB.
223   */
224  m68k_set_acr0(MCF548X_ACR_BA((uint32_t)(__MBAR))                           |
225                MCF548X_ACR_ADMSK_AMM((uint32_t)(0xFFFFF))                   |
226                MCF548X_ACR_E                                                |
227                MCF548X_ACR_SP               /* supervisor protection */     |
228                MCF548X_ACR_S(S_ACCESS_SUPV) /* always in supervisor mode */ |
229                MCF548X_ACR_CM(CM_OFF_PRECISE));
230
231#ifdef M5484FIREENGINE
232
233
234  /*
235   * Cache enabled for entire SDRAM (64 MB)
236   */
237  m68k_set_acr1(MCF548X_ACR_BA((uint32_t)(_SdramBase))                       |
238                MCF548X_ACR_ADMSK_AMM((uint32_t)(_SdramSize - 1))            |
239                MCF548X_ACR_E                                                |
240                MCF548X_ACR_SP               /* supervisor protection */     |
241                MCF548X_ACR_S(S_ACCESS_SUPV) /* always in supervisor mode */ |
242                MCF548X_ACR_CM(CM_ON_WRIGHTTHROUGH));
243
244  /*
245   * Cache enabled for entire boot flash (2 MB)
246   */
247  m68k_set_acr2(MCF548X_ACR_BA((uint32_t)(_BootFlashBase))                   |
248                MCF548X_ACR_ADMSK_AMM((uint32_t)(_BootFlashSize - 1))        |
249                MCF548X_ACR_E                                                |
250                MCF548X_ACR_SP               /* supervisor protection */     |
251                MCF548X_ACR_S(S_ACCESS_SUPV) /* always in supervisor mode */ |
252                MCF548X_ACR_CM(CM_ON_COPYBACK));
253
254  /*
255   * Cache enabled for entire code flash (16 MB)
256   */
257  m68k_set_acr3(MCF548X_ACR_BA((uint32_t)(_CodeFlashBase))                   |
258                MCF548X_ACR_ADMSK_AMM((uint32_t)(_CodeFlashSize - 1))        |
259                MCF548X_ACR_E                                                |
260                MCF548X_ACR_SP               /* supervisor protection */     |
261                MCF548X_ACR_S(S_ACCESS_SUPV) /* always in supervisor mode */ |
262                MCF548X_ACR_CM(CM_ON_COPYBACK));
263#endif
264
265   }
266
267/*
268 *  bsp_start
269 *
270 *  This routine does the bulk of the system initialisation.
271 */
272void bsp_start( void )
273{
274  /* Initialize CACR shadow register */
275  _CPU_cacr_shadow = BSP_CACR_INIT;
276
277  /*
278   * Load the shadow variable of CACR with initial mode and write it to the
279   * CACR.  Interrupts are still disabled, so there is no need for surrounding
280   * rtems_interrupt_enable() / rtems_interrupt_disable().
281   */
282  m68k_set_cacr( _CPU_cacr_shadow);
283
284  /*
285   * do mapping of acr's and/or mmu
286   */
287  acr_mmu_mapping();
288}
289
290
291/*
292 * Get the XLB clock speed
293 */
294uint32_t get_CPU_clock_speed(void)
295{
296    return (uint32_t)BSP_CPU_CLOCK_SPEED;
297}
Note: See TracBrowser for help on using the repository browser.