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*35402Stef * @(#)autoconf.c 7.12 (Berkeley) 08/27/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 59*35402Stef #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 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 222*35402Stef 223*35402Stef #if VAX650 224*35402Stef case VAX_650: 225*35402Stef #ifndef SMALL 226*35402Stef if (debug) 227*35402Stef printf("cpu: uVAX 3000\n"); 228*35402Stef #endif 229*35402Stef ubaddr = ubaddr630; 230*35402Stef uioaddr = uioaddr630; 231*35402Stef nuba = 1; 232*35402Stef break; 233*35402Stef #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 254*35402Stef #if VAX630 || VAX650 25533408Skarels case VAX_630: 256*35402Stef 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; 267*35402Stef #endif 26833408Skarels } 26933408Skarels 2703348Swnj /* give unibus devices a chance to recover... */ 2713348Swnj if (nuba > 0) 27235061Skarels DELAY(500000); 2733264Swnj } 27435051Skarels 27535051Skarels #if VAX8600 || VAX780 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