Annotation of 40BSD/sys/dev/uba.c, revision 1.1.1.1

1.1       root        1: /*     uba.c   4.2     11/9/80 */
                      2: 
                      3: #include "../h/param.h"
                      4: #include "../h/map.h"
                      5: #include "../h/pte.h"
                      6: #include "../h/uba.h"
                      7: #include "../h/buf.h"
                      8: #include "../h/dir.h"
                      9: #include "../h/user.h"
                     10: #include "../h/proc.h"
                     11: #include "../h/vm.h"
                     12: #include "../h/conf.h"
                     13: 
                     14: /*
                     15:  * Allocate as many contiguous UBA mapping registers
                     16:  * as are necessary to do transfer of bcnt bytes
                     17:  * to/from location baddr.  Wait for enough map registers.
                     18:  *
                     19:  * Bdpflg is non-zero if a "buffered data path" (BDP) is
                     20:  * to be used, else 0 -> use direct data path (DDP).  Return
                     21:  *
                     22:  *     Bits 0-8        Byte offset
                     23:  *     Bits 9-17       Start map reg. no.
                     24:  *     Bits 18-27      No. mapping reg's
                     25:  *     Bits 28-31      BDP no.
                     26:  */
                     27: ubasetup(bp, bdpflg)
                     28: struct buf *bp;
                     29: {
                     30:        register int temp, i;
                     31:        int npf, reg, bdp;
                     32:        unsigned v;
                     33:        register struct pte *pte, *io;
                     34:        struct proc *rp;
                     35:        int a, o, ubinfo;
                     36: 
                     37:        v = btop(bp->b_un.b_addr);
                     38:        o = (int)bp->b_un.b_addr & PGOFSET;
                     39:        npf = btoc(bp->b_bcount + o) + 1;
                     40:        a = spl6();
                     41:        while ((reg = malloc(ubamap, npf)) == 0) {
                     42:                panic("ran out of uba map");
                     43:                umrwant++;
                     44:                sleep((caddr_t)ubamap, PSWP);
                     45:        }
                     46:        reg--;
                     47:        bdp = 0;
                     48:        if (bdpflg)
                     49:                while ((bdp = malloc(bdpmap, 1)) == 0) {
                     50:                        panic("ran out of bdp's");
                     51:                        bdpwant++;
                     52:                        sleep((caddr_t)bdpmap, PSWP);
                     53:                }
                     54:        splx(a);
                     55:        ubinfo = (bdp << 28) | (npf << 18) | (reg << 9) | o;
                     56:        io = &(((struct uba_regs *)UBA0)->uba_map[reg]);
                     57:        temp = (bdp << 21) | MRV;
                     58:        rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc;
                     59:        if (bdp && (o & 01))
                     60:                temp |= BO;
                     61:        if (bp->b_flags & B_UAREA) {
                     62:                for (i = UPAGES - bp->b_bcount / NBPG; i < UPAGES; i++) {
                     63:                        if (rp->p_addr[i].pg_pfnum == 0)
                     64:                                panic("uba: zero upage");
                     65:                        *(int *)io++ = rp->p_addr[i].pg_pfnum | temp;
                     66:                }
                     67:        } else if ((bp->b_flags & B_PHYS) == 0) {
                     68:                pte = &Sysmap[btop(((int)bp->b_un.b_addr)&0x7fffffff)];
                     69:                while (--npf != 0)
                     70:                        *(int *)io++ = pte++->pg_pfnum | temp;
                     71:        } else {
                     72:                if (bp->b_flags & B_PAGET)
                     73:                        pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)];
                     74:                else
                     75:                        pte = vtopte(rp, v);
                     76:                while (--npf != 0) {
                     77:                        if (pte->pg_pfnum == 0)
                     78:                                panic("uba zero uentry");
                     79:                        *(int *)io++ = pte++->pg_pfnum | temp;
                     80:                }
                     81:        }
                     82:        *(int *)io++ = 0;
                     83:        return (ubinfo);
                     84: }
                     85: 
                     86: /*
                     87:  * Non buffer unibus interface... set up a buffer and call ubasetup.
                     88:  */
                     89: uballoc(addr, bcnt, bdpflg)
                     90:        caddr_t addr;
                     91:        unsigned short bcnt;
                     92: {
                     93:        struct buf ubabuf;
                     94: 
                     95:        ubabuf.b_un.b_addr = addr;
                     96:        ubabuf.b_flags = B_BUSY;
                     97:        ubabuf.b_bcount = bcnt;
                     98:        /* that's all the fields ubasetup() needs */
                     99:        return (ubasetup(&ubabuf, bdpflg));
                    100: }
                    101:  
                    102: ubafree(mr)
                    103:        int mr;
                    104: {
                    105:        register int bdp, reg, npf, a;
                    106:  
                    107:        a = spl6();
                    108:        bdp = (mr >> 28) & 0x0f;
                    109:        if (bdp) {
                    110:                ((struct uba_regs *)UBA0)->uba_dpr[bdp] |= BNE; /* purge */
                    111:                mfree(bdpmap, 1, bdp);
                    112:                if (bdpwant) {
                    113:                        bdpwant = 0;
                    114:                        wakeup((caddr_t)bdpmap);
                    115:                }
                    116:        }
                    117:        npf = (mr >> 18) & 0x3ff;
                    118:        reg = ((mr >> 9) & 0x1ff) + 1;
                    119:        mfree(ubamap, npf, reg);
                    120:        if (umrwant) {
                    121:                umrwant = 0;
                    122:                wakeup((caddr_t)ubamap);
                    123:        }
                    124:        splx(a);
                    125: }
                    126: 
                    127: ubainit()
                    128: {
                    129: 
                    130:        mfree(ubamap, 496, 1);
                    131:        mfree(bdpmap, 15, 1);
                    132: }
                    133: 
                    134: #define        DELAY(N)        { register int d; d = N; while (--d > 0); }
                    135: 
                    136: ubareset()
                    137: {
                    138:        struct uba_regs *up = (struct uba_regs *)UBA0;
                    139:        register struct cdevsw *cdp;
                    140:        int s;
                    141: 
                    142:        s = spl6();
                    143:        printf("UBA RESET:");
                    144:        up->uba_cr = ADINIT;
                    145:        up->uba_cr = IFS|BRIE|USEFIE|SUEFIE;
                    146:        while ((up->uba_cnfgr & UBIC) == 0)
                    147:                ;
                    148:        for (cdp = cdevsw; cdp->d_open; cdp++)
                    149:                (*cdp->d_reset)();
                    150:        printf("\n");
                    151:        splx(s);
                    152: }

unix.superglobalmegacorp.com

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