source: rtems/c/src/lib/libbsp/powerpc/gen5200/startup/cpuinit.c @ 740abbd

4.11
Last change on this file since 740abbd was 740abbd, checked in by Sebastian Huber <sebastian.huber@…>, on Apr 17, 2013 at 1:57:20 PM

bsp/mpc5200: Add and use enable_bat_4_to_7()

  • Property mode set to 100644
File size: 9.4 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 inline enable_bat_4_to_7(void)
116{
117  PPC_SET_SPECIAL_PURPOSE_REGISTER_BITS(HID2, BSP_BBIT32(13));
118}
119
120static void cpu_init_bsp(void)
121{
122  BAT dbat;
123
124#if defined(MPC5200_BOARD_BRS5L)
125  calc_dbat_regvals(
126    &dbat,
127    (uint32_t) bsp_ram_start,
128    (uint32_t) bsp_ram_size,
129    false,
130    false,
131    false,
132    false,
133    BPP_RW
134  );
135  SET_DBAT(0,dbat.batu,dbat.batl);
136
137  calc_dbat_regvals(
138    &dbat,
139    (uint32_t) bsp_rom_start,
140    (uint32_t) bsp_rom_size,
141    false,
142    false,
143    false,
144    false,
145    BPP_RX
146  );
147  SET_DBAT(1,dbat.batu,dbat.batl);
148
149  calc_dbat_regvals(
150    &dbat,
151    (uint32_t) MBAR,
152    128 * 1024,
153    false,
154    true,
155    false,
156    true,
157    BPP_RW
158  );
159  SET_DBAT(2,dbat.batu,dbat.batl);
160
161  calc_dbat_regvals(
162    &dbat,
163    (uint32_t) bsp_dpram_start,
164    128 * 1024,
165    false,
166    true,
167    false,
168    true,
169    BPP_RW
170  );
171  SET_DBAT(3,dbat.batu,dbat.batl);
172#elif defined (HAS_UBOOT)
173  uint32_t start = 0;
174
175  /*
176   * Accesses (also speculative accesses) outside of the RAM area are a
177   * disaster especially in combination with the BestComm.  For safety reasons
178   * we make the available RAM a little bit smaller to have an unused area at
179   * the end.
180   */
181  bsp_uboot_board_info.bi_memsize -= 4 * 1024;
182
183  /*
184   * Program BAT0 for RAM
185   */
186  calc_dbat_regvals(
187    &dbat,
188    bsp_uboot_board_info.bi_memstart,
189    bsp_uboot_board_info.bi_memsize,
190    false,
191    false,
192    false,
193    false,
194    BPP_RW
195  );
196  SET_DBAT(0,dbat.batu,dbat.batl);
197
198  /*
199   * Program BAT1 for Flash
200   *
201   * WARNING!! Some Freescale LITE5200B boards ship with a version of
202   * U-Boot that lies about the starting address of Flash.  This check
203   * corrects that.
204   */
205  if ((bsp_uboot_board_info.bi_flashstart + bsp_uboot_board_info.bi_flashsize)
206    < bsp_uboot_board_info.bi_flashstart) {
207    start = 0 - bsp_uboot_board_info.bi_flashsize;
208  } else {
209    start = bsp_uboot_board_info.bi_flashstart;
210  }
211  calc_dbat_regvals(
212    &dbat,
213    start,
214    bsp_uboot_board_info.bi_flashsize,
215    false,
216    false,
217    false,
218    false,
219    BPP_RX
220  );
221  SET_DBAT(1,dbat.batu,dbat.batl);
222
223  /*
224   * Program BAT2 for the MBAR
225   */
226  calc_dbat_regvals(
227    &dbat,
228    (uint32_t) MBAR,
229    128 * 1024,
230    false,
231    true,
232    false,
233    true,
234    BPP_RW
235  );
236  SET_DBAT(2,dbat.batu,dbat.batl);
237
238  /*
239   * If there is SRAM, program BAT3 for that memory
240   */
241  if (bsp_uboot_board_info.bi_sramsize != 0) {
242    calc_dbat_regvals(
243      &dbat,
244      bsp_uboot_board_info.bi_sramstart,
245      bsp_uboot_board_info.bi_sramsize,
246      false,
247      true,
248      true,
249      true,
250      BPP_RW
251    );
252    SET_DBAT(3,dbat.batu,dbat.batl);
253  }
254#else
255#warning "Using BAT register values set by environment"
256#endif
257
258#if defined(MPC5200_BOARD_DP2)
259  enable_bat_4_to_7();
260
261  /* FPGA */
262  calc_dbat_regvals(
263    &dbat,
264    0xf0020000,
265    128 * 1024,
266    false,
267    true,
268    false,
269    true,
270    BPP_RW
271  );
272  SET_DBAT(4, dbat.batu, dbat.batl);
273#elif defined(MPC5200_BOARD_PM520_ZE30)
274  enable_bat_4_to_7();
275
276  /* External CC770 CAN controller available in version 2 */
277  calc_dbat_regvals(
278    &dbat,
279    0xf2000000,
280    128 * 1024,
281    false,
282    true,
283    false,
284    true,
285    BPP_RW
286  );
287  SET_DBAT(4, dbat.batu, dbat.batl);
288#endif
289}
290
291void cpu_init(void)
292{
293  uint32_t msr;
294
295  #if BSP_INSTRUCTION_CACHE_ENABLED
296    rtems_cache_enable_instruction();
297  #endif
298
299  /* Set up DBAT registers in MMU */
300  cpu_init_bsp();
301
302  #if defined(SHOW_MORE_INIT_SETTINGS)
303    { extern void ShowBATS(void);
304      ShowBATS();
305    }
306  #endif
307
308  /* Read MSR */
309  msr = ppc_machine_state_register();
310
311  /* Enable data MMU in MSR */
312  msr |= MSR_DR;
313
314  /* Update MSR */
315  ppc_set_machine_state_register( msr);
316
317  #if BSP_DATA_CACHE_ENABLED
318    rtems_cache_enable_data();
319  #endif
320}
Note: See TracBrowser for help on using the repository browser.