source: rtems/c/src/lib/libbsp/powerpc/score603e/startup/bspstart.c @ 5ce16e9

4.104.11
Last change on this file since 5ce16e9 was 5ce16e9, checked in by Joel Sherrill <joel.sherrill@…>, on Sep 18, 2008 at 5:45:04 PM

2008-09-18 Joel Sherrill <joel.sherrill@…>

  • startup/bspstart.c: Remove unused variable.
  • Property mode set to 100644
File size: 7.5 KB
Line 
1/*  bspstart.c
2 *
3 *  This set of routines starts the application.  It includes application,
4 *  board, and monitor specific initialization and configuration.
5 *  The generic CPU dependent initialization has been performed
6 *  before any of these are invoked.
7 *
8 *  COPYRIGHT (c) 1989-2007.
9 *  On-Line Applications Research Corporation (OAR).
10 *
11 *  The license and distribution terms for this file may in
12 *  the file LICENSE in this distribution or at
13 *  http://www.rtems.com/license/LICENSE.
14 *
15 *  $Id:
16 */
17
18#include <string.h>
19
20#include <bsp.h>
21#include <rtems/bspIo.h>
22#include <rtems/libio.h>
23#include <libcpu/cpuIdent.h>
24#define DEBUG 1
25
26/*
27 * Where the heap starts; is used by bsp_pretasking_hook;
28 */
29unsigned int BSP_heap_start;
30
31/*
32 * PCI Bus Frequency
33 */
34unsigned int BSP_bus_frequency;  /* XXX - Set this based upon the Score board */
35
36/*
37 * processor clock frequency
38 */
39unsigned int BSP_processor_frequency; /* XXX - Set this based upon the Score board */
40
41/*
42 * Time base divisior (how many tick for 1 second).
43 */
44unsigned int BSP_time_base_divisor = 1000;  /* XXX - Just a guess */
45
46extern unsigned long __rtems_end[];
47
48/*
49 *  Driver configuration parameters
50 */
51uint32_t   bsp_clicks_per_usec;
52
53void BSP_panic(char *s)
54{
55  printk("%s PANIC %s\n",_RTEMS_version, s);
56  __asm__ __volatile ("sc");
57}
58
59void _BSP_Fatal_error(unsigned int v)
60{
61  printk("%s PANIC ERROR %x\n",_RTEMS_version, v);
62  __asm__ __volatile ("sc");
63}
64
65/*
66 *  bsp_predriver_hook
67 *
68 *  Before drivers are setup initialize interupt vectors.
69 */
70
71void init_RTC();
72void initialize_PMC();
73
74void bsp_predriver_hook(void)
75{
76  #if DEBUG
77    printk("bsp_predriver_hook: init_RTC\n");
78  #endif
79  init_RTC();
80  init_PCI();
81  initialize_universe();
82
83  #if DEBUG
84    printk("bsp_predriver_hook: initialize_PCI_bridge\n");
85  #endif
86  initialize_PCI_bridge ();
87
88#if (HAS_PMC_PSC8)
89  #if DEBUG
90    printk("bsp_predriver_hook: initialize_PMC\n");
91  #endif
92  initialize_PMC();
93#endif
94
95#if 0
96 /*
97  * Initialize Bsp General purpose vector table.
98  */
99  #if DEBUG
100    printk("bsp_predriver_hook: initialize_external_exception_vector\n");
101  #endif
102 initialize_external_exception_vector();
103#endif
104
105#if (0)
106  /*
107   * XXX - Modify this to write a 48000000 (loop to self) command
108   *       to each interrupt location.  This is better for debug.
109   */
110  #if DEBUG
111    printk("bsp_predriver_hook: bsp_spurious_initialize\n");
112  #endif
113 bsp_spurious_initialize();
114#endif
115
116  ShowBATS();
117
118  #if DEBUG
119    printk("bsp_predriver_hook: End of routine\n");
120  #endif
121
122}
123
124/*PAGE
125 *
126 *  initialize_PMC
127 */
128
129void initialize_PMC() {
130  volatile uint32_t         *PMC_addr;
131  uint8_t          data;
132
133#if (0) /* First Values sent */
134  /*
135   * set PMC base address.
136   */
137  PMC_addr  = BSP_PCI_DEVICE_ADDRESS( 0x14 );
138  *PMC_addr = (BSP_PCI_REGISTER_BASE >> 24) & 0x3f;
139
140  /*
141   * Clear status, enable SERR and memory space only.
142   */
143  PMC_addr = BSP_PCI_DEVICE_ADDRESS( 0x4 );
144  *PMC_addr = 0x0201ff37;
145
146  /*
147   * Bit 0 and 1 HI cause Medium Loopback to occur.
148   */
149  PMC_addr = (volatile uint32_t*)
150        BSP_PMC_SERIAL_ADDRESS( 0x100000 );
151  data = *PMC_addr;
152  /*   *PMC_addr = data | 0x3;  */
153  *PMC_addr = data & 0xfc;
154
155#endif
156
157#if (1)
158
159  /*
160   * Clear status, enable SERR and memory space only.
161   */
162  #if DEBUG
163    printk("initialize_PMC: set Device Address 0x4 \n");
164  ShowBATS();
165  #endif
166  PMC_addr = BSP_PCI_DEVICE_ADDRESS( 0x4 );
167  *PMC_addr = 0x020080cc;
168
169  /*
170   * set PMC base address.
171   */
172  #if DEBUG
173    printk("initialize_PMC: set Device Address 0x14 \n");
174  ShowBATS();
175  #endif
176  PMC_addr  = BSP_PCI_DEVICE_ADDRESS( 0x14 );
177  *PMC_addr = (BSP_PCI_REGISTER_BASE >> 24) & 0x3f;
178
179  #if DEBUG
180    printk("initialize_PMC: set PMC Serial Address 0x100000\n");
181  #endif
182   PMC_addr = (volatile uint32_t*)
183      BSP_PMC_SERIAL_ADDRESS( 0x100000 );
184  data = *PMC_addr;
185  *PMC_addr = data & 0xfc;
186
187#endif
188}
189
190/*PAGE
191 *
192 *  bsp_postdriver_hook
193 *
194 *  Standard post driver hook plus some BSP specific stuff.
195 */
196
197void bsp_postdriver_hook(void)
198{
199  extern void Init_EE_mask_init(void);
200  extern void open_dev_console(void);
201
202  #if DEBUG
203    printk("bsp_postdriver_hook: initialize libio\n");
204  #endif
205  if (rtems_libio_supp_helper)
206    (*rtems_libio_supp_helper)();
207  ShowBATS();
208
209  #if DEBUG
210    printk("bsp_postdriver_hook: Init_EE_mask_init\n");
211  #endif
212  Init_EE_mask_init();
213  ShowBATS();
214  #if DEBUG
215    printk("bsp_postdriver_hook: Finished procedure\n");
216  #endif
217}
218
219void bsp_set_trap_vectors( void );
220
221/*PAGE
222 *
223 *  bsp_start
224 *
225 *  This routine does the bulk of the system initialization.
226 */
227
228void bsp_start( void )
229{
230  unsigned int         msr_value = 0x0000;
231  uint32_t             intrStackStart;
232  uint32_t             intrStackSize;
233  volatile uint32_t   *ptr;
234  ppc_cpu_id_t         myCpu;
235  ppc_cpu_revision_t   myCpuRevision;
236 
237  rtems_bsp_delay( 1000 );
238
239  /*
240   *  Zero out lots of memory
241   */
242  #if DEBUG
243    printk("bsp_start: Zero out lots of memory\n");
244    ShowBATS();
245  #endif
246
247  memset(
248    &end,
249    0,
250    (unsigned char *)&RAM_END - (unsigned char *) &end
251  );
252
253  BSP_processor_frequency = 266000000;
254  BSP_bus_frequency       =  66000000;
255
256  /*
257   * Get CPU identification dynamically. Note that the get_ppc_cpu_type()
258   * function store the result in global variables so that it can be used
259   * later...
260   */
261  myCpu         = get_ppc_cpu_type();
262  myCpuRevision = get_ppc_cpu_revision();
263
264  /*
265   * Initialize the interrupt related settings.
266   */
267  intrStackStart = (uint32_t) __rtems_end + BSP_INIT_STACK_SIZE;
268  intrStackSize = rtems_configuration_get_interrupt_stack_size();
269  BSP_heap_start = intrStackStart + intrStackSize;
270
271  /*
272   * Initialize default raw exception handlers.
273   */
274printk("ppc_exc_initialize\n");
275  ppc_exc_initialize(
276    PPC_INTERRUPT_DISABLE_MASK_DEFAULT,
277    intrStackStart,
278    intrStackSize
279  );
280
281  /*
282   *  There are multiple ROM monitors available for this board.
283   */
284#if (SCORE603E_USE_SDS)
285  #if DEBUG
286    printk("bsp_start: USE SDS\n");
287  #endif
288
289
290  /*
291   * Write instruction for Unconditional Branch to ROM vector.
292   */
293
294   Code = 0x4bf00002;
295   for (Address = 0x100; Address <= 0xe00; Address += 0x100) {
296     A_Vector = (uint32_t*)Address;
297     Code = 0x4bf00002 + Address;
298     *A_Vector = Code;
299   }
300
301   for (Address = 0x1000; Address <= 0x1400; Address += 0x100) {
302     A_Vector = (uint32_t*)Address;
303     Code = 0x4bf00002 + Address;
304     *A_Vector = Code;
305   }
306
307  msr_value = 0x2030;
308
309#elif (SCORE603E_USE_OPEN_FIRMWARE)
310  #if DEBUG
311    printk("bsp_start: USE OPEN FIRMWARE\n");
312  #endif
313  msr_value = 0x2030;
314
315#elif (SCORE603E_USE_NONE)
316  #if DEBUG
317    printk("bsp_start: USE NONE\n");
318  #endif
319  msr_value = 0x2030;
320  _CPU_MSR_SET( msr_value );
321  bsp_set_trap_vectors();
322
323#elif (SCORE603E_USE_DINK)
324  #if DEBUG
325    printk("bsp_start: USE DINK\n");
326  #endif
327  msr_value = 0x2030;
328  _CPU_MSR_SET( msr_value );
329
330  /*
331   * Override the DINK error on a Decrementor interrupt.
332   */
333  /* org    dec_vector  - rfi */
334  ptr = (uint32_t*)0x900;
335  *ptr = 0x4c000064;
336
337#else
338  #if DEBUG
339    printk("bsp_start: ERROR unknow ROM Monitor\n");
340  #endif
341#error "SCORE603E BSPSTART.C -- what ROM monitor are you using"
342#endif
343
344  _CPU_MSR_SET( msr_value );
345
346  /*
347   *  initialize the device driver parameters
348   */
349  #if DEBUG
350    printk("bsp_start: set clicks poer usec\n");
351  #endif
352  bsp_clicks_per_usec = 66 / 4;  /* XXX get from linkcmds */
353
354#if ( PPC_USE_DATA_CACHE )
355  #if DEBUG
356    printk("bsp_start: cache_enable\n");
357  #endif
358  instruction_cache_enable ();
359  data_cache_enable ();
360  #if DEBUG
361    printk("bsp_start: END PPC_USE_DATA_CACHE\n");
362  #endif
363#endif
364  #if DEBUG
365    printk("bsp_start: end BSPSTART\n");
366  ShowBATS();
367  #endif
368}
Note: See TracBrowser for help on using the repository browser.