source: rtems/c/src/lib/libbsp/powerpc/score603e/startup/bspstart.c @ 353be08

4.115
Last change on this file since 353be08 was 353be08, checked in by Sebastian Huber <sebastian.huber@…>, on 06/07/11 at 13:28:01

2011-06-07 Sebastian Huber <sebastian.huber@…>

  • configure.ac, startup/bspstart.c: Use standard cache BSP options.
  • Property mode set to 100644
File size: 5.2 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-2010.
9 *  On-Line Applications Research Corporation (OAR).
10 *
11 *  The license and distribution terms for this file may be
12 *  found in 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/libio.h>
22#include <rtems/libcsupport.h>
23#include <rtems/bspIo.h>
24#include <libcpu/cpuIdent.h>
25#include <bsp/irq.h>
26
27#define DEBUG 0
28
29/*
30 * Where the heap starts; is used by bsp_pretasking_hook;
31 */
32unsigned int BSP_heap_start;
33
34/*
35 * PCI Bus Frequency
36 */
37unsigned int BSP_bus_frequency;
38
39/*
40 * processor clock frequency
41 */
42unsigned int BSP_processor_frequency;
43
44/*
45 * Time base divisior (how many tick for 1 second).
46 * Note: Calibrated with an application using a 20ms timer and
47 * a scope.
48 */
49unsigned int BSP_time_base_divisor = 3960;
50
51/*
52 *  Driver configuration parameters
53 */
54uint32_t   bsp_clicks_per_usec;
55
56/*
57 * Memory on this board.
58 */
59extern char RamSize[];
60uint32_t BSP_mem_size;
61
62extern unsigned long __rtems_end[];
63
64void BSP_panic(char *s)
65{
66  printk("%s PANIC %s\n",_RTEMS_version, s);
67  __asm__ __volatile ("sc");
68}
69
70void _BSP_Fatal_error(unsigned int v)
71{
72  printk("%s PANIC ERROR %x\n",_RTEMS_version, v);
73  __asm__ __volatile ("sc");
74}
75
76/*
77 *  Use the shared implementations of the following routines
78 */
79
80void bsp_libc_init( void *, uint32_t, int );
81
82/*PAGE
83 *
84 *  bsp_predriver_hook
85 *
86 *  Before drivers are setup initialize interupt vectors.
87 */
88
89void init_RTC(void);
90void initialize_PMC(void);
91
92void bsp_predriver_hook(void)
93{
94  init_PCI();
95  initialize_universe();
96
97  #if DEBUG
98    printk("bsp_predriver_hook: initialize_PCI_bridge\n");
99  #endif
100  initialize_PCI_bridge ();
101
102#if (HAS_PMC_PSC8)
103  #if DEBUG
104    printk("bsp_predriver_hook: initialize_PMC\n");
105  #endif
106  initialize_PMC();
107#endif
108
109  #if DEBUG
110    printk("bsp_predriver_hook: End of routine\n");
111  #endif
112
113}
114
115/*PAGE
116 *
117 *  initialize_PMC
118 */
119
120void initialize_PMC(void) {
121  volatile uint32_t     *PMC_addr;
122  uint32_t               data;
123
124  /*
125   * Clear status, enable SERR and memory space only.
126   */
127  PMC_addr = BSP_PCI_DEVICE_ADDRESS( 0x4 );
128  *PMC_addr = 0x020080cc;
129  #if DEBUG
130    printk("initialize_PMC: 0x%x = 0x%x\n", PMC_addr, 0x020080cc);
131  #endif
132
133  /*
134   * set PMC base address.
135   */
136  PMC_addr  = BSP_PCI_DEVICE_ADDRESS( 0x14 );
137  *PMC_addr = (BSP_PCI_REGISTER_BASE >> 24) & 0x3f;
138  #if DEBUG
139    printk("initialize_PMC: 0x%x = 0x%x\n", PMC_addr, ((BSP_PCI_REGISTER_BASE >> 24) & 0x3f));
140  #endif
141
142   PMC_addr = (volatile uint32_t*)
143      BSP_PMC_SERIAL_ADDRESS( 0x100000 );
144  data = *PMC_addr;
145  #if DEBUG
146    printk("initialize_PMC: Read 0x%x (0x%x)\n", PMC_addr, data );
147    printk("initialize_PMC: Read 0x%x (0x%x)\n", PMC_addr, data & 0xfc );
148  #endif
149  *PMC_addr = data & 0xfc;
150}
151
152/*PAGE
153 *
154 *  bsp_start
155 *
156 *  This routine does the bulk of the system initialization.
157 */
158
159void bsp_start( void )
160{
161  rtems_status_code sc = RTEMS_SUCCESSFUL;
162  unsigned int         msr_value = 0x0000;
163  uintptr_t            intrStackStart;
164  uintptr_t            intrStackSize;
165  ppc_cpu_id_t         myCpu;
166  ppc_cpu_revision_t   myCpuRevision;
167
168  rtems_bsp_delay( 1000 );
169
170  /*
171   *  Zero out lots of memory
172   */
173  #if DEBUG
174    printk("bsp_start: Zero out lots of memory\n");
175  #endif
176
177  BSP_processor_frequency = 266000000;
178  BSP_bus_frequency       =  66000000;
179
180  /*
181   * Get CPU identification dynamically. Note that the get_ppc_cpu_type()
182   * function store the result in global variables so that it can be used
183   * later...
184   */
185  myCpu         = get_ppc_cpu_type();
186  myCpuRevision = get_ppc_cpu_revision();
187  printk("Cpu: 0x%x  Revision: %d\n", myCpu, myCpuRevision);
188  printk("Cpu %s\n", get_ppc_cpu_type_name(myCpu) );
189
190  /*
191   * Initialize the interrupt related settings.
192   */
193  intrStackStart = (uintptr_t) __rtems_end;
194  intrStackSize = rtems_configuration_get_interrupt_stack_size();
195  printk("Interrupt Stack Start: 0x%x Size: 0x%x  Heap Start: 0x%x\n",
196    intrStackStart, intrStackSize, BSP_heap_start
197  );
198
199  BSP_mem_size = (uint32_t) RamSize;
200  printk("BSP_mem_size: %p\n", RamSize );
201
202  /*
203   * Initialize default raw exception handlers.
204   */
205  sc = ppc_exc_initialize(
206    PPC_INTERRUPT_DISABLE_MASK_DEFAULT,
207    intrStackStart,
208    intrStackSize
209  );
210  if (sc != RTEMS_SUCCESSFUL) {
211    BSP_panic("cannot initialize exceptions");
212  }
213
214  msr_value = 0x2030;
215  _CPU_MSR_SET( msr_value );
216  __asm__ volatile("sync; isync");
217
218  /*
219   *  initialize the device driver parameters
220   */
221  #if DEBUG
222    printk("bsp_start: set clicks poer usec\n");
223  #endif
224  bsp_clicks_per_usec = 66 / 4;
225
226  #if BSP_DATA_CACHE_ENABLED
227    #if DEBUG
228      printk("bsp_start: cache_enable\n");
229    #endif
230    instruction_cache_enable ();
231    data_cache_enable ();
232    #if DEBUG
233      printk("bsp_start: END BSP_DATA_CACHE_ENABLED\n");
234    #endif
235  #endif
236
237  /*
238   * Initalize RTEMS IRQ system
239   */
240  #if DEBUG
241    printk("bspstart: Call BSP_rtems_irq_mng_init\n");
242  #endif
243  BSP_rtems_irq_mng_init(0);
244
245  #if DEBUG
246    printk("bsp_start: end BSPSTART\n");
247    ShowBATS();
248  #endif
249}
Note: See TracBrowser for help on using the repository browser.