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 * 12*49334Shibler * from: Utah $Hdr: autoconf.c 1.13 91/01/21$ 1341488Smckusick * 14*49334Shibler * @(#)autoconf.c 7.5 (Berkeley) 05/07/91 1541488Smckusick */ 1641488Smckusick 1741488Smckusick #include "samachdep.h" 1845790Sbostic #include "sys/param.h" 1941488Smckusick 2045790Sbostic #include "../dev/device.h" 2145790Sbostic #include "../dev/grfvar.h" 2241488Smckusick 23*49334Shibler struct hp_hw sc_table[MAXCTLRS]; 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) 58*49334Shibler return(DIOBASE + sc * DIOCSIZE); 59*49334Shibler if (sc >= 132) 60*49334Shibler return(DIOIIBASE + (sc - 132) * DIOIICSIZE); 6141488Smckusick return(sc); 6241488Smckusick } 6341488Smckusick 6441488Smckusick /* 65*49334Shibler * Probe all DIO select codes (0 - 32), the internal display address, 66*49334Shibler * and DIO-II select codes (132 - 256). 6745420Smckusick * 6841488Smckusick * Note that we only care about displays, SCSIs and HP-IBs. 6941488Smckusick */ 7041488Smckusick find_devs() 7141488Smckusick { 72*49334Shibler short sc, sctop; 7341488Smckusick u_char *id_reg; 74*49334Shibler register caddr_t addr; 7541488Smckusick register struct hp_hw *hw; 76*49334Shibler extern int machineid; 7741488Smckusick 7841488Smckusick hw = sc_table; 79*49334Shibler sctop = machineid == HP_320 ? 32 : 256; 80*49334Shibler for (sc = -1; sc < sctop; sc++) { 81*49334Shibler if (sc >= 32 && sc < 132) 82*49334Shibler continue; 83*49334Shibler addr = (caddr_t) sctoaddr(sc); 8441488Smckusick if (badaddr(addr)) 8541488Smckusick continue; 8641488Smckusick 8741488Smckusick id_reg = (u_char *) addr; 88*49334Shibler hw->hw_pa = addr; 89*49334Shibler if (sc >= 132) 90*49334Shibler hw->hw_size = (id_reg[0x101] + 1) * 0x100000; 91*49334Shibler else 92*49334Shibler hw->hw_size = DIOCSIZE; 93*49334Shibler hw->hw_kva = addr; 94*49334Shibler hw->hw_id = id_reg[1]; 9541488Smckusick hw->hw_sc = sc; 9641488Smckusick 9742375Smckusick /* 9842375Smckusick * Not all internal HP-IBs respond rationally to id requests 9942375Smckusick * so we just go by the "internal HPIB" indicator in SYSFLAG. 10042375Smckusick */ 10142375Smckusick if (sc == 7 && internalhpib) { 102*49334Shibler hw->hw_type = C_HPIB; 10342375Smckusick hw++; 10442375Smckusick continue; 10542375Smckusick } 10642375Smckusick 10741488Smckusick switch (hw->hw_id) { 10842375Smckusick case 5: /* 98642A */ 109*49334Shibler case 5+128: /* 98642A remote */ 110*49334Shibler hw->hw_type = D_COMMDCM; 11142375Smckusick break; 11241488Smckusick case 8: /* 98625B */ 11341488Smckusick case 128: /* 98624A */ 114*49334Shibler hw->hw_type = C_HPIB; 11541488Smckusick break; 11641488Smckusick case 57: /* Displays */ 117*49334Shibler hw->hw_type = D_BITMAP; 118*49334Shibler hw->hw_secid = id_reg[0x15]; 119*49334Shibler switch (hw->hw_secid) { 12041488Smckusick case 4: /* renaissance */ 12141488Smckusick case 8: /* davinci */ 12241488Smckusick sc++; /* occupy 2 select codes */ 12341488Smckusick break; 12441488Smckusick } 12541488Smckusick break; 12641488Smckusick case 9: 127*49334Shibler hw->hw_type = D_KEYBOARD; 12841488Smckusick break; 12941488Smckusick case 7: 130*49334Shibler case 7+32: 131*49334Shibler case 7+64: 132*49334Shibler case 7+96: 133*49334Shibler hw->hw_type = C_SCSI; 13441488Smckusick break; 13541488Smckusick default: /* who cares */ 136*49334Shibler hw->hw_type = D_MISC; 13741488Smckusick break; 13841488Smckusick } 13941488Smckusick hw++; 14041488Smckusick } 14141488Smckusick } 142