source: rtems/bsps/powerpc/qoriq/start/bspstart.c @ 54d87f2

5
Last change on this file since 54d87f2 was 54d87f2, checked in by Sebastian Huber <sebastian.huber@…>, on 09/04/18 at 16:28:57

bsps/powerpc: Simplify ppc_exc_initialize()

Remove parameters from ppc_exc_initialize() since all BSPs passed the
same values.

Update #3459.

  • 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
57uint32_t _CPU_Counter_frequency(void)
58{
59#ifdef __PPC_CPU_E6500__
60  return qoriq_clock_frequency;
61#else
62  return bsp_time_base_frequency;
63#endif
64}
65
66static void initialize_frequency_parameters(void)
67{
68  const void *fdt = bsp_fdt_get();
69  int node;
70  int len;
71  fdt32_t *val_fdt;
72
73  node = fdt_node_offset_by_prop_value(fdt, -1, "device_type", "cpu", 4);
74
75  val_fdt = (fdt32_t *) fdt_getprop(fdt, node, "bus-frequency", &len);
76  if (val_fdt == NULL || len != 4) {
77    bsp_fatal(QORIQ_FATAL_FDT_NO_BUS_FREQUENCY);
78  }
79  BSP_bus_frequency = fdt32_to_cpu(*val_fdt) / QORIQ_BUS_CLOCK_DIVIDER;
80
81  val_fdt = (fdt32_t *) fdt_getprop(fdt, node, "timebase-frequency", &len);
82  if (val_fdt == NULL || len != 4) {
83    bsp_fatal(QORIQ_FATAL_FDT_NO_BUS_FREQUENCY);
84  }
85  bsp_time_base_frequency = fdt32_to_cpu(*val_fdt);
86
87  #ifdef __PPC_CPU_E6500__
88    val_fdt = (fdt32_t *) fdt_getprop(fdt, node, "clock-frequency", &len);
89    if (val_fdt == NULL || len != 4) {
90      bsp_fatal(QORIQ_FATAL_FDT_NO_CLOCK_FREQUENCY);
91    }
92    qoriq_clock_frequency = fdt32_to_cpu(*val_fdt);
93  #endif
94}
95
96#define MTIVPR(base) \
97  __asm__ volatile ("mtivpr %0" : : "r" (base))
98
99#ifdef __powerpc64__
100#define VECTOR_TABLE_ENTRY_SIZE 32
101#else
102#define VECTOR_TABLE_ENTRY_SIZE 16
103#endif
104
105#define MTIVOR(vec, offset) \
106  do { \
107    __asm__ volatile ("mtspr " RTEMS_XSTRING(vec) ", %0" : : "r" (offset)); \
108    offset += VECTOR_TABLE_ENTRY_SIZE; \
109  } while (0)
110
111void qoriq_initialize_exceptions(void *interrupt_stack_begin)
112{
113  uintptr_t addr;
114
115  ppc_exc_initialize_interrupt_stack(
116    (uintptr_t) interrupt_stack_begin
117  );
118
119  addr = (uintptr_t) bsp_exc_vector_base;
120  MTIVPR(addr);
121  MTIVOR(BOOKE_IVOR0,  addr);
122  MTIVOR(BOOKE_IVOR1,  addr);
123  MTIVOR(BOOKE_IVOR2,  addr);
124  MTIVOR(BOOKE_IVOR3,  addr);
125  MTIVOR(BOOKE_IVOR4,  addr);
126  MTIVOR(BOOKE_IVOR5,  addr);
127  MTIVOR(BOOKE_IVOR6,  addr);
128#ifdef __PPC_CPU_E6500__
129  MTIVOR(BOOKE_IVOR7,  addr);
130#endif
131  MTIVOR(BOOKE_IVOR8,  addr);
132#ifdef __PPC_CPU_E6500__
133  MTIVOR(BOOKE_IVOR9,  addr);
134#endif
135  MTIVOR(BOOKE_IVOR10, addr);
136  MTIVOR(BOOKE_IVOR11, addr);
137  MTIVOR(BOOKE_IVOR12, addr);
138  MTIVOR(BOOKE_IVOR13, addr);
139  MTIVOR(BOOKE_IVOR14, addr);
140  MTIVOR(BOOKE_IVOR15, addr);
141  MTIVOR(BOOKE_IVOR32, addr);
142  MTIVOR(BOOKE_IVOR33, addr);
143#ifndef __PPC_CPU_E6500__
144  MTIVOR(BOOKE_IVOR34, addr);
145#endif
146  MTIVOR(BOOKE_IVOR35, addr);
147#ifdef __PPC_CPU_E6500__
148  MTIVOR(BOOKE_IVOR36, addr);
149  MTIVOR(BOOKE_IVOR37, addr);
150#ifndef QORIQ_IS_HYPERVISOR_GUEST
151  MTIVOR(BOOKE_IVOR38, addr);
152  MTIVOR(BOOKE_IVOR39, addr);
153  MTIVOR(BOOKE_IVOR40, addr);
154  MTIVOR(BOOKE_IVOR41, addr);
155  MTIVOR(BOOKE_IVOR42, addr);
156#endif
157#endif
158}
159
160void bsp_start(void)
161{
162  /*
163   * Get CPU identification dynamically. Note that the get_ppc_cpu_type() function
164   * store the result in global variables so that it can be used latter...
165   */
166  get_ppc_cpu_type();
167  get_ppc_cpu_revision();
168
169  initialize_frequency_parameters();
170
171  qoriq_initialize_exceptions(
172    (uintptr_t) _Configuration_Interrupt_stack_area_begin
173  );
174  bsp_interrupt_initialize();
175
176  rtems_cache_coherent_add_area(
177    bsp_section_nocacheheap_begin,
178    (uintptr_t) bsp_section_nocacheheap_size
179  );
180
181#ifndef QORIQ_IS_HYPERVISOR_GUEST
182  /* Disable boot page translation */
183#if QORIQ_CHIP_IS_T_VARIANT(QORIQ_CHIP_VARIANT)
184  qoriq.lcc.bstar &= ~LCC_BSTAR_EN;
185#else
186  qoriq.lcc.bptr &= ~BPTR_EN;
187#endif
188#endif
189}
190
191uint32_t bsp_fdt_map_intr(const uint32_t *intr, size_t icells)
192{
193#ifndef QORIQ_IS_HYPERVISOR_GUEST
194  return intr[0] - 16;
195#else
196  return intr[0];
197#endif
198}
199
200#ifdef RTEMS_MULTIPROCESSING
201RTEMS_SYSINIT_ITEM(
202  qoriq_intercom_init,
203  RTEMS_SYSINIT_BSP_PRE_DRIVERS,
204  RTEMS_SYSINIT_ORDER_MIDDLE
205);
206#endif
Note: See TracBrowser for help on using the repository browser.