xref: /csrg-svn/sys/hp300/stand/autoconf.c (revision 45420)
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  *
1241488Smckusick  * from: Utah $Hdr: autoconf.c 1.9 89/10/07$
1341488Smckusick  *
14*45420Smckusick  *	@(#)autoconf.c	7.3 (Berkeley) 10/24/90
1541488Smckusick  */
1641488Smckusick 
1741488Smckusick #include "samachdep.h"
1841488Smckusick #include "param.h"
1941488Smckusick 
2041488Smckusick #include "../hpdev/device.h"
2141488Smckusick #include "../hpdev/grfvar.h"
2241488Smckusick 
2341488Smckusick struct hp_hw sc_table[MAX_CTLR];
2441488Smckusick 
2542375Smckusick extern int internalhpib;
2642375Smckusick 
2742375Smckusick #if 0
2842375Smckusick #include "rominfo.h"
2942375Smckusick printrominfo()
3042375Smckusick {
3142375Smckusick 	struct rominfo *rp = (struct rominfo *)ROMADDR;
3242375Smckusick 	printf("boottype %x, name %s, lowram %x, sysflag %x\n",
3342375Smckusick 	       rp->boottype, rp->name, rp->lowram, rp->sysflag&0xff);
3442375Smckusick 	printf("rambase %x, ndrives %x, sysflag2 %x, msus %x\n",
3542375Smckusick 	       rp->rambase, rp->ndrives, rp->sysflag2&0xff, rp->msus);
3642375Smckusick }
3742375Smckusick #endif
3842375Smckusick 
3941488Smckusick configure()
4041488Smckusick {
4141488Smckusick 	find_devs();
4241488Smckusick 	cninit();
4342375Smckusick #if 0
4442375Smckusick 	printrominfo();
4542375Smckusick #endif
4641488Smckusick 	hpibinit();
4741488Smckusick 	scsiinit();
4841488Smckusick }
4941488Smckusick 
5041488Smckusick sctoaddr(sc)
5141488Smckusick 	int sc;
5241488Smckusick {
5341488Smckusick 	if (sc == -1)
5441488Smckusick 		return(GRFIADDR);
5542375Smckusick 	if (sc == 7 && internalhpib)
5641488Smckusick 		return(internalhpib);
5741488Smckusick 	if (sc < 32)
5841488Smckusick 		return(0x600000+(0x10000*sc));
59*45420Smckusick 	if (sc >= 132 && sc < 134)
60*45420Smckusick 		return(0x1000000+((sc-132)*0x400000));
6141488Smckusick 	return(sc);
6241488Smckusick }
6341488Smckusick 
6441488Smckusick /*
65*45420Smckusick  * Probe all DIO select codes (0 - 32), the internal display address,.
66*45420Smckusick  * and DIO-II select codes 132 (hack) and 133 (hack).
67*45420Smckusick  *
6841488Smckusick  * Note that we only care about displays, SCSIs and HP-IBs.
6941488Smckusick  */
7041488Smckusick find_devs()
7141488Smckusick {
7241488Smckusick 	u_char *id_reg;
7341488Smckusick 	register short sc;
7441488Smckusick 	register int addr;
7541488Smckusick 	register struct hp_hw *hw;
7641488Smckusick 
7741488Smckusick 	hw = sc_table;
78*45420Smckusick 	for (sc = -1; sc < 32; sc++) {
7941488Smckusick 		addr = sctoaddr(sc);
8041488Smckusick 		if (badaddr(addr))
8141488Smckusick 			continue;
8241488Smckusick 
8341488Smckusick 		id_reg = (u_char *) addr;
8441488Smckusick 		hw->hw_addr = (char *) addr;
8541488Smckusick 		hw->hw_id = id_reg[1] & 0xff;
8641488Smckusick 		hw->hw_sc = sc;
8741488Smckusick 
8842375Smckusick 		/*
8942375Smckusick 		 * Not all internal HP-IBs respond rationally to id requests
9042375Smckusick 		 * so we just go by the "internal HPIB" indicator in SYSFLAG.
9142375Smckusick 		 */
9242375Smckusick 		if (sc == 7 && internalhpib) {
9342375Smckusick 			hw->hw_type = HPIB;
9442375Smckusick 			hw++;
9542375Smckusick 			continue;
9642375Smckusick 		}
9742375Smckusick 
9841488Smckusick 		switch (hw->hw_id) {
9942375Smckusick 		case 5:		/* 98642A */
10042375Smckusick 		case 128+5:	/* 98642A remote */
10142375Smckusick 			hw->hw_type = COMMDCM;
10242375Smckusick 			break;
10341488Smckusick 		case 8:		/* 98625B */
10441488Smckusick 		case 128:	/* 98624A */
10541488Smckusick 			hw->hw_type = HPIB;
10641488Smckusick 			break;
10741488Smckusick 		case 57:	/* Displays */
10841488Smckusick 			hw->hw_type = BITMAP;
10941488Smckusick 			hw->hw_id2 = id_reg[0x15];
11041488Smckusick 			switch (hw->hw_id2) {
11141488Smckusick 			case 4:	/* renaissance */
11241488Smckusick 			case 8: /* davinci */
11341488Smckusick 				sc++;		/* occupy 2 select codes */
11441488Smckusick 				break;
11541488Smckusick 			}
11641488Smckusick 			break;
11741488Smckusick 		case 9:
11841488Smckusick 			hw->hw_type = KEYBOARD;
11941488Smckusick 			break;
12041488Smckusick 		case 7:
12141488Smckusick 		case 39:
12241488Smckusick 		case 71:
12341488Smckusick 		case 103:
12441488Smckusick 			hw->hw_type = SCSI;
12541488Smckusick 			break;
12641488Smckusick 		default:	/* who cares */
12741488Smckusick 			hw->hw_type = MISC;
12841488Smckusick 			break;
12941488Smckusick 		}
13041488Smckusick 		hw++;
13141488Smckusick 	}
132*45420Smckusick 	/*
133*45420Smckusick 	 * Look for displays in DIO-II space
134*45420Smckusick 	 */
135*45420Smckusick 	for (sc = 132; sc < 134; sc++) {
136*45420Smckusick 		addr = sctoaddr(sc);
137*45420Smckusick 		if (badaddr(addr))
138*45420Smckusick 			continue;
139*45420Smckusick 
140*45420Smckusick 		id_reg = (u_char *) addr;
141*45420Smckusick 		hw->hw_addr = (char *) addr;
142*45420Smckusick 		hw->hw_id = id_reg[1] & 0xff;
143*45420Smckusick 		hw->hw_sc = sc;
144*45420Smckusick 
145*45420Smckusick 		switch (hw->hw_id) {
146*45420Smckusick 		case 57:	/* Displays */
147*45420Smckusick 			hw->hw_type = BITMAP;
148*45420Smckusick 			hw->hw_id2 = id_reg[0x15];
149*45420Smckusick 			switch (hw->hw_id2) {
150*45420Smckusick 			case 4:	/* renaissance */
151*45420Smckusick 			case 8: /* davinci */
152*45420Smckusick 				sc++;		/* occupy 2 select codes */
153*45420Smckusick 				break;
154*45420Smckusick 			}
155*45420Smckusick 			break;
156*45420Smckusick 		default:	/* who cares */
157*45420Smckusick 			hw->hw_type = MISC;
158*45420Smckusick 			break;
159*45420Smckusick 		}
160*45420Smckusick 		hw++;
161*45420Smckusick 	}
16241488Smckusick }
163