xref: /csrg-svn/sys/hp300/stand/autoconf.c (revision 49334)
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*49334Shibler  * from: Utah $Hdr: autoconf.c 1.13 91/01/21$
1341488Smckusick  *
14*49334Shibler  *	@(#)autoconf.c	7.5 (Berkeley) 05/07/91
1541488Smckusick  */
1641488Smckusick 
1741488Smckusick #include "samachdep.h"
1845790Sbostic #include "sys/param.h"
1941488Smckusick 
2045790Sbostic #include "../dev/device.h"
2145790Sbostic #include "../dev/grfvar.h"
2241488Smckusick 
23*49334Shibler struct hp_hw sc_table[MAXCTLRS];
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)
58*49334Shibler 		return(DIOBASE + sc * DIOCSIZE);
59*49334Shibler 	if (sc >= 132)
60*49334Shibler 		return(DIOIIBASE + (sc - 132) * DIOIICSIZE);
6141488Smckusick 	return(sc);
6241488Smckusick }
6341488Smckusick 
6441488Smckusick /*
65*49334Shibler  * Probe all DIO select codes (0 - 32), the internal display address,
66*49334Shibler  * and DIO-II select codes (132 - 256).
6745420Smckusick  *
6841488Smckusick  * Note that we only care about displays, SCSIs and HP-IBs.
6941488Smckusick  */
7041488Smckusick find_devs()
7141488Smckusick {
72*49334Shibler 	short sc, sctop;
7341488Smckusick 	u_char *id_reg;
74*49334Shibler 	register caddr_t addr;
7541488Smckusick 	register struct hp_hw *hw;
76*49334Shibler 	extern int machineid;
7741488Smckusick 
7841488Smckusick 	hw = sc_table;
79*49334Shibler 	sctop = machineid == HP_320 ? 32 : 256;
80*49334Shibler 	for (sc = -1; sc < sctop; sc++) {
81*49334Shibler 		if (sc >= 32 && sc < 132)
82*49334Shibler 			continue;
83*49334Shibler 		addr = (caddr_t) sctoaddr(sc);
8441488Smckusick 		if (badaddr(addr))
8541488Smckusick 			continue;
8641488Smckusick 
8741488Smckusick 		id_reg = (u_char *) addr;
88*49334Shibler 		hw->hw_pa = addr;
89*49334Shibler 		if (sc >= 132)
90*49334Shibler 			hw->hw_size = (id_reg[0x101] + 1) * 0x100000;
91*49334Shibler 		else
92*49334Shibler 			hw->hw_size = DIOCSIZE;
93*49334Shibler 		hw->hw_kva = addr;
94*49334Shibler 		hw->hw_id = id_reg[1];
9541488Smckusick 		hw->hw_sc = sc;
9641488Smckusick 
9742375Smckusick 		/*
9842375Smckusick 		 * Not all internal HP-IBs respond rationally to id requests
9942375Smckusick 		 * so we just go by the "internal HPIB" indicator in SYSFLAG.
10042375Smckusick 		 */
10142375Smckusick 		if (sc == 7 && internalhpib) {
102*49334Shibler 			hw->hw_type = C_HPIB;
10342375Smckusick 			hw++;
10442375Smckusick 			continue;
10542375Smckusick 		}
10642375Smckusick 
10741488Smckusick 		switch (hw->hw_id) {
10842375Smckusick 		case 5:		/* 98642A */
109*49334Shibler 		case 5+128:	/* 98642A remote */
110*49334Shibler 			hw->hw_type = D_COMMDCM;
11142375Smckusick 			break;
11241488Smckusick 		case 8:		/* 98625B */
11341488Smckusick 		case 128:	/* 98624A */
114*49334Shibler 			hw->hw_type = C_HPIB;
11541488Smckusick 			break;
11641488Smckusick 		case 57:	/* Displays */
117*49334Shibler 			hw->hw_type = D_BITMAP;
118*49334Shibler 			hw->hw_secid = id_reg[0x15];
119*49334Shibler 			switch (hw->hw_secid) {
12041488Smckusick 			case 4:	/* renaissance */
12141488Smckusick 			case 8: /* davinci */
12241488Smckusick 				sc++;		/* occupy 2 select codes */
12341488Smckusick 				break;
12441488Smckusick 			}
12541488Smckusick 			break;
12641488Smckusick 		case 9:
127*49334Shibler 			hw->hw_type = D_KEYBOARD;
12841488Smckusick 			break;
12941488Smckusick 		case 7:
130*49334Shibler 		case 7+32:
131*49334Shibler 		case 7+64:
132*49334Shibler 		case 7+96:
133*49334Shibler 			hw->hw_type = C_SCSI;
13441488Smckusick 			break;
13541488Smckusick 		default:	/* who cares */
136*49334Shibler 			hw->hw_type = D_MISC;
13741488Smckusick 			break;
13841488Smckusick 		}
13941488Smckusick 		hw++;
14041488Smckusick 	}
14141488Smckusick }
142