Annotation of sys/arch/vax/vax/ka750.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: ka750.c,v 1.10 2003/06/02 23:27:59 millert Exp $ */
2: /* $NetBSD: ka750.c,v 1.30 1999/08/14 11:30:48 ragge Exp $ */
3: /*
4: * Copyright (c) 1982, 1986, 1988 The Regents of the University of California.
5: * Copyright (c) 1994 Ludd, University of Lule}, Sweden.
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. Neither the name of the University nor the names of its contributors
17: * may be used to endorse or promote products derived from this software
18: * without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30: * SUCH DAMAGE.
31: *
32: * @(#)ka750.c 7.4 (Berkeley) 5/9/91
33: * @(#)autoconf.c 7.20 (Berkeley) 5/9/91
34: */
35:
36: #include <sys/param.h>
37: #include <sys/device.h>
38: #include <sys/systm.h>
39:
40: #include <machine/ka750.h>
41: #include <machine/mtpr.h>
42: #include <machine/cpu.h>
43: #include <machine/clock.h>
44: #include <machine/sid.h>
45:
46: #include <vax/vax/gencons.h>
47:
48: void ctuattach(void);
49: static void ka750_clrf(void);
50: static void ka750_conf(void);
51: static void ka750_memerr(void);
52: static int ka750_mchk(caddr_t);
53:
54:
55: struct cpu_dep ka750_calls = {
56: 0,
57: ka750_mchk,
58: ka750_memerr,
59: ka750_conf,
60: generic_clkread,
61: generic_clkwrite,
62: 1, /* ~VUPS */
63: 4, /* SCB pages */
64: 0, /* halt call */
65: 0, /* Reboot call */
66: ka750_clrf,
67: };
68:
69: static caddr_t mcraddr[4]; /* XXX */
70:
71: void
72: ka750_conf()
73: {
74: printf("cpu0: KA750, hardware rev %d, ucode rev %d, ",
75: V750HARDW(vax_cpudata), V750UCODE(vax_cpudata));
76: if (mfpr(PR_ACCS) & 255) {
77: printf("FPA present, enabling.\n");
78: mtpr(0x8000, PR_ACCS);
79: } else
80: printf("no FPA\n");
81:
82: if (mfpr(PR_TODR) == 0) { /* Check for failing battery */
83: mtpr(1, PR_TODR);
84: printf("WARNING: TODR battery broken\n");
85: }
86:
87: /* Call ctuattach() here so it can setup its vectors. */
88: ctuattach();
89: }
90:
91: int ka750_memmatch(struct device *, struct cfdata *, void *);
92: void ka750_memenable(struct device *, struct device *, void *);
93:
94: struct cfattach mem_cmi_ca = {
95: sizeof(struct device), ka750_memmatch, ka750_memenable
96: };
97:
98: int
99: ka750_memmatch(parent, cf, aux)
100: struct device *parent;
101: struct cfdata *cf;
102: void *aux;
103: {
104: struct sbi_attach_args *sa = (struct sbi_attach_args *)aux;
105:
106: if (cf->cf_loc[CMICF_TR] != sa->nexnum && cf->cf_loc[CMICF_TR] > -1)
107: return 0;
108:
109: if (sa->type != NEX_MEM16)
110: return 0;
111:
112: return 1;
113: }
114:
115: struct mcr750 {
116: int mc_err; /* error bits */
117: int mc_inh; /* inhibit crd */
118: int mc_inf; /* info bits */
119: };
120:
121: #define M750_ICRD 0x10000000 /* inhibit crd interrupts, in [1] */
122: #define M750_UNCORR 0xc0000000 /* uncorrectable error, in [0] */
123: #define M750_CORERR 0x20000000 /* correctable error, in [0] */
124:
125: #define M750_INH(mcr) ((mcr)->mc_inh = 0)
126: #define M750_ENA(mcr) ((mcr)->mc_err = (M750_UNCORR|M750_CORERR), \
127: (mcr)->mc_inh = M750_ICRD)
128: #define M750_ERR(mcr) ((mcr)->mc_err & (M750_UNCORR|M750_CORERR))
129:
130: #define M750_SYN(err) ((err) & 0x7f)
131: #define M750_ADDR(err) (((err) >> 9) & 0x7fff)
132:
133: /* enable crd interrupts */
134: void
135: ka750_memenable(parent, self, aux)
136: struct device *parent, *self;
137: void *aux;
138: {
139: struct sbi_attach_args *sa = (struct sbi_attach_args *)aux;
140: struct mcr750 *mcr = (struct mcr750 *)sa->nexaddr;
141: int k, l, m, cardinfo;
142:
143: mcraddr[self->dv_unit] = (caddr_t)sa->nexaddr;
144:
145: /* We will use this info for error reporting - later! */
146: cardinfo = mcr->mc_inf;
147: switch ((cardinfo >> 24) & 3) {
148: case 0: printf(": L0011 ");
149: break;
150:
151: case 1: printf(": L0016 ");
152: m = cardinfo & 0xaaaa;
153: for (k = l = 0; k < 16; k++){
154: if (m & 1)
155: l++;
156: m >>= 1;
157: }
158: printf("with %d M8750",l);
159: break;
160:
161: case 3: printf(": L0022 ");
162: m = cardinfo & 0x5555;
163: for (k = l = 0; k < 16; k++) {
164: if (m & 1)
165: l++;
166: m>>=1;
167: }
168: printf("with %d M7199",l);
169: m = cardinfo & 0xaaaa;
170: if (m) {
171: for (k = l = 0; k < 16; k++) {
172: if (m & 1)
173: l++;
174: m >>= 1;
175: }
176: printf(" and %d M8750",l);
177: }
178: break;
179: }
180: printf("\n");
181:
182:
183: M750_ENA((struct mcr750 *)mcraddr[0]);
184: }
185:
186: /* log crd errors */
187: void
188: ka750_memerr()
189: {
190: register struct mcr750 *mcr = (struct mcr750 *)mcraddr[0];
191: register int err;
192:
193: if (M750_ERR(mcr)) {
194: err = mcr->mc_err; /* careful with i/o space refs */
195: printf("mcr0: %s", err & M750_UNCORR ?
196: "hard error" : "soft ecc");
197: printf(" addr %x syn %x\n", M750_ADDR(err), M750_SYN(err));
198: M750_INH(mcr);
199: }
200: }
201:
202: char *mc750[]={"0","1","2","3","4","5","6","7","8","9","10","11","12","13",
203: "14","15"};
204:
205: struct mc750frame {
206: int mc5_bcnt; /* byte count == 0x28 */
207: int mc5_summary; /* summary parameter (as above) */
208: int mc5_va; /* virtual address register */
209: int mc5_errpc; /* error pc */
210: int mc5_mdr;
211: int mc5_svmode; /* saved mode register */
212: int mc5_rdtimo; /* read lock timeout */
213: int mc5_tbgpar; /* tb group parity error register */
214: int mc5_cacherr; /* cache error register */
215: int mc5_buserr; /* bus error register */
216: int mc5_mcesr; /* machine check status register */
217: int mc5_pc; /* trapped pc */
218: int mc5_psl; /* trapped psl */
219: };
220:
221: #define MC750_TBERR 2 /* type code of cp tbuf par */
222: #define MC750_TBPAR 4 /* tbuf par bit in mcesr */
223:
224: int
225: ka750_mchk(cmcf)
226: caddr_t cmcf;
227: {
228: register struct mc750frame *mcf = (struct mc750frame *)cmcf;
229: register int type = mcf->mc5_summary;
230: int mcsr = mfpr(PR_MCSR);
231:
232: printf("machine check %x: %s%s\n", type, mc750[type&0xf],
233: (type&0xf0) ? " abort" : " fault");
234: printf(
235: "\tva %x errpc %x mdr %x smr %x rdtimo %x tbgpar %x cacherr %x\n",
236: mcf->mc5_va, mcf->mc5_errpc, mcf->mc5_mdr, mcf->mc5_svmode,
237: mcf->mc5_rdtimo, mcf->mc5_tbgpar, mcf->mc5_cacherr);
238: printf("\tbuserr %x mcesr %x pc %x psl %x mcsr %x\n",
239: mcf->mc5_buserr, mcf->mc5_mcesr, mcf->mc5_pc, mcf->mc5_psl,
240: mcsr);
241: mtpr(0, PR_TBIA);
242: mtpr(0xf, PR_MCESR);
243: if (type == MC750_TBERR && (mcf->mc5_mcesr&0xe) == MC750_TBPAR) {
244: printf("tbuf par: flushing and returning\n");
245: return (MCHK_RECOVERED);
246: }
247: return (MCHK_PANIC);
248: }
249:
250: void
251: ka750_clrf()
252: {
253: int s = splhigh();
254:
255: #define WAIT while ((mfpr(PR_TXCS) & GC_RDY) == 0) ;
256:
257: WAIT;
258:
259: mtpr(GC_CWFL|GC_CONS, PR_TXDB);
260:
261: WAIT;
262: mtpr(GC_CCFL|GC_CONS, PR_TXDB);
263:
264: WAIT;
265: splx(s);
266: }
CVSweb