141488Smckusick /* 241488Smckusick * Copyright (c) 1988 University of Utah. 341488Smckusick * Copyright (c) 1990 The Regents of the University of California. 441488Smckusick * All rights reserved. 541488Smckusick * 641488Smckusick * This code is derived from software contributed to Berkeley by 741488Smckusick * the Systems Programming Group of the University of Utah Computer 841488Smckusick * Science Department. 941488Smckusick * 1041488Smckusick * %sccs.include.redist.c% 1141488Smckusick * 1241488Smckusick * from: Utah $Hdr: autoconf.c 1.9 89/10/07$ 1341488Smckusick * 14*42375Smckusick * @(#)autoconf.c 7.2 (Berkeley) 05/25/90 1541488Smckusick */ 1641488Smckusick 1741488Smckusick #include "samachdep.h" 1841488Smckusick #include "param.h" 1941488Smckusick 2041488Smckusick #include "../hpdev/device.h" 2141488Smckusick #include "../hpdev/grfvar.h" 2241488Smckusick 2341488Smckusick struct hp_hw sc_table[MAX_CTLR]; 2441488Smckusick 25*42375Smckusick extern int internalhpib; 26*42375Smckusick 27*42375Smckusick #if 0 28*42375Smckusick #include "rominfo.h" 29*42375Smckusick printrominfo() 30*42375Smckusick { 31*42375Smckusick struct rominfo *rp = (struct rominfo *)ROMADDR; 32*42375Smckusick printf("boottype %x, name %s, lowram %x, sysflag %x\n", 33*42375Smckusick rp->boottype, rp->name, rp->lowram, rp->sysflag&0xff); 34*42375Smckusick printf("rambase %x, ndrives %x, sysflag2 %x, msus %x\n", 35*42375Smckusick rp->rambase, rp->ndrives, rp->sysflag2&0xff, rp->msus); 36*42375Smckusick } 37*42375Smckusick #endif 38*42375Smckusick 3941488Smckusick configure() 4041488Smckusick { 4141488Smckusick find_devs(); 4241488Smckusick cninit(); 43*42375Smckusick #if 0 44*42375Smckusick printrominfo(); 45*42375Smckusick #endif 4641488Smckusick hpibinit(); 4741488Smckusick scsiinit(); 4841488Smckusick } 4941488Smckusick 5041488Smckusick sctoaddr(sc) 5141488Smckusick int sc; 5241488Smckusick { 5341488Smckusick if (sc == -2) 5441488Smckusick return(0x1000000); 5541488Smckusick if (sc == -1) 5641488Smckusick return(GRFIADDR); 57*42375Smckusick if (sc == 7 && internalhpib) 5841488Smckusick return(internalhpib); 5941488Smckusick if (sc < 32) 6041488Smckusick return(0x600000+(0x10000*sc)); 6141488Smckusick return(sc); 6241488Smckusick } 6341488Smckusick 6441488Smckusick /* 6541488Smckusick * Probe all select codes (0 - 32) and internal display address. 6641488Smckusick * Note that we only care about displays, SCSIs and HP-IBs. 6741488Smckusick */ 6841488Smckusick find_devs() 6941488Smckusick { 7041488Smckusick u_char *id_reg; 7141488Smckusick register short sc; 7241488Smckusick register int addr; 7341488Smckusick register struct hp_hw *hw; 7441488Smckusick 7541488Smckusick hw = sc_table; 7641488Smckusick for (sc = -2; sc < 32; sc++) { 7741488Smckusick addr = sctoaddr(sc); 7841488Smckusick if (badaddr(addr)) 7941488Smckusick continue; 8041488Smckusick 8141488Smckusick id_reg = (u_char *) addr; 8241488Smckusick hw->hw_addr = (char *) addr; 8341488Smckusick hw->hw_id = id_reg[1] & 0xff; 8441488Smckusick hw->hw_sc = sc; 8541488Smckusick 86*42375Smckusick /* 87*42375Smckusick * Not all internal HP-IBs respond rationally to id requests 88*42375Smckusick * so we just go by the "internal HPIB" indicator in SYSFLAG. 89*42375Smckusick */ 90*42375Smckusick if (sc == 7 && internalhpib) { 91*42375Smckusick hw->hw_type = HPIB; 92*42375Smckusick hw++; 93*42375Smckusick continue; 94*42375Smckusick } 95*42375Smckusick 9641488Smckusick switch (hw->hw_id) { 97*42375Smckusick case 5: /* 98642A */ 98*42375Smckusick case 128+5: /* 98642A remote */ 99*42375Smckusick hw->hw_type = COMMDCM; 100*42375Smckusick break; 10141488Smckusick case 8: /* 98625B */ 10241488Smckusick case 128: /* 98624A */ 10341488Smckusick hw->hw_type = HPIB; 10441488Smckusick break; 10541488Smckusick case 57: /* Displays */ 10641488Smckusick hw->hw_type = BITMAP; 10741488Smckusick hw->hw_id2 = id_reg[0x15]; 10841488Smckusick switch (hw->hw_id2) { 10941488Smckusick case 4: /* renaissance */ 11041488Smckusick case 8: /* davinci */ 11141488Smckusick sc++; /* occupy 2 select codes */ 11241488Smckusick break; 11341488Smckusick } 11441488Smckusick break; 11541488Smckusick case 9: 11641488Smckusick hw->hw_type = KEYBOARD; 11741488Smckusick break; 11841488Smckusick case 7: 11941488Smckusick case 39: 12041488Smckusick case 71: 12141488Smckusick case 103: 12241488Smckusick hw->hw_type = SCSI; 12341488Smckusick break; 12441488Smckusick default: /* who cares */ 12541488Smckusick hw->hw_type = MISC; 12641488Smckusick break; 12741488Smckusick } 12841488Smckusick hw++; 12941488Smckusick } 13041488Smckusick } 131