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 * 1254073Shibler * from: Utah $Hdr: autoconf.c 1.16 92/05/29$ 1341488Smckusick * 14*57299Shibler * @(#)autoconf.c 7.8 (Berkeley) 12/26/92 1541488Smckusick */ 1641488Smckusick 1756510Sbostic #include <hp300/stand/samachdep.h> 1856510Sbostic #include <hp300/stand/rominfo.h> 1956510Sbostic #include <sys/param.h> 2056510Sbostic #include <sys/reboot.h> 2141488Smckusick 2256510Sbostic #include <hp/dev/device.h> 2356510Sbostic #include <hp/dev/grfreg.h> 2441488Smckusick 2554073Shibler /* 2654073Shibler * Mapping of ROM MSUS types to BSD major device numbers 2754073Shibler * WARNING: major numbers must match bdevsw indices in hp300/conf.c. 2854073Shibler */ 2954073Shibler char rom2mdev[] = { 3054073Shibler 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0-13: none */ 3154073Shibler 4, /* 14: SCSI disk */ 3254073Shibler 0, /* 15: none */ 3354073Shibler 2, /* 16: CS/80 device on HPIB */ 3454073Shibler 2, /* 17: CS/80 device on HPIB */ 3554073Shibler 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 18-31: none */ 3654073Shibler }; 3754073Shibler 3849334Shibler struct hp_hw sc_table[MAXCTLRS]; 3954073Shibler int cpuspeed; 4041488Smckusick 4142375Smckusick extern int internalhpib; 4242375Smckusick 4342375Smckusick #if 0 4442375Smckusick printrominfo() 4542375Smckusick { 4642375Smckusick struct rominfo *rp = (struct rominfo *)ROMADDR; 4754073Shibler 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 { 5754073Shibler u_long msustobdev(); 5854073Shibler 5954073Shibler switch (machineid) { 6054073Shibler case HP_320: 6154073Shibler case HP_330: 6254073Shibler case HP_340: 6354073Shibler cpuspeed = MHZ_16; 6454073Shibler break; 6554073Shibler case HP_350: 6654073Shibler case HP_360: 6754073Shibler cpuspeed = MHZ_25; 6854073Shibler break; 6954073Shibler case HP_370: 7054073Shibler cpuspeed = MHZ_33; 7154073Shibler break; 7254073Shibler case HP_375: 7354073Shibler cpuspeed = MHZ_50; 7454073Shibler break; 7554073Shibler case HP_380: 7654073Shibler cpuspeed = MHZ_25 * 2; /* XXX */ 7754073Shibler break; 78*57299Shibler case HP_433: 79*57299Shibler cpuspeed = MHZ_33 * 2; /* XXX */ 8054073Shibler break; 81*57299Shibler default: /* assume the fastest (largest delay value) */ 82*57299Shibler cpuspeed = MHZ_50; 83*57299Shibler break; 8454073Shibler } 8541488Smckusick find_devs(); 8641488Smckusick cninit(); 8742375Smckusick #if 0 8842375Smckusick printrominfo(); 8942375Smckusick #endif 9041488Smckusick hpibinit(); 9141488Smckusick scsiinit(); 9254073Shibler if ((bootdev & B_MAGICMASK) != B_DEVMAGIC) 9354073Shibler bootdev = msustobdev(); 9441488Smckusick } 9541488Smckusick 9654073Shibler /* 9754073Shibler * Convert HP MSUS to a valid bootdev layout: 9854073Shibler * TYPE comes from MSUS device type as mapped by rom2mdev 9954073Shibler * PARTITION is set to 0 ('a') 10054073Shibler * UNIT comes from MSUS unit (almost always 0) 10154073Shibler * CONTROLLER comes from MSUS primary address 10254073Shibler * ADAPTOR comes from SCSI/HPIB driver logical unit number 10354073Shibler * (passed back via unused hw_pa field) 10454073Shibler */ 10554073Shibler u_long 10654073Shibler msustobdev() 10754073Shibler { 10854073Shibler struct rominfo *rp = (struct rominfo *) ROMADDR; 10954073Shibler u_long bdev = 0; 11054073Shibler register struct hp_hw *hw; 11154073Shibler int sc; 11254073Shibler 11354073Shibler sc = (rp->msus >> 8) & 0xFF; 11454073Shibler for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) 11554073Shibler if (hw->hw_sc == sc) 11654073Shibler break; 11754073Shibler bdev |= rom2mdev[(rp->msus >> 24) & 0x1F] << B_TYPESHIFT; 11854073Shibler bdev |= 0 << B_PARTITIONSHIFT; 11954073Shibler bdev |= ((rp->msus >> 16) & 0xFF) << B_UNITSHIFT; 12054073Shibler bdev |= (rp->msus & 0xFF) << B_CONTROLLERSHIFT; 12154073Shibler bdev |= (int)hw->hw_pa << B_ADAPTORSHIFT; 12254073Shibler bdev |= B_DEVMAGIC; 12354073Shibler #if 0 12454073Shibler printf("msus %x -> bdev %x\n", rp->msus, bdev); 12554073Shibler #endif 12654073Shibler return (bdev); 12754073Shibler } 12854073Shibler 12941488Smckusick sctoaddr(sc) 13041488Smckusick int sc; 13141488Smckusick { 13241488Smckusick if (sc == -1) 13341488Smckusick return(GRFIADDR); 13442375Smckusick if (sc == 7 && internalhpib) 13541488Smckusick return(internalhpib); 13641488Smckusick if (sc < 32) 13749334Shibler return(DIOBASE + sc * DIOCSIZE); 13849334Shibler if (sc >= 132) 13949334Shibler return(DIOIIBASE + (sc - 132) * DIOIICSIZE); 14041488Smckusick return(sc); 14141488Smckusick } 14241488Smckusick 14341488Smckusick /* 14449334Shibler * Probe all DIO select codes (0 - 32), the internal display address, 14549334Shibler * and DIO-II select codes (132 - 256). 14645420Smckusick * 14741488Smckusick * Note that we only care about displays, SCSIs and HP-IBs. 14841488Smckusick */ 14941488Smckusick find_devs() 15041488Smckusick { 15149334Shibler short sc, sctop; 15241488Smckusick u_char *id_reg; 15349334Shibler register caddr_t addr; 15441488Smckusick register struct hp_hw *hw; 15541488Smckusick 15641488Smckusick hw = sc_table; 15749334Shibler sctop = machineid == HP_320 ? 32 : 256; 15849334Shibler for (sc = -1; sc < sctop; sc++) { 15949334Shibler if (sc >= 32 && sc < 132) 16049334Shibler continue; 16149334Shibler addr = (caddr_t) sctoaddr(sc); 16241488Smckusick if (badaddr(addr)) 16341488Smckusick continue; 16441488Smckusick 16541488Smckusick id_reg = (u_char *) addr; 16654073Shibler hw->hw_pa = 0; /* XXX used to pass back LUN from driver */ 16749334Shibler if (sc >= 132) 16849334Shibler hw->hw_size = (id_reg[0x101] + 1) * 0x100000; 16949334Shibler else 17049334Shibler hw->hw_size = DIOCSIZE; 17149334Shibler hw->hw_kva = addr; 17249334Shibler hw->hw_id = id_reg[1]; 17341488Smckusick hw->hw_sc = sc; 17441488Smckusick 17542375Smckusick /* 17642375Smckusick * Not all internal HP-IBs respond rationally to id requests 17742375Smckusick * so we just go by the "internal HPIB" indicator in SYSFLAG. 17842375Smckusick */ 17942375Smckusick if (sc == 7 && internalhpib) { 18049334Shibler hw->hw_type = C_HPIB; 18142375Smckusick hw++; 18242375Smckusick continue; 18342375Smckusick } 18442375Smckusick 18541488Smckusick switch (hw->hw_id) { 18642375Smckusick case 5: /* 98642A */ 18749334Shibler case 5+128: /* 98642A remote */ 18849334Shibler hw->hw_type = D_COMMDCM; 18942375Smckusick break; 19041488Smckusick case 8: /* 98625B */ 19141488Smckusick case 128: /* 98624A */ 19249334Shibler hw->hw_type = C_HPIB; 19341488Smckusick break; 19441488Smckusick case 57: /* Displays */ 19549334Shibler hw->hw_type = D_BITMAP; 19649334Shibler hw->hw_secid = id_reg[0x15]; 19749334Shibler switch (hw->hw_secid) { 19841488Smckusick case 4: /* renaissance */ 19941488Smckusick case 8: /* davinci */ 20041488Smckusick sc++; /* occupy 2 select codes */ 20141488Smckusick break; 20241488Smckusick } 20341488Smckusick break; 20441488Smckusick case 9: 20549334Shibler hw->hw_type = D_KEYBOARD; 20641488Smckusick break; 20741488Smckusick case 7: 20849334Shibler case 7+32: 20949334Shibler case 7+64: 21049334Shibler case 7+96: 21149334Shibler hw->hw_type = C_SCSI; 21241488Smckusick break; 21341488Smckusick default: /* who cares */ 21449334Shibler hw->hw_type = D_MISC; 21541488Smckusick break; 21641488Smckusick } 21741488Smckusick hw++; 21841488Smckusick } 21941488Smckusick } 220