06f179c0937073195012400a19245c7ef85aa7b5
[oweals/u-boot.git] / cpu / mpc86xx / cpu_init.c
1 /*
2  * Copyright 2004 Freescale Semiconductor.
3  * Jeff Brown
4  * Srikanth Srinivasan (srikanth.srinivasan@freescale.com)
5  *
6  * See file CREDITS for list of people who contributed to this
7  * project.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation; either version 2 of
12  * the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
22  * MA 02111-1307 USA
23  */
24
25 /*
26  * cpu_init.c - low level cpu init
27  */
28
29 #include <config.h>
30 #include <common.h>
31 #include <mpc86xx.h>
32 #include <asm/mmu.h>
33 #include <asm/fsl_law.h>
34 #include "mp.h"
35
36 DECLARE_GLOBAL_DATA_PTR;
37
38 /*
39  * Breathe some life into the CPU...
40  *
41  * Set up the memory map
42  * initialize a bunch of registers
43  */
44
45 void cpu_init_f(void)
46 {
47         volatile immap_t    *immap = (immap_t *)CONFIG_SYS_IMMR;
48         volatile ccsr_lbc_t *memctl = &immap->im_lbc;
49
50         /* Pointer is writable since we allocated a register for it */
51         gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
52
53         /* Clear initial global data */
54         memset ((void *) gd, 0, sizeof (gd_t));
55
56 #ifdef CONFIG_FSL_LAW
57         init_laws();
58 #endif
59
60         /* Map banks 0 and 1 to the FLASH banks 0 and 1 at preliminary
61          * addresses - these have to be modified later when FLASH size
62          * has been determined
63          */
64
65 #if defined(CONFIG_SYS_OR0_REMAP)
66         memctl->or0 = CONFIG_SYS_OR0_REMAP;
67 #endif
68 #if defined(CONFIG_SYS_OR1_REMAP)
69         memctl->or1 = CONFIG_SYS_OR1_REMAP;
70 #endif
71
72         /* now restrict to preliminary range */
73 #if defined(CONFIG_SYS_BR0_PRELIM) && defined(CONFIG_SYS_OR0_PRELIM)
74         memctl->br0 = CONFIG_SYS_BR0_PRELIM;
75         memctl->or0 = CONFIG_SYS_OR0_PRELIM;
76 #endif
77
78 #if defined(CONFIG_SYS_BR1_PRELIM) && defined(CONFIG_SYS_OR1_PRELIM)
79         memctl->or1 = CONFIG_SYS_OR1_PRELIM;
80         memctl->br1 = CONFIG_SYS_BR1_PRELIM;
81 #endif
82
83 #if defined(CONFIG_SYS_BR2_PRELIM) && defined(CONFIG_SYS_OR2_PRELIM)
84         memctl->or2 = CONFIG_SYS_OR2_PRELIM;
85         memctl->br2 = CONFIG_SYS_BR2_PRELIM;
86 #endif
87
88 #if defined(CONFIG_SYS_BR3_PRELIM) && defined(CONFIG_SYS_OR3_PRELIM)
89         memctl->or3 = CONFIG_SYS_OR3_PRELIM;
90         memctl->br3 = CONFIG_SYS_BR3_PRELIM;
91 #endif
92
93 #if defined(CONFIG_SYS_BR4_PRELIM) && defined(CONFIG_SYS_OR4_PRELIM)
94         memctl->or4 = CONFIG_SYS_OR4_PRELIM;
95         memctl->br4 = CONFIG_SYS_BR4_PRELIM;
96 #endif
97
98 #if defined(CONFIG_SYS_BR5_PRELIM) && defined(CONFIG_SYS_OR5_PRELIM)
99         memctl->or5 = CONFIG_SYS_OR5_PRELIM;
100         memctl->br5 = CONFIG_SYS_BR5_PRELIM;
101 #endif
102
103 #if defined(CONFIG_SYS_BR6_PRELIM) && defined(CONFIG_SYS_OR6_PRELIM)
104         memctl->or6 = CONFIG_SYS_OR6_PRELIM;
105         memctl->br6 = CONFIG_SYS_BR6_PRELIM;
106 #endif
107
108 #if defined(CONFIG_SYS_BR7_PRELIM) && defined(CONFIG_SYS_OR7_PRELIM)
109         memctl->or7 = CONFIG_SYS_OR7_PRELIM;
110         memctl->br7 = CONFIG_SYS_BR7_PRELIM;
111 #endif
112
113         /* enable the timebase bit in HID0 */
114         set_hid0(get_hid0() | 0x4000000);
115
116         /* enable EMCP, SYNCBE | ABE bits in HID1 */
117         set_hid1(get_hid1() | 0x80000C00);
118 }
119
120 /*
121  * initialize higher level parts of CPU like timers
122  */
123 int cpu_init_r(void)
124 {
125 #if (CONFIG_NUM_CPUS > 1)
126         setup_mp();
127 #endif
128         return 0;
129 }
130
131 /* Set up BAT registers */
132 void setup_bats(void)
133 {
134         write_bat(DBAT0, CONFIG_SYS_DBAT0U, CONFIG_SYS_DBAT0L);
135         write_bat(IBAT0, CONFIG_SYS_IBAT0U, CONFIG_SYS_IBAT0L);
136         write_bat(DBAT1, CONFIG_SYS_DBAT1U, CONFIG_SYS_DBAT1L);
137         write_bat(IBAT1, CONFIG_SYS_IBAT1U, CONFIG_SYS_IBAT1L);
138         write_bat(DBAT2, CONFIG_SYS_DBAT2U, CONFIG_SYS_DBAT2L);
139         write_bat(IBAT2, CONFIG_SYS_IBAT2U, CONFIG_SYS_IBAT2L);
140         write_bat(DBAT3, CONFIG_SYS_DBAT3U, CONFIG_SYS_DBAT3L);
141         write_bat(IBAT3, CONFIG_SYS_IBAT3U, CONFIG_SYS_IBAT3L);
142         write_bat(DBAT4, CONFIG_SYS_DBAT4U, CONFIG_SYS_DBAT4L);
143         write_bat(IBAT4, CONFIG_SYS_IBAT4U, CONFIG_SYS_IBAT4L);
144         write_bat(DBAT5, CONFIG_SYS_DBAT5U, CONFIG_SYS_DBAT5L);
145         write_bat(IBAT5, CONFIG_SYS_IBAT5U, CONFIG_SYS_IBAT5L);
146         write_bat(DBAT6, CONFIG_SYS_DBAT6U, CONFIG_SYS_DBAT6L);
147         write_bat(IBAT6, CONFIG_SYS_IBAT6U, CONFIG_SYS_IBAT6L);
148         write_bat(DBAT7, CONFIG_SYS_DBAT7U, CONFIG_SYS_DBAT7L);
149         write_bat(IBAT7, CONFIG_SYS_IBAT7U, CONFIG_SYS_IBAT7L);
150
151         return;
152 }