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)2334293Skarelsbi_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)3634293Skarelsbi_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)5734293Skarelsbi_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