Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mips/sibyte/sb1250/setup.c
15116 views
1
/*
2
* Copyright (C) 2000, 2001, 2002, 2003 Broadcom Corporation
3
*
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public License
6
* as published by the Free Software Foundation; either version 2
7
* of the License, or (at your option) any later version.
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
*/
18
#include <linux/init.h>
19
#include <linux/module.h>
20
#include <linux/kernel.h>
21
#include <linux/reboot.h>
22
#include <linux/string.h>
23
24
#include <asm/bootinfo.h>
25
#include <asm/mipsregs.h>
26
#include <asm/io.h>
27
#include <asm/sibyte/sb1250.h>
28
#include <asm/sibyte/sb1250_regs.h>
29
#include <asm/sibyte/sb1250_scd.h>
30
31
unsigned int sb1_pass;
32
unsigned int soc_pass;
33
unsigned int soc_type;
34
EXPORT_SYMBOL(soc_type);
35
unsigned int periph_rev;
36
unsigned int zbbus_mhz;
37
EXPORT_SYMBOL(zbbus_mhz);
38
39
static char *soc_str;
40
static char *pass_str;
41
static unsigned int war_pass; /* XXXKW don't overload PASS defines? */
42
43
static int __init setup_bcm1250(void)
44
{
45
int ret = 0;
46
47
switch (soc_pass) {
48
case K_SYS_REVISION_BCM1250_PASS1:
49
periph_rev = 1;
50
pass_str = "Pass 1";
51
break;
52
case K_SYS_REVISION_BCM1250_A10:
53
periph_rev = 2;
54
pass_str = "A8/A10";
55
/* XXXKW different war_pass? */
56
war_pass = K_SYS_REVISION_BCM1250_PASS2;
57
break;
58
case K_SYS_REVISION_BCM1250_PASS2_2:
59
periph_rev = 2;
60
pass_str = "B1";
61
break;
62
case K_SYS_REVISION_BCM1250_B2:
63
periph_rev = 2;
64
pass_str = "B2";
65
war_pass = K_SYS_REVISION_BCM1250_PASS2_2;
66
break;
67
case K_SYS_REVISION_BCM1250_PASS3:
68
periph_rev = 3;
69
pass_str = "C0";
70
break;
71
case K_SYS_REVISION_BCM1250_C1:
72
periph_rev = 3;
73
pass_str = "C1";
74
break;
75
default:
76
if (soc_pass < K_SYS_REVISION_BCM1250_PASS2_2) {
77
periph_rev = 2;
78
pass_str = "A0-A6";
79
war_pass = K_SYS_REVISION_BCM1250_PASS2;
80
} else {
81
printk("Unknown BCM1250 rev %x\n", soc_pass);
82
ret = 1;
83
}
84
break;
85
}
86
87
return ret;
88
}
89
90
int sb1250_m3_workaround_needed(void)
91
{
92
switch (soc_type) {
93
case K_SYS_SOC_TYPE_BCM1250:
94
case K_SYS_SOC_TYPE_BCM1250_ALT:
95
case K_SYS_SOC_TYPE_BCM1250_ALT2:
96
case K_SYS_SOC_TYPE_BCM1125:
97
case K_SYS_SOC_TYPE_BCM1125H:
98
return soc_pass < K_SYS_REVISION_BCM1250_C0;
99
100
default:
101
return 0;
102
}
103
}
104
105
static int __init setup_bcm112x(void)
106
{
107
int ret = 0;
108
109
switch (soc_pass) {
110
case 0:
111
/* Early build didn't have revid set */
112
periph_rev = 3;
113
pass_str = "A1";
114
war_pass = K_SYS_REVISION_BCM112x_A1;
115
break;
116
case K_SYS_REVISION_BCM112x_A1:
117
periph_rev = 3;
118
pass_str = "A1";
119
break;
120
case K_SYS_REVISION_BCM112x_A2:
121
periph_rev = 3;
122
pass_str = "A2";
123
break;
124
case K_SYS_REVISION_BCM112x_A3:
125
periph_rev = 3;
126
pass_str = "A3";
127
break;
128
case K_SYS_REVISION_BCM112x_A4:
129
periph_rev = 3;
130
pass_str = "A4";
131
break;
132
case K_SYS_REVISION_BCM112x_B0:
133
periph_rev = 3;
134
pass_str = "B0";
135
break;
136
default:
137
printk("Unknown %s rev %x\n", soc_str, soc_pass);
138
ret = 1;
139
}
140
141
return ret;
142
}
143
144
/* Setup code likely to be common to all SiByte platforms */
145
146
static int __init sys_rev_decode(void)
147
{
148
int ret = 0;
149
150
war_pass = soc_pass;
151
switch (soc_type) {
152
case K_SYS_SOC_TYPE_BCM1250:
153
case K_SYS_SOC_TYPE_BCM1250_ALT:
154
case K_SYS_SOC_TYPE_BCM1250_ALT2:
155
soc_str = "BCM1250";
156
ret = setup_bcm1250();
157
break;
158
case K_SYS_SOC_TYPE_BCM1120:
159
soc_str = "BCM1120";
160
ret = setup_bcm112x();
161
break;
162
case K_SYS_SOC_TYPE_BCM1125:
163
soc_str = "BCM1125";
164
ret = setup_bcm112x();
165
break;
166
case K_SYS_SOC_TYPE_BCM1125H:
167
soc_str = "BCM1125H";
168
ret = setup_bcm112x();
169
break;
170
default:
171
printk("Unknown SOC type %x\n", soc_type);
172
ret = 1;
173
break;
174
}
175
176
return ret;
177
}
178
179
void __init sb1250_setup(void)
180
{
181
uint64_t sys_rev;
182
int plldiv;
183
int bad_config = 0;
184
185
sb1_pass = read_c0_prid() & 0xff;
186
sys_rev = __raw_readq(IOADDR(A_SCD_SYSTEM_REVISION));
187
soc_type = SYS_SOC_TYPE(sys_rev);
188
soc_pass = G_SYS_REVISION(sys_rev);
189
190
if (sys_rev_decode()) {
191
printk("Restart after failure to identify SiByte chip\n");
192
machine_restart(NULL);
193
}
194
195
plldiv = G_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG)));
196
zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25);
197
198
printk("Broadcom SiByte %s %s @ %d MHz (SB1 rev %d)\n",
199
soc_str, pass_str, zbbus_mhz * 2, sb1_pass);
200
printk("Board type: %s\n", get_system_type());
201
202
switch (war_pass) {
203
case K_SYS_REVISION_BCM1250_PASS1:
204
#ifndef CONFIG_SB1_PASS_1_WORKAROUNDS
205
printk("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, "
206
"and the kernel doesn't have the proper "
207
"workarounds compiled in. @@@@\n");
208
bad_config = 1;
209
#endif
210
break;
211
case K_SYS_REVISION_BCM1250_PASS2:
212
/* Pass 2 - easiest as default for now - so many numbers */
213
#if !defined(CONFIG_SB1_PASS_2_WORKAROUNDS) || \
214
!defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS)
215
printk("@@@@ This is a BCM1250 A3-A10 board, and the "
216
"kernel doesn't have the proper workarounds "
217
"compiled in. @@@@\n");
218
bad_config = 1;
219
#endif
220
#ifdef CONFIG_CPU_HAS_PREFETCH
221
printk("@@@@ Prefetches may be enabled in this kernel, "
222
"but are buggy on this board. @@@@\n");
223
bad_config = 1;
224
#endif
225
break;
226
case K_SYS_REVISION_BCM1250_PASS2_2:
227
#ifndef CONFIG_SB1_PASS_2_WORKAROUNDS
228
printk("@@@@ This is a BCM1250 B1/B2. board, and the "
229
"kernel doesn't have the proper workarounds "
230
"compiled in. @@@@\n");
231
bad_config = 1;
232
#endif
233
#if defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) || \
234
!defined(CONFIG_CPU_HAS_PREFETCH)
235
printk("@@@@ This is a BCM1250 B1/B2, but the kernel is "
236
"conservatively configured for an 'A' stepping. "
237
"@@@@\n");
238
#endif
239
break;
240
default:
241
break;
242
}
243
if (bad_config) {
244
printk("Invalid configuration for this chip.\n");
245
machine_restart(NULL);
246
}
247
}
248
249