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