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