xref: /netbsd-src/sys/arch/hp300/stand/common/autoconf.c (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /*	$NetBSD: autoconf.c,v 1.13 2011/02/08 20:20:14 rmind Exp $	*/
2 
3 /*
4  * Copyright (c) 1988 University of Utah.
5  * Copyright (c) 1990, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * the Systems Programming Group of the University of Utah Computer
10  * Science Department.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  * from: Utah Hdr: autoconf.c 1.16 92/05/29
37  *
38  *	@(#)autoconf.c	8.1 (Berkeley) 6/10/93
39  */
40 
41 #include <sys/param.h>
42 #include <sys/reboot.h>
43 
44 #include <hp300/stand/common/samachdep.h>
45 #include <hp300/stand/common/rominfo.h>
46 #include <hp300/stand/common/device.h>
47 #include <hp300/stand/common/hpibvar.h>
48 #include <hp300/stand/common/scsireg.h>
49 #include <hp300/stand/common/scsivar.h>
50 
51 #include <hp300/dev/dioreg.h>
52 #include <hp300/stand/common/grfreg.h>
53 #include <hp300/dev/intioreg.h>
54 
55 /*
56  * Mapping of ROM MSUS types to BSD major device numbers
57  * WARNING: major numbers must match bdevsw indices in hp300/conf.c.
58  */
59 static const char rom2mdev[] = {
60 	0, 0, 						/* 0-1: none */
61 	6,	/* 2: network device; special */
62 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		/* 3-13: none */
63 	4,	/* 14: SCSI disk */
64 	0,	/* 15: none */
65 	2,	/* 16: CS/80 device on HPIB */
66 	2,	/* 17: CS/80 device on HPIB */
67 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 18-31: none */
68 };
69 
70 struct hp_hw sc_table[MAXCTLRS];
71 int cpuspeed;
72 
73 static u_long msustobdev(void);
74 static void find_devs(void);
75 
76 #ifdef PRINTROMINFO
77 void
78 printrominfo(void)
79 {
80 	struct rominfo *rp = (struct rominfo *)ROMADDR;
81 
82 	printf("boottype %x, name %s, lowram %x, sysflag %x\n",
83 	       rp->boottype, rp->name, rp->lowram, rp->sysflag&0xff);
84 	printf("rambase %x, ndrives %x, sysflag2 %x, msus %x\n",
85 	       rp->rambase, rp->ndrives, rp->sysflag2&0xff, rp->msus);
86 }
87 #endif
88 
89 void
90 configure(void)
91 {
92 
93 	switch (machineid) {
94 	case HP_320:
95 	case HP_330:
96 	case HP_340:
97 		cpuspeed = MHZ_16;
98 		break;
99 	case HP_350:
100 	case HP_360:
101 	case HP_362:
102 		cpuspeed = MHZ_25;
103 		break;
104 	case HP_370:
105 		cpuspeed = MHZ_33;
106 		break;
107 	case HP_375:
108 	case HP_400:
109 		cpuspeed = MHZ_50;
110 		break;
111 	case HP_380:
112 	case HP_382:
113 	case HP_425:
114 		cpuspeed = MHZ_25 * 2;	/* XXX */
115 		break;
116 	case HP_385:
117 	case HP_433:
118 		cpuspeed = MHZ_33 * 2;	/* XXX */
119 		break;
120 	default:	/* assume the fastest (largest delay value) */
121 		cpuspeed = MHZ_50;
122 		break;
123 	}
124 	find_devs();
125 	cninit();
126 #ifdef PRINTROMINFO
127 	printrominfo();
128 #endif
129 	hpibinit();
130 	scsiinit();
131 	if ((bootdev & B_MAGICMASK) != B_DEVMAGIC)
132 		bootdev = msustobdev();
133 }
134 
135 /*
136  * Convert HP MSUS to a valid bootdev layout:
137  *	TYPE comes from MSUS device type as mapped by rom2mdev
138  *	PARTITION is set to 0 ('a')
139  *	UNIT comes from MSUS unit (almost always 0)
140  *	CONTROLLER comes from MSUS primary address
141  *	ADAPTER comes from SCSI/HPIB driver logical unit number
142  *		(passed back via unused hw_pa field)
143  */
144 static u_long
145 msustobdev(void)
146 {
147 	struct rominfo *rp = (struct rominfo *) ROMADDR;
148 	u_long bdev = 0;
149 	struct hp_hw *hw;
150 	int sc, type, ctlr, slave, punit;
151 
152 	sc = (rp->msus >> 8) & 0xFF;
153 	for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++)
154 		if (hw->hw_sc == sc)
155 			break;
156 
157 	type  = rom2mdev[(rp->msus >> 24) & 0x1F];
158 	ctlr  = (int)hw->hw_pa;
159 	slave = (rp->msus & 0xFF);
160 	punit = ((rp->msus >> 16) & 0xFF);
161 
162 	bdev  = MAKEBOOTDEV(type, ctlr, slave, punit, 0);
163 
164 #ifdef PRINTROMINFO
165 	printf("msus %x -> bdev %x\n", rp->msus, bdev);
166 #endif
167 	return bdev;
168 }
169 
170 int
171 sctoaddr(int sc)
172 {
173 
174 	if (sc == -1)
175 		return INTIOBASE + FB_BASE;
176 	if (sc == 7 && internalhpib)
177 		return internalhpib ;
178 	if (sc < 32)
179 		return DIOBASE + sc * DIOCSIZE ;
180 	if (sc >= DIOII_SCBASE)
181 		return DIOIIBASE + (sc - DIOII_SCBASE) * DIOIICSIZE ;
182 	return sc;
183 }
184 
185 /*
186  * Probe all DIO select codes (0 - 32), the internal display address,
187  * and DIO-II select codes (132 - 256).
188  *
189  * Note that we only care about displays, LANCEs, SCSIs and HP-IBs.
190  */
191 static void
192 find_devs(void)
193 {
194 	short sc, sctop;
195 	u_char *id_reg;
196 	void *addr;
197 	struct hp_hw *hw;
198 
199 	hw = sc_table;
200 	sctop = DIO_SCMAX(machineid);
201 	for (sc = -1; sc < sctop; sc++) {
202 		if (DIO_INHOLE(sc))
203 			continue;
204 		addr = (void *)sctoaddr(sc);
205 		if (badaddr(addr))
206 			continue;
207 
208 		id_reg = (u_char *)addr;
209 		hw->hw_pa = 0;	/* XXX used to pass back LUN from driver */
210 		if (sc >= DIOII_SCBASE)
211 			hw->hw_size = DIOII_SIZE(id_reg);
212 		else
213 			hw->hw_size = DIOCSIZE;
214 		hw->hw_kva = addr;
215 		hw->hw_id = DIO_ID(id_reg);
216 		hw->hw_sc = sc;
217 
218 		/*
219 		 * Not all internal HP-IBs respond rationally to id requests
220 		 * so we just go by the "internal HPIB" indicator in SYSFLAG.
221 		 */
222 		if (sc == 7 && internalhpib) {
223 			hw->hw_type = C_HPIB;
224 			hw++;
225 			continue;
226 		}
227 
228 		switch (hw->hw_id) {
229 		case 5:		/* 98642A */
230 		case 5+128:	/* 98642A remote */
231 			hw->hw_type = D_COMMDCM;
232 			break;
233 		case 8:		/* 98625B */
234 		case 128:	/* 98624A */
235 			hw->hw_type = C_HPIB;
236 			break;
237 		case 21:	/* LANCE */
238 			hw->hw_type = D_LAN;
239 			break;
240 		case 57:	/* Displays */
241 			hw->hw_type = D_BITMAP;
242 			hw->hw_secid = id_reg[0x15];
243 			switch (hw->hw_secid) {
244 			case 4:	/* renaissance */
245 			case 8: /* davinci */
246 				sc++;		/* occupy 2 select codes */
247 				break;
248 			}
249 			break;
250 		case 9:
251 			hw->hw_type = D_KEYBOARD;
252 			break;
253 		case 7:
254 		case 7+32:
255 		case 7+64:
256 		case 7+96:
257 			hw->hw_type = C_SCSI;
258 			break;
259 		default:	/* who cares */
260 			hw->hw_type = D_MISC;
261 			break;
262 		}
263 		hw++;
264 	}
265 }
266