xref: /csrg-svn/sys/vax/stand/autoconf.c (revision 35051)
123218Smckusick /*
2*35051Skarels  * Copyright (c) 1982, 1986, 1988 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*35051Skarels  *	@(#)autoconf.c	7.10 (Berkeley) 07/09/88
723218Smckusick  */
83264Swnj 
933408Skarels #include "param.h"
10*35051Skarels #include "reboot.h"
119186Ssam 
129186Ssam #include "../vax/cpu.h"
139186Ssam #include "../vax/nexus.h"
14*35051Skarels #include "../vax/pte.h"
15*35051Skarels #include "../vax/mtpr.h"
169186Ssam #include "../vaxuba/ubareg.h"
179186Ssam #include "../vaxmba/mbareg.h"
189186Ssam 
193264Swnj #include "savax.h"
203264Swnj 
2133408Skarels #ifdef VAX8200
2234882Sbostic #include "../vaxbi/bireg.h"
23*35051Skarels #endif
24*35051Skarels 
25*35051Skarels #if VAX8600 || VAX8200 || VAX780
2633408Skarels /*
27*35051Skarels  * These are used on CPU's that do configuration.
2833408Skarels  */
29*35051Skarels struct	uba_regs *ubaddrspace[MAXNUBA];
30*35051Skarels caddr_t	uioaddrspace[MAXNUBA];
31*35051Skarels struct	mba_regs *mbaddrspace[MAXNMBA];
3233408Skarels #endif
3333408Skarels 
3433408Skarels #if VAX750
353264Swnj #define	UTR(i)	((struct uba_regs *)(NEX750+(i)))
3633408Skarels #define	UMA(i)	((caddr_t)UMEM750(i)+UBAIOADDR)
373264Swnj #define	MTR(i)	((struct mba_regs *)(NEX750+(i)))
383264Swnj 
393264Swnj struct	uba_regs *ubaddr750[] = { UTR(8), UTR(9) };
4033408Skarels caddr_t	uioaddr750[] = { UMA(0), UMA(1) };
413341Swnj struct	mba_regs *mbaddr750[] = { MTR(4), MTR(5), MTR(6), MTR(7) };
423264Swnj 
433264Swnj #undef	UTR
443264Swnj #undef	UMA
453264Swnj #undef	MTR
4633408Skarels #endif
473264Swnj 
4833408Skarels #if VAX730
497444Sroot #define	UTR(i)	((struct uba_regs *)(NEX730+(i)))
5033408Skarels #define	UMA	((caddr_t)UMEM730+UBAIOADDR)
513341Swnj 
527444Sroot struct	uba_regs *ubaddr730[] = { UTR(3) };
5333408Skarels caddr_t	uioaddr730[] = { UMA };
543341Swnj 
553341Swnj #undef	UTR
563341Swnj #undef	UMA
5733408Skarels #endif
583341Swnj 
5933408Skarels #if VAX630
6033408Skarels /*
6133408Skarels  * The map registers start at 20088000 on the ka630, so
6233408Skarels  * subtract a 2k offset to make things work.
6333408Skarels  *
6433408Skarels  * This could stand serious cleanup.
6533408Skarels  */
6633408Skarels struct	uba_regs *ubaddr630[] =
6733408Skarels 	{ (struct uba_regs *)((caddr_t)QBAMAP630 - 0x800) };
6833408Skarels caddr_t	uioaddr630[] = { (caddr_t)QIOPAGE630 };
6934946Skarels 
70*35051Skarels int (*v_getc)(), (*v_putc)();
7134946Skarels 
7234946Skarels #ifndef SMALL
7334659Smarc /*
7434659Smarc  * Virtual console configuration tables.
7534659Smarc  */
7634659Smarc extern qv_init(),qd_init();
7734659Smarc 
7834659Smarc int (*vcons_init[])() = {
7934659Smarc 	qd_init,
8034659Smarc 	qv_init,
8134659Smarc 	0
8234659Smarc };
8333408Skarels #endif
8434946Skarels #endif
8533408Skarels 
86*35051Skarels #ifndef SMALL
87*35051Skarels extern int boothowto;
88*35051Skarels int debug = 0;
89*35051Skarels #endif
9033441Skarels int cpuspeed = 1;
9133441Skarels 
923264Swnj configure()
933264Swnj {
943264Swnj 	union cpusid cpusid;
95*35051Skarels 	register int i;
963264Swnj 
97*35051Skarels #ifndef SMALL
98*35051Skarels 	if (boothowto & RB_KDB)		/* XXX */
99*35051Skarels 		debug = 1;
100*35051Skarels #endif
1013264Swnj 	cpusid.cpusid = mfpr(SID);
1023264Swnj 	cpu = cpusid.cpuany.cp_type;
1033264Swnj 	switch (cpu) {
1043264Swnj 
10533408Skarels #if VAX8600
10624151Sbloom 	case VAX_8600:
107*35051Skarels #ifndef SMALL
108*35051Skarels 		if (debug)
109*35051Skarels 			printf("cpu: 8600\nsbia 0:\n");
110*35051Skarels #endif
11133441Skarels 		cpuspeed = 6;
112*35051Skarels 		probenexi(NEXA8600, (caddr_t)UMEMA8600(0)+UBAIOADDR, 0);
113*35051Skarels 		probenexi(NEXB8600, (caddr_t)UMEMB8600(0)+UBAIOADDR, 1);
11433408Skarels 		break;
11533408Skarels #endif
11633408Skarels 
11733408Skarels #if VAX780
1183264Swnj 	case VAX_780:
119*35051Skarels #ifndef SMALL
120*35051Skarels 		if (debug)
121*35051Skarels 			printf("cpu: 780\n");
122*35051Skarels #endif
12333441Skarels 		cpuspeed = 2;
124*35051Skarels 		probenexi(NEX780, (caddr_t)UMEM780(0)+UBAIOADDR, 0);
12533408Skarels 		break;
12633408Skarels #endif
12733408Skarels 
12833408Skarels #if VAX8200
12933408Skarels 	case VAX_8200: {
13033408Skarels 		register struct bi_node *bi;
13133408Skarels 
132*35051Skarels 		cpuspeed = 2;
13333408Skarels 		for (i = 0, bi = BI_BASE(0); i < NNODEBI; i++, bi++) {
13433408Skarels 			if (badaddr((caddr_t)bi, sizeof (long)))
13533408Skarels 				continue;
13633408Skarels #ifdef notdef
13733408Skarels 			/* clear bus errors */
13833408Skarels 			bi->biic.bi_ber = ~(BIBER_MBZ|BIBER_NMR|BIBER_UPEN);
13933408Skarels #endif
140*35051Skarels #ifndef SMALL
141*35051Skarels 			if (debug)
142*35051Skarels 				printf("node%d: ", i);
143*35051Skarels #endif
14433408Skarels 			switch (bi->biic.bi_dtype) {
14533408Skarels 
14633408Skarels 			case BIDT_DWBUA:
14733408Skarels 				if (nuba >= MAXNUBA)	/* sorry */
14833408Skarels 					break;
149*35051Skarels #ifndef SMALL
150*35051Skarels 				if (debug)
151*35051Skarels 					printf("uba%d\n", nuba);
152*35051Skarels #endif
153*35051Skarels 				ubaddrspace[nuba] = (struct uba_regs *)bi;
154*35051Skarels 				uioaddrspace[nuba] = (caddr_t)UMEM8200(i) +
15534883Sbostic 				    UBAIOADDR;
15633408Skarels 				((struct dwbua_regs *)bi)->bua_csr |=
15733408Skarels 				    BUACSR_UPI;
15833408Skarels 				nuba++;
15933408Skarels 				break;
16033408Skarels 
16133408Skarels 			case BIDT_KDB50:
162*35051Skarels 				if (nkdb < MAXNKDB) {
16333408Skarels 					kdbaddr[nkdb++] = (caddr_t)bi;
164*35051Skarels #ifndef SMALL
165*35051Skarels 					if (debug)
166*35051Skarels 						printf("kdb%d\n", nkdb);
167*35051Skarels #endif
168*35051Skarels 				}
16933408Skarels 				break;
170*35051Skarels #ifndef SMALL
171*35051Skarels 			default:
172*35051Skarels 				if (debug)
173*35051Skarels 					printf("unknown type %x\n",
174*35051Skarels 					    bi->biic.bi_dtype);
175*35051Skarels 				break;
176*35051Skarels #endif
17733408Skarels 			}
17830547Skarels 		}
179*35051Skarels 		ubaddr = ubaddrspace;
180*35051Skarels 		uioaddr = uioaddrspace;
18133408Skarels 	}
1823264Swnj 		break;
18333408Skarels #endif
1843264Swnj 
18533408Skarels #if VAX750
1863264Swnj 	case VAX_750:
187*35051Skarels #ifndef SMALL
188*35051Skarels 		if (debug)
189*35051Skarels 			printf("cpu: 750 -- assuming standard config\n");
190*35051Skarels #endif
1913264Swnj 		mbaddr = mbaddr750;
1923264Swnj 		ubaddr = ubaddr750;
19333408Skarels 		uioaddr = uioaddr750;
1943348Swnj 		nmba = sizeof (mbaddr750) / sizeof (mbaddr750[0]);
195*35051Skarels 		nuba = 2;
1963264Swnj 		break;
19733408Skarels #endif
1983341Swnj 
19933408Skarels #if VAX730
2007444Sroot 	case VAX_730:
201*35051Skarels #ifndef SMALL
202*35051Skarels 		if (debug)
203*35051Skarels 			printf("cpu: 730 -- assuming standard config\n");
204*35051Skarels #endif
2057444Sroot 		ubaddr = ubaddr730;
20633408Skarels 		uioaddr = uioaddr730;
207*35051Skarels 		nuba = 1;
2083341Swnj 		break;
20933408Skarels #endif
21033408Skarels 
21133408Skarels #if VAX630
21233408Skarels 	case VAX_630:
213*35051Skarels #ifndef SMALL
214*35051Skarels 		if (debug)
215*35051Skarels 			printf("cpu: uVAX II\n");
216*35051Skarels #endif
21733408Skarels 		ubaddr = ubaddr630;
21833408Skarels 		uioaddr = uioaddr630;
219*35051Skarels 		nuba = 1;
22033408Skarels 		break;
22133408Skarels #endif
2223264Swnj 	}
22333408Skarels 
2243348Swnj 	/*
2253348Swnj 	 * Forward into the past...
2263348Swnj 	 */
2277444Sroot /*
2283348Swnj 	for (i = 0; i < nmba; i++)
22930547Skarels 		if (!badaddr(mbaddr[i], sizeof(long)))
2303348Swnj 			mbaddr[i]->mba_cr = MBCR_INIT;
2317444Sroot */
232*35051Skarels 
23333408Skarels 	switch (cpu) {
23433408Skarels 
23533408Skarels #if VAX750 || VAX730
23633408Skarels 	case VAX_750:
23733408Skarels 	case VAX_730:
2387444Sroot 		mtpr(IUR, 0);
23933408Skarels 		break;
24033408Skarels #endif
24133408Skarels 
24233408Skarels #if VAX630
24333408Skarels 	case VAX_630:
24433408Skarels 		mtpr(IUR, 0);
24533408Skarels 		*((char *)QIOPAGE630 + QIPCR) = Q_LMEAE;
24634947Skarels #if !defined(SMALL)
24734947Skarels 		/*
24834947Skarels 		 * configure the console
24934947Skarels 		 */
25034947Skarels 		for(i = 0; vcons_init[i] && !(*vcons_init[i])(); i++)
25134947Skarels 			;
25234947Skarels #endif
25333408Skarels 		break;
254*35051Skarels #endif /* VAX630 */
25533408Skarels 	}
25633408Skarels 
2573348Swnj 	/* give unibus devices a chance to recover... */
2583348Swnj 	if (nuba > 0)
2593348Swnj 		DELAY(2000000);
2603264Swnj }
261*35051Skarels 
262*35051Skarels #if VAX8600 || VAX780
263*35051Skarels probenexi(nxp, umembase, sbia)
264*35051Skarels 	register struct nexus *nxp;
265*35051Skarels 	caddr_t umembase;
266*35051Skarels 	int sbia;
267*35051Skarels {
268*35051Skarels 	register int i;
269*35051Skarels 	union nexcsr nexcsr;
270*35051Skarels 	int first = 1;
271*35051Skarels 
272*35051Skarels 	for (i = 0; i < 16; i++, nxp++) {
273*35051Skarels 		if (badaddr(nxp, sizeof(long)))
274*35051Skarels 			continue;
275*35051Skarels 		nexcsr = nxp->nexcsr;
276*35051Skarels 		if (nexcsr.nex_csr & NEX_APD)
277*35051Skarels 			continue;
278*35051Skarels #ifndef SMALL
279*35051Skarels 		if (debug) {
280*35051Skarels 			if (first && sbia != 0)
281*35051Skarels 				printf("sbia %d:\n", sbia);
282*35051Skarels 			printf("tr%d: ", i);
283*35051Skarels 			first = 0;
284*35051Skarels 		}
285*35051Skarels #endif
286*35051Skarels 		switch (nexcsr.nex_type) {
287*35051Skarels 		default:
288*35051Skarels #ifndef SMALL
289*35051Skarels 			if (debug)
290*35051Skarels 				printf("nexid %2x\n", nexcsr.nex_type);
291*35051Skarels #endif
292*35051Skarels 			break;
293*35051Skarels 
294*35051Skarels 		case NEX_MEM4:
295*35051Skarels 		case NEX_MEM4I:
296*35051Skarels 		case NEX_MEM16:
297*35051Skarels 		case NEX_MEM16I:
298*35051Skarels 		case NEX_MEM64L:
299*35051Skarels 		case NEX_MEM64LI:
300*35051Skarels 		case NEX_MEM64U:
301*35051Skarels 		case NEX_MEM64UI:
302*35051Skarels 		case NEX_MEM64I:
303*35051Skarels #ifndef SMALL
304*35051Skarels 			if (debug)
305*35051Skarels 				printf("mem\n");
306*35051Skarels #endif
307*35051Skarels 			break;
308*35051Skarels 
309*35051Skarels 		case NEX_CI:
310*35051Skarels #ifndef SMALL
311*35051Skarels 			if (debug)
312*35051Skarels 				printf("ci\n");
313*35051Skarels #endif
314*35051Skarels 			break;
315*35051Skarels 
316*35051Skarels 		case NEX_DR32:
317*35051Skarels #ifndef SMALL
318*35051Skarels 			if (debug)
319*35051Skarels 				printf("dr32\n");
320*35051Skarels #endif
321*35051Skarels 			break;
322*35051Skarels 
323*35051Skarels 		case NEX_MPM0:
324*35051Skarels 		case NEX_MPM1:
325*35051Skarels 		case NEX_MPM2:
326*35051Skarels 		case NEX_MPM3:
327*35051Skarels #ifndef SMALL
328*35051Skarels 			if (debug)
329*35051Skarels 				printf("mpm\n");
330*35051Skarels #endif
331*35051Skarels 			break;
332*35051Skarels 
333*35051Skarels 		case NEX_MBA:
334*35051Skarels 			if (nmba >= MAXNMBA) {
335*35051Skarels #ifndef SMALL
336*35051Skarels 				if (debug)
337*35051Skarels 					printf("unsupported mba\n");
338*35051Skarels #endif
339*35051Skarels 				break;
340*35051Skarels 			}
341*35051Skarels #ifndef SMALL
342*35051Skarels 			if (debug)
343*35051Skarels 				printf("mba%d\n", nmba);
344*35051Skarels #endif
345*35051Skarels 			mbaddrspace[nmba] = (struct mba_regs *)nxp;
346*35051Skarels 			nmba++;
347*35051Skarels 			break;
348*35051Skarels 
349*35051Skarels 		case NEX_UBA0:
350*35051Skarels 		case NEX_UBA1:
351*35051Skarels 		case NEX_UBA2:
352*35051Skarels 		case NEX_UBA3:
353*35051Skarels 			if (nuba >= MAXNUBA) {
354*35051Skarels #ifndef SMALL
355*35051Skarels 				if (debug)
356*35051Skarels 					printf("unsupported uba\n");
357*35051Skarels #endif
358*35051Skarels 				break;
359*35051Skarels 			}
360*35051Skarels #ifndef SMALL
361*35051Skarels 			if (debug)
362*35051Skarels 				printf("uba%d umem%d", nuba,
363*35051Skarels 				    nexcsr.nex_type&3);
364*35051Skarels #endif
365*35051Skarels 			ubaddrspace[nuba] = (struct uba_regs *)nxp;
366*35051Skarels 			uioaddrspace[nuba] = umembase +
367*35051Skarels 			    (nexcsr.nex_csr & 3) * (512*NBPG);
368*35051Skarels #ifndef SMALL
369*35051Skarels 			if (debug)
370*35051Skarels 				printf(" (%x)\n", uioaddrspace[nuba]);
371*35051Skarels #endif
372*35051Skarels 			nuba++;
373*35051Skarels 			((struct uba_regs *)nxp)->uba_cr = UBACR_ADINIT;
374*35051Skarels 			break;
375*35051Skarels 		}
376*35051Skarels 	}
377*35051Skarels 	mbaddr = mbaddrspace;
378*35051Skarels 	ubaddr = ubaddrspace;
379*35051Skarels 	uioaddr = uioaddrspace;
380*35051Skarels #undef	UTR
381*35051Skarels #undef	UMA
382*35051Skarels #undef	MTR
383*35051Skarels }
384*35051Skarels #endif /* VAX780 || VAX8600 */
385