]>
Commit | Line | Data |
---|---|---|
945af8d7 WD |
1 | /* |
2 | * (C) Copyright 2000-2003 | |
3 | * Wolfgang Denk, DENX Software Engineering, wd@denx.de. | |
4 | * | |
5 | * See file CREDITS for list of people who contributed to this | |
6 | * project. | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or | |
9 | * modify it under the terms of the GNU General Public License as | |
10 | * published by the Free Software Foundation; either version 2 of | |
11 | * the License, or (at your option) any later version. | |
12 | * | |
13 | * This program is distributed in the hope that it will be useful, | |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | * GNU General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU General Public License | |
19 | * along with this program; if not, write to the Free Software | |
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
21 | * MA 02111-1307 USA | |
22 | */ | |
23 | ||
24 | /* | |
25 | * CPU specific code for the MPC5xxx CPUs | |
26 | */ | |
27 | ||
28 | #include <common.h> | |
29 | #include <watchdog.h> | |
30 | #include <command.h> | |
31 | #include <mpc5xxx.h> | |
e1d7480b | 32 | #include <netdev.h> |
cf2817a8 | 33 | #include <asm/io.h> |
945af8d7 WD |
34 | #include <asm/processor.h> |
35 | ||
cf2817a8 GL |
36 | #if defined(CONFIG_OF_LIBFDT) |
37 | #include <libfdt.h> | |
38 | #include <libfdt_env.h> | |
e93becf8 | 39 | #include <fdt_support.h> |
e59581c5 SR |
40 | #endif |
41 | ||
d87080b7 WD |
42 | DECLARE_GLOBAL_DATA_PTR; |
43 | ||
945af8d7 WD |
44 | int checkcpu (void) |
45 | { | |
945af8d7 WD |
46 | ulong clock = gd->cpu_clk; |
47 | char buf[32]; | |
36c72877 | 48 | #ifndef CONFIG_MGT5100 |
b66a9383 | 49 | uint svr, pvr; |
36c72877 | 50 | #endif |
945af8d7 WD |
51 | |
52 | puts ("CPU: "); | |
53 | ||
36c72877 WD |
54 | #ifdef CONFIG_MGT5100 |
55 | puts (CPU_ID_STR); | |
945af8d7 | 56 | printf (" (JTAG ID %08lx)", *(vu_long *)MPC5XXX_CDM_JTAGID); |
36c72877 | 57 | #else |
b66a9383 RJ |
58 | svr = get_svr(); |
59 | pvr = get_pvr(); | |
a9d87e27 GW |
60 | |
61 | switch (pvr) { | |
62 | case PVR_5200: | |
63 | printf("MPC5200"); | |
64 | break; | |
65 | case PVR_5200B: | |
66 | printf("MPC5200B"); | |
36c72877 WD |
67 | break; |
68 | default: | |
a9d87e27 | 69 | printf("Unknown MPC5xxx"); |
36c72877 WD |
70 | break; |
71 | } | |
72 | ||
cf48eb9a | 73 | printf (" v%d.%d, Core v%d.%d", SVR_MJREV (svr), SVR_MNREV (svr), |
b66a9383 | 74 | PVR_MAJ(pvr), PVR_MIN(pvr)); |
36c72877 | 75 | #endif |
945af8d7 | 76 | printf (" at %s MHz\n", strmhz (buf, clock)); |
945af8d7 WD |
77 | return 0; |
78 | } | |
79 | ||
80 | /* ------------------------------------------------------------------------- */ | |
81 | ||
82 | int | |
83 | do_reset (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) | |
84 | { | |
d94f92cb | 85 | ulong msr; |
945af8d7 WD |
86 | /* Interrupts and MMU off */ |
87 | __asm__ __volatile__ ("mfmsr %0":"=r" (msr):); | |
88 | ||
89 | msr &= ~(MSR_ME | MSR_EE | MSR_IR | MSR_DR); | |
90 | __asm__ __volatile__ ("mtmsr %0"::"r" (msr)); | |
91 | ||
d94f92cb | 92 | /* Charge the watchdog timer */ |
2d5b561e | 93 | *(vu_long *)(MPC5XXX_GPT0_COUNTER) = 0x0001000f; |
d94f92cb | 94 | *(vu_long *)(MPC5XXX_GPT0_ENABLE) = 0x9004; /* wden|ce|timer_ms */ |
2d5b561e | 95 | while(1); |
d94f92cb | 96 | |
945af8d7 WD |
97 | return 1; |
98 | ||
99 | } | |
100 | ||
101 | /* ------------------------------------------------------------------------- */ | |
102 | ||
103 | /* | |
104 | * Get timebase clock frequency (like cpu_clk in Hz) | |
105 | * | |
106 | */ | |
107 | unsigned long get_tbclk (void) | |
108 | { | |
945af8d7 WD |
109 | ulong tbclk; |
110 | ||
111 | tbclk = (gd->bus_clk + 3L) / 4L; | |
112 | ||
113 | return (tbclk); | |
114 | } | |
115 | ||
116 | /* ------------------------------------------------------------------------- */ | |
e59581c5 | 117 | |
75d3e8fb | 118 | #if defined(CONFIG_OF_LIBFDT) && defined (CONFIG_OF_BOARD_SETUP) |
cf2817a8 GL |
119 | void ft_cpu_setup(void *blob, bd_t *bd) |
120 | { | |
6d0f6bcf | 121 | int div = in_8((void*)CONFIG_SYS_MBAR + 0x204) & 0x0020 ? 8 : 4; |
cf2817a8 | 122 | char * cpu_path = "/cpus/" OF_CPU; |
c512389c | 123 | #ifdef CONFIG_MPC5xxx_FEC |
cf2817a8 | 124 | char * eth_path = "/" OF_SOC "/ethernet@3000"; |
c512389c | 125 | #endif |
cf2817a8 | 126 | |
e93becf8 KG |
127 | do_fixup_by_path_u32(blob, cpu_path, "timebase-frequency", OF_TBCLK, 1); |
128 | do_fixup_by_path_u32(blob, cpu_path, "bus-frequency", bd->bi_busfreq, 1); | |
129 | do_fixup_by_path_u32(blob, cpu_path, "clock-frequency", bd->bi_intfreq, 1); | |
130 | do_fixup_by_path_u32(blob, "/" OF_SOC, "bus-frequency", bd->bi_ipbfreq, 1); | |
131 | do_fixup_by_path_u32(blob, "/" OF_SOC, "system-frequency", | |
132 | bd->bi_busfreq*div, 1); | |
c512389c | 133 | #ifdef CONFIG_MPC5xxx_FEC |
e93becf8 KG |
134 | do_fixup_by_path(blob, eth_path, "mac-address", bd->bi_enetaddr, 6, 0); |
135 | do_fixup_by_path(blob, eth_path, "local-mac-address", bd->bi_enetaddr, 6, 0); | |
c512389c | 136 | #endif |
e59581c5 SR |
137 | } |
138 | #endif | |
bef92e21 AB |
139 | |
140 | #ifdef CONFIG_BOOTCOUNT_LIMIT | |
141 | ||
142 | void bootcount_store (ulong a) | |
143 | { | |
a49d10cf | 144 | volatile ulong *save_addr = (volatile ulong *) (MPC5XXX_CDM_BRDCRMB); |
bef92e21 | 145 | |
a49d10cf | 146 | *save_addr = (BOOTCOUNT_MAGIC & 0xffff0000) | a; |
bef92e21 AB |
147 | } |
148 | ||
149 | ulong bootcount_load (void) | |
150 | { | |
a49d10cf | 151 | volatile ulong *save_addr = (volatile ulong *) (MPC5XXX_CDM_BRDCRMB); |
bef92e21 | 152 | |
a49d10cf WD |
153 | if ((*save_addr & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) |
154 | return 0; | |
155 | else | |
156 | return (*save_addr & 0x0000ffff); | |
bef92e21 AB |
157 | } |
158 | #endif /* CONFIG_BOOTCOUNT_LIMIT */ | |
e1d7480b BW |
159 | |
160 | #ifdef CONFIG_MPC5xxx_FEC | |
161 | /* Default initializations for FEC controllers. To override, | |
162 | * create a board-specific function called: | |
163 | * int board_eth_init(bd_t *bis) | |
164 | */ | |
165 | ||
166 | int cpu_eth_init(bd_t *bis) | |
167 | { | |
168 | return mpc5xxx_fec_initialize(bis); | |
169 | } | |
170 | #endif |