source: rtems/c/src/lib/libbsp/powerpc/gen5200/startup/cpuinit.c @ 47fb2fe

4.115
Last change on this file since 47fb2fe was 47fb2fe, checked in by Sebastian Huber <sebastian.huber@…>, on 04/11/13 at 15:22:02

bsp/mpc5200: Add MPC5200_BOARD prefix

  • Property mode set to 100644
File size: 9.5 KB
Line 
1/*===============================================================*\
2| Project: RTEMS generic MPC5200 BSP                              |
3+-----------------------------------------------------------------+
4| Partially based on the code references which are named below.   |
5| Adaptions, modifications, enhancements and any recent parts of  |
6| the code are:                                                   |
7|                    Copyright (c) 2005                           |
8|                    Embedded Brains GmbH                         |
9|                    Obere Lagerstr. 30                           |
10|                    D-82178 Puchheim                             |
11|                    Germany                                      |
12|                    rtems@embedded-brains.de                     |
13+-----------------------------------------------------------------+
14| The license and distribution terms for this file may be         |
15| found in the file LICENSE in this distribution or at            |
16|                                                                 |
17| http://www.rtems.com/license/LICENSE.                           |
18|                                                                 |
19+-----------------------------------------------------------------+
20| this file contains the code to initialize the cpu               |
21\*===============================================================*/
22/***********************************************************************/
23/*                                                                     */
24/*   Module:       cpuinit.c                                           */
25/*   Date:         07/17/2003                                          */
26/*   Purpose:      RTEMS MPC5x00 C level startup code                  */
27/*                                                                     */
28/*---------------------------------------------------------------------*/
29/*                                                                     */
30/*   Description:  This file contains additional functions for         */
31/*                 initializing the MPC5x00 CPU                        */
32/*                                                                     */
33/*---------------------------------------------------------------------*/
34/*                                                                     */
35/*   Code                                                              */
36/*   References:   MPC8260ads additional CPU initialization            */
37/*   Module:       cpuinit.c                                           */
38/*   Project:      RTEMS 4.6.0pre1 / MCF8260ads BSP                    */
39/*   Version       1.1                                                 */
40/*   Date:         10/22/2002                                          */
41/*                                                                     */
42/*   Author(s) / Copyright(s):                                         */
43/*                                                                     */
44/*   Written by Jay Monkman (jmonkman@frasca.com)                      */
45/*                                                                     */
46/*---------------------------------------------------------------------*/
47/*                                                                     */
48/*   Partially based on the code references which are named above.     */
49/*   Adaptions, modifications, enhancements and any recent parts of    */
50/*   the code are under the right of                                   */
51/*                                                                     */
52/*         IPR Engineering, Dachauer Straße 38, D-80335 MÃŒnchen        */
53/*                        Copyright(C) 2003                            */
54/*                                                                     */
55/*---------------------------------------------------------------------*/
56/*                                                                     */
57/*   IPR Engineering makes no representation or warranties with        */
58/*   respect to the performance of this computer program, and          */
59/*   specifically disclaims any responsibility for any damages,        */
60/*   special or consequential, connected with the use of this program. */
61/*                                                                     */
62/*---------------------------------------------------------------------*/
63/*                                                                     */
64/*   Version history:  1.0                                             */
65/*                                                                     */
66/***********************************************************************/
67
68#include <stdbool.h>
69#include <string.h>
70
71#include <libcpu/powerpc-utility.h>
72#include <libcpu/mmu.h>
73
74#include <bsp.h>
75#include <bsp/mpc5200.h>
76
77#define SET_DBAT( n, uv, lv) \
78  do { \
79    PPC_SET_SPECIAL_PURPOSE_REGISTER( DBAT##n##L, lv); \
80    PPC_SET_SPECIAL_PURPOSE_REGISTER( DBAT##n##U, uv); \
81  } while (0)
82
83static void calc_dbat_regvals(
84  BAT *bat_ptr,
85  uint32_t base_addr,
86  uint32_t size,
87  bool flg_w,
88  bool flg_i,
89  bool flg_m,
90  bool flg_g,
91  uint32_t flg_bpp
92)
93{
94  uint32_t block_mask = 0xffffffff;
95  uint32_t end_addr = base_addr + size - 1;
96
97  /* Determine block mask, that overlaps the whole block */
98  while ((end_addr & block_mask) != (base_addr & block_mask)) {
99    block_mask <<= 1;
100  }
101
102  bat_ptr->batu.bepi = base_addr >> (32 - 15);
103  bat_ptr->batu.bl   = ~(block_mask >> (28 - 11));
104  bat_ptr->batu.vs   = 1;
105  bat_ptr->batu.vp   = 1;
106
107  bat_ptr->batl.brpn = base_addr  >> (32 - 15);
108  bat_ptr->batl.w    = flg_w;
109  bat_ptr->batl.i    = flg_i;
110  bat_ptr->batl.m    = flg_m;
111  bat_ptr->batl.g    = flg_g;
112  bat_ptr->batl.pp   = flg_bpp;
113}
114
115static void cpu_init_bsp(void)
116{
117#if defined (MPC5200_BOARD_BRS5L)
118  BAT dbat;
119
120  calc_dbat_regvals(
121    &dbat,
122    (uint32_t) bsp_ram_start,
123    (uint32_t) bsp_ram_size,
124    false,
125    false,
126    false,
127    false,
128    BPP_RW
129  );
130  SET_DBAT(0,dbat.batu,dbat.batl);
131
132  calc_dbat_regvals(
133    &dbat,
134    (uint32_t) bsp_rom_start,
135    (uint32_t) bsp_rom_size,
136    false,
137    false,
138    false,
139    false,
140    BPP_RX
141  );
142  SET_DBAT(1,dbat.batu,dbat.batl);
143
144  calc_dbat_regvals(
145    &dbat,
146    (uint32_t) MBAR,
147    128 * 1024,
148    false,
149    true,
150    false,
151    true,
152    BPP_RW
153  );
154  SET_DBAT(2,dbat.batu,dbat.batl);
155
156  calc_dbat_regvals(
157    &dbat,
158    (uint32_t) bsp_dpram_start,
159    128 * 1024,
160    false,
161    true,
162    false,
163    true,
164    BPP_RW
165  );
166  SET_DBAT(3,dbat.batu,dbat.batl);
167#elif defined (HAS_UBOOT)
168  BAT dbat;
169  uint32_t start = 0;
170
171  /*
172   * Accesses (also speculative accesses) outside of the RAM area are a
173   * disaster especially in combination with the BestComm.  For safety reasons
174   * we make the available RAM a little bit smaller to have an unused area at
175   * the end.
176   */
177  bsp_uboot_board_info.bi_memsize -= 4 * 1024;
178
179  /*
180   * Program BAT0 for RAM
181   */
182  calc_dbat_regvals(
183    &dbat,
184    bsp_uboot_board_info.bi_memstart,
185    bsp_uboot_board_info.bi_memsize,
186    false,
187    false,
188    false,
189    false,
190    BPP_RW
191  );
192  SET_DBAT(0,dbat.batu,dbat.batl);
193
194  /*
195   * Program BAT1 for Flash
196   *
197   * WARNING!! Some Freescale LITE5200B boards ship with a version of
198   * U-Boot that lies about the starting address of Flash.  This check
199   * corrects that.
200   */
201  if ((bsp_uboot_board_info.bi_flashstart + bsp_uboot_board_info.bi_flashsize)
202    < bsp_uboot_board_info.bi_flashstart) {
203    start = 0 - bsp_uboot_board_info.bi_flashsize;
204  } else {
205    start = bsp_uboot_board_info.bi_flashstart;
206  }
207  calc_dbat_regvals(
208    &dbat,
209    start,
210    bsp_uboot_board_info.bi_flashsize,
211    false,
212    false,
213    false,
214    false,
215    BPP_RX
216  );
217  SET_DBAT(1,dbat.batu,dbat.batl);
218
219  /*
220   * Program BAT2 for the MBAR
221   */
222  calc_dbat_regvals(
223    &dbat,
224    (uint32_t) MBAR,
225    128 * 1024,
226    false,
227    true,
228    false,
229    true,
230    BPP_RW
231  );
232  SET_DBAT(2,dbat.batu,dbat.batl);
233
234  /*
235   * If there is SRAM, program BAT3 for that memory
236   */
237  if (bsp_uboot_board_info.bi_sramsize != 0) {
238    calc_dbat_regvals(
239      &dbat,
240      bsp_uboot_board_info.bi_sramstart,
241      bsp_uboot_board_info.bi_sramsize,
242      false,
243      true,
244      true,
245      true,
246      BPP_RW
247    );
248    SET_DBAT(3,dbat.batu,dbat.batl);
249  }
250#else
251#warning "Using BAT register values set by environment"
252#endif
253
254#if defined(MPC5200_BOARD_DP2)
255  /* Enable BAT4-7 */
256  PPC_SET_SPECIAL_PURPOSE_REGISTER_BITS(HID2, BSP_BBIT32(13));
257
258  /* FPGA */
259  calc_dbat_regvals(
260    &dbat,
261    0xf0020000,
262    128 * 1024,
263    false,
264    true,
265    false,
266    true,
267    BPP_RW
268  );
269  SET_DBAT(4, dbat.batu, dbat.batl);
270#elif defined(MPC5200_BOARD_PM520_ZE30)
271  /* Enable BAT4-7 */
272  PPC_SET_SPECIAL_PURPOSE_REGISTER_BITS(HID2, BSP_BBIT32(13));
273
274  /* External CC770 CAN controller available in version 2 */
275  calc_dbat_regvals(
276    &dbat,
277    0xf2000000,
278    128 * 1024,
279    false,
280    true,
281    false,
282    true,
283    BPP_RW
284  );
285  SET_DBAT(4, dbat.batu, dbat.batl);
286#endif
287}
288
289void cpu_init(void)
290{
291  uint32_t msr;
292
293  /* Enable instruction cache */
294  PPC_SET_SPECIAL_PURPOSE_REGISTER_BITS( HID0, HID0_ICE);
295
296  /* Set up DBAT registers in MMU */
297  cpu_init_bsp();
298
299  #if defined(SHOW_MORE_INIT_SETTINGS)
300    { extern void ShowBATS(void);
301      ShowBATS();
302    }
303  #endif
304
305  /* Read MSR */
306  msr = ppc_machine_state_register();
307
308  /* Enable data MMU in MSR */
309  msr |= MSR_DR;
310
311  /* Update MSR */
312  ppc_set_machine_state_register( msr);
313
314  /*
315   * Enable data cache.
316   *
317   * NOTE: TRACE32 now supports data cache for MGT5x00.
318   */
319  PPC_SET_SPECIAL_PURPOSE_REGISTER_BITS( HID0, HID0_DCE);
320}
Note: See TracBrowser for help on using the repository browser.