xref: /csrg-svn/sys/hp300/stand/autoconf.c (revision 42375)
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*42375Smckusick  *	@(#)autoconf.c	7.2 (Berkeley) 05/25/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 
25*42375Smckusick extern int internalhpib;
26*42375Smckusick 
27*42375Smckusick #if 0
28*42375Smckusick #include "rominfo.h"
29*42375Smckusick printrominfo()
30*42375Smckusick {
31*42375Smckusick 	struct rominfo *rp = (struct rominfo *)ROMADDR;
32*42375Smckusick 	printf("boottype %x, name %s, lowram %x, sysflag %x\n",
33*42375Smckusick 	       rp->boottype, rp->name, rp->lowram, rp->sysflag&0xff);
34*42375Smckusick 	printf("rambase %x, ndrives %x, sysflag2 %x, msus %x\n",
35*42375Smckusick 	       rp->rambase, rp->ndrives, rp->sysflag2&0xff, rp->msus);
36*42375Smckusick }
37*42375Smckusick #endif
38*42375Smckusick 
3941488Smckusick configure()
4041488Smckusick {
4141488Smckusick 	find_devs();
4241488Smckusick 	cninit();
43*42375Smckusick #if 0
44*42375Smckusick 	printrominfo();
45*42375Smckusick #endif
4641488Smckusick 	hpibinit();
4741488Smckusick 	scsiinit();
4841488Smckusick }
4941488Smckusick 
5041488Smckusick sctoaddr(sc)
5141488Smckusick 	int sc;
5241488Smckusick {
5341488Smckusick 	if (sc == -2)
5441488Smckusick 		return(0x1000000);
5541488Smckusick 	if (sc == -1)
5641488Smckusick 		return(GRFIADDR);
57*42375Smckusick 	if (sc == 7 && internalhpib)
5841488Smckusick 		return(internalhpib);
5941488Smckusick 	if (sc < 32)
6041488Smckusick 		return(0x600000+(0x10000*sc));
6141488Smckusick 	return(sc);
6241488Smckusick }
6341488Smckusick 
6441488Smckusick /*
6541488Smckusick  * Probe all select codes (0 - 32) and internal display address.
6641488Smckusick  * Note that we only care about displays, SCSIs and HP-IBs.
6741488Smckusick  */
6841488Smckusick find_devs()
6941488Smckusick {
7041488Smckusick 	u_char *id_reg;
7141488Smckusick 	register short sc;
7241488Smckusick 	register int addr;
7341488Smckusick 	register struct hp_hw *hw;
7441488Smckusick 
7541488Smckusick 	hw = sc_table;
7641488Smckusick 	for (sc = -2; sc < 32; sc++) {
7741488Smckusick 		addr = sctoaddr(sc);
7841488Smckusick 		if (badaddr(addr))
7941488Smckusick 			continue;
8041488Smckusick 
8141488Smckusick 		id_reg = (u_char *) addr;
8241488Smckusick 		hw->hw_addr = (char *) addr;
8341488Smckusick 		hw->hw_id = id_reg[1] & 0xff;
8441488Smckusick 		hw->hw_sc = sc;
8541488Smckusick 
86*42375Smckusick 		/*
87*42375Smckusick 		 * Not all internal HP-IBs respond rationally to id requests
88*42375Smckusick 		 * so we just go by the "internal HPIB" indicator in SYSFLAG.
89*42375Smckusick 		 */
90*42375Smckusick 		if (sc == 7 && internalhpib) {
91*42375Smckusick 			hw->hw_type = HPIB;
92*42375Smckusick 			hw++;
93*42375Smckusick 			continue;
94*42375Smckusick 		}
95*42375Smckusick 
9641488Smckusick 		switch (hw->hw_id) {
97*42375Smckusick 		case 5:		/* 98642A */
98*42375Smckusick 		case 128+5:	/* 98642A remote */
99*42375Smckusick 			hw->hw_type = COMMDCM;
100*42375Smckusick 			break;
10141488Smckusick 		case 8:		/* 98625B */
10241488Smckusick 		case 128:	/* 98624A */
10341488Smckusick 			hw->hw_type = HPIB;
10441488Smckusick 			break;
10541488Smckusick 		case 57:	/* Displays */
10641488Smckusick 			hw->hw_type = BITMAP;
10741488Smckusick 			hw->hw_id2 = id_reg[0x15];
10841488Smckusick 			switch (hw->hw_id2) {
10941488Smckusick 			case 4:	/* renaissance */
11041488Smckusick 			case 8: /* davinci */
11141488Smckusick 				sc++;		/* occupy 2 select codes */
11241488Smckusick 				break;
11341488Smckusick 			}
11441488Smckusick 			break;
11541488Smckusick 		case 9:
11641488Smckusick 			hw->hw_type = KEYBOARD;
11741488Smckusick 			break;
11841488Smckusick 		case 7:
11941488Smckusick 		case 39:
12041488Smckusick 		case 71:
12141488Smckusick 		case 103:
12241488Smckusick 			hw->hw_type = SCSI;
12341488Smckusick 			break;
12441488Smckusick 		default:	/* who cares */
12541488Smckusick 			hw->hw_type = MISC;
12641488Smckusick 			break;
12741488Smckusick 		}
12841488Smckusick 		hw++;
12941488Smckusick 	}
13041488Smckusick }
131