Annotation of researchv8dc/sys/dev/cv.c, revision 1.1.1.1

1.1       root        1: #include "cv.h"
                      2: #if NCV > 0
                      3: /*
                      4:  * Raster Technologies Color Video Interface -- Rob Pike
                      5:  *     Model One 20 with Option Card, on DR-11/W
                      6:  */
                      7: 
                      8: #include "../h/param.h"
                      9: #include "../h/dir.h"
                     10: #include "../h/user.h"
                     11: #include "../h/buf.h"
                     12: #include "../h/systm.h"
                     13: #include "../h/pte.h"
                     14: #include "../h/map.h"
                     15: #include "../h/ioctl.h"
                     16: #include "../h/ubareg.h"
                     17: #include "../h/ubavar.h"
                     18: 
                     19: struct cvdevice {
                     20:        short   wcr;            /* Unibus word count reg */
                     21:        u_short bar;            /* Unibus address register */
                     22:        u_short csr;            /* Unibus status/command reg */
                     23:        u_short idr;            /* Input Data Register */
                     24: };
                     25: #define        eir     csr             /* Error and Information Register */
                     26: #define        odr     idr             /* Output Data Register */
                     27: 
                     28: /*
                     29:  * Unibus status/command register bits
                     30:  */
                     31: 
                     32: #define GO             0000001
                     33: #define IENABLE                0000100
                     34: #define READY          0000200
                     35: #define        MAINT           0010000
                     36: #define        ERROR           0100000
                     37: 
                     38: /*
                     39:  * Function codes
                     40:  */
                     41: #define        WR_IMAGE        (1<<1)
                     42: #define        WR_CMD          (4<<1)
                     43: #define        WR_RLE          (5<<1)  
                     44: #define RD_CMD         (7<<1)
                     45: #define RD_IMAGE       (3<<1)
                     46: #define        FUNCMASK        (7<<1)
                     47: #define        TOGGLE          (8<<1)  /* toggle between X and WR_CMD, WR_CMD first */
                     48: 
                     49: /*
                     50:  * IOCTL
                     51:  */
                     52: #define        CVSETDMA        (('c'<<8)|1)
                     53: 
                     54: #define BUSY 01
                     55: #define DMAPRI (PZERO-1)
                     56: #define WAITPRI (PZERO+1)
                     57: 
                     58: int    cvprobe(), cvattach(), cvintr();
                     59: struct uba_device *cvdinfo[NCV];
                     60: u_short        cvstd[] = { 0772410, 0000000, 0 };
                     61: struct uba_driver cvdriver = {
                     62:        cvprobe, 0, cvattach, 0, cvstd, "cv", cvdinfo, 0, 0
                     63: };
                     64: 
                     65: struct cvsoftc {
                     66:        char    open;
                     67:        short   uid;
                     68:        short   state;
                     69:        int     ubinfo;
                     70:        int     count;
                     71:        struct  buf *bp;
                     72:        int     bufp;
                     73:        int     icnt;
                     74:        short   dmamode;
                     75:        short   func;
                     76: } cvsoftc[NCV];
                     77: 
                     78: int    cvstrategy();
                     79: u_int  cvminphys();
                     80: struct buf rcvbuf[NCV];
                     81: 
                     82: #define UNIT(dev) (minor(dev))
                     83: 
                     84: cvprobe(reg)
                     85:        caddr_t reg;
                     86: {
                     87:        register int br, cvec;          /* value-result */
                     88:        register struct cvdevice *cvaddr = (struct cvdevice *) reg;
                     89: 
                     90: #ifdef lint
                     91:        br = 0; cvec = br; br = cvec;
                     92:        cvintr(0);
                     93: #endif
                     94:        cvaddr->csr = IENABLE;
                     95:        cvaddr->odr = 0x0707;   /* clear screen, force interrupt */
                     96:        DELAY(10000);
                     97:        cvaddr->csr = 0;
                     98:        /* KLUDGE */
                     99:        br=0x15;
                    100:        cvec=0124;
                    101:        return (sizeof (struct cvdevice));
                    102: }
                    103: 
                    104: /*ARGSUSED*/
                    105: cvattach(ui)
                    106:        struct uba_device *ui;
                    107: {
                    108: 
                    109: }
                    110: 
                    111: cvopen(dev)
                    112:        dev_t dev;
                    113: {
                    114:        register struct cvsoftc *cvp;
                    115:        register struct uba_device *ui;
                    116: 
                    117:        if (UNIT(dev) >= NCV || (cvp = &cvsoftc[minor(dev)])->open ||
                    118:            (ui = cvdinfo[UNIT(dev)]) == 0 || ui->ui_alive == 0)
                    119:                u.u_error = EBUSY;
                    120:        else {
                    121:                cvp->open = 1;
                    122:                cvp->icnt = 0;
                    123:                cvp->state = 0;
                    124:                cvp->uid = u.u_uid;
                    125:                cvp->dmamode = -1;
                    126:        }
                    127: }
                    128: 
                    129: cvclose(dev)
                    130:        dev_t dev;
                    131: {
                    132: 
                    133:        cvsoftc[minor(dev)].open = 0;
                    134:        cvsoftc[minor(dev)].state = 0;
                    135: }
                    136: 
                    137: cvread(dev, uio)
                    138:        dev_t dev;
                    139:        struct uio *uio;
                    140: {
                    141:        register int unit = UNIT(dev);
                    142: 
                    143:        if (unit >= NCV)
                    144:                return (ENXIO);
                    145:        return (physio(cvstrategy, &rcvbuf[unit], dev, B_READ, cvminphys, uio));
                    146: }
                    147: 
                    148: cvwrite(dev, uio)
                    149:        dev_t dev;
                    150:        struct uio *uio;
                    151: {
                    152:        register int unit = UNIT(dev);
                    153: 
                    154:        if (unit >= NCV)
                    155:                return (ENXIO);
                    156:        return (physio(cvstrategy, &rcvbuf[unit], dev, B_WRITE, cvminphys, uio));
                    157: }
                    158: 
                    159: u_int
                    160: cvminphys(bp)
                    161:        register struct buf *bp;
                    162: {
                    163: 
                    164:        if (bp->b_bcount > 65536)       /* may be able to do twice as much */
                    165:                bp->b_bcount = 65536;
                    166: }
                    167: 
                    168: cvstrategy(bp)
                    169:        register struct buf *bp;
                    170: {
                    171:        register struct cvsoftc *cvp = &cvsoftc[UNIT(bp->b_dev)];
                    172:        register struct uba_device *ui;
                    173: 
                    174:        if (UNIT(bp->b_dev) >= NCV || (ui = cvdinfo[UNIT(bp->b_dev)]) == 0
                    175:                                || ui->ui_alive == 0)
                    176:                goto bad;
                    177:        (void) spl5();
                    178:        while (cvp->state & BUSY)
                    179:                sleep((caddr_t)cvp, DMAPRI+1);
                    180:        cvp->state |= BUSY;
                    181:        cvp->bp = bp;
                    182:        if(bp->b_bcount<=0 || (bp->b_bcount&1) || 
                    183:            ((int)bp->b_un.b_addr&1) || cvp->dmamode<0){
                    184:                u.u_error = EINVAL;
                    185:                goto bad;
                    186:        }
                    187:        cvp->ubinfo = ubasetup(ui->ui_ubanum, bp, UBA_NEEDBDP);
                    188:        cvp->bufp = cvp->ubinfo & 0x3ffff;
                    189:        cvp->count = -(bp->b_bcount>>1);        /* it's a word count */
                    190:        cvstart(ui);
                    191:        if(tsleep((caddr_t)cvp, DMAPRI+1, 15) != TS_OK){
                    192:                register struct cvdevice *cvaddr = (struct cvdevice *) ui->ui_addr;
                    193:                bp->b_flags |= B_ERROR;
                    194:                /* stop the dma */
                    195:                cvslam(cvaddr);
                    196:                cvaddr->wcr=0xFFFF;     /* gently; -1 first... */
                    197:                cvaddr->wcr=0x0000;     /* then zero */
                    198:                /* reset device */
                    199:                cvslam(cvaddr);
                    200:                /* fake an interrupt to clear software status */
                    201:                cvintr(UNIT(bp->b_dev));
                    202:        }
                    203:        cvp->count = 0;
                    204:        cvp->bufp = 0;
                    205:        (void) spl0();
                    206:        ubarelse(ui->ui_ubanum, &cvp->ubinfo);
                    207:        cvp->bp = 0;
                    208:        iodone(bp);
                    209:        wakeup((caddr_t)cvp);
                    210:        return;
                    211:    bad:
                    212:        cvp->state &= ~BUSY;
                    213:        bp->b_flags |= B_ERROR;
                    214:        iodone(bp);
                    215:        return;
                    216: }
                    217: 
                    218: cvslam(cvaddr)
                    219:        register struct cvdevice *cvaddr;
                    220: {
                    221:        register i;
                    222:        cvaddr->csr=MAINT;
                    223:        for(i=0; i<10; i++)
                    224:                ;
                    225:        cvaddr->csr=0;
                    226:        for(i=0; i<10; i++)
                    227:                ;
                    228: }
                    229: cvstart(ui)
                    230:        register struct uba_device *ui;
                    231: {
                    232:        register int csr;
                    233:        register struct cvdevice *cvaddr = (struct cvdevice *) ui->ui_addr;
                    234:        register struct cvsoftc *cvp = &cvsoftc[UNIT(ui->ui_unit)];
                    235: 
                    236:        if((cvp->dmamode&TOGGLE) && cvp->func!=WR_CMD)
                    237:                cvp->func = WR_CMD;
                    238:        else
                    239:                cvp->func = cvp->dmamode&~TOGGLE;
                    240:        csr = IENABLE|((cvp->bufp>>12)&060) | cvp->func;
                    241:        cvaddr->wcr =  cvp->count;
                    242:        cvaddr->bar = cvp->bufp;
                    243:        cvaddr->csr = csr;      /* No GO bit; let function codes settle */
                    244:        cvaddr->csr = csr|GO;
                    245: }
                    246: 
                    247: /*ARGSUSED*/
                    248: cvioctl(dev, cmd, data)
                    249:        dev_t dev;
                    250:        int cmd;
                    251:        register caddr_t data;
                    252: {
                    253:        register struct uba_device *ui = cvdinfo[UNIT(dev)];
                    254:        register struct cvsoftc *cvp = &cvsoftc[UNIT(dev)];
                    255:        int fmt;
                    256: 
                    257:        switch (cmd) {
                    258:        case CVSETDMA:  /* set DMA mode */
                    259:                if (copyin(data, (caddr_t)&fmt, sizeof(fmt))) {
                    260:                        u.u_error = EFAULT;
                    261:                        goto out;
                    262:                }
                    263:                switch (fmt&~TOGGLE) {
                    264:                case WR_IMAGE:
                    265:                case WR_CMD:
                    266:                case WR_RLE:
                    267:                case RD_CMD:
                    268:                case RD_IMAGE:
                    269:                        cvp->dmamode = cvp->func = fmt;
                    270:                        cvp->func &= ~TOGGLE;
                    271:                        break;
                    272:                default:
                    273:                        u.u_error = EINVAL;
                    274:                }
                    275:                goto out;
                    276: 
                    277:        default:
                    278:                return (ENOTTY);
                    279:        }
                    280:    out:
                    281:        return u.u_error;
                    282: }
                    283: 
                    284: /*ARGSUSED*/
                    285: cvintr(dev)
                    286:        dev_t dev;
                    287: {
                    288:        register struct cvdevice *cvaddr =
                    289:                        (struct cvdevice *) cvdinfo[UNIT(dev)]->ui_addr;
                    290:        register struct cvsoftc *cvp = &cvsoftc[UNIT(dev)];
                    291:        register csr;
                    292: 
                    293:        cvp->icnt++;
                    294:        if (cvp->state&BUSY) {
                    295:                csr = cvaddr->csr;
                    296:                if(csr & ERROR){
                    297:                        cvaddr->eir |= ERROR;
                    298:                        printf("cv: CSR %x EIR %x\n", csr, cvaddr->eir);
                    299:                }
                    300:                cvaddr->csr = csr&~FUNCMASK;
                    301:                cvp->state &= ~BUSY;
                    302:                wakeup((caddr_t)cvp);
                    303:        }
                    304: }
                    305: 
                    306: cvreset(uban)
                    307:        int uban;
                    308: {
                    309:        register int i;
                    310:        register struct uba_device *ui;
                    311:        register struct cvsoftc *cvp = cvsoftc;
                    312: #ifdef untried
                    313:        for (i = 0; i < NCV; i++, cvp++) {
                    314:                if ((ui = cvdinfo[i]) == 0 || ui->ui_alive == 0 ||
                    315:                    ui->ui_ubanum != uban || cvp->open == 0)
                    316:                        continue;
                    317:                printf(" cv%d", i);
                    318:                if ((cvp->state&CVBUSY) == 0)
                    319:                        continue;
                    320:                cvp->ubinfo =
                    321:                    ubasetup(ui->ui_ubanum, cvp->bp, UBA_NEEDBDP);
                    322:                cvp->count = -(cvp->bp->b_bcount/2);
                    323:                cvstart(ui);
                    324:        }
                    325: #endif
                    326: }
                    327: #endif

unix.superglobalmegacorp.com

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