]>
Commit | Line | Data |
---|---|---|
c609719b WD |
1 | /* |
2 | * (C) Copyright 2002 Wolfgang Grandegger <wg@denx.de> | |
3 | * | |
4 | * See file CREDITS for list of people who contributed to this | |
5 | * project. | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or | |
8 | * modify it under the terms of the GNU General Public License as | |
9 | * published by the Free Software Foundation; either version 2 of | |
10 | * the License, or (at your option) any later version. | |
11 | * | |
12 | * This program is distributed in the hope that it will be useful, | |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | * GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with this program; if not, write to the Free Software | |
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
20 | * MA 02111-1307 USA | |
21 | */ | |
22 | ||
23 | #include <common.h> | |
24 | #include <mpc824x.h> | |
25 | #include <pci.h> | |
26 | ||
27 | #include "pn62.h" | |
28 | ||
29 | ||
30 | static int get_serial_number (char *string, int size); | |
31 | static int get_mac_address (int id, u8 * mac, char *string, int size); | |
32 | ||
33 | #ifdef CONFIG_SHOW_BOOT_PROGRESS | |
34 | void show_boot_progress (int phase) | |
35 | { | |
36 | /* | |
37 | * Show phases of the bootm command on the front panel | |
38 | * LEDs and the scratchpad register #3 as well. We use | |
39 | * blinking LEDs for logical "1". | |
40 | */ | |
41 | if (phase > 0) { | |
42 | set_led (8, (phase & 0x1) ? LED_SLOW_CLOCK : LED_0); | |
43 | set_led (9, (phase & 0x2) ? LED_SLOW_CLOCK : LED_0); | |
44 | set_led (10, (phase & 0x4) ? LED_SLOW_CLOCK : LED_0); | |
45 | set_led (11, (phase & 0x8) ? LED_SLOW_CLOCK : LED_0); | |
46 | } | |
47 | i2155x_write_scrapad (BOOT_STATUS, phase); | |
48 | if (phase < 0) | |
49 | i2155x_write_scrapad (BOOT_DONE, BOOT_DONE_ERROR); | |
50 | } | |
51 | #endif | |
52 | ||
53 | void show_startup_phase (int phase) | |
54 | { | |
55 | /* | |
56 | * Show the phase of U-Boot startup on the front panel | |
57 | * LEDs and the scratchpad register #3 as well. | |
58 | */ | |
59 | if (phase > 0) { | |
60 | set_led (8, (phase & 0x1) ? LED_1 : LED_0); | |
61 | set_led (9, (phase & 0x2) ? LED_1 : LED_0); | |
62 | set_led (10, (phase & 0x4) ? LED_1 : LED_0); | |
63 | set_led (11, (phase & 0x8) ? LED_1 : LED_0); | |
64 | } | |
65 | i2155x_write_scrapad (BOOT_STATUS, phase); | |
66 | if (phase < 0) | |
67 | i2155x_write_scrapad (BOOT_DONE, BOOT_DONE_ERROR); | |
68 | } | |
69 | ||
70 | int checkboard (void) | |
71 | { | |
72 | show_startup_phase (1); | |
73 | puts ("Board: PN62\n"); | |
74 | return 0; | |
75 | } | |
76 | ||
77 | long int initdram (int board_type) | |
78 | { | |
c83bf6a2 WD |
79 | long size; |
80 | long new_bank0_end; | |
81 | long mear1; | |
82 | long emear1; | |
c609719b WD |
83 | |
84 | show_startup_phase (2); | |
85 | ||
c83bf6a2 | 86 | size = get_ram_size(CFG_SDRAM_BASE, CFG_MAX_RAM_SIZE); |
c609719b | 87 | |
c83bf6a2 WD |
88 | new_bank0_end = size - 1; |
89 | mear1 = mpc824x_mpc107_getreg (MEAR1); | |
90 | emear1 = mpc824x_mpc107_getreg (EMEAR1); | |
91 | mear1 = (mear1 & 0xFFFFFF00) | | |
92 | ((new_bank0_end & MICR_ADDR_MASK) >> MICR_ADDR_SHIFT); | |
93 | emear1 = (emear1 & 0xFFFFFF00) | | |
94 | ((new_bank0_end & MICR_ADDR_MASK) >> MICR_EADDR_SHIFT); | |
95 | mpc824x_mpc107_setreg (MEAR1, mear1); | |
96 | mpc824x_mpc107_setreg (EMEAR1, emear1); | |
c609719b | 97 | |
c83bf6a2 | 98 | return (size); |
c609719b WD |
99 | } |
100 | ||
101 | /* | |
102 | * Initialize PCI Devices. We rely on auto-configuration. | |
103 | */ | |
104 | #ifndef CONFIG_PCI_PNP | |
105 | #error "CONFIG_PCI_PNP is not defined, please correct!" | |
106 | #endif | |
107 | ||
108 | struct pci_controller hose = { | |
109 | }; | |
110 | ||
ad10dd9a | 111 | void pci_init_board (void) |
c609719b WD |
112 | { |
113 | show_startup_phase (4); | |
114 | pci_mpc824x_init (&hose); | |
115 | ||
116 | show_startup_phase (5); | |
117 | i2155x_init (); | |
118 | show_startup_phase (6); | |
119 | am79c95x_init (); | |
120 | show_startup_phase (7); | |
121 | } | |
122 | ||
123 | int misc_init_r (void) | |
124 | { | |
125 | DECLARE_GLOBAL_DATA_PTR; | |
126 | ||
127 | char str[20]; | |
128 | u8 mac[6]; | |
129 | ||
130 | show_startup_phase (8); | |
131 | /* | |
132 | * Get serial number and ethernet addresses if not already defined | |
133 | * and update the board info structure and the environment. | |
134 | */ | |
135 | if (getenv ("serial#") == NULL && | |
136 | get_serial_number (str, strlen (str)) > 0) { | |
137 | setenv ("serial#", str); | |
138 | } | |
139 | show_startup_phase (9); | |
140 | ||
141 | if (getenv ("ethaddr") == NULL && | |
142 | get_mac_address (0, mac, str, sizeof (str)) > 0) { | |
143 | setenv ("ethaddr", str); | |
144 | memcpy (gd->bd->bi_enetaddr, mac, 6); | |
145 | } | |
146 | show_startup_phase (10); | |
147 | ||
e2ffd59b | 148 | #ifdef CONFIG_HAS_ETH1 |
c609719b WD |
149 | if (getenv ("eth1addr") == NULL && |
150 | get_mac_address (1, mac, str, sizeof (str)) > 0) { | |
151 | setenv ("eth1addr", str); | |
152 | memcpy (gd->bd->bi_enet1addr, mac, 6); | |
153 | } | |
e2ffd59b | 154 | #endif /* CONFIG_HAS_ETH1 */ |
c609719b WD |
155 | show_startup_phase (11); |
156 | ||
157 | /* Tell everybody that U-Boot is up and runnig */ | |
158 | i2155x_write_scrapad (0, 0x12345678); | |
159 | return (0); | |
160 | } | |
161 | ||
162 | static int get_serial_number (char *string, int size) | |
163 | { | |
164 | int i; | |
165 | char c; | |
166 | ||
167 | if (size < I2155X_VPD_SN_SIZE) | |
168 | size = I2155X_VPD_SN_SIZE; | |
169 | for (i = 0; i < (size - 1); i++) { | |
77ddac94 | 170 | i2155x_read_vpd (I2155X_VPD_SN_START + i, 1, (uchar *)&c); |
c609719b WD |
171 | if (c == '\0') |
172 | break; | |
173 | string[i] = c; | |
174 | } | |
175 | string[i] = '\0'; /* make sure it's terminated */ | |
176 | ||
177 | return i; | |
178 | } | |
179 | ||
180 | static int get_mac_address (int id, u8 * mac, char *string, int size) | |
181 | { | |
182 | if (size < 6 * 3) | |
183 | return -1; | |
184 | ||
185 | i2155x_read_vpd (I2155X_VPD_MAC0_START + 6 * id, 6, mac); | |
186 | return sprintf (string, "%02x:%02x:%02x:%02x:%02x:%02x", | |
187 | mac[0], mac[1], mac[2], | |
188 | mac[3], mac[4], mac[5]); | |
189 | } |