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*54073Shibler * from: Utah $Hdr: autoconf.c 1.16 92/05/29$ 1341488Smckusick * 14*54073Shibler * @(#)autoconf.c 7.6 (Berkeley) 06/18/92 1541488Smckusick */ 1641488Smckusick 1741488Smckusick #include "samachdep.h" 18*54073Shibler #include "rominfo.h" 1945790Sbostic #include "sys/param.h" 20*54073Shibler #include "sys/reboot.h" 2141488Smckusick 22*54073Shibler #include "hp/dev/device.h" 23*54073Shibler #include "hp/dev/grfreg.h" 2441488Smckusick 25*54073Shibler /* 26*54073Shibler * Mapping of ROM MSUS types to BSD major device numbers 27*54073Shibler * WARNING: major numbers must match bdevsw indices in hp300/conf.c. 28*54073Shibler */ 29*54073Shibler char rom2mdev[] = { 30*54073Shibler 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0-13: none */ 31*54073Shibler 4, /* 14: SCSI disk */ 32*54073Shibler 0, /* 15: none */ 33*54073Shibler 2, /* 16: CS/80 device on HPIB */ 34*54073Shibler 2, /* 17: CS/80 device on HPIB */ 35*54073Shibler 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 18-31: none */ 36*54073Shibler }; 37*54073Shibler 3849334Shibler struct hp_hw sc_table[MAXCTLRS]; 39*54073Shibler int cpuspeed; 4041488Smckusick 4142375Smckusick extern int internalhpib; 4242375Smckusick 4342375Smckusick #if 0 4442375Smckusick printrominfo() 4542375Smckusick { 4642375Smckusick struct rominfo *rp = (struct rominfo *)ROMADDR; 47*54073Shibler 4842375Smckusick printf("boottype %x, name %s, lowram %x, sysflag %x\n", 4942375Smckusick rp->boottype, rp->name, rp->lowram, rp->sysflag&0xff); 5042375Smckusick printf("rambase %x, ndrives %x, sysflag2 %x, msus %x\n", 5142375Smckusick rp->rambase, rp->ndrives, rp->sysflag2&0xff, rp->msus); 5242375Smckusick } 5342375Smckusick #endif 5442375Smckusick 5541488Smckusick configure() 5641488Smckusick { 57*54073Shibler u_long msustobdev(); 58*54073Shibler 59*54073Shibler switch (machineid) { 60*54073Shibler case HP_320: 61*54073Shibler case HP_330: 62*54073Shibler case HP_340: 63*54073Shibler cpuspeed = MHZ_16; 64*54073Shibler break; 65*54073Shibler case HP_350: 66*54073Shibler case HP_360: 67*54073Shibler cpuspeed = MHZ_25; 68*54073Shibler break; 69*54073Shibler case HP_370: 70*54073Shibler cpuspeed = MHZ_33; 71*54073Shibler break; 72*54073Shibler case HP_375: 73*54073Shibler cpuspeed = MHZ_50; 74*54073Shibler break; 75*54073Shibler case HP_380: 76*54073Shibler cpuspeed = MHZ_25 * 2; /* XXX */ 77*54073Shibler break; 78*54073Shibler default: /* assume the slowest */ 79*54073Shibler cpuspeed = MHZ_16; 80*54073Shibler break; 81*54073Shibler } 8241488Smckusick find_devs(); 8341488Smckusick cninit(); 8442375Smckusick #if 0 8542375Smckusick printrominfo(); 8642375Smckusick #endif 8741488Smckusick hpibinit(); 8841488Smckusick scsiinit(); 89*54073Shibler if ((bootdev & B_MAGICMASK) != B_DEVMAGIC) 90*54073Shibler bootdev = msustobdev(); 9141488Smckusick } 9241488Smckusick 93*54073Shibler /* 94*54073Shibler * Convert HP MSUS to a valid bootdev layout: 95*54073Shibler * TYPE comes from MSUS device type as mapped by rom2mdev 96*54073Shibler * PARTITION is set to 0 ('a') 97*54073Shibler * UNIT comes from MSUS unit (almost always 0) 98*54073Shibler * CONTROLLER comes from MSUS primary address 99*54073Shibler * ADAPTOR comes from SCSI/HPIB driver logical unit number 100*54073Shibler * (passed back via unused hw_pa field) 101*54073Shibler */ 102*54073Shibler u_long 103*54073Shibler msustobdev() 104*54073Shibler { 105*54073Shibler struct rominfo *rp = (struct rominfo *) ROMADDR; 106*54073Shibler u_long bdev = 0; 107*54073Shibler register struct hp_hw *hw; 108*54073Shibler int sc; 109*54073Shibler 110*54073Shibler sc = (rp->msus >> 8) & 0xFF; 111*54073Shibler for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) 112*54073Shibler if (hw->hw_sc == sc) 113*54073Shibler break; 114*54073Shibler bdev |= rom2mdev[(rp->msus >> 24) & 0x1F] << B_TYPESHIFT; 115*54073Shibler bdev |= 0 << B_PARTITIONSHIFT; 116*54073Shibler bdev |= ((rp->msus >> 16) & 0xFF) << B_UNITSHIFT; 117*54073Shibler bdev |= (rp->msus & 0xFF) << B_CONTROLLERSHIFT; 118*54073Shibler bdev |= (int)hw->hw_pa << B_ADAPTORSHIFT; 119*54073Shibler bdev |= B_DEVMAGIC; 120*54073Shibler #if 0 121*54073Shibler printf("msus %x -> bdev %x\n", rp->msus, bdev); 122*54073Shibler #endif 123*54073Shibler return (bdev); 124*54073Shibler } 125*54073Shibler 12641488Smckusick sctoaddr(sc) 12741488Smckusick int sc; 12841488Smckusick { 12941488Smckusick if (sc == -1) 13041488Smckusick return(GRFIADDR); 13142375Smckusick if (sc == 7 && internalhpib) 13241488Smckusick return(internalhpib); 13341488Smckusick if (sc < 32) 13449334Shibler return(DIOBASE + sc * DIOCSIZE); 13549334Shibler if (sc >= 132) 13649334Shibler return(DIOIIBASE + (sc - 132) * DIOIICSIZE); 13741488Smckusick return(sc); 13841488Smckusick } 13941488Smckusick 14041488Smckusick /* 14149334Shibler * Probe all DIO select codes (0 - 32), the internal display address, 14249334Shibler * and DIO-II select codes (132 - 256). 14345420Smckusick * 14441488Smckusick * Note that we only care about displays, SCSIs and HP-IBs. 14541488Smckusick */ 14641488Smckusick find_devs() 14741488Smckusick { 14849334Shibler short sc, sctop; 14941488Smckusick u_char *id_reg; 15049334Shibler register caddr_t addr; 15141488Smckusick register struct hp_hw *hw; 15241488Smckusick 15341488Smckusick hw = sc_table; 15449334Shibler sctop = machineid == HP_320 ? 32 : 256; 15549334Shibler for (sc = -1; sc < sctop; sc++) { 15649334Shibler if (sc >= 32 && sc < 132) 15749334Shibler continue; 15849334Shibler addr = (caddr_t) sctoaddr(sc); 15941488Smckusick if (badaddr(addr)) 16041488Smckusick continue; 16141488Smckusick 16241488Smckusick id_reg = (u_char *) addr; 163*54073Shibler hw->hw_pa = 0; /* XXX used to pass back LUN from driver */ 16449334Shibler if (sc >= 132) 16549334Shibler hw->hw_size = (id_reg[0x101] + 1) * 0x100000; 16649334Shibler else 16749334Shibler hw->hw_size = DIOCSIZE; 16849334Shibler hw->hw_kva = addr; 16949334Shibler hw->hw_id = id_reg[1]; 17041488Smckusick hw->hw_sc = sc; 17141488Smckusick 17242375Smckusick /* 17342375Smckusick * Not all internal HP-IBs respond rationally to id requests 17442375Smckusick * so we just go by the "internal HPIB" indicator in SYSFLAG. 17542375Smckusick */ 17642375Smckusick if (sc == 7 && internalhpib) { 17749334Shibler hw->hw_type = C_HPIB; 17842375Smckusick hw++; 17942375Smckusick continue; 18042375Smckusick } 18142375Smckusick 18241488Smckusick switch (hw->hw_id) { 18342375Smckusick case 5: /* 98642A */ 18449334Shibler case 5+128: /* 98642A remote */ 18549334Shibler hw->hw_type = D_COMMDCM; 18642375Smckusick break; 18741488Smckusick case 8: /* 98625B */ 18841488Smckusick case 128: /* 98624A */ 18949334Shibler hw->hw_type = C_HPIB; 19041488Smckusick break; 19141488Smckusick case 57: /* Displays */ 19249334Shibler hw->hw_type = D_BITMAP; 19349334Shibler hw->hw_secid = id_reg[0x15]; 19449334Shibler switch (hw->hw_secid) { 19541488Smckusick case 4: /* renaissance */ 19641488Smckusick case 8: /* davinci */ 19741488Smckusick sc++; /* occupy 2 select codes */ 19841488Smckusick break; 19941488Smckusick } 20041488Smckusick break; 20141488Smckusick case 9: 20249334Shibler hw->hw_type = D_KEYBOARD; 20341488Smckusick break; 20441488Smckusick case 7: 20549334Shibler case 7+32: 20649334Shibler case 7+64: 20749334Shibler case 7+96: 20849334Shibler hw->hw_type = C_SCSI; 20941488Smckusick break; 21041488Smckusick default: /* who cares */ 21149334Shibler hw->hw_type = D_MISC; 21241488Smckusick break; 21341488Smckusick } 21441488Smckusick hw++; 21541488Smckusick } 21641488Smckusick } 217