xref: /csrg-svn/sys/hp300/stand/autoconf.c (revision 54073)
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