xref: /csrg-svn/sys/vax/bi/bi.c (revision 34293)
1*34293Skarels /*
2*34293Skarels  *	@(#)bi.c	7.1 (Berkeley) 05/14/88
3*34293Skarels  *
4*34293Skarels  * VAXBI specific routines.
5*34293Skarels  */
6*34293Skarels 
7*34293Skarels #include "param.h"
8*34293Skarels 
9*34293Skarels #include "../vax/cpu.h"
10*34293Skarels #include "../vax/mtpr.h"
11*34293Skarels #include "../vax/nexus.h"
12*34293Skarels 
13*34293Skarels #include "bireg.h"
14*34293Skarels 
15*34293Skarels bi_reset(bi)
16*34293Skarels 	register struct biiregs *bi;
17*34293Skarels {
18*34293Skarels 
19*34293Skarels 	bi->bi_csr |= BICSR_NRST;
20*34293Skarels 	DELAY(10000);		/* ??? */
21*34293Skarels }
22*34293Skarels 
23*34293Skarels /*
24*34293Skarels  * Reset with self test.  Return true iff reset fails.
25*34293Skarels  * BEWARE, THIS RESETS THE BI ARBITRATION LEVEL TO ARB_NONE
26*34293Skarels  * does self test ever cause a bi bus error?
27*34293Skarels  */
28*34293Skarels bi_selftest(bi)
29*34293Skarels 	register struct biiregs *bi;
30*34293Skarels {
31*34293Skarels 	register int timo;
32*34293Skarels 
33*34293Skarels 	bi->bi_csr |= BICSR_ARB_NONE;	/* why? */
34*34293Skarels 	bi->bi_csr |= BICSR_STS | BICSR_INIT;/* must this be separate? */
35*34293Skarels 	DELAY(50);			/* why? */
36*34293Skarels 	timo = todr() + 1000;
37*34293Skarels 	while (bi->bi_csr & BICSR_BROKE) {
38*34293Skarels 		if (todr() > timo)	/* reset failed */
39*34293Skarels 			return (-1);
40*34293Skarels 	}
41*34293Skarels 	return (0);			/* reset OK */
42*34293Skarels }
43*34293Skarels 
44*34293Skarels /*
45*34293Skarels  * THIS SHOULD PROBABLY WORK MORE LIKE ubaerror()
46*34293Skarels  * (but then we would need to be able to reset BI nodes)
47*34293Skarels  * (we need a per-BI-device driver structure!)
48*34293Skarels  */
49*34293Skarels bi_buserr(binum)
50*34293Skarels 	int binum;
51*34293Skarels {
52*34293Skarels 	register struct bi_node *bi;
53*34293Skarels 	register int node;
54*34293Skarels 	extern int bi_nodes;
55*34293Skarels 	extern int cold;
56*34293Skarels 
57*34293Skarels 	printf("vaxbi%d: bus error\n", binum);
58*34293Skarels 	bi = (struct bi_node *) &nexus[binum * NNODEBI];/* XXX */
59*34293Skarels 	for (node = 0; node < 16; node++, bi++) {
60*34293Skarels 		if ((bi_nodes & (1 << node)) == 0)	/* XXX crude */
61*34293Skarels 			continue;
62*34293Skarels 		printf("node %x: ber=%b\n", node, bi->biic.bi_ber, BIBER_BITS);
63*34293Skarels 	}
64*34293Skarels 	panic("bi_buserr");
65*34293Skarels }
66