xref: /csrg-svn/sys/vax/bi/bi.c (revision 45798)
134293Skarels /*
235041Sbostic  * Copyright (c) 1988 Regents of the University of California.
335041Sbostic  * All rights reserved.
434293Skarels  *
535041Sbostic  * This code is derived from software contributed to Berkeley by
635041Sbostic  * Chris Torek.
735041Sbostic  *
844542Sbostic  * %sccs.include.redist.c%
935041Sbostic  *
10*45798Sbostic  *	@(#)bi.c	7.4 (Berkeley) 12/16/90
1135041Sbostic  */
1235041Sbostic 
1335041Sbostic /*
1434293Skarels  * VAXBI specific routines.
1534293Skarels  */
1634293Skarels 
17*45798Sbostic #include "sys/param.h"
18*45798Sbostic #include "../include/cpu.h"
19*45798Sbostic #include "../include/mtpr.h"
2034293Skarels #include "../vax/nexus.h"
2134293Skarels #include "bireg.h"
2234293Skarels 
bi_reset(bi)2334293Skarels bi_reset(bi)
2434293Skarels 	register struct biiregs *bi;
2534293Skarels {
2634293Skarels 
2734293Skarels 	bi->bi_csr |= BICSR_NRST;
2834293Skarels 	DELAY(10000);		/* ??? */
2934293Skarels }
3034293Skarels 
3134293Skarels /*
3234293Skarels  * Reset with self test.  Return true iff reset fails.
3334293Skarels  * BEWARE, THIS RESETS THE BI ARBITRATION LEVEL TO ARB_NONE
3434293Skarels  * does self test ever cause a bi bus error?
3534293Skarels  */
bi_selftest(bi)3634293Skarels bi_selftest(bi)
3734293Skarels 	register struct biiregs *bi;
3834293Skarels {
3934293Skarels 	register int timo;
4034293Skarels 
4134293Skarels 	bi->bi_csr |= BICSR_ARB_NONE;	/* why? */
4234293Skarels 	bi->bi_csr |= BICSR_STS | BICSR_INIT;/* must this be separate? */
4334293Skarels 	DELAY(50);			/* why? */
4434293Skarels 	timo = todr() + 1000;
4534293Skarels 	while (bi->bi_csr & BICSR_BROKE) {
4634293Skarels 		if (todr() > timo)	/* reset failed */
4734293Skarels 			return (-1);
4834293Skarels 	}
4934293Skarels 	return (0);			/* reset OK */
5034293Skarels }
5134293Skarels 
5234293Skarels /*
5334293Skarels  * THIS SHOULD PROBABLY WORK MORE LIKE ubaerror()
5434293Skarels  * (but then we would need to be able to reset BI nodes)
5534293Skarels  * (we need a per-BI-device driver structure!)
5634293Skarels  */
bi_buserr(binum)5734293Skarels bi_buserr(binum)
5834293Skarels 	int binum;
5934293Skarels {
6034293Skarels 	register struct bi_node *bi;
6134293Skarels 	register int node;
6234293Skarels 	extern int bi_nodes;
6334293Skarels 	extern int cold;
6434293Skarels 
6534293Skarels 	printf("vaxbi%d: bus error\n", binum);
6634293Skarels 	bi = (struct bi_node *) &nexus[binum * NNODEBI];/* XXX */
6734293Skarels 	for (node = 0; node < 16; node++, bi++) {
6834293Skarels 		if ((bi_nodes & (1 << node)) == 0)	/* XXX crude */
6934293Skarels 			continue;
7034293Skarels 		printf("node %x: ber=%b\n", node, bi->biic.bi_ber, BIBER_BITS);
7134293Skarels 	}
7234293Skarels 	panic("bi_buserr");
7334293Skarels }
74