xref: /csrg-svn/sys/hp300/stand/autoconf.c (revision 63163)
141488Smckusick /*
241488Smckusick  * Copyright (c) 1988 University of Utah.
3*63163Sbostic  * Copyright (c) 1990, 1993
4*63163Sbostic  *	The Regents of the University of California.  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*63163Sbostic  *	@(#)autoconf.c	8.1 (Berkeley) 06/10/93
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 
configure()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;
7857299Shibler 	case HP_433:
7957299Shibler 		cpuspeed = MHZ_33 * 2;	/* XXX */
8054073Shibler 		break;
8157299Shibler 	default:	/* assume the fastest (largest delay value) */
8257299Shibler 		cpuspeed = MHZ_50;
8357299Shibler 		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
msustobdev()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 
sctoaddr(sc)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  */
find_devs()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