bcu_vrip.c revision 1.2 1 /* $NetBSD: bcu_vrip.c,v 1.2 1999/12/09 02:14:00 sato Exp $ */
2
3 /*-
4 * Copyright (c) 1999 SATO Kazumi. All rights reserved.
5 * Copyright (c) 1999 PocketBSD Project. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the PocketBSD project
18 * and its contributors.
19 * 4. Neither the name of the project nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 */
36
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/device.h>
40 #include <sys/reboot.h>
41
42 #include <machine/bus.h>
43
44 #include <mips/cpuregs.h>
45
46 #include <hpcmips/vr/vr.h>
47 #include <hpcmips/vr/vripvar.h>
48 #include <hpcmips/vr/vripreg.h>
49 #include <hpcmips/vr/bcureg.h>
50 #include <hpcmips/vr/bcuvar.h>
51
52 struct vrbcu_vrip_softc {
53 struct vrbcu_softc sc_vrbcu;
54 };
55
56 /* Definition of the mainbus driver. */
57 static int vrbcu_vrip_match __P((struct device *,
58 struct cfdata *, void *));
59 static void vrbcu_vrip_attach __P((struct device *,
60
61 struct device *, void*));
62
63 char *vr_cpuname=NULL;
64 int vr_major=-1;
65 int vr_minor=-1;
66 int vr_cpuid=-1;
67
68 struct cfattach vrbcu_ca = {
69 sizeof(struct vrbcu_vrip_softc), vrbcu_vrip_match, vrbcu_vrip_attach
70 };
71
72 static int
73 vrbcu_vrip_match(parent, cf, aux)
74 struct device *parent;
75 struct cfdata *cf;
76 void *aux;
77 {
78 return 2;
79 }
80
81 static void
82 vrbcu_vrip_attach(parent, self, aux)
83 struct device *parent;
84 struct device *self;
85 void *aux;
86 {
87 struct vrip_attach_args *va = aux;
88 struct vrbcu_vrip_softc *sc = (struct vrbcu_vrip_softc *)self;
89
90 sc->sc_vrbcu.sc_iot = va->va_iot;
91 bus_space_map(sc->sc_vrbcu.sc_iot, va->va_addr, va->va_size,
92 0, /* no flags */
93 &sc->sc_vrbcu.sc_ioh);
94
95 printf("\n");
96 }
97
98 static char *cpuname[] = {
99 "VR4101",
100 "VR4102",
101 "VR4111",
102 "VR4121",
103 "UNKNOWN",
104 "UNKNOWN",
105 "UNKNOWN",
106 "UNKNOWN" };
107
108 int
109 vrbcu_vrip_getcpuid(void)
110 {
111 volatile u_int16_t *revreg;
112
113 if (vr_cpuid != -1)
114 return vr_cpuid;
115
116 if (vr_cpuid == -1) {
117 revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1((VRIP_BCU_ADDR+BCUREVID_REG_W));
118
119 vr_cpuid = *revreg;
120 vr_cpuid = (vr_cpuid&BCUREVID_RIDMASK)>>BCUREVID_RIDSHFT;
121 }
122 return vr_cpuid;
123 }
124
125 char *
126 vrbcu_vrip_getcpuname(void)
127 {
128 int cpuid;
129
130 if (vr_cpuname != NULL)
131 return vr_cpuname;
132
133 cpuid = vrbcu_vrip_getcpuid();
134 vr_cpuname = cpuname[cpuid];
135 return vr_cpuname;
136 }
137
138
139 int
140 vrbcu_vrip_getcpumajor(void)
141 {
142 volatile u_int16_t *revreg;
143
144 if (vr_major != -1)
145 return vr_major;
146
147 revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1((VRIP_BCU_ADDR+BCUREVID_REG_W));
148
149 vr_major = *revreg;
150 vr_major = (vr_major&BCUREVID_MJREVMASK)>>BCUREVID_MJREVSHFT;
151 return vr_major;
152 }
153
154 int
155 vrbcu_vrip_getcpuminor(void)
156 {
157 volatile u_int16_t *revreg;
158
159 if (vr_minor != -1)
160 return vr_minor;
161
162 revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1((VRIP_BCU_ADDR+BCUREVID_REG_W));
163
164 vr_minor = *revreg;
165 vr_minor = (vr_minor&BCUREVID_MNREVMASK)>>BCUREVID_MNREVSHFT;
166 return vr_minor;
167 }
168