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*35061Skarels * @(#)autoconf.c 7.11 (Berkeley) 07/10/88 723218Smckusick */ 83264Swnj 933408Skarels #include "param.h" 1035051Skarels #include "reboot.h" 119186Ssam 129186Ssam #include "../vax/cpu.h" 139186Ssam #include "../vax/nexus.h" 1435051Skarels #include "../vax/pte.h" 1535051Skarels #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" 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 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 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 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 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 */ 23235051Skarels 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; 25435051Skarels #endif /* VAX630 */ 25533408Skarels } 25633408Skarels 2573348Swnj /* give unibus devices a chance to recover... */ 2583348Swnj if (nuba > 0) 259*35061Skarels DELAY(500000); 2603264Swnj } 26135051Skarels 26235051Skarels #if VAX8600 || VAX780 26335051Skarels probenexi(nxp, umembase, sbia) 26435051Skarels register struct nexus *nxp; 26535051Skarels caddr_t umembase; 26635051Skarels int sbia; 26735051Skarels { 26835051Skarels register int i; 26935051Skarels union nexcsr nexcsr; 27035051Skarels int first = 1; 27135051Skarels 27235051Skarels for (i = 0; i < 16; i++, nxp++) { 27335051Skarels if (badaddr(nxp, sizeof(long))) 27435051Skarels continue; 27535051Skarels nexcsr = nxp->nexcsr; 27635051Skarels if (nexcsr.nex_csr & NEX_APD) 27735051Skarels continue; 27835051Skarels #ifndef SMALL 27935051Skarels if (debug) { 28035051Skarels if (first && sbia != 0) 28135051Skarels printf("sbia %d:\n", sbia); 28235051Skarels printf("tr%d: ", i); 28335051Skarels first = 0; 28435051Skarels } 28535051Skarels #endif 28635051Skarels switch (nexcsr.nex_type) { 28735051Skarels default: 28835051Skarels #ifndef SMALL 28935051Skarels if (debug) 29035051Skarels printf("nexid %2x\n", nexcsr.nex_type); 29135051Skarels #endif 29235051Skarels break; 29335051Skarels 29435051Skarels case NEX_MEM4: 29535051Skarels case NEX_MEM4I: 29635051Skarels case NEX_MEM16: 29735051Skarels case NEX_MEM16I: 29835051Skarels case NEX_MEM64L: 29935051Skarels case NEX_MEM64LI: 30035051Skarels case NEX_MEM64U: 30135051Skarels case NEX_MEM64UI: 30235051Skarels case NEX_MEM64I: 30335051Skarels #ifndef SMALL 30435051Skarels if (debug) 30535051Skarels printf("mem\n"); 30635051Skarels #endif 30735051Skarels break; 30835051Skarels 30935051Skarels case NEX_CI: 31035051Skarels #ifndef SMALL 31135051Skarels if (debug) 31235051Skarels printf("ci\n"); 31335051Skarels #endif 31435051Skarels break; 31535051Skarels 31635051Skarels case NEX_DR32: 31735051Skarels #ifndef SMALL 31835051Skarels if (debug) 31935051Skarels printf("dr32\n"); 32035051Skarels #endif 32135051Skarels break; 32235051Skarels 32335051Skarels case NEX_MPM0: 32435051Skarels case NEX_MPM1: 32535051Skarels case NEX_MPM2: 32635051Skarels case NEX_MPM3: 32735051Skarels #ifndef SMALL 32835051Skarels if (debug) 32935051Skarels printf("mpm\n"); 33035051Skarels #endif 33135051Skarels break; 33235051Skarels 33335051Skarels case NEX_MBA: 33435051Skarels if (nmba >= MAXNMBA) { 33535051Skarels #ifndef SMALL 33635051Skarels if (debug) 33735051Skarels printf("unsupported mba\n"); 33835051Skarels #endif 33935051Skarels break; 34035051Skarels } 34135051Skarels #ifndef SMALL 34235051Skarels if (debug) 34335051Skarels printf("mba%d\n", nmba); 34435051Skarels #endif 34535051Skarels mbaddrspace[nmba] = (struct mba_regs *)nxp; 34635051Skarels nmba++; 34735051Skarels break; 34835051Skarels 34935051Skarels case NEX_UBA0: 35035051Skarels case NEX_UBA1: 35135051Skarels case NEX_UBA2: 35235051Skarels case NEX_UBA3: 35335051Skarels if (nuba >= MAXNUBA) { 35435051Skarels #ifndef SMALL 35535051Skarels if (debug) 35635051Skarels printf("unsupported uba\n"); 35735051Skarels #endif 35835051Skarels break; 35935051Skarels } 36035051Skarels #ifndef SMALL 36135051Skarels if (debug) 36235051Skarels printf("uba%d umem%d", nuba, 36335051Skarels nexcsr.nex_type&3); 36435051Skarels #endif 36535051Skarels ubaddrspace[nuba] = (struct uba_regs *)nxp; 36635051Skarels uioaddrspace[nuba] = umembase + 36735051Skarels (nexcsr.nex_csr & 3) * (512*NBPG); 36835051Skarels #ifndef SMALL 36935051Skarels if (debug) 37035051Skarels printf(" (%x)\n", uioaddrspace[nuba]); 37135051Skarels #endif 37235051Skarels nuba++; 37335051Skarels ((struct uba_regs *)nxp)->uba_cr = UBACR_ADINIT; 37435051Skarels break; 37535051Skarels } 37635051Skarels } 37735051Skarels mbaddr = mbaddrspace; 37835051Skarels ubaddr = ubaddrspace; 37935051Skarels uioaddr = uioaddrspace; 38035051Skarels #undef UTR 38135051Skarels #undef UMA 38235051Skarels #undef MTR 38335051Skarels } 38435051Skarels #endif /* VAX780 || VAX8600 */ 385