xref: /csrg-svn/sys/vax/stand/autoconf.c (revision 34659)
123218Smckusick /*
229291Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
323218Smckusick  * All rights reserved.  The Berkeley software License Agreement
423218Smckusick  * specifies the terms and conditions for redistribution.
523218Smckusick  *
6*34659Smarc  *	@(#)autoconf.c	7.5 (Berkeley) 06/06/88
723218Smckusick  */
83264Swnj 
99803Ssam #include "../machine/pte.h"
109803Ssam 
1133408Skarels #include "param.h"
129186Ssam 
139186Ssam #include "../vax/cpu.h"
149186Ssam #include "../vax/nexus.h"
159186Ssam #include "../vaxuba/ubareg.h"
169186Ssam #include "../vaxmba/mbareg.h"
179186Ssam #include "../vax/mtpr.h"
189186Ssam 
193264Swnj #include "savax.h"
203264Swnj 
2133408Skarels #ifdef VAX8200
2233408Skarels #include "../vax/bireg.h"
2333408Skarels /*
2433408Skarels  * These are found during configuration, rather than being compiled in
2533408Skarels  * statically.
2633408Skarels  */
2733408Skarels struct	uba_regs *ubaddr8200[MAXNUBA];
2833408Skarels caddr_t	uioaddr8200[MAXNUBA];
2933408Skarels #endif
3033408Skarels 
3133408Skarels #if VAX8600 || VAX780
323264Swnj #define	UTR(i)	((struct uba_regs *)(NEX780+(i)))
3333408Skarels #define	UMA(i)	((caddr_t)UMEM780(i)+UBAIOADDR)
343264Swnj #define	MTR(i)	((struct mba_regs *)(NEX780+(i)))
3530547Skarels #define	UTRB(i)	((struct uba_regs *)(NEXB8600+(i)))
3633408Skarels #define	UMAB(i)	((caddr_t)UMEMB8600(i)+UBAIOADDR)
3730547Skarels #define	MTRB(i)	((struct mba_regs *)(NEXB8600+(i)))
383264Swnj 
3930547Skarels struct	uba_regs *ubaddr780[] = {
4030547Skarels 	UTR(3), UTR(4), UTR(5), UTR(6),
4130547Skarels #if VAX8600
4230547Skarels 	UTRB(3), UTRB(4), UTRB(5), UTRB(6),
4330547Skarels #endif
4430547Skarels };
4533408Skarels caddr_t	uioaddr780[] = {
4630547Skarels 	UMA(0), UMA(1), UMA(2), UMA(3),
4730547Skarels #if VAX8600
4830547Skarels 	UMAB(0), UMAB(1), UMAB(2), UMAB(3),
4930547Skarels #endif
5030547Skarels };
5130547Skarels struct	mba_regs *mbaddr780[] = {
5230547Skarels 	MTR(8), MTR(9), MTR(10), MTR(11),
5330547Skarels #if VAX8600
5430547Skarels 	MTRB(8), MTRB(9), MTRB(10), MTRB(11),
5530547Skarels #endif
5630547Skarels };
573264Swnj 
583264Swnj #undef	UTR
593264Swnj #undef	UMA
603264Swnj #undef	MTR
6133408Skarels #endif
623264Swnj 
6333408Skarels #if VAX750
643264Swnj #define	UTR(i)	((struct uba_regs *)(NEX750+(i)))
6533408Skarels #define	UMA(i)	((caddr_t)UMEM750(i)+UBAIOADDR)
663264Swnj #define	MTR(i)	((struct mba_regs *)(NEX750+(i)))
673264Swnj 
683264Swnj struct	uba_regs *ubaddr750[] = { UTR(8), UTR(9) };
6933408Skarels caddr_t	uioaddr750[] = { UMA(0), UMA(1) };
703341Swnj struct	mba_regs *mbaddr750[] = { MTR(4), MTR(5), MTR(6), MTR(7) };
713264Swnj 
723264Swnj #undef	UTR
733264Swnj #undef	UMA
743264Swnj #undef	MTR
7533408Skarels #endif
763264Swnj 
7733408Skarels #if VAX730
787444Sroot #define	UTR(i)	((struct uba_regs *)(NEX730+(i)))
7933408Skarels #define	UMA	((caddr_t)UMEM730+UBAIOADDR)
803341Swnj 
817444Sroot struct	uba_regs *ubaddr730[] = { UTR(3) };
8233408Skarels caddr_t	uioaddr730[] = { UMA };
833341Swnj 
843341Swnj #undef	UTR
853341Swnj #undef	UMA
8633408Skarels #endif
873341Swnj 
8833408Skarels #if VAX630
8933408Skarels /*
9033408Skarels  * The map registers start at 20088000 on the ka630, so
9133408Skarels  * subtract a 2k offset to make things work.
9233408Skarels  *
9333408Skarels  * This could stand serious cleanup.
9433408Skarels  */
9533408Skarels struct	uba_regs *ubaddr630[] =
9633408Skarels 	{ (struct uba_regs *)((caddr_t)QBAMAP630 - 0x800) };
9733408Skarels caddr_t	uioaddr630[] = { (caddr_t)QIOPAGE630 };
98*34659Smarc /*
99*34659Smarc  * Virtual console configuration tables.
100*34659Smarc  */
101*34659Smarc extern qv_init(),qd_init();
102*34659Smarc 
103*34659Smarc int (*vcons_init[])() = {
104*34659Smarc 	qd_init,
105*34659Smarc 	qv_init,
106*34659Smarc 	0
107*34659Smarc };
108*34659Smarc int (*v_getc)()=0,
109*34659Smarc     (*v_putc)()=0;
11033408Skarels #endif
11133408Skarels 
11233441Skarels int cpuspeed = 1;
11333441Skarels 
1143264Swnj configure()
1153264Swnj {
1163264Swnj 	union cpusid cpusid;
11733408Skarels 	register int nmba, nuba, i;
1183264Swnj 
1193264Swnj 	cpusid.cpusid = mfpr(SID);
1203264Swnj 	cpu = cpusid.cpuany.cp_type;
1213264Swnj 	switch (cpu) {
1223264Swnj 
12333408Skarels #if VAX8600
12424151Sbloom 	case VAX_8600:
12533408Skarels 		nmba = sizeof (mbaddr780) / sizeof (mbaddr780[0]);
12633408Skarels 		nuba = sizeof (ubaddr780) / sizeof (ubaddr780[0]);
12733408Skarels 		mbaddr = mbaddr780;
12833408Skarels 		ubaddr = ubaddr780;
12933408Skarels 		uioaddr = uioaddr780;
13033441Skarels 		cpuspeed = 6;
13133408Skarels 		break;
13233408Skarels #endif
13333408Skarels 
13433408Skarels #if VAX780
1353264Swnj 	case VAX_780:
13633408Skarels 		nmba = 4;
13733408Skarels 		nuba = 4;
1383264Swnj 		mbaddr = mbaddr780;
1393264Swnj 		ubaddr = ubaddr780;
14033408Skarels 		uioaddr = uioaddr780;
14133441Skarels 		cpuspeed = 2;
14233408Skarels 		break;
14333408Skarels #endif
14433408Skarels 
14533408Skarels #if VAX8200
14633408Skarels 	case VAX_8200: {
14733408Skarels 		register struct bi_node *bi;
14833408Skarels 
14933408Skarels 		nmba = 0;
15033408Skarels 		nuba = 0;
15133408Skarels 		for (i = 0, bi = BI_BASE(0); i < NNODEBI; i++, bi++) {
15233408Skarels 			if (badaddr((caddr_t)bi, sizeof (long)))
15333408Skarels 				continue;
15433408Skarels #ifdef notdef
15533408Skarels 			/* clear bus errors */
15633408Skarels 			bi->biic.bi_ber = ~(BIBER_MBZ|BIBER_NMR|BIBER_UPEN);
15733408Skarels #endif
15833408Skarels 			switch (bi->biic.bi_dtype) {
15933408Skarels 
16033408Skarels 			case BIDT_DWBUA:
16133408Skarels 				if (nuba >= MAXNUBA)	/* sorry */
16233408Skarels 					break;
16333408Skarels 				ubaddr8200[nuba] = (struct uba_regs *)bi;
16433408Skarels 				uioaddr8200[nuba] = (caddr_t)UMEM8200(i);
16533408Skarels 				((struct dwbua_regs *)bi)->bua_csr |=
16633408Skarels 				    BUACSR_UPI;
16733408Skarels 				nuba++;
16833408Skarels 				break;
16933408Skarels 
17033408Skarels 			case BIDT_KDB50:
17133408Skarels 				if (nkdb < MAXNKDB)
17233408Skarels 					kdbaddr[nkdb++] = (caddr_t)bi;
17333408Skarels 				break;
17433408Skarels 			}
17530547Skarels 		}
17633408Skarels 		ubaddr = ubaddr8200;
17733408Skarels 		uioaddr = uioaddr8200;
17833408Skarels 	}
1793264Swnj 		break;
18033408Skarels #endif
1813264Swnj 
18233408Skarels #if VAX750
1833264Swnj 	case VAX_750:
1843264Swnj 		mbaddr = mbaddr750;
1853264Swnj 		ubaddr = ubaddr750;
18633408Skarels 		uioaddr = uioaddr750;
1873348Swnj 		nmba = sizeof (mbaddr750) / sizeof (mbaddr750[0]);
1883348Swnj 		nuba = 0;
1893264Swnj 		break;
19033408Skarels #endif
1913341Swnj 
19233408Skarels #if VAX730
1937444Sroot 	case VAX_730:
1947444Sroot 		ubaddr = ubaddr730;
19533408Skarels 		uioaddr = uioaddr730;
19633408Skarels 		nmba = 0;
19733408Skarels 		nuba = 0;
1983341Swnj 		break;
19933408Skarels #endif
20033408Skarels 
20133408Skarels #if VAX630
20233408Skarels 	case VAX_630:
20333408Skarels 		ubaddr = ubaddr630;
20433408Skarels 		uioaddr = uioaddr630;
20533408Skarels 		nmba = 0;
20633408Skarels 		nuba = 0;
20733408Skarels 		break;
20833408Skarels #endif
2093264Swnj 	}
21033408Skarels 
2113348Swnj 	/*
2123348Swnj 	 * Forward into the past...
2133348Swnj 	 */
2147444Sroot /*
2153348Swnj 	for (i = 0; i < nmba; i++)
21630547Skarels 		if (!badaddr(mbaddr[i], sizeof(long)))
2173348Swnj 			mbaddr[i]->mba_cr = MBCR_INIT;
2187444Sroot */
21933408Skarels 	switch (cpu) {
22033408Skarels 
22133408Skarels #if VAX8600 || VAX780
22233408Skarels 	case VAX_8600:
22333408Skarels 	case VAX_780:
22433408Skarels 		for (i = 0; i < nuba; i++)
22533408Skarels 			if (!badaddr(ubaddr[i], sizeof(long)))
22633408Skarels 				ubaddr[i]->uba_cr = UBACR_ADINIT;
22733408Skarels 		break;
22833408Skarels #endif
22933408Skarels 
23033408Skarels #if VAX750 || VAX730
23133408Skarels 	case VAX_750:
23233408Skarels 	case VAX_730:
2337444Sroot 		mtpr(IUR, 0);
23433408Skarels 		break;
23533408Skarels #endif
23633408Skarels 
23733408Skarels #if VAX630
23833408Skarels 	case VAX_630:
23933408Skarels 		mtpr(IUR, 0);
24033408Skarels 		*((char *)QIOPAGE630 + QIPCR) = Q_LMEAE;
24133408Skarels 		break;
24233408Skarels #endif
24333408Skarels 	}
24433408Skarels 
2453348Swnj 	/* give unibus devices a chance to recover... */
2463348Swnj 	if (nuba > 0)
2473348Swnj 		DELAY(2000000);
248*34659Smarc #if VAX630
249*34659Smarc 	/*
250*34659Smarc 	 * configure the console
251*34659Smarc 	 */
252*34659Smarc 	for(i = 0; vcons_init[i] && !(*vcons_init[i])(); i++)
253*34659Smarc 		;
254*34659Smarc #endif
2553264Swnj }
256