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*45790Sbostic * @(#)autoconf.c 7.4 (Berkeley) 12/16/90 1541488Smckusick */ 1641488Smckusick 1741488Smckusick #include "samachdep.h" 18*45790Sbostic #include "sys/param.h" 1941488Smckusick 20*45790Sbostic #include "../dev/device.h" 21*45790Sbostic #include "../dev/grfvar.h" 2241488Smckusick 2341488Smckusick struct hp_hw sc_table[MAX_CTLR]; 2441488Smckusick 2542375Smckusick extern int internalhpib; 2642375Smckusick 2742375Smckusick #if 0 2842375Smckusick #include "rominfo.h" 2942375Smckusick printrominfo() 3042375Smckusick { 3142375Smckusick struct rominfo *rp = (struct rominfo *)ROMADDR; 3242375Smckusick printf("boottype %x, name %s, lowram %x, sysflag %x\n", 3342375Smckusick rp->boottype, rp->name, rp->lowram, rp->sysflag&0xff); 3442375Smckusick printf("rambase %x, ndrives %x, sysflag2 %x, msus %x\n", 3542375Smckusick rp->rambase, rp->ndrives, rp->sysflag2&0xff, rp->msus); 3642375Smckusick } 3742375Smckusick #endif 3842375Smckusick 3941488Smckusick configure() 4041488Smckusick { 4141488Smckusick find_devs(); 4241488Smckusick cninit(); 4342375Smckusick #if 0 4442375Smckusick printrominfo(); 4542375Smckusick #endif 4641488Smckusick hpibinit(); 4741488Smckusick scsiinit(); 4841488Smckusick } 4941488Smckusick 5041488Smckusick sctoaddr(sc) 5141488Smckusick int sc; 5241488Smckusick { 5341488Smckusick if (sc == -1) 5441488Smckusick return(GRFIADDR); 5542375Smckusick if (sc == 7 && internalhpib) 5641488Smckusick return(internalhpib); 5741488Smckusick if (sc < 32) 5841488Smckusick return(0x600000+(0x10000*sc)); 5945420Smckusick if (sc >= 132 && sc < 134) 6045420Smckusick return(0x1000000+((sc-132)*0x400000)); 6141488Smckusick return(sc); 6241488Smckusick } 6341488Smckusick 6441488Smckusick /* 6545420Smckusick * Probe all DIO select codes (0 - 32), the internal display address,. 6645420Smckusick * and DIO-II select codes 132 (hack) and 133 (hack). 6745420Smckusick * 6841488Smckusick * Note that we only care about displays, SCSIs and HP-IBs. 6941488Smckusick */ 7041488Smckusick find_devs() 7141488Smckusick { 7241488Smckusick u_char *id_reg; 7341488Smckusick register short sc; 7441488Smckusick register int addr; 7541488Smckusick register struct hp_hw *hw; 7641488Smckusick 7741488Smckusick hw = sc_table; 7845420Smckusick for (sc = -1; sc < 32; sc++) { 7941488Smckusick addr = sctoaddr(sc); 8041488Smckusick if (badaddr(addr)) 8141488Smckusick continue; 8241488Smckusick 8341488Smckusick id_reg = (u_char *) addr; 8441488Smckusick hw->hw_addr = (char *) addr; 8541488Smckusick hw->hw_id = id_reg[1] & 0xff; 8641488Smckusick hw->hw_sc = sc; 8741488Smckusick 8842375Smckusick /* 8942375Smckusick * Not all internal HP-IBs respond rationally to id requests 9042375Smckusick * so we just go by the "internal HPIB" indicator in SYSFLAG. 9142375Smckusick */ 9242375Smckusick if (sc == 7 && internalhpib) { 9342375Smckusick hw->hw_type = HPIB; 9442375Smckusick hw++; 9542375Smckusick continue; 9642375Smckusick } 9742375Smckusick 9841488Smckusick switch (hw->hw_id) { 9942375Smckusick case 5: /* 98642A */ 10042375Smckusick case 128+5: /* 98642A remote */ 10142375Smckusick hw->hw_type = COMMDCM; 10242375Smckusick break; 10341488Smckusick case 8: /* 98625B */ 10441488Smckusick case 128: /* 98624A */ 10541488Smckusick hw->hw_type = HPIB; 10641488Smckusick break; 10741488Smckusick case 57: /* Displays */ 10841488Smckusick hw->hw_type = BITMAP; 10941488Smckusick hw->hw_id2 = id_reg[0x15]; 11041488Smckusick switch (hw->hw_id2) { 11141488Smckusick case 4: /* renaissance */ 11241488Smckusick case 8: /* davinci */ 11341488Smckusick sc++; /* occupy 2 select codes */ 11441488Smckusick break; 11541488Smckusick } 11641488Smckusick break; 11741488Smckusick case 9: 11841488Smckusick hw->hw_type = KEYBOARD; 11941488Smckusick break; 12041488Smckusick case 7: 12141488Smckusick case 39: 12241488Smckusick case 71: 12341488Smckusick case 103: 12441488Smckusick hw->hw_type = SCSI; 12541488Smckusick break; 12641488Smckusick default: /* who cares */ 12741488Smckusick hw->hw_type = MISC; 12841488Smckusick break; 12941488Smckusick } 13041488Smckusick hw++; 13141488Smckusick } 13245420Smckusick /* 13345420Smckusick * Look for displays in DIO-II space 13445420Smckusick */ 13545420Smckusick for (sc = 132; sc < 134; sc++) { 13645420Smckusick addr = sctoaddr(sc); 13745420Smckusick if (badaddr(addr)) 13845420Smckusick continue; 13945420Smckusick 14045420Smckusick id_reg = (u_char *) addr; 14145420Smckusick hw->hw_addr = (char *) addr; 14245420Smckusick hw->hw_id = id_reg[1] & 0xff; 14345420Smckusick hw->hw_sc = sc; 14445420Smckusick 14545420Smckusick switch (hw->hw_id) { 14645420Smckusick case 57: /* Displays */ 14745420Smckusick hw->hw_type = BITMAP; 14845420Smckusick hw->hw_id2 = id_reg[0x15]; 14945420Smckusick switch (hw->hw_id2) { 15045420Smckusick case 4: /* renaissance */ 15145420Smckusick case 8: /* davinci */ 15245420Smckusick sc++; /* occupy 2 select codes */ 15345420Smckusick break; 15445420Smckusick } 15545420Smckusick break; 15645420Smckusick default: /* who cares */ 15745420Smckusick hw->hw_type = MISC; 15845420Smckusick break; 15945420Smckusick } 16045420Smckusick hw++; 16145420Smckusick } 16241488Smckusick } 163