]> git.sur5r.net Git - u-boot/blob - arch/powerpc/cpu/mpc86xx/cpu_init.c
SPDX: Convert all of our single license tags to Linux Kernel style
[u-boot] / arch / powerpc / cpu / mpc86xx / cpu_init.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2004,2009-2011 Freescale Semiconductor, Inc.
4  * Jeff Brown
5  * Srikanth Srinivasan (srikanth.srinivasan@freescale.com)
6  */
7
8 /*
9  * cpu_init.c - low level cpu init
10  */
11
12 #include <config.h>
13 #include <common.h>
14 #include <mpc86xx.h>
15 #include <asm/mmu.h>
16 #include <asm/fsl_law.h>
17 #include <asm/fsl_serdes.h>
18 #include <asm/mp.h>
19
20 extern void srio_init(void);
21
22 DECLARE_GLOBAL_DATA_PTR;
23
24 /*
25  * Breathe some life into the CPU...
26  *
27  * Set up the memory map
28  * initialize a bunch of registers
29  */
30
31 void cpu_init_f(void)
32 {
33         /* Pointer is writable since we allocated a register for it */
34         gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
35
36         /* Clear initial global data */
37         memset ((void *) gd, 0, sizeof (gd_t));
38
39 #ifdef CONFIG_FSL_LAW
40         init_laws();
41 #endif
42
43         setup_bats();
44
45         init_early_memctl_regs();
46
47 #if defined(CONFIG_FSL_DMA)
48         dma_init();
49 #endif
50
51         /* enable the timebase bit in HID0 */
52         set_hid0(get_hid0() | 0x4000000);
53
54         /* enable EMCP, SYNCBE | ABE bits in HID1 */
55         set_hid1(get_hid1() | 0x80000C00);
56 }
57
58 /*
59  * initialize higher level parts of CPU like timers
60  */
61 int cpu_init_r(void)
62 {
63         /* needs to be in ram since code uses global static vars */
64         fsl_serdes_init();
65
66 #ifdef CONFIG_SYS_SRIO
67         srio_init();
68 #endif
69
70 #if defined(CONFIG_MP)
71         setup_mp();
72 #endif
73         return 0;
74 }
75
76 #ifdef CONFIG_ADDR_MAP
77 /* Initialize address mapping array */
78 void init_addr_map(void)
79 {
80         int i;
81         ppc_bat_t bat = DBAT0;
82         phys_size_t size;
83         unsigned long upper, lower;
84
85         for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++, bat++) {
86                 if (read_bat(bat, &upper, &lower) != -1) {
87                         if (!BATU_VALID(upper))
88                                 size = 0;
89                         else
90                                 size = BATU_SIZE(upper);
91                         addrmap_set_entry(BATU_VADDR(upper), BATL_PADDR(lower),
92                                           size, i);
93                 }
94 #ifdef CONFIG_HIGH_BATS
95                 /* High bats are not contiguous with low BAT numbers */
96                 if (bat == DBAT3)
97                         bat = DBAT4 - 1;
98 #endif
99         }
100 }
101 #endif