Annotation of 43BSDReno/sys/vax/autoconf.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1982,1986 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  *     @(#)autoconf.c  7.18 (Berkeley) 9/3/89
                      7:  */
                      8: 
                      9: /*
                     10:  * Setup the system to run on the current machine.
                     11:  *
                     12:  * Configure() is called at boot time and initializes the uba and mba
                     13:  * device tables and the memory controller monitoring.  Available
                     14:  * devices are determined (from possibilities mentioned in ioconf.c),
                     15:  * and the drivers are initialized.
                     16:  */
                     17: 
                     18: #include "mba.h"
                     19: #include "uba.h"
                     20: #include "kra.h"               /* XXX wrong file */
                     21: 
                     22: #include "param.h"
                     23: #include "systm.h"
                     24: #include "map.h"
                     25: #include "buf.h"
                     26: #include "dkstat.h"
                     27: #include "vm.h"
                     28: #include "malloc.h"
                     29: #include "conf.h"
                     30: #include "dmap.h"
                     31: #include "reboot.h"
                     32: 
                     33: #include "pte.h"
                     34: #include "cpu.h"
                     35: #include "mem.h"
                     36: #include "mtpr.h"
                     37: #include "nexus.h"
                     38: #include "scb.h"
                     39: #include "ioa.h"
                     40: #include "../vaxbi/bireg.h"
                     41: #include "../vaxmba/mbareg.h"
                     42: #include "../vaxmba/mbavar.h"
                     43: #include "../vaxuba/ubareg.h"
                     44: #include "../vaxuba/ubavar.h"
                     45: 
                     46: /*
                     47:  * The following several variables are related to
                     48:  * the configuration process, and are used in initializing
                     49:  * the machine.
                     50:  */
                     51: int    cold;           /* if 1, still working on cold-start */
                     52: int    dkn;            /* number of iostat dk numbers assigned so far */
                     53: int    cpuspeed = 1;   /* relative cpu speed */
                     54: 
                     55: /*
                     56:  * Addresses of the (locore) routines which bootstrap us from
                     57:  * hardware traps to C code.  Filled into the system control block
                     58:  * as necessary.
                     59:  *
                     60:  * RIDICULOUS!  CONFIG SHOULD GENERATE AN ioconf.h FOR US, with
                     61:  * mba glue also in `glue.s'.  (Unibus adapter glue is special, though.)
                     62:  */
                     63: #if NMBA > 0
                     64: int    (*mbaintv[4])() =       { Xmba0int, Xmba1int, Xmba2int, Xmba3int };
                     65: #if NMBA > 4
                     66:        Need to expand the table for more than 4 massbus adaptors
                     67: #endif
                     68: #endif
                     69: #if defined(VAX780) || defined(VAX8600)
                     70: int    (*ubaintv[])() =
                     71: {
                     72:        Xua0int, Xua1int, Xua2int, Xua3int,
                     73: #if NUBA > 4
                     74:        Xua4int, Xua5int, Xua6int, Xua7int,
                     75: #endif
                     76: #if NUBA > 8
                     77:        Need to expand the table for more than 8 unibus adaptors
                     78: #endif
                     79: };
                     80: #endif
                     81: #if NKDB > 0
                     82: /* kdb50 driver does not appear in udminit[] (not without csr!) */
                     83: int    Xkdbintr0();            /* generated by autoconf */
                     84: int    (*kdbintv[])() = { Xkdbintr0 };
                     85: #if NKDB > 1
                     86:        Need to expand the table for more than 1 KDB adapter
                     87: #endif
                     88: #endif
                     89: 
                     90: /*
                     91:  * This allocates the space for the per-uba information,
                     92:  * such as buffered data path usage.
                     93:  */
                     94: struct uba_hd uba_hd[NUBA];
                     95: 
                     96: /*
                     97:  * Determine mass storage and memory configuration for a machine.
                     98:  * Get cpu type, and then switch out to machine specific procedures
                     99:  * which will probe adaptors to see what is out there.
                    100:  */
                    101: configure()
                    102: {
                    103:        union cpusid cpusid;
                    104:        register struct percpu *ocp;
                    105:        register struct pte *ip;
                    106: 
                    107:        cpusid.cpusid = mfpr(SID);
                    108:        switch (cpusid.cpuany.cp_type) {
                    109: #if VAX8600
                    110:        case VAX_8600:
                    111:                printf("VAX 8600, serial# %d(%d), hardware ECO level %d(%d)\n",
                    112:                        cpusid.cpu8600.cp_sno, cpusid.cpu8600.cp_plant,
                    113:                        cpusid.cpu8600.cp_eco >> 4, cpusid.cpu8600.cp_eco);
                    114:                break;
                    115: #endif
                    116: #if VAX8200
                    117:        case VAX_8200:
                    118:                printf("\
                    119: VAX 82%c0, hardware rev %d, ucode patch rev %d, sec patch %d, ucode rev %d\n",
                    120:                        cpusid.cpu8200.cp_5 ? '5' : '0',
                    121:                        cpusid.cpu8200.cp_hrev, cpusid.cpu8200.cp_patch,
                    122:                        cpusid.cpu8200.cp_secp, cpusid.cpu8200.cp_urev);
                    123:                mastercpu = mfpr(BINID);
                    124:                break;
                    125: #endif
                    126: #if VAX780
                    127:        case VAX_780:
                    128:                printf("\
                    129: VAX 11/78%c, serial# %d(%d), hardware ECO level %d(%d)\n",
                    130:                        cpusid.cpu780.cp_5 ? '5' : '0',
                    131:                        cpusid.cpu780.cp_sno, cpusid.cpu780.cp_plant,
                    132:                        cpusid.cpu780.cp_eco >> 4, cpusid.cpu780.cp_eco);
                    133:                break;
                    134: #endif
                    135: #if VAX750
                    136:        case VAX_750:
                    137:                printf("VAX 11/750, hardware rev %d, ucode rev %d\n",
                    138:                        cpusid.cpu750.cp_hrev, cpusid.cpu750.cp_urev);
                    139:                break;
                    140: #endif
                    141: #if VAX730
                    142:        case VAX_730:
                    143:                printf("VAX 11/730, ucode rev %d\n", cpusid.cpu730.cp_urev);
                    144:                break;
                    145: #endif
                    146: #if VAX630
                    147:        case VAX_630:
                    148:                printf("MicroVAX-II\n");
                    149:                break;
                    150: #endif
                    151: #if VAX650
                    152:        case VAX_650:
                    153:                printf("MicroVAX 3000, ucode rev %d\n", cpusid.cpu650.cp_urev);
                    154:                break;
                    155: #endif
                    156:        }
                    157:        for (ocp = percpu; ocp->pc_cputype; ocp++)
                    158:                if (ocp->pc_cputype == cpusid.cpuany.cp_type) {
                    159:                        cpuspeed = ocp->pc_cpuspeed;
                    160:                        cpuops = ocp->pc_ops;
                    161:                        if (cpuops->cpu_init != NULL)
                    162:                                (*cpuops->cpu_init)();
                    163:                        probeio(ocp);
                    164:                        /*
                    165:                         * Write protect the scb and UNIBUS interrupt vectors.
                    166:                         * It is strange that this code is here, but this is
                    167:                         * as soon as we are done mucking with it, and the
                    168:                         * write-enable was done in assembly language
                    169:                         * to which we will never return.
                    170:                         */
                    171:                        for (ip = kvtopte(scb); ip < kvtopte(eUNIvec); ip++) {
                    172:                                *(int *)ip &= ~PG_PROT;
                    173:                                *(int *)ip |= PG_KR;
                    174:                        }
                    175:                        mtpr(TBIA, 0);
                    176: #if GENERIC
                    177:                        if ((boothowto & RB_ASKNAME) == 0)
                    178:                                setroot();
                    179:                        setconf();
                    180: #else
                    181:                        setroot();
                    182: #endif
                    183:                        /*
                    184:                         * Configure swap area and related system
                    185:                         * parameter based on device(s) used.
                    186:                         */
                    187:                        swapconf();
                    188:                        cold = 0;
                    189:                        memenable();
                    190:                        return;
                    191:                }
                    192:        printf("cpu type %d not configured\n", cpusid.cpuany.cp_type);
                    193:        asm("halt");
                    194: }
                    195: 
                    196: #if VAX8600 || VAX780 || VAX750 || VAX730
                    197: int    nexnum;         /* current nexus number */
                    198: int    nsbi;           /* current sbi number */
                    199: #endif
                    200: #if VAX8200
                    201: int    numkdb;         /* current ``kdb'' number */
                    202: int    bi_nodes;       /* XXX remembers found bi nodes */
                    203: #endif
                    204: 
                    205: /*
                    206:  * Probe the main IO bus(es).
                    207:  * The percpu structure gives us a handle on the addresses and/or types.
                    208:  */
                    209: probeio(pcpu)
                    210:        register struct percpu *pcpu;
                    211: {
                    212:        register struct iobus *iob;
                    213:        int ioanum;
                    214: 
                    215:        ioanum = 0;
                    216:        for (iob = pcpu->pc_io; ioanum < pcpu->pc_nioa; ioanum++, iob++) {
                    217: 
                    218:                switch (iob->io_type) {
                    219: 
                    220: #if VAX630 || VAX650
                    221:                case IO_QBUS:
                    222:                        probeqbus((struct qbus *)iob->io_details);
                    223:                        break;
                    224: #endif
                    225: 
                    226: #if VAX780 || VAX750 || VAX730
                    227:                case IO_SBI780:
                    228:                case IO_CMI750:
                    229:                case IO_XXX730:
                    230:                        probenexi((struct nexusconnect *)iob->io_details);
                    231:                        break;
                    232: #endif
                    233: 
                    234: #if VAX8600
                    235:                case IO_ABUS:
                    236:                        probe_Abus(ioanum, iob);
                    237:                        break;
                    238: #endif
                    239: 
                    240: #if VAX8200
                    241:                case IO_BI:
                    242:                        probe_bi((struct bibus *)iob->io_details);
                    243:                        break;
                    244: #endif
                    245: 
                    246:                default:
                    247:                        if (iob->io_addr) {
                    248:                            printf(
                    249:                "IO adaptor %d, type %d, at address 0x%x is unsupported\n",
                    250:                                ioanum, iob->io_type, iob->io_addr);
                    251:                        } else
                    252:                            printf("IO adaptor %d, type %d, is unsupported\n",
                    253:                                ioanum, iob->io_type);
                    254:                        break;
                    255:                }
                    256:        }
                    257: }
                    258: 
                    259: #if VAX8600
                    260: probe_Abus(ioanum, iob)
                    261:        register struct iobus *iob;
                    262: {
                    263:        register struct ioa *ioap;
                    264:        union ioacsr ioacsr;
                    265:        int type;
                    266:        struct sbia_regs *sbiaregs;
                    267: #ifdef notyet
                    268:        int sbi1fail(), sbi1alert(), sbi1fault(), sbi1err();
                    269: #endif
                    270: 
                    271:        ioap = &ioa[ioanum];
                    272:        ioaccess(iob->io_addr, Ioamap[ioanum], iob->io_size);
                    273:        if (badaddr((caddr_t)ioap, 4))
                    274:                return;
                    275:        ioacsr.ioa_csr = ioap->ioacsr.ioa_csr;
                    276:        type = ioacsr.ioa_type & IOA_TYPMSK;
                    277: 
                    278:        switch (type) {
                    279: 
                    280:        case IOA_SBIA:
                    281:                printf("SBIA%d at IO adaptor %d address 0x%x\n",
                    282:                    nsbi, ioanum, iob->io_addr);
                    283: #ifdef notyet
                    284:                /* I AM NOT SURE THESE ARE IN THE SAME PLACES */
                    285:                if (nscb == 1) {
                    286:                        scb[1].scb_sbifail = scbentry(sbi1fail, SCB_ISTACK);
                    287:                        /* maybe not sbifail, maybe scb1.scb_cmrd */
                    288:                        /* but how can I find out without a broken SBIA1? */
                    289:                        scb[1].scb_sbialert = scbentry(sbi1alert, SCB_ISTACK);
                    290:                        scb[1].scb_sbifault = scbentry(sbi1fault, SCB_ISTACK);
                    291:                        scb[1].scb_sbierr = scbentry(sbi1err, SCB_ISTACK);
                    292:                }
                    293: #endif
                    294:                probenexi((struct nexusconnect *)iob->io_details);
                    295:                nsbi++;
                    296:                sbiaregs = (struct sbia_regs *)ioap;
                    297:                sbiaregs->sbi_errsum = -1;
                    298:                sbiaregs->sbi_error = 0x1000;
                    299:                sbiaregs->sbi_fltsts = 0xc0000;
                    300:                break;
                    301: 
                    302:        default:
                    303:                printf("IOA%d at address 0x%x is unsupported (type = 0x%x)\n",
                    304:                    ioanum, iob->io_addr, ioacsr.ioa_type);
                    305:                break;
                    306:        }
                    307: }
                    308: #endif
                    309: 
                    310: #if VAX8600 || VAX780 || VAX750 || VAX730
                    311: /*
                    312:  * Probe nexus space, finding the interconnects
                    313:  * and setting up and probing mba's and uba's for devices.
                    314:  */
                    315: probenexi(pnc)
                    316:        register struct nexusconnect *pnc;
                    317: {
                    318:        register struct nexus *nxv;
                    319:        struct nexus *nxp = pnc->psb_nexbase;
                    320:        union nexcsr nexcsr;
                    321:        int i;
                    322: 
                    323:        ioaccess((caddr_t)nxp, Nexmap[nsbi * NNEXSBI],
                    324:            pnc->psb_nnexus * sizeof(struct nexus));
                    325:        nxv = &nexus[nsbi * NNEXSBI];
                    326:        for (nexnum = 0; nexnum < pnc->psb_nnexus; nexnum++, nxp++, nxv++) {
                    327:                if (badaddr((caddr_t)nxv, 4))
                    328:                        continue;
                    329:                if (pnc->psb_nextype && pnc->psb_nextype[nexnum] != NEX_ANY)
                    330:                        nexcsr.nex_csr = pnc->psb_nextype[nexnum];
                    331:                else
                    332:                        nexcsr = nxv->nexcsr;
                    333:                if (nexcsr.nex_csr&NEX_APD)
                    334:                        continue;
                    335:                switch (nexcsr.nex_type) {
                    336: 
                    337:                case NEX_MBA:
                    338:                        printf("mba%d at tr%d\n", nummba, nexnum);
                    339:                        if (nummba >= NMBA) {
                    340:                                printf("%d mba's", ++nummba);
                    341:                                goto unconfig;
                    342:                        }
                    343: #if NMBA > 0
                    344:                        mbafind(nxv, nxp);
                    345:                        nummba++;
                    346: #endif
                    347:                        break;
                    348: 
                    349:                case NEX_UBA0:
                    350:                case NEX_UBA1:
                    351:                case NEX_UBA2:
                    352:                case NEX_UBA3:
                    353:                        printf("uba%d at tr%d\n", numuba, nexnum);
                    354:                        if (numuba >= NUBA) {
                    355:                                printf("%d uba's", ++numuba);
                    356:                                goto unconfig;
                    357:                        }
                    358: #if NUBA > 0
                    359: #if VAX750
                    360:                        if (numuba >= 2 && cpu == VAX_750) {
                    361:                                printf("More than 2 UBA's");
                    362:                                goto unsupp;
                    363:                        }
                    364: #endif
                    365: #if defined(VAX780) || defined(VAX8600)
                    366:                        if (cpu == VAX_780 || cpu == VAX_8600)
                    367:                                setscbnex(ubaintv[numuba]);
                    368: #endif
                    369:                        i = nexcsr.nex_type - NEX_UBA0;
                    370:                        probeuba((struct uba_regs *)nxv, (struct uba_regs *)nxp,
                    371:                            pnc->psb_umaddr[i]);
                    372: #endif /* NUBA */
                    373:                        break;
                    374: 
                    375:                case NEX_DR32:
                    376:                /* there can be more than one... are there other codes??? */
                    377:                        printf("dr32");
                    378:                        goto unsupp;
                    379: 
                    380:                case NEX_MEM4:
                    381:                case NEX_MEM4I:
                    382:                case NEX_MEM16:
                    383:                case NEX_MEM16I:
                    384:                        printf("mcr%d at tr%d\n", nmcr, nexnum);
                    385:                        if (nmcr >= MAXNMCR) {
                    386:                                printf("%d mcr's", ++nmcr);
                    387:                                goto unconfig;
                    388:                        }
                    389:                        switch (cpu) {
                    390: #if VAX780
                    391:                        case VAX_780:
                    392:                                /* only ka780 code looks at type */
                    393:                                mcrtype[nmcr] = M780C;
                    394:                                break;
                    395: #endif
                    396:                        default:
                    397:                                break;
                    398:                        }
                    399:                        mcraddr[nmcr++] = (caddr_t)nxv;
                    400:                        break;
                    401: 
                    402: #if VAX780
                    403:                case NEX_MEM64I:
                    404:                case NEX_MEM64L:
                    405:                case NEX_MEM64LI:
                    406:                case NEX_MEM256I:
                    407:                case NEX_MEM256L:
                    408:                case NEX_MEM256LI:
                    409:                        printf("mcr%d (el) at tr%d\n", nmcr, nexnum);
                    410:                        if (nmcr >= MAXNMCR) {
                    411:                                printf("%d mcr's", ++nmcr);
                    412:                                goto unconfig;
                    413:                        }
                    414:                        mcrtype[nmcr] = M780EL;
                    415:                        mcraddr[nmcr++] = (caddr_t)nxv;
                    416:                        if (nexcsr.nex_type != NEX_MEM64I && 
                    417:                            nexcsr.nex_type != NEX_MEM256I)
                    418:                                break;
                    419:                        /* fall into ... */
                    420: 
                    421:                case NEX_MEM64U:
                    422:                case NEX_MEM64UI:
                    423:                case NEX_MEM256U:
                    424:                case NEX_MEM256UI:
                    425:                        printf("mcr%d (eu) at tr%d\n", nmcr, nexnum);
                    426:                        if (nmcr >= MAXNMCR) {
                    427:                                printf("%d mcr's", ++nmcr);
                    428:                                goto unconfig;
                    429:                        }
                    430:                        mcrtype[nmcr] = M780EU;
                    431:                        mcraddr[nmcr++] = (caddr_t)nxv;
                    432:                        break;
                    433: #endif
                    434: 
                    435:                case NEX_MPM0:
                    436:                case NEX_MPM1:
                    437:                case NEX_MPM2:
                    438:                case NEX_MPM3:
                    439:                        printf("mpm");
                    440:                        goto unsupp;
                    441: 
                    442:                case NEX_CI:
                    443:                        printf("ci");
                    444:                        goto unsupp;
                    445: 
                    446:                default:
                    447:                        printf("nexus type %x", nexcsr.nex_type);
                    448: unsupp:
                    449:                        printf(" unsupported (at tr %d)\n", nexnum);
                    450:                        continue;
                    451: unconfig:
                    452:                        printf(" not configured\n");
                    453:                        continue;
                    454:                }
                    455:        }
                    456:        if (nummba > NMBA)
                    457:                nummba = NMBA;
                    458:        if (numuba > NUBA)
                    459:                numuba = NUBA;
                    460:        if (nmcr > MAXNMCR)
                    461:                nmcr = MAXNMCR;
                    462: }
                    463: 
                    464: setscbnex(fn)
                    465:        int (*fn)();
                    466: {
                    467:        register struct scb *scbp = &scb[nsbi];
                    468: 
                    469:        scbp->scb_ipl14[nexnum] = scbp->scb_ipl15[nexnum] =
                    470:            scbp->scb_ipl16[nexnum] = scbp->scb_ipl17[nexnum] =
                    471:                scbentry(fn, SCB_ISTACK);
                    472: }
                    473: #endif
                    474: 
                    475: #include "bi.h"
                    476: #if NBI > 0
                    477: /*
                    478:  * Probe BI node space.
                    479:  *
                    480:  * THIS DEPENDS ON BI SPACE == NEXUS SPACE
                    481:  * THIS WILL NOT WORK FOR MULTIPLE BIs
                    482:  */
                    483: probe_bi(p)
                    484:        register struct bibus *p;
                    485: {
                    486:        register struct bi_node *biv, *bip;
                    487:        register int node;
                    488:        short dtype;
                    489: 
                    490:        /* must ignore BI errors while configuring */
                    491:        bip = p->pbi_base;
                    492:        ioaccess((caddr_t)bip, Nexmap[0], sizeof(*bip) * NNODEBI);/* XXX */
                    493:        printf("vaxbi0 at address 0x%x\n", bip);
                    494:        biv = (struct bi_node *) &nexus[0];     /* XXX */
                    495:        for (node = 0; node < NNODEBI; node++, bip++, biv++) {
                    496:                if (badaddr((caddr_t)biv, 4))
                    497:                        continue;
                    498:                bi_nodes |= 1 << node;          /* XXX */
                    499:                dtype = biv->biic.bi_dtype;
                    500:                /* clear bus errors */
                    501:                biv->biic.bi_ber = ~(BIBER_MBZ|BIBER_NMR|BIBER_UPEN);
                    502:                switch (dtype) {
                    503: 
                    504:                case BIDT_KA820: {
                    505:                        /* is this right?? */
                    506:                        int cp5 = biv->biic.bi_revs & 0x8000 ? '5' : '0';
                    507: 
                    508:                        if (node != mastercpu) {
                    509:                                printf("slave ka82%c cpu", cp5);
                    510:                                goto unsupp;
                    511:                        }
                    512:                        printf("ka82%c cpu at node %x\n", cp5, node);
                    513:                        biv->biic.bi_intrdes = 1 << mastercpu;
                    514:                        biv->biic.bi_csr |= BICSR_SEIE | BICSR_HEIE;
                    515:                        break;
                    516:                }
                    517: 
                    518:                case BIDT_DWBUA:
                    519:                        if (numuba >= NUBA || /*XXX*/numuba > 2) {
                    520:                                printf("%d uba's", ++numuba);
                    521:                                goto unconfig;
                    522:                        }
                    523: #if NUBA > 0
                    524:                        printf("uba%d at node %x\n", numuba, node);
                    525: 
                    526:                        /*
                    527:                         * Run a self test reset to drop any `old' errors,
                    528:                         * so that they cannot cause a BI bus error.
                    529:                         */
                    530:                        (void) bi_selftest(&biv->biic);
                    531: 
                    532:                        /*
                    533:                         * Enable interrupts.  DWBUAs must have
                    534:                         * high priority.
                    535:                         */
                    536:                        biv->biic.bi_intrdes = 1 << mastercpu;
                    537:                        biv->biic.bi_csr = (biv->biic.bi_csr&~BICSR_ARB_MASK) |
                    538:                                BICSR_ARB_HIGH;
                    539:                        probeuba((struct uba_regs *)biv, (struct uba_regs *)bip,
                    540:                                (caddr_t)UMEM8200(node));
                    541: #endif /* NUBA */
                    542:                        break;
                    543: 
                    544:                case BIDT_MS820:
                    545:                        printf("mcr%d at node %x\n", nmcr, node);
                    546:                        if (nmcr >= MAXNMCR) {
                    547:                                printf("%d mcr's", ++nmcr);
                    548:                                goto unconfig;
                    549:                        }
                    550:                        mcraddr[nmcr++] = (caddr_t)biv;
                    551:                        biv->biic.bi_intrdes = 1 << mastercpu;
                    552:                        biv->biic.bi_csr |= BICSR_SEIE | BICSR_HEIE;
                    553:                        break;
                    554: 
                    555:                case BIDT_KDB50:
                    556:                        if (numkdb >= NKDB) {
                    557:                                printf("%d kdb's", ++numkdb);
                    558:                                goto unconfig;
                    559:                        }
                    560: #if NKDB > 0
                    561:                        printf("kdb%d at node %x\n", numkdb, node);
                    562:                        kdbconfig(numkdb, (struct biiregs *)biv,
                    563:                                (struct biiregs *)bip,
                    564:                                (int)&scb[0].scb_ipl15[node] - (int)&scb[0]);
                    565:                        scb[0].scb_ipl15[node] =
                    566:                                scbentry(kdbintv[numkdb], SCB_ISTACK);
                    567:                        kdbfind(numkdb);
                    568: #endif
                    569:                        numkdb++;
                    570:                        break;
                    571: 
                    572:                case BIDT_DEBNA:
                    573:                case BIDT_DEBNK:
                    574:                        printf("debna/debnk ethernet");
                    575:                        goto unsupp;
                    576: 
                    577:                default:
                    578:                        printf("node type 0x%x ", dtype);
                    579: unsupp:
                    580:                        printf(" unsupported (at node %x)\n", node);
                    581:                        break;
                    582: unconfig:
                    583:                        printf(" not configured (at node %x)\n", node);
                    584:                        continue;
                    585:                }
                    586: #ifdef DO_EINTRCSR
                    587:                biv->biic.bi_eintrcsr = BIEIC_IPL17 |
                    588:                        (int)&scb[0].scb_bierr - (int)&scb[0];
                    589:                /* but bi reset will need to restore this */
                    590: #endif
                    591:        }
                    592:        if (numuba > NUBA)
                    593:                numuba = NUBA;
                    594:        if (numkdb > NKDB)
                    595:                numkdb = NKDB;
                    596:        if (nmcr > MAXNMCR)
                    597:                nmcr = MAXNMCR;
                    598: }
                    599: 
                    600: #if NKDB > 0
                    601: /*
                    602:  * Find drives attached to a particular KDB50.
                    603:  */
                    604: kdbfind(kdbnum)
                    605:        int kdbnum;
                    606: {
                    607:        extern struct uba_driver kdbdriver;
                    608:        register struct uba_device *ui;
                    609:        register struct uba_driver *udp = &kdbdriver;
                    610:        int t;
                    611: 
                    612:        for (ui = ubdinit; ui->ui_driver; ui++) {
                    613:                /* ui->ui_ubanum is trash */
                    614:                if (ui->ui_driver != udp || ui->ui_alive ||
                    615:                    ui->ui_ctlr != kdbnum && ui->ui_ctlr != '?')
                    616:                        continue;
                    617:                t = ui->ui_ctlr;
                    618:                ui->ui_ctlr = kdbnum;
                    619:                if ((*udp->ud_slave)(ui) == 0) {
                    620:                        ui->ui_ctlr = t;
                    621:                        continue;
                    622:                }
                    623:                ui->ui_alive = 1;
                    624:                ui->ui_ubanum = -1;
                    625: 
                    626:                /* make these invalid so we can see if someone uses them */
                    627:                /* might as well make each one different too */
                    628:                ui->ui_hd = (struct uba_hd *)0xc0000010;
                    629:                ui->ui_addr = (caddr_t)0xc0000014;
                    630:                ui->ui_physaddr = (caddr_t)0xc0000018;
                    631:                ui->ui_mi = (struct uba_ctlr *)0xc000001c;
                    632: 
                    633:                if (ui->ui_dk && dkn < DK_NDRIVE)
                    634:                        ui->ui_dk = dkn++;
                    635:                else
                    636:                        ui->ui_dk = -1;
                    637:                /* ui_type comes from driver */
                    638:                udp->ud_dinfo[ui->ui_unit] = ui;
                    639:                printf("%s%d at %s%d slave %d\n",
                    640:                    udp->ud_dname, ui->ui_unit,
                    641:                    udp->ud_mname, ui->ui_ctlr, ui->ui_slave);
                    642:                (*udp->ud_attach)(ui);
                    643:        }
                    644: }
                    645: #endif /* NKDB > 0 */
                    646: #endif /* NBI > 0 */
                    647: 
                    648: #if NMBA > 0
                    649: struct mba_device *mbaconfig();
                    650: /*
                    651:  * Find devices attached to a particular mba
                    652:  * and look for each device found in the massbus
                    653:  * initialization tables.
                    654:  */
                    655: mbafind(nxv, nxp)
                    656:        struct nexus *nxv, *nxp;
                    657: {
                    658:        register struct mba_regs *mdp;
                    659:        register struct mba_drv *mbd;
                    660:        register struct mba_device *mi;
                    661:        register struct mba_slave *ms;
                    662:        int dn, dt, sn;
                    663:        struct mba_device fnd;
                    664: 
                    665:        mdp = (struct mba_regs *)nxv;
                    666:        mba_hd[nummba].mh_mba = mdp;
                    667:        mba_hd[nummba].mh_physmba = (struct mba_regs *)nxp;
                    668:        setscbnex(mbaintv[nummba]);
                    669:        mdp->mba_cr = MBCR_INIT;
                    670:        mdp->mba_cr = MBCR_IE;
                    671:        fnd.mi_mba = mdp;
                    672:        fnd.mi_mbanum = nummba;
                    673:        for (mbd = mdp->mba_drv, dn = 0; mbd < &mdp->mba_drv[8]; mbd++, dn++) {
                    674:                if ((mbd->mbd_ds&MBDS_DPR) == 0)
                    675:                        continue;
                    676:                mdp->mba_sr |= MBSR_NED;                /* si kludge */
                    677:                dt = mbd->mbd_dt & 0xffff;
                    678:                if (dt == 0)
                    679:                        continue;
                    680:                if (mdp->mba_sr&MBSR_NED)
                    681:                        continue;                       /* si kludge */
                    682:                if (dt == MBDT_MOH)
                    683:                        continue;
                    684:                fnd.mi_drive = dn;
                    685: #define        qeq(a, b)       ( a == b || a == '?' )
                    686:                if ((mi = mbaconfig(&fnd, dt)) && (dt & MBDT_TAP))
                    687:                    for (sn = 0; sn < 8; sn++) {
                    688:                        mbd->mbd_tc = sn;
                    689:                        for (ms = mbsinit; ms->ms_driver; ms++)
                    690:                            if (ms->ms_driver == mi->mi_driver &&
                    691:                                ms->ms_alive == 0 && 
                    692:                                qeq(ms->ms_ctlr, mi->mi_unit) &&
                    693:                                qeq(ms->ms_slave, sn) &&
                    694:                                (*ms->ms_driver->md_slave)(mi, ms, sn)) {
                    695:                                        printf("%s%d at %s%d slave %d\n"
                    696:                                            , ms->ms_driver->md_sname
                    697:                                            , ms->ms_unit
                    698:                                            , mi->mi_driver->md_dname
                    699:                                            , mi->mi_unit
                    700:                                            , sn
                    701:                                        );
                    702:                                        ms->ms_alive = 1;
                    703:                                        ms->ms_ctlr = mi->mi_unit;
                    704:                                        ms->ms_slave = sn;
                    705:                                        break;
                    706:                                }
                    707:                    }
                    708:        }
                    709: }
                    710: 
                    711: /*
                    712:  * Have found a massbus device;
                    713:  * see if it is in the configuration table.
                    714:  * If so, fill in its data.
                    715:  */
                    716: struct mba_device *
                    717: mbaconfig(ni, type)
                    718:        register struct mba_device *ni;
                    719:        register int type;
                    720: {
                    721:        register struct mba_device *mi;
                    722:        register short *tp;
                    723:        register struct mba_hd *mh;
                    724: 
                    725:        for (mi = mbdinit; mi->mi_driver; mi++) {
                    726:                if (mi->mi_alive)
                    727:                        continue;
                    728:                tp = mi->mi_driver->md_type;
                    729:                for (mi->mi_type = 0; *tp; tp++, mi->mi_type++)
                    730:                        if (*tp == (type&MBDT_TYPE))
                    731:                                goto found;
                    732:                continue;
                    733: found:
                    734: #define        match(fld)      (ni->fld == mi->fld || mi->fld == '?')
                    735:                if (!match(mi_drive) || !match(mi_mbanum))
                    736:                        continue;
                    737:                printf("%s%d at mba%d drive %d",
                    738:                    mi->mi_driver->md_dname, mi->mi_unit,
                    739:                    ni->mi_mbanum, ni->mi_drive);
                    740:                mi->mi_alive = 1;
                    741:                mh = &mba_hd[ni->mi_mbanum];
                    742:                mi->mi_hd = mh;
                    743:                mh->mh_mbip[ni->mi_drive] = mi;
                    744:                mh->mh_ndrive++;
                    745:                mi->mi_mba = ni->mi_mba;
                    746:                mi->mi_drv = &mi->mi_mba->mba_drv[ni->mi_drive];
                    747:                mi->mi_mbanum = ni->mi_mbanum;
                    748:                mi->mi_drive = ni->mi_drive;
                    749:                /*
                    750:                 * If drive has never been seen before,
                    751:                 * give it a dkn for statistics.
                    752:                 */
                    753:                if (mi->mi_driver->md_info[mi->mi_unit] == 0) {
                    754:                        mi->mi_driver->md_info[mi->mi_unit] = mi;
                    755:                        if (mi->mi_dk && dkn < DK_NDRIVE)
                    756:                                mi->mi_dk = dkn++;
                    757:                        else
                    758:                                mi->mi_dk = -1;
                    759:                }
                    760:                (*mi->mi_driver->md_attach)(mi);
                    761:                printf("\n");
                    762:                return (mi);
                    763:        }
                    764:        return (0);
                    765: }
                    766: #endif
                    767: 
                    768: /*
                    769:  * Fixctlrmask fixes the masks of the driver ctlr routines
                    770:  * which otherwise save r10 and r11 where the interrupt and br
                    771:  * level are passed through.
                    772:  */
                    773: fixctlrmask()
                    774: {
                    775:        register struct uba_ctlr *um;
                    776:        register struct uba_device *ui;
                    777:        register struct uba_driver *ud;
                    778: #define        phys(a,b) ((b)(((int)(a))&0x7fffffff))
                    779: 
                    780:        for (um = ubminit; ud = phys(um->um_driver, struct uba_driver *); um++)
                    781:                *phys(ud->ud_probe, short *) &= ~0xc00;
                    782:        for (ui = ubdinit; ud = phys(ui->ui_driver, struct uba_driver *); ui++)
                    783:                *phys(ud->ud_probe, short *) &= ~0xc00;
                    784: }
                    785: 
                    786: #ifdef QBA
                    787: /*
                    788:  * Configure a Q-bus.
                    789:  */
                    790: probeqbus(qb)
                    791:        struct qbus *qb;
                    792: {
                    793:        register struct uba_hd *uhp = &uba_hd[numuba];
                    794: 
                    795:        ioaccess((caddr_t)qb->qb_map, Nexmap[0],
                    796:                qb->qb_memsize * sizeof (struct pte));
                    797:        uhp->uh_type = qb->qb_type;
                    798:        uhp->uh_uba = (struct uba_regs *)0xc0000000;   /* no uba adaptor regs */
                    799:        uhp->uh_mr = (struct pte *)&nexus[0];
                    800:        /*
                    801:         * The map registers start right at 20088000 on the
                    802:         * ka630, so we have to subtract out the 2k offset to make the
                    803:         * pointers work..
                    804:         */
                    805:        uhp->uh_physuba = (struct uba_regs *)(((u_long)qb->qb_map)-0x800);
                    806: 
                    807:        uhp->uh_memsize = qb->qb_memsize;
                    808:        ioaccess(qb->qb_maddr, UMEMmap[numuba], uhp->uh_memsize * NBPG);
                    809:        uhp->uh_mem = umem[numuba];
                    810: 
                    811:        /*
                    812:         * The I/O page is mapped to the 8K of the umem address space
                    813:         * immediately after the memory section that is mapped.
                    814:         */
                    815:        ioaccess(qb->qb_iopage, UMEMmap[numuba] + uhp->uh_memsize,
                    816:            UBAIOPAGES * NBPG);
                    817:        uhp->uh_iopage = umem[numuba] + (uhp->uh_memsize * NBPG);
                    818: 
                    819:        unifind(uhp, qb->qb_iopage);
                    820: }
                    821: #endif
                    822: 
                    823: #if NUBA > 0
                    824: probeuba(vubp, pubp, pumem)
                    825:        struct uba_regs *vubp, *pubp;
                    826:        caddr_t pumem;
                    827: {
                    828:        register struct uba_hd *uhp = &uba_hd[numuba];
                    829: 
                    830:        /*
                    831:         * Save virtual and physical addresses of adaptor.
                    832:         */
                    833:        switch (cpu) {
                    834: #ifdef DW780
                    835:        case VAX_8600:
                    836:        case VAX_780:
                    837:                uhp->uh_type = DW780;
                    838:                break;
                    839: #endif
                    840: #ifdef DW750
                    841:        case VAX_750:
                    842:                uhp->uh_type = DW750;
                    843:                break;
                    844: #endif
                    845: #ifdef DW730
                    846:        case VAX_730:
                    847:                uhp->uh_type = DW730;
                    848:                break;
                    849: #endif
                    850: #ifdef DWBUA
                    851:        case VAX_8200:
                    852:                uhp->uh_type = DWBUA;
                    853:                break;
                    854: #endif
                    855:        default:
                    856:                panic("unknown UBA type");
                    857:                /*NOTREACHED*/
                    858:        }
                    859:        uhp->uh_uba = vubp;
                    860:        uhp->uh_physuba = pubp;
                    861:        uhp->uh_mr = vubp->uba_map;
                    862:        uhp->uh_memsize = UBAPAGES;
                    863: 
                    864:        ioaccess(pumem, UMEMmap[numuba], (UBAPAGES + UBAIOPAGES) * NBPG);
                    865:        uhp->uh_mem = umem[numuba];
                    866:        uhp->uh_iopage = umem[numuba] + (uhp->uh_memsize * NBPG);
                    867: 
                    868:        unifind(uhp, pumem + (uhp->uh_memsize * NBPG));
                    869: }
                    870: 
                    871: /*
                    872:  * Find devices on a UNIBUS.
                    873:  * Uses per-driver routine to set <br,cvec> into <r11,r10>,
                    874:  * and then fills in the tables, with help from a per-driver
                    875:  * slave initialization routine.
                    876:  */
                    877: unifind(uhp0, pumem)
                    878:        struct uba_hd *uhp0;
                    879:        caddr_t pumem;
                    880: {
                    881: #ifndef lint
                    882:        register int rbr, rcvec;                        /* MUST BE r11, r10 */
                    883: #else
                    884:        /*
                    885:         * Lint doesn't realize that these
                    886:         * can be initialized asynchronously
                    887:         * when devices interrupt.
                    888:         */
                    889:        register int rbr = 0, rcvec = 0;
                    890: #endif
                    891:        register struct uba_device *ui;
                    892:        register struct uba_ctlr *um;
                    893:        register struct uba_hd *uhp = uhp0;
                    894:        u_short *reg, *ap, addr;
                    895:        struct uba_driver *udp;
                    896:        int i, (**ivec)();
                    897:        caddr_t ualloc;
                    898:        extern quad catcher[128];
                    899:        extern int br, cvec;
                    900: #if DW780 || DWBUA
                    901:        struct uba_regs *vubp = uhp->uh_uba;
                    902: #endif
                    903: 
                    904:        /*
                    905:         * Initialize the UNIBUS, by freeing the map
                    906:         * registers and the buffered data path registers
                    907:         */
                    908:        uhp->uh_map = (struct map *)
                    909:                malloc((u_long)(UAMSIZ * sizeof (struct map)), M_DEVBUF,
                    910:                    M_NOWAIT);
                    911:        if (uhp->uh_map == 0)
                    912:                panic("no mem for unibus map");
                    913:        bzero((caddr_t)uhp->uh_map, (unsigned)(UAMSIZ * sizeof (struct map)));
                    914:        ubainitmaps(uhp);
                    915: 
                    916:        /*
                    917:         * Initialize space for the UNIBUS interrupt vectors.
                    918:         * On the 8600, can't use first slot in UNIvec
                    919:         * (the vectors for the second SBI overlap it);
                    920:         * move each set of vectors forward.
                    921:         */
                    922: #if    VAX8600
                    923:        if (cpu == VAX_8600)
                    924:                uhp->uh_vec = UNIvec[numuba + 1];
                    925:        else
                    926: #endif
                    927:                uhp->uh_vec = UNIvec[numuba];
                    928:        for (i = 0; i < 128; i++)
                    929:                uhp->uh_vec[i] = scbentry(&catcher[i], SCB_ISTACK);
                    930:        /*
                    931:         * Set last free interrupt vector for devices with
                    932:         * programmable interrupt vectors.  Use is to decrement
                    933:         * this number and use result as interrupt vector.
                    934:         */
                    935:        uhp->uh_lastiv = 0x200;
                    936: 
                    937: #ifdef DWBUA
                    938:        if (uhp->uh_type == DWBUA)
                    939:                BUA(vubp)->bua_offset = (int)uhp->uh_vec - (int)&scb[0];
                    940: #endif
                    941: 
                    942: #ifdef DW780
                    943:        if (uhp->uh_type == DW780) {
                    944:                vubp->uba_sr = vubp->uba_sr;
                    945:                vubp->uba_cr = UBACR_IFS|UBACR_BRIE;
                    946:        }
                    947: #endif
                    948:        /*
                    949:         * First configure devices that have unibus memory,
                    950:         * allowing them to allocate the correct map registers.
                    951:         */
                    952:        ubameminit(numuba);
                    953:        /*
                    954:         * Grab some memory to record the umem address space we allocate,
                    955:         * so we can be sure not to place two devices at the same address.
                    956:         *
                    957:         * We could use just 1/8 of this (we only want a 1 bit flag) but
                    958:         * we are going to give it back anyway, and that would make the
                    959:         * code here bigger (which we can't give back), so ...
                    960:         *
                    961:         * One day, someone will make a unibus with something other than
                    962:         * an 8K i/o address space, & screw this totally.
                    963:         */
                    964:        ualloc = (caddr_t)malloc((u_long)(8 * 1024), M_TEMP, M_NOWAIT);
                    965:        if (ualloc == (caddr_t)0)
                    966:                panic("no mem for unifind");
                    967:        bzero(ualloc, 8*1024);
                    968: 
                    969:        /*
                    970:         * Map the first page of UNIBUS i/o
                    971:         * space to the first page of memory
                    972:         * for devices which will need to dma
                    973:         * output to produce an interrupt.
                    974:         */
                    975:        *(int *)(&uhp->uh_mr[0]) = UBAMR_MRV;
                    976: 
                    977: #define        ubaddr(uhp, off)    (u_short *)((int)(uhp)->uh_iopage + ubdevreg(off))
                    978:        /*
                    979:         * Check each unibus mass storage controller.
                    980:         * For each one which is potentially on this uba,
                    981:         * see if it is really there, and if it is record it and
                    982:         * then go looking for slaves.
                    983:         */
                    984:        for (um = ubminit; udp = um->um_driver; um++) {
                    985:                if (um->um_ubanum != numuba && um->um_ubanum != '?' ||
                    986:                    um->um_alive)
                    987:                        continue;
                    988:                addr = (u_short)um->um_addr;
                    989:                /*
                    990:                 * use the particular address specified first,
                    991:                 * or if it is given as "0", of there is no device
                    992:                 * at that address, try all the standard addresses
                    993:                 * in the driver til we find it
                    994:                 */
                    995:            for (ap = udp->ud_addr; addr || (addr = *ap++); addr = 0) {
                    996: 
                    997:                if (ualloc[ubdevreg(addr)])
                    998:                        continue;
                    999:                reg = ubaddr(uhp, addr);
                   1000:                if (badaddr((caddr_t)reg, 2))
                   1001:                        continue;
                   1002: #ifdef DW780
                   1003:                if (uhp->uh_type == DW780 && vubp->uba_sr) {
                   1004:                        vubp->uba_sr = vubp->uba_sr;
                   1005:                        continue;
                   1006:                }
                   1007: #endif
                   1008:                cvec = 0x200;
                   1009:                rcvec = 0x200;
                   1010:                i = (*udp->ud_probe)(reg, um->um_ctlr, um);
                   1011: #ifdef DW780
                   1012:                if (uhp->uh_type == DW780 && vubp->uba_sr) {
                   1013:                        vubp->uba_sr = vubp->uba_sr;
                   1014:                        continue;
                   1015:                }
                   1016: #endif
                   1017:                if (i == 0)
                   1018:                        continue;
                   1019:                printf("%s%d at uba%d csr %o ",
                   1020:                    udp->ud_mname, um->um_ctlr, numuba, addr);
                   1021:                if (rcvec == 0) {
                   1022:                        printf("zero vector\n");
                   1023:                        continue;
                   1024:                }
                   1025:                if (rcvec == 0x200) {
                   1026:                        printf("didn't interrupt\n");
                   1027:                        continue;
                   1028:                }
                   1029:                printf("vec %o, ipl %x\n", rcvec, rbr);
                   1030:                csralloc(ualloc, addr, i);
                   1031:                um->um_alive = 1;
                   1032:                um->um_ubanum = numuba;
                   1033:                um->um_hd = uhp;
                   1034:                um->um_addr = (caddr_t)reg;
                   1035:                udp->ud_minfo[um->um_ctlr] = um;
                   1036:                for (rcvec /= 4, ivec = um->um_intr; *ivec; rcvec++, ivec++)
                   1037:                        uhp->uh_vec[rcvec] = scbentry(*ivec, SCB_ISTACK);
                   1038:                for (ui = ubdinit; ui->ui_driver; ui++) {
                   1039:                        int t;
                   1040: 
                   1041:                        if (ui->ui_driver != udp || ui->ui_alive ||
                   1042:                            ui->ui_ctlr != um->um_ctlr && ui->ui_ctlr != '?' ||
                   1043:                            ui->ui_ubanum != numuba && ui->ui_ubanum != '?')
                   1044:                                continue;
                   1045:                        t = ui->ui_ctlr;
                   1046:                        ui->ui_ctlr = um->um_ctlr;
                   1047:                        if ((*udp->ud_slave)(ui, reg) == 0)
                   1048:                                ui->ui_ctlr = t;
                   1049:                        else {
                   1050:                                ui->ui_alive = 1;
                   1051:                                ui->ui_ubanum = numuba;
                   1052:                                ui->ui_hd = uhp;
                   1053:                                ui->ui_addr = (caddr_t)reg;
                   1054:                                ui->ui_physaddr = pumem + ubdevreg(addr);
                   1055:                                if (ui->ui_dk && dkn < DK_NDRIVE)
                   1056:                                        ui->ui_dk = dkn++;
                   1057:                                else
                   1058:                                        ui->ui_dk = -1;
                   1059:                                ui->ui_mi = um;
                   1060:                                /* ui_type comes from driver */
                   1061:                                udp->ud_dinfo[ui->ui_unit] = ui;
                   1062:                                printf("%s%d at %s%d slave %d",
                   1063:                                    udp->ud_dname, ui->ui_unit,
                   1064:                                    udp->ud_mname, um->um_ctlr, ui->ui_slave);
                   1065:                                (*udp->ud_attach)(ui);
                   1066:                                printf("\n");
                   1067:                        }
                   1068:                }
                   1069:                break;
                   1070:            }
                   1071:        }
                   1072:        /*
                   1073:         * Now look for non-mass storage peripherals.
                   1074:         */
                   1075:        for (ui = ubdinit; udp = ui->ui_driver; ui++) {
                   1076:                if (ui->ui_ubanum != numuba && ui->ui_ubanum != '?' ||
                   1077:                    ui->ui_alive || ui->ui_slave != -1)
                   1078:                        continue;
                   1079:                addr = (u_short)ui->ui_addr;
                   1080: 
                   1081:            for (ap = udp->ud_addr; addr || (addr = *ap++); addr = 0) {
                   1082:                
                   1083:                if (ualloc[ubdevreg(addr)])
                   1084:                        continue;
                   1085:                reg = ubaddr(uhp, addr);
                   1086:                if (badaddr((caddr_t)reg, 2))
                   1087:                        continue;
                   1088: #ifdef DW780
                   1089:                if (uhp->uh_type == DW780 && vubp->uba_sr) {
                   1090:                        vubp->uba_sr = vubp->uba_sr;
                   1091:                        continue;
                   1092:                }
                   1093: #endif
                   1094:                rcvec = 0x200;
                   1095:                cvec = 0x200;
                   1096:                i = (*udp->ud_probe)(reg, ui);
                   1097: #ifdef DW780
                   1098:                if (uhp->uh_type == DW780 && vubp->uba_sr) {
                   1099:                        vubp->uba_sr = vubp->uba_sr;
                   1100:                        continue;
                   1101:                }
                   1102: #endif
                   1103:                if (i == 0)
                   1104:                        continue;
                   1105:                printf("%s%d at uba%d csr %o ",
                   1106:                    ui->ui_driver->ud_dname, ui->ui_unit, numuba, addr);
                   1107:                if (rcvec == 0) {
                   1108:                        printf("zero vector\n");
                   1109:                        continue;
                   1110:                }
                   1111:                if (rcvec == 0x200) {
                   1112:                        printf("didn't interrupt\n");
                   1113:                        continue;
                   1114:                }
                   1115:                printf("vec %o, ipl %x\n", rcvec, rbr);
                   1116:                csralloc(ualloc, addr, i);
                   1117:                ui->ui_hd = uhp;
                   1118:                for (rcvec /= 4, ivec = ui->ui_intr; *ivec; rcvec++, ivec++)
                   1119:                        uhp->uh_vec[rcvec] = scbentry(*ivec, SCB_ISTACK);
                   1120:                ui->ui_alive = 1;
                   1121:                ui->ui_ubanum = numuba;
                   1122:                ui->ui_addr = (caddr_t)reg;
                   1123:                ui->ui_physaddr = pumem + ubdevreg(addr);
                   1124:                ui->ui_dk = -1;
                   1125:                /* ui_type comes from driver */
                   1126:                udp->ud_dinfo[ui->ui_unit] = ui;
                   1127:                (*udp->ud_attach)(ui);
                   1128:                break;
                   1129:            }
                   1130:        }
                   1131: 
                   1132: #ifdef DW780
                   1133:        if (uhp->uh_type == DW780)
                   1134:                uhp->uh_uba->uba_cr = UBACR_IFS | UBACR_BRIE |
                   1135:                    UBACR_USEFIE | UBACR_SUEFIE |
                   1136:                    (uhp->uh_uba->uba_cr & 0x7c000000);
                   1137: #endif
                   1138:        numuba++;
                   1139: 
                   1140: #ifdef AUTO_DEBUG
                   1141:        printf("Unibus allocation map");
                   1142:        for (i = 0; i < 8*1024; ) {
                   1143:                register n, m;
                   1144: 
                   1145:                if ((i % 128) == 0) {
                   1146:                        printf("\n%6o:", i);
                   1147:                        for (n = 0; n < 128; n++)
                   1148:                                if (ualloc[i+n])
                   1149:                                        break;
                   1150:                        if (n == 128) {
                   1151:                                i += 128;
                   1152:                                continue;
                   1153:                        }
                   1154:                }
                   1155: 
                   1156:                for (n = m = 0; n < 16; n++) {
                   1157:                        m <<= 1;
                   1158:                        m |= ualloc[i++];
                   1159:                }
                   1160: 
                   1161:                printf(" %4x", m);
                   1162:        }
                   1163:        printf("\n");
                   1164: #endif
                   1165: 
                   1166:        free(ualloc, M_TEMP);
                   1167: }
                   1168: #endif /* NUBA */
                   1169: 
                   1170: /*
                   1171:  * Mark addresses starting at "addr" and continuing
                   1172:  * "size" bytes as allocated in the map "ualloc".
                   1173:  * Warn if the new allocation overlaps a previous allocation.
                   1174:  */
                   1175: static
                   1176: csralloc(ualloc, addr, size)
                   1177:        caddr_t ualloc;
                   1178:        u_short addr;
                   1179:        register int size;
                   1180: {
                   1181:        register caddr_t p;
                   1182:        int warned = 0;
                   1183: 
                   1184:        p = &ualloc[ubdevreg(addr+size)];
                   1185:        while (--size >= 0) {
                   1186:                if (*--p && !warned) {
                   1187:                        printf(
                   1188:        "WARNING: device registers overlap those for a previous device!\n");
                   1189:                        warned = 1;
                   1190:                }
                   1191:                *p = 1;
                   1192:        }
                   1193: }
                   1194: 
                   1195: /*
                   1196:  * Make an IO register area accessible at physical address physa
                   1197:  * by mapping kernel ptes starting at pte.
                   1198:  */
                   1199: ioaccess(physa, pte, size)
                   1200:        caddr_t physa;
                   1201:        register struct pte *pte;
                   1202:        int size;
                   1203: {
                   1204:        register int i = btoc(size);
                   1205:        register unsigned v = btop(physa);
                   1206:        
                   1207:        do
                   1208:                *(int *)pte++ = PG_V|PG_KW|v++;
                   1209:        while (--i > 0);
                   1210:        mtpr(TBIA, 0);
                   1211: }
                   1212: 
                   1213: /*
                   1214:  * Configure swap space and related parameters.
                   1215:  */
                   1216: swapconf()
                   1217: {
                   1218:        register struct swdevt *swp;
                   1219:        register int nblks;
                   1220: 
                   1221:        for (swp = swdevt; swp->sw_dev; swp++)
                   1222:                if (bdevsw[major(swp->sw_dev)].d_psize) {
                   1223:                        nblks =
                   1224:                          (*bdevsw[major(swp->sw_dev)].d_psize)(swp->sw_dev);
                   1225:                        if (nblks != -1 &&
                   1226:                            (swp->sw_nblks == 0 || swp->sw_nblks > nblks))
                   1227:                                swp->sw_nblks = nblks;
                   1228:                }
                   1229:        dumpconf();
                   1230: }
                   1231: 
                   1232: #define        DOSWAP                  /* Change swdevt, argdev, and dumpdev too */
                   1233: u_long bootdev;                /* should be dev_t, but not until 32 bits */
                   1234: 
                   1235: static char devname[][2] = {
                   1236:        'h','p',        /* 0 = hp */
                   1237:        0,0,            /* 1 = ht */
                   1238:        'u','p',        /* 2 = up */
                   1239:        'r','k',        /* 3 = hk */
                   1240:        0,0,            /* 4 = sw */
                   1241:        0,0,            /* 5 = tm */
                   1242:        0,0,            /* 6 = ts */
                   1243:        0,0,            /* 7 = mt */
                   1244:        0,0,            /* 8 = tu */
                   1245:        'r','a',        /* 9 = ra */
                   1246:        0,0,            /* 10 = ut */
                   1247:        'r','b',        /* 11 = rb */
                   1248:        0,0,            /* 12 = uu */
                   1249:        0,0,            /* 13 = rx */
                   1250:        'r','l',        /* 14 = rl */
                   1251:        0,0,            /* 15 = tmscp */
                   1252:        'k','r',        /* 16 = ra on kdb50 */
                   1253: };
                   1254: 
                   1255: #define        PARTITIONMASK   0x7
                   1256: #define        PARTITIONSHIFT  3
                   1257: 
                   1258: /*
                   1259:  * Attempt to find the device from which we were booted.
                   1260:  * If we can do so, and not instructed not to do so,
                   1261:  * change rootdev to correspond to the load device.
                   1262:  */
                   1263: setroot()
                   1264: {
                   1265:        int  majdev, mindev, unit, part, controller, adaptor;
                   1266:        dev_t temp, orootdev;
                   1267:        struct swdevt *swp;
                   1268: 
                   1269:        if (boothowto & RB_DFLTROOT ||
                   1270:            (bootdev & B_MAGICMASK) != (u_long)B_DEVMAGIC)
                   1271:                return;
                   1272:        majdev = B_TYPE(bootdev);
                   1273:        if (majdev >= sizeof(devname) / sizeof(devname[0]))
                   1274:                return;
                   1275:        adaptor = B_ADAPTOR(bootdev);
                   1276:        controller = B_CONTROLLER(bootdev);
                   1277:        part = B_PARTITION(bootdev);
                   1278:        unit = B_UNIT(bootdev);
                   1279:        if (majdev == 0) {      /* MBA device */
                   1280: #if NMBA > 0
                   1281:                register struct mba_device *mbap;
                   1282:                int mask;
                   1283: 
                   1284: /*
                   1285:  * The MBA number used at boot time is not necessarily the same as the
                   1286:  * MBA number used by the kernel.  In order to change the rootdev we need to
                   1287:  * convert the boot MBA number to the kernel MBA number.  The address space
                   1288:  * for an MBA used by the boot code is 0x20010000 + 0x2000 * MBA_number
                   1289:  * on the 78? and 86?0, 0xf28000 + 0x2000 * MBA_number on the 750.
                   1290:  * Therefore we can search the mba_hd table for the MBA that has the physical
                   1291:  * address corresponding to the boot MBA number.
                   1292:  */
                   1293: #define        PHYSADRSHFT     13
                   1294: #define        PHYSMBAMASK780  0x7
                   1295: #define        PHYSMBAMASK750  0x3
                   1296: 
                   1297:                switch (cpu) {
                   1298: 
                   1299:                case VAX_780:
                   1300:                case VAX_8600:
                   1301:                default:
                   1302:                        mask = PHYSMBAMASK780;
                   1303:                        break;
                   1304: 
                   1305:                case VAX_750:
                   1306:                        mask = PHYSMBAMASK750;
                   1307:                        break;
                   1308:                }
                   1309:                for (mbap = mbdinit; mbap->mi_driver; mbap++)
                   1310:                        if (mbap->mi_alive && mbap->mi_drive == unit &&
                   1311:                            (((long)mbap->mi_hd->mh_physmba >> PHYSADRSHFT)
                   1312:                              & mask) == adaptor)
                   1313:                                break;
                   1314:                if (mbap->mi_driver == 0)
                   1315:                        return;
                   1316:                mindev = mbap->mi_unit;
                   1317: #else
                   1318:                return;
                   1319: #endif
                   1320:        } else {
                   1321:                register struct uba_device *ubap;
                   1322: 
                   1323:                for (ubap = ubdinit; ubap->ui_driver; ubap++)
                   1324:                        if (ubap->ui_alive && ubap->ui_slave == unit &&
                   1325:                           ubap->ui_ctlr == controller &&
                   1326:                           ubap->ui_ubanum == adaptor &&
                   1327:                           ubap->ui_driver->ud_dname[0] == devname[majdev][0] &&
                   1328:                           ubap->ui_driver->ud_dname[1] == devname[majdev][1])
                   1329:                                break;
                   1330: 
                   1331:                if (ubap->ui_driver == 0)
                   1332:                        return;
                   1333:                mindev = ubap->ui_unit;
                   1334:        }
                   1335:        mindev = (mindev << PARTITIONSHIFT) + part;
                   1336:        orootdev = rootdev;
                   1337:        rootdev = makedev(majdev, mindev);
                   1338:        /*
                   1339:         * If the original rootdev is the same as the one
                   1340:         * just calculated, don't need to adjust the swap configuration.
                   1341:         */
                   1342:        if (rootdev == orootdev)
                   1343:                return;
                   1344: 
                   1345:        printf("Changing root device to %c%c%d%c\n",
                   1346:                devname[majdev][0], devname[majdev][1],
                   1347:                mindev >> PARTITIONSHIFT, part + 'a');
                   1348: 
                   1349: #ifdef DOSWAP
                   1350:        mindev &= ~PARTITIONMASK;
                   1351:        for (swp = swdevt; swp->sw_dev; swp++) {
                   1352:                if (majdev == major(swp->sw_dev) &&
                   1353:                    mindev == (minor(swp->sw_dev) & ~PARTITIONMASK)) {
                   1354:                        temp = swdevt[0].sw_dev;
                   1355:                        swdevt[0].sw_dev = swp->sw_dev;
                   1356:                        swp->sw_dev = temp;
                   1357:                        break;
                   1358:                }
                   1359:        }
                   1360:        if (swp->sw_dev == 0)
                   1361:                return;
                   1362: 
                   1363:        /*
                   1364:         * If argdev and dumpdev were the same as the old primary swap
                   1365:         * device, move them to the new primary swap device.
                   1366:         */
                   1367:        if (temp == dumpdev)
                   1368:                dumpdev = swdevt[0].sw_dev;
                   1369:        if (temp == argdev)
                   1370:                argdev = swdevt[0].sw_dev;
                   1371: #endif
                   1372: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.