bcu_vrip.c revision 1.10.4.1 1 1.10.4.1 fvdl /* $NetBSD: bcu_vrip.c,v 1.10.4.1 2001/10/01 12:39:16 fvdl Exp $ */
2 1.1 takemura
3 1.1 takemura /*-
4 1.7 sato * Copyright (c) 1999-2001 SATO Kazumi. All rights reserved.
5 1.1 takemura * Copyright (c) 1999 PocketBSD Project. All rights reserved.
6 1.1 takemura *
7 1.1 takemura * Redistribution and use in source and binary forms, with or without
8 1.1 takemura * modification, are permitted provided that the following conditions
9 1.1 takemura * are met:
10 1.1 takemura * 1. Redistributions of source code must retain the above copyright
11 1.1 takemura * notice, this list of conditions and the following disclaimer.
12 1.1 takemura * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 takemura * notice, this list of conditions and the following disclaimer in the
14 1.1 takemura * documentation and/or other materials provided with the distribution.
15 1.1 takemura * 3. All advertising materials mentioning features or use of this software
16 1.1 takemura * must display the following acknowledgement:
17 1.1 takemura * This product includes software developed by the PocketBSD project
18 1.1 takemura * and its contributors.
19 1.1 takemura * 4. Neither the name of the project nor the names of its contributors
20 1.1 takemura * may be used to endorse or promote products derived from this software
21 1.1 takemura * without specific prior written permission.
22 1.1 takemura *
23 1.1 takemura * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 1.1 takemura * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 1.1 takemura * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 1.1 takemura * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 1.1 takemura * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 1.1 takemura * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 1.1 takemura * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 1.1 takemura * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 1.1 takemura * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 1.1 takemura * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 1.1 takemura * SUCH DAMAGE.
34 1.1 takemura *
35 1.1 takemura */
36 1.1 takemura
37 1.1 takemura #include <sys/param.h>
38 1.1 takemura #include <sys/systm.h>
39 1.1 takemura #include <sys/device.h>
40 1.1 takemura #include <sys/reboot.h>
41 1.1 takemura
42 1.1 takemura #include <machine/bus.h>
43 1.1 takemura
44 1.1 takemura #include <mips/cpuregs.h>
45 1.1 takemura
46 1.7 sato #include "opt_vr41xx.h"
47 1.1 takemura #include <hpcmips/vr/vr.h>
48 1.7 sato #include <hpcmips/vr/vrcpudef.h>
49 1.1 takemura #include <hpcmips/vr/vripvar.h>
50 1.1 takemura #include <hpcmips/vr/vripreg.h>
51 1.1 takemura #include <hpcmips/vr/bcureg.h>
52 1.1 takemura #include <hpcmips/vr/bcuvar.h>
53 1.1 takemura
54 1.10.4.1 fvdl static int vrbcu_match(struct device *, struct cfdata *, void *);
55 1.10.4.1 fvdl static void vrbcu_attach(struct device *, struct device *, void *);
56 1.1 takemura
57 1.10.4.1 fvdl static void vrbcu_write(struct vrbcu_softc *, int, unsigned short);
58 1.10.4.1 fvdl static unsigned short vrbcu_read(struct vrbcu_softc *, int);
59 1.2 sato
60 1.10.4.1 fvdl static void vrbcu_dump_regs(void);
61 1.5 sato
62 1.2 sato char *vr_cpuname=NULL;
63 1.2 sato int vr_major=-1;
64 1.2 sato int vr_minor=-1;
65 1.2 sato int vr_cpuid=-1;
66 1.1 takemura
67 1.1 takemura struct cfattach vrbcu_ca = {
68 1.3 sato sizeof(struct vrbcu_softc), vrbcu_match, vrbcu_attach
69 1.1 takemura };
70 1.1 takemura
71 1.3 sato struct vrbcu_softc *the_bcu_sc = NULL;
72 1.3 sato
73 1.3 sato static inline void
74 1.10.4.1 fvdl vrbcu_write(struct vrbcu_softc *sc, int port, unsigned short val)
75 1.3 sato {
76 1.10.4.1 fvdl
77 1.3 sato bus_space_write_2(sc->sc_iot, sc->sc_ioh, port, val);
78 1.3 sato }
79 1.3 sato
80 1.3 sato static inline unsigned short
81 1.10.4.1 fvdl vrbcu_read(struct vrbcu_softc *sc, int port)
82 1.3 sato {
83 1.10.4.1 fvdl
84 1.10.4.1 fvdl return (bus_space_read_2(sc->sc_iot, sc->sc_ioh, port));
85 1.3 sato }
86 1.3 sato
87 1.1 takemura static int
88 1.10.4.1 fvdl vrbcu_match(struct device *parent, struct cfdata *cf, void *aux)
89 1.1 takemura {
90 1.10.4.1 fvdl
91 1.10.4.1 fvdl return (2);
92 1.1 takemura }
93 1.1 takemura
94 1.1 takemura static void
95 1.10.4.1 fvdl vrbcu_attach(struct device *parent, struct device *self, void *aux)
96 1.1 takemura {
97 1.1 takemura struct vrip_attach_args *va = aux;
98 1.3 sato struct vrbcu_softc *sc = (struct vrbcu_softc *)self;
99 1.1 takemura
100 1.3 sato sc->sc_iot = va->va_iot;
101 1.3 sato bus_space_map(sc->sc_iot, va->va_addr, va->va_size,
102 1.10.4.1 fvdl 0, /* no flags */
103 1.10.4.1 fvdl &sc->sc_ioh);
104 1.1 takemura
105 1.1 takemura printf("\n");
106 1.3 sato the_bcu_sc = sc;
107 1.5 sato vrbcu_dump_regs();
108 1.5 sato }
109 1.5 sato
110 1.5 sato static void
111 1.5 sato vrbcu_dump_regs()
112 1.5 sato {
113 1.5 sato struct vrbcu_softc *sc = the_bcu_sc;
114 1.7 sato int cpuclock = 0, tclock = 0, vtclock = 0, cpuid;
115 1.8 sato #if !defined(ONLY_VR4102)
116 1.7 sato int spdreg;
117 1.7 sato #endif
118 1.7 sato #ifdef VRBCUDEBUG
119 1.5 sato int reg;
120 1.7 sato #endif /* VRBCUDEBUG */
121 1.5 sato
122 1.7 sato cpuid = vrbcu_vrip_getcpuid();
123 1.8 sato #if !defined(ONLY_VR4181) && !defined(ONLY_VR4102)
124 1.7 sato if (cpuid != BCUREVID_FIXRID_4181
125 1.10.4.1 fvdl && cpuid <= BCUREVID_RID_4131
126 1.10.4.1 fvdl && cpuid >= BCUREVID_RID_4111) {
127 1.7 sato spdreg = vrbcu_read(sc, BCUCLKSPEED_REG_W);
128 1.5 sato #ifdef VRBCUDEBUG
129 1.7 sato printf("vrbcu: CLKSPEED %x: \n", spdreg);
130 1.7 sato #endif /* VRBCUDEBUG */
131 1.7 sato }
132 1.7 sato #endif
133 1.8 sato #if defined VR4181
134 1.8 sato if (cpuid == BCUREVID_FIXRID_4181){
135 1.8 sato spdreg = vrbcu_read(sc, BCU81CLKSPEED_REG_W);
136 1.8 sato #ifdef VRBCUDEBUG
137 1.8 sato printf("vrbcu: CLKSPEED %x: \n", spdreg);
138 1.8 sato #endif /* VRBCUDEBUG */
139 1.8 sato }
140 1.8 sato #endif
141 1.7 sato
142 1.5 sato cpuclock = vrbcu_vrip_getcpuclock();
143 1.5 sato
144 1.5 sato switch (cpuid) {
145 1.8 sato #if defined VR4181
146 1.7 sato case BCUREVID_FIXRID_4181:
147 1.10.4.1 fvdl switch ((spdreg & BCU81CLKSPEED_DIVTMASK) >>
148 1.10.4.1 fvdl BCU81CLKSPEED_DIVTSHFT){
149 1.8 sato case BCU81CLKSPEED_DIVT1:
150 1.8 sato vtclock = tclock = cpuclock;
151 1.8 sato break;
152 1.8 sato case BCU81CLKSPEED_DIVT2:
153 1.8 sato vtclock = tclock = cpuclock/2;
154 1.8 sato break;
155 1.8 sato case BCU81CLKSPEED_DIVT3:
156 1.8 sato vtclock = tclock = cpuclock/3;
157 1.8 sato break;
158 1.8 sato case BCU81CLKSPEED_DIVT4:
159 1.8 sato vtclock = tclock = cpuclock/4;
160 1.8 sato break;
161 1.8 sato default:
162 1.8 sato vtclock = tclock = 0;
163 1.8 sato }
164 1.8 sato break;
165 1.8 sato #endif /* VR4181 */
166 1.5 sato case BCUREVID_RID_4101:
167 1.5 sato case BCUREVID_RID_4102:
168 1.5 sato vtclock = tclock = cpuclock/2;
169 1.5 sato break;
170 1.7 sato #if defined VR4111
171 1.5 sato case BCUREVID_RID_4111:
172 1.7 sato if ((spdreg&BCUCLKSPEED_DIVT2B) == 0)
173 1.5 sato vtclock = tclock = cpuclock/2;
174 1.7 sato else if ((spdreg&BCUCLKSPEED_DIVT3B) == 0)
175 1.5 sato vtclock = tclock = cpuclock/3;
176 1.7 sato else if ((spdreg&BCUCLKSPEED_DIVT4B) == 0)
177 1.5 sato vtclock = tclock = cpuclock/4;
178 1.5 sato else
179 1.5 sato vtclock = tclock = 0; /* XXX */
180 1.5 sato break;
181 1.7 sato #endif /* VR4111 */
182 1.7 sato #if defined VR4121
183 1.5 sato case BCUREVID_RID_4121:
184 1.10.4.1 fvdl {
185 1.10.4.1 fvdl int vt;
186 1.10.4.1 fvdl tclock = cpuclock / ((spdreg & BCUCLKSPEED_DIVTMASK) >>
187 1.10.4.1 fvdl BCUCLKSPEED_DIVTSHFT);
188 1.10.4.1 fvdl vt = ((spdreg & BCUCLKSPEED_DIVVTMASK) >>
189 1.10.4.1 fvdl BCUCLKSPEED_DIVVTSHFT);
190 1.10.4.1 fvdl if (vt == 0)
191 1.10.4.1 fvdl vtclock = 0; /* XXX */
192 1.10.4.1 fvdl else if (vt < 0x9)
193 1.10.4.1 fvdl vtclock = cpuclock / vt;
194 1.10.4.1 fvdl else
195 1.10.4.1 fvdl vtclock = cpuclock / ((vt - 8)*2+1) * 2;
196 1.10.4.1 fvdl }
197 1.10.4.1 fvdl break;
198 1.7 sato #endif /* VR4121 */
199 1.10.4.1 fvdl #if defined VR4122 || defined VR4131
200 1.9 enami case BCUREVID_RID_4122:
201 1.10.4.1 fvdl case BCUREVID_RID_4131:
202 1.10.4.1 fvdl {
203 1.10.4.1 fvdl int vtdiv;
204 1.9 enami
205 1.10.4.1 fvdl vtdiv = ((spdreg & BCUCLKSPEED_VTDIVMODE) >>
206 1.10.4.1 fvdl BCUCLKSPEED_VTDIVSHFT);
207 1.10.4.1 fvdl if (vtdiv == 0 || vtdiv > BCUCLKSPEED_VTDIV6)
208 1.10.4.1 fvdl vtclock = 0; /* XXX */
209 1.10.4.1 fvdl else
210 1.10.4.1 fvdl vtclock = cpuclock / vtdiv;
211 1.10.4.1 fvdl tclock = vtclock /
212 1.10.4.1 fvdl (((spdreg & BCUCLKSPEED_TDIVMODE) >>
213 1.10.4.1 fvdl BCUCLKSPEED_TDIVSHFT) ? 4 : 2);
214 1.10.4.1 fvdl }
215 1.10.4.1 fvdl break;
216 1.10.4.1 fvdl #endif /* VR4122 || VR4131 */
217 1.5 sato default:
218 1.5 sato break;
219 1.5 sato }
220 1.7 sato if (tclock)
221 1.7 sato printf("%s: cpu %d.%03dMHz, bus %d.%03dMHz, ram %d.%03dMHz\n",
222 1.10.4.1 fvdl sc->sc_dev.dv_xname,
223 1.10.4.1 fvdl cpuclock/1000000, (cpuclock%1000000)/1000,
224 1.10.4.1 fvdl tclock/1000000, (tclock%1000000)/1000,
225 1.10.4.1 fvdl vtclock/1000000, (vtclock%1000000)/1000);
226 1.7 sato else {
227 1.7 sato printf("%s: cpu %d.%03dMHz\n",
228 1.10.4.1 fvdl sc->sc_dev.dv_xname,
229 1.10.4.1 fvdl cpuclock/1000000, (cpuclock%1000000)/1000);
230 1.10.4.1 fvdl printf("%s: UNKNOWN BUS CLOCK SPEED:"
231 1.10.4.1 fvdl " CPU is UNKNOWN or NOT CONFIGURED\n",
232 1.10.4.1 fvdl sc->sc_dev.dv_xname);
233 1.7 sato }
234 1.5 sato #ifdef VRBCUDEBUG
235 1.7 sato reg = vrbcu_read(sc, BCUCNT1_REG_W);
236 1.7 sato printf("vrbcu: CNT1 %x: ", reg);
237 1.7 sato bitdisp16(reg);
238 1.7 sato #if !defined(ONLY_VR4181)
239 1.7 sato if (cpuid != BCUREVID_FIXRID_4181
240 1.10.4.1 fvdl && cpuid <= BCUREVID_RID_4121
241 1.10.4.1 fvdl && cpuid >= BCUREVID_RID_4102) {
242 1.7 sato reg = vrbcu_read(sc, BCUCNT2_REG_W);
243 1.7 sato printf("vrbcu: CNT2 %x: ", reg);
244 1.7 sato bitdisp16(reg);
245 1.7 sato }
246 1.7 sato #endif /* !defined ONLY_VR4181 */
247 1.10.4.1 fvdl #if !defined(ONLY_VR4181) || !defined(ONLY_VR4122_4131)
248 1.7 sato if (cpuid != BCUREVID_FIXRID_4181
249 1.10.4.1 fvdl && cpuid <= BCUREVID_RID_4121
250 1.10.4.1 fvdl && cpuid >= BCUREVID_RID_4102) {
251 1.7 sato reg = vrbcu_read(sc, BCUSPEED_REG_W);
252 1.7 sato printf("vrbcu: SPEED %x: ", reg);
253 1.7 sato bitdisp16(reg);
254 1.7 sato reg = vrbcu_read(sc, BCUERRST_REG_W);
255 1.7 sato printf("vrbcu: ERRST %x: ", reg);
256 1.7 sato bitdisp16(reg);
257 1.7 sato reg = vrbcu_read(sc, BCURFCNT_REG_W);
258 1.7 sato printf("vrbcu: RFCNT %x\n", reg);
259 1.7 sato reg = vrbcu_read(sc, BCUREFCOUNT_REG_W);
260 1.7 sato printf("vrbcu: RFCOUNT %x\n", reg);
261 1.7 sato }
262 1.10.4.1 fvdl #endif /* !defined(ONLY_VR4181) || !defined(ONLY_VR4122_4131) */
263 1.7 sato #if !defined(ONLY_VR4181)
264 1.7 sato if (cpuid != BCUREVID_FIXRID_4181
265 1.10.4.1 fvdl && cpuid <= BCUREVID_RID_4131
266 1.10.4.1 fvdl && cpuid >= BCUREVID_RID_4111)
267 1.7 sato {
268 1.5 sato reg = vrbcu_read(sc, BCUCNT3_REG_W);
269 1.5 sato printf("vrbcu: CNT3 %x: ", reg);
270 1.5 sato bitdisp16(reg);
271 1.5 sato }
272 1.7 sato #endif /* !defined ONLY_VR4181 */
273 1.5 sato #endif /* VRBCUDEBUG */
274 1.5 sato
275 1.1 takemura }
276 1.1 takemura
277 1.1 takemura static char *cpuname[] = {
278 1.7 sato "VR4101", /* 0 */
279 1.7 sato "VR4102", /* 1 */
280 1.7 sato "VR4111", /* 2 */
281 1.7 sato "VR4121", /* 3 */
282 1.7 sato "VR4122", /* 4 */
283 1.10.4.1 fvdl "VR4131", /* 5 */
284 1.7 sato "UNKNOWN",
285 1.7 sato "UNKNOWN",
286 1.1 takemura "UNKNOWN",
287 1.1 takemura "UNKNOWN",
288 1.1 takemura "UNKNOWN",
289 1.7 sato "UNKNOWN",
290 1.7 sato "UNKNOWN",
291 1.7 sato "UNKNOWN",
292 1.7 sato "UNKNOWN",
293 1.7 sato "UNKNOWN",
294 1.7 sato "VR4181", /* 0x10 + 0 */
295 1.7 sato };
296 1.1 takemura
297 1.2 sato int
298 1.2 sato vrbcu_vrip_getcpuid(void)
299 1.2 sato {
300 1.2 sato volatile u_int16_t *revreg;
301 1.2 sato
302 1.2 sato if (vr_cpuid != -1)
303 1.10.4.1 fvdl return (vr_cpuid);
304 1.2 sato
305 1.2 sato if (vr_cpuid == -1) {
306 1.8 sato if (VRIP_BCU_ADDR == VR4181_BCU_ADDR)
307 1.10.4.1 fvdl revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1
308 1.10.4.1 fvdl ((VRIP_BCU_ADDR+BCU81REVID_REG_W));
309 1.8 sato else
310 1.10.4.1 fvdl revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1
311 1.10.4.1 fvdl ((VRIP_BCU_ADDR+BCUREVID_REG_W));
312 1.2 sato
313 1.2 sato vr_cpuid = *revreg;
314 1.2 sato vr_cpuid = (vr_cpuid&BCUREVID_RIDMASK)>>BCUREVID_RIDSHFT;
315 1.8 sato if (VRIP_BCU_ADDR == VR4181_BCU_ADDR
316 1.8 sato && vr_cpuid == BCUREVID_RID_4181) /* conflict vr4101 */
317 1.7 sato vr_cpuid = BCUREVID_FIXRID_4181;
318 1.2 sato }
319 1.10.4.1 fvdl return (vr_cpuid);
320 1.2 sato }
321 1.2 sato
322 1.1 takemura char *
323 1.1 takemura vrbcu_vrip_getcpuname(void)
324 1.1 takemura {
325 1.2 sato int cpuid;
326 1.1 takemura
327 1.2 sato if (vr_cpuname != NULL)
328 1.10.4.1 fvdl return (vr_cpuname);
329 1.1 takemura
330 1.2 sato cpuid = vrbcu_vrip_getcpuid();
331 1.2 sato vr_cpuname = cpuname[cpuid];
332 1.10.4.1 fvdl
333 1.10.4.1 fvdl return (vr_cpuname);
334 1.1 takemura }
335 1.1 takemura
336 1.2 sato
337 1.1 takemura int
338 1.1 takemura vrbcu_vrip_getcpumajor(void)
339 1.1 takemura {
340 1.1 takemura volatile u_int16_t *revreg;
341 1.2 sato
342 1.2 sato if (vr_major != -1)
343 1.10.4.1 fvdl return (vr_major);
344 1.1 takemura
345 1.10.4.1 fvdl revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1
346 1.10.4.1 fvdl ((VRIP_BCU_ADDR+BCUREVID_REG_W));
347 1.1 takemura
348 1.2 sato vr_major = *revreg;
349 1.2 sato vr_major = (vr_major&BCUREVID_MJREVMASK)>>BCUREVID_MJREVSHFT;
350 1.10.4.1 fvdl
351 1.10.4.1 fvdl return (vr_major);
352 1.1 takemura }
353 1.1 takemura
354 1.1 takemura int
355 1.1 takemura vrbcu_vrip_getcpuminor(void)
356 1.1 takemura {
357 1.1 takemura volatile u_int16_t *revreg;
358 1.2 sato
359 1.2 sato if (vr_minor != -1)
360 1.10.4.1 fvdl return (vr_minor);
361 1.1 takemura
362 1.10.4.1 fvdl revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1
363 1.10.4.1 fvdl ((VRIP_BCU_ADDR+BCUREVID_REG_W));
364 1.1 takemura
365 1.2 sato vr_minor = *revreg;
366 1.2 sato vr_minor = (vr_minor&BCUREVID_MNREVMASK)>>BCUREVID_MNREVSHFT;
367 1.10.4.1 fvdl
368 1.10.4.1 fvdl return (vr_minor);
369 1.1 takemura }
370 1.4 shin
371 1.4 shin #define CLKX 18432000 /* CLKX1,CLKX2: 18.432MHz */
372 1.4 shin #define MHZ 1000000
373 1.4 shin
374 1.4 shin int
375 1.4 shin vrbcu_vrip_getcpuclock(void)
376 1.4 shin {
377 1.4 shin u_int16_t clksp;
378 1.4 shin int cpuid, cpuclock;
379 1.4 shin
380 1.4 shin cpuid = vrbcu_vrip_getcpuid();
381 1.7 sato if (cpuid != BCUREVID_FIXRID_4181 && cpuid >= BCUREVID_RID_4111) {
382 1.10.4.1 fvdl clksp = *(u_int16_t *)MIPS_PHYS_TO_KSEG1
383 1.10.4.1 fvdl ((VRIP_BCU_ADDR+BCUCLKSPEED_REG_W)) &
384 1.10.4.1 fvdl BCUCLKSPEED_CLKSPMASK;
385 1.8 sato } else if (cpuid == BCUREVID_FIXRID_4181) {
386 1.10.4.1 fvdl clksp = *(u_int16_t *)MIPS_PHYS_TO_KSEG1
387 1.10.4.1 fvdl ((VRIP_BCU_ADDR+BCU81CLKSPEED_REG_W)) &
388 1.10.4.1 fvdl BCUCLKSPEED_CLKSPMASK;
389 1.7 sato }
390 1.4 shin
391 1.4 shin switch (cpuid) {
392 1.7 sato case BCUREVID_FIXRID_4181:
393 1.8 sato cpuclock = CLKX / clksp * 64;
394 1.7 sato /* branch delay is 1 clock; 2 clock/loop */
395 1.7 sato cpuspeed = (cpuclock / 2 + MHZ / 2) / MHZ;
396 1.7 sato break;
397 1.4 shin case BCUREVID_RID_4101:
398 1.4 shin /* assume 33MHz */
399 1.4 shin cpuclock = 33000000;
400 1.4 shin /* branch delay is 1 clock; 2 clock/loop */
401 1.4 shin cpuspeed = (cpuclock / 2 + MHZ / 2) / MHZ;
402 1.4 shin break;
403 1.4 shin case BCUREVID_RID_4102:
404 1.4 shin cpuclock = CLKX / clksp * 32;
405 1.4 shin /* branch delay is 1 clock; 2 clock/loop */
406 1.4 shin cpuspeed = (cpuclock / 2 + MHZ / 2) / MHZ;
407 1.4 shin break;
408 1.4 shin case BCUREVID_RID_4111:
409 1.4 shin cpuclock = CLKX / clksp * 64;
410 1.4 shin /* branch delay is 1 clock; 2 clock/loop */
411 1.4 shin cpuspeed = (cpuclock / 2 + MHZ / 2) / MHZ;
412 1.4 shin break;
413 1.4 shin case BCUREVID_RID_4121:
414 1.4 shin cpuclock = CLKX / clksp * 64;
415 1.9 enami /* branch delay is 2 clock; 3 clock/loop */
416 1.9 enami cpuspeed = (cpuclock / 3 + MHZ / 2) / MHZ;
417 1.9 enami break;
418 1.9 enami case BCUREVID_RID_4122:
419 1.9 enami cpuclock = CLKX / clksp * 98;
420 1.4 shin /* branch delay is 2 clock; 3 clock/loop */
421 1.4 shin cpuspeed = (cpuclock / 3 + MHZ / 2) / MHZ;
422 1.4 shin break;
423 1.10.4.1 fvdl case BCUREVID_RID_4131:
424 1.10.4.1 fvdl cpuclock = CLKX / clksp * 98;
425 1.10.4.1 fvdl /* branch delay is 2 clock; 3 clock/loop */
426 1.10.4.1 fvdl cpuspeed = (cpuclock / 3 + MHZ / 2) / MHZ;
427 1.10.4.1 fvdl break;
428 1.4 shin default:
429 1.4 shin panic("unknown CPU type %d\n", cpuid);
430 1.4 shin break;
431 1.4 shin }
432 1.10.4.1 fvdl
433 1.10.4.1 fvdl return (cpuclock);
434 1.4 shin }
435