xref: /csrg-svn/sys/hp300/stand/autoconf.c (revision 41488)
1*41488Smckusick /*
2*41488Smckusick  * Copyright (c) 1988 University of Utah.
3*41488Smckusick  * Copyright (c) 1990 The Regents of the University of California.
4*41488Smckusick  * All rights reserved.
5*41488Smckusick  *
6*41488Smckusick  * This code is derived from software contributed to Berkeley by
7*41488Smckusick  * the Systems Programming Group of the University of Utah Computer
8*41488Smckusick  * Science Department.
9*41488Smckusick  *
10*41488Smckusick  * %sccs.include.redist.c%
11*41488Smckusick  *
12*41488Smckusick  * from: Utah $Hdr: autoconf.c 1.9 89/10/07$
13*41488Smckusick  *
14*41488Smckusick  *	@(#)autoconf.c	7.1 (Berkeley) 05/08/90
15*41488Smckusick  */
16*41488Smckusick 
17*41488Smckusick #include "samachdep.h"
18*41488Smckusick #include "param.h"
19*41488Smckusick 
20*41488Smckusick #include "../hpdev/device.h"
21*41488Smckusick #include "../hpdev/grfvar.h"
22*41488Smckusick 
23*41488Smckusick struct hp_hw sc_table[MAX_CTLR];
24*41488Smckusick 
25*41488Smckusick configure()
26*41488Smckusick {
27*41488Smckusick 	find_devs();
28*41488Smckusick 	cninit();
29*41488Smckusick 	hpibinit();
30*41488Smckusick 	scsiinit();
31*41488Smckusick }
32*41488Smckusick 
33*41488Smckusick sctoaddr(sc)
34*41488Smckusick 	int sc;
35*41488Smckusick {
36*41488Smckusick 	extern int internalhpib;
37*41488Smckusick 
38*41488Smckusick 	if (sc == -2)
39*41488Smckusick 		return(0x1000000);
40*41488Smckusick 	if (sc == -1)
41*41488Smckusick 		return(GRFIADDR);
42*41488Smckusick 	if (sc == 7)
43*41488Smckusick 		return(internalhpib);
44*41488Smckusick 	if (sc < 32)
45*41488Smckusick 		return(0x600000+(0x10000*sc));
46*41488Smckusick 	return(sc);
47*41488Smckusick }
48*41488Smckusick 
49*41488Smckusick /*
50*41488Smckusick  * Probe all select codes (0 - 32) and internal display address.
51*41488Smckusick  * Note that we only care about displays, SCSIs and HP-IBs.
52*41488Smckusick  */
53*41488Smckusick find_devs()
54*41488Smckusick {
55*41488Smckusick 	u_char *id_reg;
56*41488Smckusick 	register short sc;
57*41488Smckusick 	register int addr;
58*41488Smckusick 	register struct hp_hw *hw;
59*41488Smckusick 
60*41488Smckusick 	hw = sc_table;
61*41488Smckusick 	for (sc = -2; sc < 32; sc++) {
62*41488Smckusick 		addr = sctoaddr(sc);
63*41488Smckusick 		if (badaddr(addr))
64*41488Smckusick 			continue;
65*41488Smckusick 
66*41488Smckusick 		id_reg = (u_char *) addr;
67*41488Smckusick 		hw->hw_addr = (char *) addr;
68*41488Smckusick 		hw->hw_id = id_reg[1] & 0xff;
69*41488Smckusick 		hw->hw_sc = sc;
70*41488Smckusick 
71*41488Smckusick 		switch (hw->hw_id) {
72*41488Smckusick 		case 8:		/* 98625B */
73*41488Smckusick 		case 128:	/* 98624A */
74*41488Smckusick 			hw->hw_type = HPIB;
75*41488Smckusick 			break;
76*41488Smckusick 		case 57:	/* Displays */
77*41488Smckusick 			hw->hw_type = BITMAP;
78*41488Smckusick 			hw->hw_id2 = id_reg[0x15];
79*41488Smckusick 			switch (hw->hw_id2) {
80*41488Smckusick 			case 4:	/* renaissance */
81*41488Smckusick 			case 8: /* davinci */
82*41488Smckusick 				sc++;		/* occupy 2 select codes */
83*41488Smckusick 				break;
84*41488Smckusick 			}
85*41488Smckusick 			break;
86*41488Smckusick 		case 9:
87*41488Smckusick 			hw->hw_type = KEYBOARD;
88*41488Smckusick 			break;
89*41488Smckusick 		case 7:
90*41488Smckusick 		case 39:
91*41488Smckusick 		case 71:
92*41488Smckusick 		case 103:
93*41488Smckusick 			hw->hw_type = SCSI;
94*41488Smckusick 			break;
95*41488Smckusick 		default:	/* who cares */
96*41488Smckusick 			hw->hw_type = MISC;
97*41488Smckusick 			break;
98*41488Smckusick 		}
99*41488Smckusick 		hw++;
100*41488Smckusick 	}
101*41488Smckusick }
102