123218Smckusick /*
235051Skarels * 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*45803Sbostic * @(#)autoconf.c 7.13 (Berkeley) 12/16/90
723218Smckusick */
83264Swnj
9*45803Sbostic #include "sys/param.h"
10*45803Sbostic #include "sys/reboot.h"
119186Ssam
12*45803Sbostic #include "../include/cpu.h"
139186Ssam #include "../vax/nexus.h"
14*45803Sbostic #include "../include/pte.h"
15*45803Sbostic #include "../include/mtpr.h"
16*45803Sbostic #include "../uba/ubareg.h"
17*45803Sbostic #include "../mba/mbareg.h"
189186Ssam
193264Swnj #include "savax.h"
203264Swnj
2133408Skarels #ifdef VAX8200
22*45803Sbostic #include "../bi/bireg.h"
2335051Skarels #endif
2435051Skarels
2535051Skarels #if VAX8600 || VAX8200 || VAX780
2633408Skarels /*
2735051Skarels * These are used on CPU's that do configuration.
2833408Skarels */
2935051Skarels struct uba_regs *ubaddrspace[MAXNUBA];
3035051Skarels caddr_t uioaddrspace[MAXNUBA];
3135051Skarels 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
5935402Stef #if VAX630 || VAX650
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
7035051Skarels 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
8635051Skarels #ifndef SMALL
8735051Skarels extern int boothowto;
8835051Skarels int debug = 0;
8935051Skarels #endif
9033441Skarels int cpuspeed = 1;
9133441Skarels
configure()923264Swnj configure()
933264Swnj {
943264Swnj union cpusid cpusid;
9535051Skarels register int i;
963264Swnj
9735051Skarels #ifndef SMALL
9835051Skarels if (boothowto & RB_KDB) /* XXX */
9935051Skarels debug = 1;
10035051Skarels #endif
1013264Swnj cpusid.cpusid = mfpr(SID);
1023264Swnj cpu = cpusid.cpuany.cp_type;
1033264Swnj switch (cpu) {
1043264Swnj
10533408Skarels #if VAX8600
10624151Sbloom case VAX_8600:
10735051Skarels #ifndef SMALL
10835051Skarels if (debug)
10935051Skarels printf("cpu: 8600\nsbia 0:\n");
11035051Skarels #endif
11133441Skarels cpuspeed = 6;
11235051Skarels probenexi(NEXA8600, (caddr_t)UMEMA8600(0)+UBAIOADDR, 0);
11335051Skarels probenexi(NEXB8600, (caddr_t)UMEMB8600(0)+UBAIOADDR, 1);
11433408Skarels break;
11533408Skarels #endif
11633408Skarels
11733408Skarels #if VAX780
1183264Swnj case VAX_780:
11935051Skarels #ifndef SMALL
12035051Skarels if (debug)
12135051Skarels printf("cpu: 780\n");
12235051Skarels #endif
12333441Skarels cpuspeed = 2;
12435051Skarels 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
13235051Skarels 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
14035051Skarels #ifndef SMALL
14135051Skarels if (debug)
14235051Skarels printf("node%d: ", i);
14335051Skarels #endif
14433408Skarels switch (bi->biic.bi_dtype) {
14533408Skarels
14633408Skarels case BIDT_DWBUA:
14733408Skarels if (nuba >= MAXNUBA) /* sorry */
14833408Skarels break;
14935051Skarels #ifndef SMALL
15035051Skarels if (debug)
15135051Skarels printf("uba%d\n", nuba);
15235051Skarels #endif
15335051Skarels ubaddrspace[nuba] = (struct uba_regs *)bi;
15435051Skarels 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:
16235051Skarels if (nkdb < MAXNKDB) {
16333408Skarels kdbaddr[nkdb++] = (caddr_t)bi;
16435051Skarels #ifndef SMALL
16535051Skarels if (debug)
16635051Skarels printf("kdb%d\n", nkdb);
16735051Skarels #endif
16835051Skarels }
16933408Skarels break;
17035051Skarels #ifndef SMALL
17135051Skarels default:
17235051Skarels if (debug)
17335051Skarels printf("unknown type %x\n",
17435051Skarels bi->biic.bi_dtype);
17535051Skarels break;
17635051Skarels #endif
17733408Skarels }
17830547Skarels }
17935051Skarels ubaddr = ubaddrspace;
18035051Skarels uioaddr = uioaddrspace;
18133408Skarels }
1823264Swnj break;
18333408Skarels #endif
1843264Swnj
18533408Skarels #if VAX750
1863264Swnj case VAX_750:
18735051Skarels #ifndef SMALL
18835051Skarels if (debug)
18935051Skarels printf("cpu: 750 -- assuming standard config\n");
19035051Skarels #endif
1913264Swnj mbaddr = mbaddr750;
1923264Swnj ubaddr = ubaddr750;
19333408Skarels uioaddr = uioaddr750;
1943348Swnj nmba = sizeof (mbaddr750) / sizeof (mbaddr750[0]);
19535051Skarels nuba = 2;
1963264Swnj break;
19733408Skarels #endif
1983341Swnj
19933408Skarels #if VAX730
2007444Sroot case VAX_730:
20135051Skarels #ifndef SMALL
20235051Skarels if (debug)
20335051Skarels printf("cpu: 730 -- assuming standard config\n");
20435051Skarels #endif
2057444Sroot ubaddr = ubaddr730;
20633408Skarels uioaddr = uioaddr730;
20735051Skarels nuba = 1;
2083341Swnj break;
20933408Skarels #endif
21033408Skarels
21133408Skarels #if VAX630
21233408Skarels case VAX_630:
21335051Skarels #ifndef SMALL
21435051Skarels if (debug)
21535051Skarels printf("cpu: uVAX II\n");
21635051Skarels #endif
21733408Skarels ubaddr = ubaddr630;
21833408Skarels uioaddr = uioaddr630;
21935051Skarels nuba = 1;
22033408Skarels break;
22133408Skarels #endif
22235402Stef
22335402Stef #if VAX650
22435402Stef case VAX_650:
22535402Stef #ifndef SMALL
22635402Stef if (debug)
22735402Stef printf("cpu: uVAX 3000\n");
22835402Stef #endif
22935402Stef ubaddr = ubaddr630;
23035402Stef uioaddr = uioaddr630;
23135402Stef nuba = 1;
23235402Stef break;
23335402Stef #endif
2343264Swnj }
23533408Skarels
2363348Swnj /*
2373348Swnj * Forward into the past...
2383348Swnj */
2397444Sroot /*
2403348Swnj for (i = 0; i < nmba; i++)
24130547Skarels if (!badaddr(mbaddr[i], sizeof(long)))
2423348Swnj mbaddr[i]->mba_cr = MBCR_INIT;
2437444Sroot */
24435051Skarels
24533408Skarels switch (cpu) {
24633408Skarels
24733408Skarels #if VAX750 || VAX730
24833408Skarels case VAX_750:
24933408Skarels case VAX_730:
2507444Sroot mtpr(IUR, 0);
25133408Skarels break;
25233408Skarels #endif
25333408Skarels
25435402Stef #if VAX630 || VAX650
25533408Skarels case VAX_630:
25635402Stef case VAX_650:
25733408Skarels mtpr(IUR, 0);
25833408Skarels *((char *)QIOPAGE630 + QIPCR) = Q_LMEAE;
25934947Skarels #if !defined(SMALL)
26034947Skarels /*
26134947Skarels * configure the console
26234947Skarels */
26334947Skarels for(i = 0; vcons_init[i] && !(*vcons_init[i])(); i++)
26434947Skarels ;
26534947Skarels #endif
26633408Skarels break;
26735402Stef #endif
26833408Skarels }
26933408Skarels
2703348Swnj /* give unibus devices a chance to recover... */
2713348Swnj if (nuba > 0)
27235061Skarels DELAY(500000);
2733264Swnj }
27435051Skarels
27535051Skarels #if VAX8600 || VAX780
probenexi(nxp,umembase,sbia)27635051Skarels probenexi(nxp, umembase, sbia)
27735051Skarels register struct nexus *nxp;
27835051Skarels caddr_t umembase;
27935051Skarels int sbia;
28035051Skarels {
28135051Skarels register int i;
28235051Skarels union nexcsr nexcsr;
28335051Skarels int first = 1;
28435051Skarels
28535051Skarels for (i = 0; i < 16; i++, nxp++) {
28635051Skarels if (badaddr(nxp, sizeof(long)))
28735051Skarels continue;
28835051Skarels nexcsr = nxp->nexcsr;
28935051Skarels if (nexcsr.nex_csr & NEX_APD)
29035051Skarels continue;
29135051Skarels #ifndef SMALL
29235051Skarels if (debug) {
29335051Skarels if (first && sbia != 0)
29435051Skarels printf("sbia %d:\n", sbia);
29535051Skarels printf("tr%d: ", i);
29635051Skarels first = 0;
29735051Skarels }
29835051Skarels #endif
29935051Skarels switch (nexcsr.nex_type) {
30035051Skarels default:
30135051Skarels #ifndef SMALL
30235051Skarels if (debug)
30335051Skarels printf("nexid %2x\n", nexcsr.nex_type);
30435051Skarels #endif
30535051Skarels break;
30635051Skarels
30735051Skarels case NEX_MEM4:
30835051Skarels case NEX_MEM4I:
30935051Skarels case NEX_MEM16:
31035051Skarels case NEX_MEM16I:
31135051Skarels case NEX_MEM64L:
31235051Skarels case NEX_MEM64LI:
31335051Skarels case NEX_MEM64U:
31435051Skarels case NEX_MEM64UI:
31535051Skarels case NEX_MEM64I:
31635051Skarels #ifndef SMALL
31735051Skarels if (debug)
31835051Skarels printf("mem\n");
31935051Skarels #endif
32035051Skarels break;
32135051Skarels
32235051Skarels case NEX_CI:
32335051Skarels #ifndef SMALL
32435051Skarels if (debug)
32535051Skarels printf("ci\n");
32635051Skarels #endif
32735051Skarels break;
32835051Skarels
32935051Skarels case NEX_DR32:
33035051Skarels #ifndef SMALL
33135051Skarels if (debug)
33235051Skarels printf("dr32\n");
33335051Skarels #endif
33435051Skarels break;
33535051Skarels
33635051Skarels case NEX_MPM0:
33735051Skarels case NEX_MPM1:
33835051Skarels case NEX_MPM2:
33935051Skarels case NEX_MPM3:
34035051Skarels #ifndef SMALL
34135051Skarels if (debug)
34235051Skarels printf("mpm\n");
34335051Skarels #endif
34435051Skarels break;
34535051Skarels
34635051Skarels case NEX_MBA:
34735051Skarels if (nmba >= MAXNMBA) {
34835051Skarels #ifndef SMALL
34935051Skarels if (debug)
35035051Skarels printf("unsupported mba\n");
35135051Skarels #endif
35235051Skarels break;
35335051Skarels }
35435051Skarels #ifndef SMALL
35535051Skarels if (debug)
35635051Skarels printf("mba%d\n", nmba);
35735051Skarels #endif
35835051Skarels mbaddrspace[nmba] = (struct mba_regs *)nxp;
35935051Skarels nmba++;
36035051Skarels break;
36135051Skarels
36235051Skarels case NEX_UBA0:
36335051Skarels case NEX_UBA1:
36435051Skarels case NEX_UBA2:
36535051Skarels case NEX_UBA3:
36635051Skarels if (nuba >= MAXNUBA) {
36735051Skarels #ifndef SMALL
36835051Skarels if (debug)
36935051Skarels printf("unsupported uba\n");
37035051Skarels #endif
37135051Skarels break;
37235051Skarels }
37335051Skarels #ifndef SMALL
37435051Skarels if (debug)
37535051Skarels printf("uba%d umem%d", nuba,
37635051Skarels nexcsr.nex_type&3);
37735051Skarels #endif
37835051Skarels ubaddrspace[nuba] = (struct uba_regs *)nxp;
37935051Skarels uioaddrspace[nuba] = umembase +
38035051Skarels (nexcsr.nex_csr & 3) * (512*NBPG);
38135051Skarels #ifndef SMALL
38235051Skarels if (debug)
38335051Skarels printf(" (%x)\n", uioaddrspace[nuba]);
38435051Skarels #endif
38535051Skarels nuba++;
38635051Skarels ((struct uba_regs *)nxp)->uba_cr = UBACR_ADINIT;
38735051Skarels break;
38835051Skarels }
38935051Skarels }
39035051Skarels mbaddr = mbaddrspace;
39135051Skarels ubaddr = ubaddrspace;
39235051Skarels uioaddr = uioaddrspace;
39335051Skarels #undef UTR
39435051Skarels #undef UMA
39535051Skarels #undef MTR
39635051Skarels }
39735051Skarels #endif /* VAX780 || VAX8600 */
398