source: rtems/bsps/powerpc/qoriq/start/bspstart.c @ 8f8ccee

5
Last change on this file since 8f8ccee was 9964895, checked in by Sebastian Huber <sebastian.huber@…>, on 04/20/18 at 08:35:35

bsps: Move startup files to bsps

Adjust build support files to new directory layout.

This patch is a part of the BSP source reorganization.

Update #3285.

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup QorIQ
5 *
6 * @brief BSP startup.
7 */
8
9/*
10 * Copyright (c) 2010, 2017 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Dornierstr. 4
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.org/license/LICENSE.
21 */
22
23#include <libfdt.h>
24
25#include <rtems.h>
26#include <rtems/config.h>
27#include <rtems/counter.h>
28#include <rtems/sysinit.h>
29
30#include <libcpu/powerpc-utility.h>
31
32#include <bsp.h>
33#include <bsp/bootcard.h>
34#include <bsp/console-termios.h>
35#include <bsp/fatal.h>
36#include <bsp/fdt.h>
37#include <bsp/intercom.h>
38#include <bsp/irq-generic.h>
39#include <bsp/linker-symbols.h>
40#include <bsp/mmu.h>
41#include <bsp/qoriq.h>
42#include <bsp/vectors.h>
43
44LINKER_SYMBOL(bsp_exc_vector_base);
45
46qoriq_start_spin_table *
47qoriq_start_spin_table_addr[QORIQ_CPU_COUNT / QORIQ_THREAD_COUNT];
48
49/* Configuration parameters for console driver, ... */
50unsigned int BSP_bus_frequency;
51
52/* Configuration parameter for clock driver, ... */
53uint32_t bsp_time_base_frequency;
54
55uint32_t qoriq_clock_frequency;
56
57static void initialize_frequency_parameters(void)
58{
59  const void *fdt = bsp_fdt_get();
60  int node;
61  int len;
62  fdt32_t *val_fdt;
63
64  node = fdt_node_offset_by_prop_value(fdt, -1, "device_type", "cpu", 4);
65
66  val_fdt = (fdt32_t *) fdt_getprop(fdt, node, "bus-frequency", &len);
67  if (val_fdt == NULL || len != 4) {
68    bsp_fatal(QORIQ_FATAL_FDT_NO_BUS_FREQUENCY);
69  }
70  BSP_bus_frequency = fdt32_to_cpu(*val_fdt) / QORIQ_BUS_CLOCK_DIVIDER;
71
72  val_fdt = (fdt32_t *) fdt_getprop(fdt, node, "timebase-frequency", &len);
73  if (val_fdt == NULL || len != 4) {
74    bsp_fatal(QORIQ_FATAL_FDT_NO_BUS_FREQUENCY);
75  }
76  bsp_time_base_frequency = fdt32_to_cpu(*val_fdt);
77
78  #ifdef __PPC_CPU_E6500__
79    val_fdt = (fdt32_t *) fdt_getprop(fdt, node, "clock-frequency", &len);
80    if (val_fdt == NULL || len != 4) {
81      bsp_fatal(QORIQ_FATAL_FDT_NO_CLOCK_FREQUENCY);
82    }
83    qoriq_clock_frequency = fdt32_to_cpu(*val_fdt);
84  #endif
85  rtems_counter_initialize_converter(fdt32_to_cpu(*val_fdt));
86}
87
88#define MTIVPR(base) \
89  __asm__ volatile ("mtivpr %0" : : "r" (base))
90
91#ifdef __powerpc64__
92#define VECTOR_TABLE_ENTRY_SIZE 32
93#else
94#define VECTOR_TABLE_ENTRY_SIZE 16
95#endif
96
97#define MTIVOR(vec, offset) \
98  do { \
99    __asm__ volatile ("mtspr " RTEMS_XSTRING(vec) ", %0" : : "r" (offset)); \
100    offset += VECTOR_TABLE_ENTRY_SIZE; \
101  } while (0)
102
103void qoriq_initialize_exceptions(void *interrupt_stack_begin)
104{
105  uintptr_t addr;
106
107  ppc_exc_initialize_interrupt_stack(
108    (uintptr_t) interrupt_stack_begin,
109    rtems_configuration_get_interrupt_stack_size()
110  );
111
112  addr = (uintptr_t) bsp_exc_vector_base;
113  MTIVPR(addr);
114  MTIVOR(BOOKE_IVOR0,  addr);
115  MTIVOR(BOOKE_IVOR1,  addr);
116  MTIVOR(BOOKE_IVOR2,  addr);
117  MTIVOR(BOOKE_IVOR3,  addr);
118  MTIVOR(BOOKE_IVOR4,  addr);
119  MTIVOR(BOOKE_IVOR5,  addr);
120  MTIVOR(BOOKE_IVOR6,  addr);
121#ifdef __PPC_CPU_E6500__
122  MTIVOR(BOOKE_IVOR7,  addr);
123#endif
124  MTIVOR(BOOKE_IVOR8,  addr);
125#ifdef __PPC_CPU_E6500__
126  MTIVOR(BOOKE_IVOR9,  addr);
127#endif
128  MTIVOR(BOOKE_IVOR10, addr);
129  MTIVOR(BOOKE_IVOR11, addr);
130  MTIVOR(BOOKE_IVOR12, addr);
131  MTIVOR(BOOKE_IVOR13, addr);
132  MTIVOR(BOOKE_IVOR14, addr);
133  MTIVOR(BOOKE_IVOR15, addr);
134  MTIVOR(BOOKE_IVOR32, addr);
135  MTIVOR(BOOKE_IVOR33, addr);
136#ifndef __PPC_CPU_E6500__
137  MTIVOR(BOOKE_IVOR34, addr);
138#endif
139  MTIVOR(BOOKE_IVOR35, addr);
140#ifdef __PPC_CPU_E6500__
141  MTIVOR(BOOKE_IVOR36, addr);
142  MTIVOR(BOOKE_IVOR37, addr);
143#ifndef QORIQ_IS_HYPERVISOR_GUEST
144  MTIVOR(BOOKE_IVOR38, addr);
145  MTIVOR(BOOKE_IVOR39, addr);
146  MTIVOR(BOOKE_IVOR40, addr);
147  MTIVOR(BOOKE_IVOR41, addr);
148  MTIVOR(BOOKE_IVOR42, addr);
149#endif
150#endif
151}
152
153void bsp_start(void)
154{
155  /*
156   * Get CPU identification dynamically. Note that the get_ppc_cpu_type() function
157   * store the result in global variables so that it can be used latter...
158   */
159  get_ppc_cpu_type();
160  get_ppc_cpu_revision();
161
162  initialize_frequency_parameters();
163
164  qoriq_initialize_exceptions(bsp_section_work_begin);
165  bsp_interrupt_initialize();
166
167  rtems_cache_coherent_add_area(
168    bsp_section_nocacheheap_begin,
169    (uintptr_t) bsp_section_nocacheheap_size
170  );
171
172#ifndef QORIQ_IS_HYPERVISOR_GUEST
173  /* Disable boot page translation */
174#if QORIQ_CHIP_IS_T_VARIANT(QORIQ_CHIP_VARIANT)
175  qoriq.lcc.bstar &= ~LCC_BSTAR_EN;
176#else
177  qoriq.lcc.bptr &= ~BPTR_EN;
178#endif
179#endif
180}
181
182uint32_t bsp_fdt_map_intr(const uint32_t *intr, size_t icells)
183{
184#ifndef QORIQ_IS_HYPERVISOR_GUEST
185  return intr[0] - 16;
186#else
187  return intr[0];
188#endif
189}
190
191#ifdef RTEMS_MULTIPROCESSING
192RTEMS_SYSINIT_ITEM(
193  qoriq_intercom_init,
194  RTEMS_SYSINIT_BSP_PRE_DRIVERS,
195  RTEMS_SYSINIT_ORDER_MIDDLE
196);
197#endif
Note: See TracBrowser for help on using the repository browser.