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

1.1       root        1: /*     dr.c    4.10    82/05/18        */
                      2: 
                      3: #include "ekx.h"
                      4: #if NEKX > 0
                      5: /*
                      6:  * UNIBUS DR11-B driver for various graphical systems,.
                      7:  * TS
                      8:  */
                      9: 
                     10: #include "../h/param.h"
                     11: #include "../h/systm.h"
                     12: #include "../h/cpu.h"
                     13: #include "../h/nexus.h"
                     14: #include "../h/dk.h"
                     15: #include "../h/buf.h"
                     16: #include "../h/conf.h"
                     17: #include "../h/dir.h"
                     18: #include "../h/user.h"
                     19: #include "../h/map.h"
                     20: #include "../h/pte.h"
                     21: #include "../h/mtpr.h"
                     22: #include "../h/vm.h"
                     23: #include "../h/ubavar.h"
                     24: #include "../h/ubareg.h"
                     25: #include "../h/cmap.h"
                     26: 
                     27: #include "../h/ekcmd.h"
                     28: 
                     29: struct ekdevice{
                     30:        u_short ekgc;
                     31:        u_short ekdc;
                     32:        u_short ekgs;
                     33:        u_short ekds;
                     34:        short ekwc;
                     35:        u_short ekba;
                     36:        u_short ekcs;
                     37:        u_short ekdata;
                     38: };
                     39: struct ekctl {
                     40:        u_short mode;
                     41:        u_short dma_device;
                     42:        u_short device;
                     43:        u_short state;
                     44: } ek[NEKX];
                     45: #define        EK_GO   01
                     46: #define EK_FCTN                016
                     47: #define EK_12BIT       0
                     48: #define EK_12BITST     04
                     49: #define EK_8BIT                02
                     50: #define EK_8BITST      06
                     51: #define EK_DARK                0
                     52: #define EK_GAIN                02
                     53: #define EK_HTST                010
                     54: #define EK_GTST                012
                     55: #define EK_X1617       060
                     56: #define        EK_IE   0100
                     57: #define EK_READY       0200
                     58: #define EK_DIR 0400
                     59: #define EK_ODEV                01000
                     60: #define EK_OVER                02000
                     61: #define EK_ATTN        020000
                     62: #define        EK_NEX  040000
                     63: #define        EK_ERROR        0100000
                     64: 
                     65: int    ekxprobe(),ekxattach(),ekxdgo(),ekxintr();
                     66: int    ekstrategy(),ekstart();
                     67: struct uba_ctlr *ekxminfo[NEKX];
                     68: struct uba_device *ekxdinfo[NEKX];
                     69: struct uba_ctlr ekctlr[NEKX];  /* ekxminfo points to this */
                     70: u_short ekxstd[]       = { 0163700, 0};        
                     71: struct uba_driver ekxdriver =
                     72:        { ekxprobe,0,ekxattach,ekxdgo,ekxstd,"ekx",ekxdinfo,"ekx",ekxminfo };
                     73: 
                     74: #define ui_open        ui_type
                     75: struct buf     ekbuf[NEKX];
                     76: struct buf     ekutab[NEKX];
                     77: int ct1, ct2, ct3, ct4, ct5, ct6, ct7, ct8, ct9, ct10, ct11;
                     78: short sekgs, sekds,  sekcs;
                     79: unsigned short sekwc;
                     80: 
                     81: /*ARGSUSED*/
                     82: ekxprobe(reg)
                     83: caddr_t reg;
                     84: {
                     85:        register int br,cvec;
                     86: 
                     87: #ifdef LINT
                     88:        br = 0; cvec = br; br = cvec;
                     89: #endif
                     90: 
                     91: /* There seems to be no way to make this vile animal
                     92:    interrupt, so we cheat...                           */
                     93: 
                     94:        br = 0x15;
                     95:        cvec = 0270;
                     96: }
                     97: 
                     98: ekxattach(ui)
                     99: register struct uba_device *ui;
                    100: {
                    101:        register struct uba_ctlr *um;
                    102:        register int unit;
                    103: 
                    104:        unit = ui->ui_unit;
                    105: 
                    106:        um = &ekctlr[unit];
                    107:        ekxminfo[unit] = um;
                    108:        ui->ui_ctlr = unit;
                    109:        ui->ui_mi = um;
                    110:        um->um_driver = ui->ui_driver;
                    111:        um->um_ctlr = unit;
                    112:        um->um_ubanum = ui->ui_ubanum;
                    113:        um->um_alive = 1;
                    114:        um->um_intr = ui->ui_intr;
                    115:        um->um_addr = ui->ui_addr;
                    116:        um->um_hd = ui->ui_hd;
                    117: }
                    118: 
                    119: ekxopen(dev)
                    120: dev_t dev;
                    121: {
                    122:        register int unit;
                    123: 
                    124:        ct1 = ct2 = ct3 = ct4 = ct5 = 0;
                    125:        ct6 = ct7 = ct8 = ct9 = 0;
                    126:        ct10 = ct11 = 0;
                    127:        unit = minor(dev);
                    128:        if((unit >= NEKX) || (ekxdinfo[unit]->ui_open)) {
                    129:                u.u_error = ENXIO;
                    130:                return;
                    131:        }
                    132:        ekxdinfo[unit]->ui_open++;
                    133: }
                    134: 
                    135: ekxclose(dev)
                    136: dev_t dev;
                    137: {
                    138:        register int unit;
                    139: 
                    140:        ekxdinfo[minor(dev)]->ui_open = 0;
                    141: }
                    142: 
                    143: ekxread(dev)
                    144: dev_t dev;
                    145: {
                    146:        register int unit = minor(dev);
                    147: 
                    148:        ct1++;
                    149:        physio(ekstrategy,&ekbuf[unit],dev,B_READ,minphys);
                    150:        ct2++;
                    151: }
                    152: 
                    153: ekxwrite(dev)
                    154: dev_t dev;
                    155: {
                    156:        register int unit = minor(dev);
                    157: 
                    158:        physio(ekstrategy,&ekbuf[unit],dev,B_WRITE,minphys);
                    159: }
                    160: 
                    161: /*
                    162:  * Due to the fact the ekstrategy routine is called only by ekxread
                    163:  * and ekxwrite via physio, there will only be one transaction in each
                    164:  * DR11-B's queue at any time.  Therefore, one can just tack the given
                    165:  * buffer header pointer on at the end of the queue, and call ekstart.
                    166:  */
                    167: ekstrategy(bp)
                    168: register struct buf *bp;
                    169: {
                    170:        register struct uba_device *ui;
                    171:        register struct uba_ctlr *um;
                    172:        register struct buf *dp;
                    173:        register int s;
                    174:        struct ekdevice *draddr;
                    175:        dev_t unit;
                    176: 
                    177:        ct3++;
                    178:        unit = minor(bp->b_dev);        /* chose a DR11-B */
                    179:        ui = ekxdinfo[unit];
                    180:        um = ui->ui_mi;         /* get ctlr ptr */
                    181:        dp = &ekutab[unit];
                    182:        s = spl5();
                    183:        dp->b_actf = bp;
                    184:        dp->b_actl = bp;
                    185:        bp->av_forw = NULL;
                    186:        um->um_tab.b_actf = dp;
                    187:        um->um_tab.b_actl = dp;
                    188: 
                    189:        ekstart(um);
                    190:        splx(s);
                    191:        switch(tsleep((caddr_t)bp, PRIBIO+1, 20)) {
                    192:        case TS_OK:
                    193:                break;
                    194:        case TS_SIG:    /* not supposed to happen*/
                    195:        case TS_TIME:
                    196:                draddr = (struct ekdevice *)um->um_addr;
                    197:                sekgs = draddr->ekgs;
                    198:                sekds = draddr->ekds;
                    199:                sekwc = draddr->ekwc;
                    200:                sekcs = draddr->ekcs;
                    201:                printf("gs %o ds %o wc %o cs %o\n",sekgs, sekds, sekwc, sekcs);
                    202:                printf("ct1 %o ct2 %o ct3 %o ct4 %o ct5 %o ct6 %o\n",ct1,ct2,ct3,ct4,ct5,ct6);
                    203:                printf("ct7 %o ct8 %o ct9 %o ct10 %o ct11 %o\n",ct7,ct8,ct9,ct10,ct11);
                    204:                bp->b_flags |= B_DONE | B_ERROR;
                    205:                s = spl6();
                    206:                ekxintr(unit);
                    207:                splx(s);
                    208:        }
                    209: }
                    210: 
                    211: ekstart(um)
                    212: register struct uba_ctlr *um;
                    213: {
                    214:        register struct buf *bp,*dp;
                    215:        register struct ekdevice *draddr;
                    216:        register struct ekctl *ekp;
                    217:        int cmd;
                    218: 
                    219:        dp = um->um_tab.b_actf;
                    220:        bp = dp->b_actf;
                    221:        ekp = &ek[minor(bp->b_dev)];
                    222: 
                    223:        um->um_tab.b_active++;
                    224:        draddr = (struct ekdevice *)um->um_addr;
                    225:        draddr->ekwc = -bp->b_bcount / sizeof (short);
                    226:        if(bp->b_flags & B_READ)
                    227:                cmd = EK_IE|EK_DIR|ekp->mode;   
                    228:        else
                    229:                cmd = EK_IE|ekp->dma_device;
                    230:        um->um_cmd = cmd|EK_GO;
                    231:        ct4++;
                    232:        draddr->ekcs = cmd;
                    233:        ct5++;
                    234:        DELAY(10);
                    235:        if( ubago(ekxdinfo[minor(bp->b_dev)])== 0)
                    236:                printf("ubago returned 0\n");
                    237: }
                    238: 
                    239: ekxioctl(dev, cmd, arg)
                    240: dev_t dev;
                    241: int cmd;
                    242: register caddr_t arg;
                    243: {
                    244:        register struct ekctl *ekp = &ek[minor(dev)];
                    245:        register struct uba_device *ui = ekxdinfo[minor(dev)];
                    246:        register struct ekdevice *draddr = (struct ekdevice *)ui->ui_addr;
                    247:        u_short realcmd;
                    248: 
                    249:        if( (cmd != EKGS) && (cmd != EKDMA)){
                    250:                if(copyin(arg, (caddr_t)&realcmd, sizeof(realcmd))){
                    251:                        u.u_error = EFAULT;
                    252:                        return;
                    253:                }
                    254:        }
                    255:        switch(cmd){
                    256:        case EKGC:
                    257:                draddr->ekgc = realcmd;
                    258:                return;
                    259:        case EKDC:
                    260:                draddr->ekdc = realcmd;
                    261:                return;
                    262:        case EKGS:
                    263:                realcmd = draddr->ekgs;
                    264:                break;
                    265:        case EKDS:
                    266:                draddr->ekdc = EKDC_READ|realcmd;
                    267:                realcmd = draddr->ekds;
                    268:                break;
                    269:        case EKMOD:
                    270:                ek->mode = realcmd & EK_FCTN;
                    271:                return;
                    272:        case EKDEV:
                    273:                ek->dma_device = realcmd & EK_FCTN;
                    274:                return;
                    275:        default:
                    276:                u.u_error = ENXIO;
                    277:                return;
                    278:        }
                    279:        if(copyout((caddr_t)&realcmd, arg, sizeof(realcmd)))
                    280:                u.u_error = EFAULT;
                    281: }
                    282: ekreset() {}
                    283: ekxdgo(um)
                    284: struct uba_ctlr *um;
                    285: {
                    286:        register struct ekdevice *draddr = (struct ekdevice *)um->um_addr;
                    287: 
                    288:        ct6++;
                    289:        draddr->ekba = um->um_ubinfo;
                    290:        draddr->ekcs = um->um_cmd|((um->um_ubinfo>>12)&EK_X1617);
                    291:        ct7++;
                    292: }
                    293: ekxintr(dr11)
                    294: register dr11;
                    295: {
                    296:        register struct buf *bp,*dp;
                    297:        register struct ekdevice *draddr;
                    298:        register struct uba_ctlr *um;
                    299:        register int stat;
                    300: 
                    301:        ct8++;
                    302:        um = ekxminfo[dr11];
                    303: 
                    304:        if(um->um_tab.b_active == 0)
                    305:                return;
                    306: 
                    307:        if(ekxdinfo[dr11]->ui_open == 0)
                    308:                return;
                    309:        dp = um->um_tab.b_actf;
                    310:        bp = dp->b_actf;
                    311:        draddr = (struct ekdevice *)um->um_addr;
                    312:        stat = draddr->ekcs;
                    313: 
                    314:        if(stat & EK_ODEV){
                    315:                ct11++;
                    316:        }
                    317: 
                    318:                        /*should check stat&EK_OVER for retry*/
                    319:        if((stat&EK_ERROR) && draddr->ekwc && (draddr->ekba == 0)) {
                    320:                draddr->ekcs = um->um_cmd|(((um->um_ubinfo>>12)+1)&EK_X1617);
                    321:                ct10++;
                    322:        }
                    323: 
                    324:        um->um_tab.b_active = 0;
                    325:        um->um_tab.b_errcnt = 0;
                    326:        um->um_tab.b_actf = dp->b_forw;
                    327:        dp->b_errcnt = 0;
                    328:        dp->b_active = 0;
                    329:        bp->b_resid = (-draddr->ekwc * sizeof(short));
                    330:        ubadone(um);
                    331:        iodone(bp);
                    332:        ct9++;
                    333: }
                    334: #endif

unix.superglobalmegacorp.com

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