1 /* 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1990, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. 9 * 10 * %sccs.include.redist.c% 11 * 12 * from: Utah $Hdr: autoconf.c 1.16 92/05/29$ 13 * 14 * @(#)autoconf.c 8.1 (Berkeley) 06/10/93 15 */ 16 17 #include <hp300/stand/samachdep.h> 18 #include <hp300/stand/rominfo.h> 19 #include <sys/param.h> 20 #include <sys/reboot.h> 21 22 #include <hp/dev/device.h> 23 #include <hp/dev/grfreg.h> 24 25 /* 26 * Mapping of ROM MSUS types to BSD major device numbers 27 * WARNING: major numbers must match bdevsw indices in hp300/conf.c. 28 */ 29 char rom2mdev[] = { 30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0-13: none */ 31 4, /* 14: SCSI disk */ 32 0, /* 15: none */ 33 2, /* 16: CS/80 device on HPIB */ 34 2, /* 17: CS/80 device on HPIB */ 35 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 18-31: none */ 36 }; 37 38 struct hp_hw sc_table[MAXCTLRS]; 39 int cpuspeed; 40 41 extern int internalhpib; 42 43 #if 0 44 printrominfo() 45 { 46 struct rominfo *rp = (struct rominfo *)ROMADDR; 47 48 printf("boottype %x, name %s, lowram %x, sysflag %x\n", 49 rp->boottype, rp->name, rp->lowram, rp->sysflag&0xff); 50 printf("rambase %x, ndrives %x, sysflag2 %x, msus %x\n", 51 rp->rambase, rp->ndrives, rp->sysflag2&0xff, rp->msus); 52 } 53 #endif 54 55 configure() 56 { 57 u_long msustobdev(); 58 59 switch (machineid) { 60 case HP_320: 61 case HP_330: 62 case HP_340: 63 cpuspeed = MHZ_16; 64 break; 65 case HP_350: 66 case HP_360: 67 cpuspeed = MHZ_25; 68 break; 69 case HP_370: 70 cpuspeed = MHZ_33; 71 break; 72 case HP_375: 73 cpuspeed = MHZ_50; 74 break; 75 case HP_380: 76 cpuspeed = MHZ_25 * 2; /* XXX */ 77 break; 78 case HP_433: 79 cpuspeed = MHZ_33 * 2; /* XXX */ 80 break; 81 default: /* assume the fastest (largest delay value) */ 82 cpuspeed = MHZ_50; 83 break; 84 } 85 find_devs(); 86 cninit(); 87 #if 0 88 printrominfo(); 89 #endif 90 hpibinit(); 91 scsiinit(); 92 if ((bootdev & B_MAGICMASK) != B_DEVMAGIC) 93 bootdev = msustobdev(); 94 } 95 96 /* 97 * Convert HP MSUS to a valid bootdev layout: 98 * TYPE comes from MSUS device type as mapped by rom2mdev 99 * PARTITION is set to 0 ('a') 100 * UNIT comes from MSUS unit (almost always 0) 101 * CONTROLLER comes from MSUS primary address 102 * ADAPTOR comes from SCSI/HPIB driver logical unit number 103 * (passed back via unused hw_pa field) 104 */ 105 u_long 106 msustobdev() 107 { 108 struct rominfo *rp = (struct rominfo *) ROMADDR; 109 u_long bdev = 0; 110 register struct hp_hw *hw; 111 int sc; 112 113 sc = (rp->msus >> 8) & 0xFF; 114 for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) 115 if (hw->hw_sc == sc) 116 break; 117 bdev |= rom2mdev[(rp->msus >> 24) & 0x1F] << B_TYPESHIFT; 118 bdev |= 0 << B_PARTITIONSHIFT; 119 bdev |= ((rp->msus >> 16) & 0xFF) << B_UNITSHIFT; 120 bdev |= (rp->msus & 0xFF) << B_CONTROLLERSHIFT; 121 bdev |= (int)hw->hw_pa << B_ADAPTORSHIFT; 122 bdev |= B_DEVMAGIC; 123 #if 0 124 printf("msus %x -> bdev %x\n", rp->msus, bdev); 125 #endif 126 return (bdev); 127 } 128 129 sctoaddr(sc) 130 int sc; 131 { 132 if (sc == -1) 133 return(GRFIADDR); 134 if (sc == 7 && internalhpib) 135 return(internalhpib); 136 if (sc < 32) 137 return(DIOBASE + sc * DIOCSIZE); 138 if (sc >= 132) 139 return(DIOIIBASE + (sc - 132) * DIOIICSIZE); 140 return(sc); 141 } 142 143 /* 144 * Probe all DIO select codes (0 - 32), the internal display address, 145 * and DIO-II select codes (132 - 256). 146 * 147 * Note that we only care about displays, SCSIs and HP-IBs. 148 */ 149 find_devs() 150 { 151 short sc, sctop; 152 u_char *id_reg; 153 register caddr_t addr; 154 register struct hp_hw *hw; 155 156 hw = sc_table; 157 sctop = machineid == HP_320 ? 32 : 256; 158 for (sc = -1; sc < sctop; sc++) { 159 if (sc >= 32 && sc < 132) 160 continue; 161 addr = (caddr_t) sctoaddr(sc); 162 if (badaddr(addr)) 163 continue; 164 165 id_reg = (u_char *) addr; 166 hw->hw_pa = 0; /* XXX used to pass back LUN from driver */ 167 if (sc >= 132) 168 hw->hw_size = (id_reg[0x101] + 1) * 0x100000; 169 else 170 hw->hw_size = DIOCSIZE; 171 hw->hw_kva = addr; 172 hw->hw_id = id_reg[1]; 173 hw->hw_sc = sc; 174 175 /* 176 * Not all internal HP-IBs respond rationally to id requests 177 * so we just go by the "internal HPIB" indicator in SYSFLAG. 178 */ 179 if (sc == 7 && internalhpib) { 180 hw->hw_type = C_HPIB; 181 hw++; 182 continue; 183 } 184 185 switch (hw->hw_id) { 186 case 5: /* 98642A */ 187 case 5+128: /* 98642A remote */ 188 hw->hw_type = D_COMMDCM; 189 break; 190 case 8: /* 98625B */ 191 case 128: /* 98624A */ 192 hw->hw_type = C_HPIB; 193 break; 194 case 57: /* Displays */ 195 hw->hw_type = D_BITMAP; 196 hw->hw_secid = id_reg[0x15]; 197 switch (hw->hw_secid) { 198 case 4: /* renaissance */ 199 case 8: /* davinci */ 200 sc++; /* occupy 2 select codes */ 201 break; 202 } 203 break; 204 case 9: 205 hw->hw_type = D_KEYBOARD; 206 break; 207 case 7: 208 case 7+32: 209 case 7+64: 210 case 7+96: 211 hw->hw_type = C_SCSI; 212 break; 213 default: /* who cares */ 214 hw->hw_type = D_MISC; 215 break; 216 } 217 hw++; 218 } 219 } 220