Annotation of researchv8dc/sys/dev/kmc.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * KMC11 microprocessor driver
        !             3:  */
        !             4: #include "kmc.h"
        !             5: #if NKMC > 0
        !             6: /* this driver supports ONE kmc ONLY */
        !             7: /* it should be modified to support only kmc11b's too */
        !             8: 
        !             9: /* nonstandard crap */
        !            10: typedef unsigned short ushort;
        !            11: #define lobyte(X) (((unsigned char *)&X)[0])
        !            12: #define hibyte(X) (((unsigned char *)&X)[1])
        !            13: 
        !            14: #include "../h/param.h"
        !            15: #include "../h/systm.h"
        !            16: #include "../h/kmc.h"
        !            17: #include "../h/pte.h"
        !            18: #include "../h/map.h"
        !            19: #include "../h/buf.h"
        !            20: #include "../h/ubareg.h"
        !            21: #include "../h/ubavar.h"
        !            22: #include "../h/conf.h"
        !            23: #include "../h/dir.h"
        !            24: #include "../h/user.h"
        !            25: 
        !            26: struct kmc {
        !            27:        char    k_stat;
        !            28:        char    k_type;
        !            29: } kmc[NKMC];
        !            30: 
        !            31: #define        KMC11A  1
        !            32: #define        KMC11B  2
        !            33: #define        KASIZE  1024
        !            34: #define        KBSIZE  4096
        !            35: 
        !            36: #define        RUN     (1<<7)
        !            37: #define        MCLR    (1<<6)
        !            38: #define        CWRT    (1<<5)
        !            39: #define        LUB     (1<<4)
        !            40: #define        LUA     (1<<3)
        !            41: #define        ROMO    (1<<2)
        !            42: #define        ROMI    (1<<1)
        !            43: #define        STEP    (1<<0)
        !            44: 
        !            45: #define RDYO   0200
        !            46: #define RDYI   020
        !            47: #define RQI    0200
        !            48: #define IEI    01
        !            49: #define IEO    020
        !            50: 
        !            51: #define        STYPE   017
        !            52: #define SRUN   020
        !            53: #define SRINT  040
        !            54: #define        SOPEN   0100
        !            55: 
        !            56: struct device {
        !            57:        union {
        !            58:                char    b[8];
        !            59:                ushort  w[4];
        !            60:        } un;
        !            61: };
        !            62: 
        !            63: #define        bsel0   un.b[0]
        !            64: #define        bsel1   un.b[1]
        !            65: #define        bsel2   un.b[2]
        !            66: #define        bsel3   un.b[3]
        !            67: #define        bsel4   un.b[4]
        !            68: #define        bsel5   un.b[5]
        !            69: #define        bsel6   un.b[6]
        !            70: #define        bsel7   un.b[7]
        !            71: #define        sel0    un.w[0]
        !            72: #define        sel2    un.w[1]
        !            73: #define        sel4    un.w[2]
        !            74: #define        sel6    un.w[3]
        !            75: 
        !            76: int    kmcwritten;
        !            77: int kmcprobe(), kmcattach(), kmcxint();
        !            78: struct uba_device *kmcdinfo[NKMC];
        !            79: unsigned short kmcstd[] = { 0};
        !            80: struct uba_driver kmcdriver = {
        !            81:        kmcprobe, 0, kmcattach, 0, kmcstd, "kmc", kmcdinfo
        !            82: };
        !            83: 
        !            84: int    (*kdirint)();
        !            85: int    (*kdixint)();
        !            86: 
        !            87: kmcprobe(reg)
        !            88: caddr_t reg;
        !            89: {      register int br, cvec;  /* don't touch */
        !            90:        register struct device *kp = (struct device *)reg;
        !            91:        register s;
        !            92: 
        !            93: #ifdef lint
        !            94:        br = 0; cvec = br; br = cvec;
        !            95: #endif
        !            96:        s = spl7();
        !            97:        kp->bsel1 = MCLR;
        !            98:        splx(s);
        !            99:        kp->bsel1 = ROMI;
        !           100:        kp->sel4 = 0200;                /* bus request */
        !           101:        kp->sel6 = 0121111;             /* mov csr4,obr */
        !           102:        kp->bsel1 = ROMI|STEP;
        !           103:        DELAY(50);
        !           104:        kp->bsel1 = 0;
        !           105:        return(1);
        !           106: }
        !           107: 
        !           108: kmcattach(ui)
        !           109: register struct uba_device *ui;
        !           110: {}
        !           111: 
        !           112: kmcopen(dev, flag)
        !           113: dev_t dev;
        !           114: {      register struct device *kp;
        !           115:        register struct kmc *tp;
        !           116:        register sav;
        !           117: 
        !           118:        dev = minor(dev);
        !           119:        if (dev>=NKMC || (tp = &kmc[dev])->k_stat&SOPEN) {
        !           120:                u.u_error = ENXIO;
        !           121:                return;
        !           122:        }
        !           123:        kmcwritten = 0;
        !           124:        tp->k_stat |= SOPEN;
        !           125:        if (tp->k_type==0) {
        !           126:                kp = ((struct device *)kmcdinfo[dev]->ui_addr);
        !           127:                kp->bsel1 = ROMO;
        !           128:                kp->sel4 = 0;
        !           129:                sav = kp->sel6;
        !           130:                kp->sel6 = ~sav;
        !           131:                if (kp->sel6 != sav) {
        !           132:                        tp->k_type = KMC11B;
        !           133:                        kp->sel6 = sav;
        !           134:                } else
        !           135:                        tp->k_type = KMC11A;
        !           136:                kp->bsel1 = 0;
        !           137:        }
        !           138: }
        !           139: 
        !           140: kmcclose(dev)
        !           141: dev_t dev;
        !           142: {
        !           143:        dev = minor(dev);
        !           144:        if(dev >= NKMC)
        !           145:                return;
        !           146:        kmc[dev].k_stat &= ~SOPEN;
        !           147:        if (kmcwritten)
        !           148:                kdireload();
        !           149: }
        !           150: 
        !           151: kmcread(dev)
        !           152: dev_t dev;
        !           153: {      register struct device *kp;
        !           154:        register ad;
        !           155:        int     dsize;
        !           156:        ushort  sav;
        !           157: 
        !           158:        dev = minor(dev);
        !           159:        if(dev >= NKMC) {
        !           160:                u.u_error = ENXIO;
        !           161:                return;
        !           162:        }
        !           163:        if (kmc[dev].k_stat&SRUN)
        !           164:                return;
        !           165:        dsize = (kmc[dev].k_type==KMC11A)?KASIZE:KBSIZE;
        !           166:        kp = ((struct device *)kmcdinfo[dev]->ui_addr);
        !           167:        kp->bsel1 = 0;
        !           168:        do {
        !           169:                ad = u.u_offset;
        !           170:                if (ad<dsize*2) {
        !           171:                        if (ad&1) {
        !           172:                                u.u_error = ENXIO;
        !           173:                                break;
        !           174:                        }
        !           175:                        ad >>= 1;
        !           176:                        kp->bsel1 = ROMO;
        !           177:                        kp->sel4 = ad;
        !           178:                        passc(kp->bsel6);
        !           179:                        passc(kp->bsel7);
        !           180:                        kp->bsel1 = 0;
        !           181:                } else if (ad -= dsize*2, ad<dsize) {
        !           182:                        kp->bsel1 = ROMO;
        !           183:                        kp->sel4 = 0;
        !           184:                        sav = kp->sel6;
        !           185:                        kp->bsel1 = ROMI;
        !           186:                        kp->sel6 = 010000|(ad&0377);    /* mov ad,mar */
        !           187:                        kp->bsel1 = ROMI|STEP;
        !           188:                        kp->bsel1 = ROMI;
        !           189:                        kp->sel6 = 04000|((ad>>8)&0377);        /* mov %ad,%mar */
        !           190:                        kp->bsel1 = ROMI|STEP;
        !           191:                        kp->bsel1 = ROMI;
        !           192:                        kp->sel6 = 055222;      /* mov mem,csr2|mar++ */
        !           193:                        kp->bsel1 = ROMI|STEP;
        !           194:                        passc(kp->bsel2);
        !           195:                        kp->bsel1 = ROMI;
        !           196:                        kp->sel6 = sav;
        !           197:                        kp->bsel1 = 0;
        !           198:                } else
        !           199:                        break;
        !           200:        } while (u.u_error==0 && u.u_count);
        !           201: }
        !           202: 
        !           203: kmcwrite(dev)
        !           204: dev_t dev;
        !           205: {      register struct device *kp;
        !           206:        register ad;
        !           207:        int     dsize;
        !           208:        short   ins;
        !           209:        ushort  sav;
        !           210: 
        !           211:        dev = minor(dev);
        !           212:        if(dev >= NKMC) {
        !           213:                u.u_error = ENXIO;
        !           214:                return;
        !           215:        }
        !           216:        if (kmc[dev].k_stat&SRUN)
        !           217:                return;
        !           218:        dsize = (kmc[dev].k_type==KMC11A)?KASIZE:KBSIZE;
        !           219:        kp = ((struct device *)kmcdinfo[dev]->ui_addr);
        !           220:        kp->bsel1 = 0;
        !           221:        kmcwritten = 1;
        !           222:        while (u.u_error==0 && u.u_count) {
        !           223:                ad = u.u_offset;
        !           224:                if (ad<dsize*2) {
        !           225:                        if (ad&1) {
        !           226:                                u.u_error = ENXIO;
        !           227:                                break;
        !           228:                        }
        !           229:                        kp->bsel1 = ROMO;
        !           230:                        kp->sel4 = ad>>1;
        !           231:                        lobyte(ins) = cpass();
        !           232:                        hibyte(ins) = cpass();
        !           233:                        kp->sel6 = ins;
        !           234:                        kp->bsel1 |= CWRT;
        !           235:                        kp->bsel1 = 0;
        !           236:                } else if (ad -= dsize*2, ad<dsize) {
        !           237:                        kp->bsel1 = ROMO;
        !           238:                        kp->sel4 = 0;
        !           239:                        sav = kp->sel6;
        !           240:                        kp->bsel1 = ROMI;
        !           241:                        kp->sel6 = 010000|(ad&0377);    /* mov ad,mar */
        !           242:                        kp->bsel1 = ROMI|STEP;
        !           243:                        kp->bsel1 = ROMI;
        !           244:                        kp->sel6 = 04000|((ad>>8)&0377);        /* mov %ad,%mar */
        !           245:                        kp->bsel1 = ROMI|STEP;
        !           246:                        kp->bsel1 = ROMI;
        !           247:                        kp->bsel2 = cpass();
        !           248:                        kp->sel6 = 0136440;     /* mov csr2,mem|mar++ */
        !           249:                        kp->bsel1 = ROMI|STEP;
        !           250:                        kp->bsel1 = ROMI;
        !           251:                        kp->sel6 = sav;
        !           252:                        kp->bsel1 = 0;
        !           253:                } else
        !           254:                        break;
        !           255:        }
        !           256: }
        !           257: 
        !           258: kmcioctl(dev, cmd, arg, mode)
        !           259: caddr_t arg;
        !           260: dev_t dev;
        !           261: {      register struct device *kp;
        !           262:        register struct kmc *tp;
        !           263:        struct kmcntl kk;
        !           264:        short   csr[4];
        !           265:        ushort  sav;
        !           266: 
        !           267:        dev = minor(dev);
        !           268:        if (cmd != KCSETA) {
        !           269:                u.u_error = EINVAL;
        !           270:                return;
        !           271:        }
        !           272:        if(dev >= NKMC) {
        !           273:                u.u_error = ENXIO;
        !           274:                return;
        !           275:        }
        !           276:        if (copyin(arg, &kk, sizeof(kk))) {
        !           277:                u.u_error = EFAULT;
        !           278:                return;
        !           279:        }
        !           280:        kp = ((struct device *)kmcdinfo[dev]->ui_addr);
        !           281:        tp = &kmc[dev];
        !           282:        switch (kk.kmd) {
        !           283:        case KMCLR:
        !           284:        case KRESET:
        !           285:                spl7();
        !           286:                kp->bsel1 = MCLR;
        !           287:                spl0();
        !           288:        case KSTOP:
        !           289:                tp->k_stat &= ~SRUN;
        !           290:                kp->bsel1 = 0;
        !           291:                if (kk.kmd == KRESET) {
        !           292:                        tp->k_stat = 0;
        !           293:                        /* flush here */
        !           294:                }
        !           295:                return;
        !           296:        case KMS:
        !           297:                if (tp->k_stat&SRUN)
        !           298:                        break;
        !           299:                kp->bsel1 = ROMI|ROMO;
        !           300:                sav = kp->sel6;
        !           301:                kp->bsel1 = ROMI;
        !           302:                kp->sel6 = kk.kval;
        !           303:                kp->bsel1 = ROMI|STEP;
        !           304:                kp->bsel1 = ROMI;
        !           305:                kp->sel6 = sav;
        !           306:                kp->bsel1 = 0;
        !           307:                goto lcsr;
        !           308:        case KSTEP:
        !           309:                if (tp->k_stat&SRUN)
        !           310:                        break;
        !           311:                kp->bsel1 |= STEP;
        !           312:                kp->bsel1 = 0;
        !           313:        case KCSR:
        !           314:        lcsr:
        !           315:                csr[0] = kp->sel0;
        !           316:                csr[1] = kp->sel2;
        !           317:                csr[2] = kp->sel4;
        !           318:                csr[3] = kp->sel6;
        !           319:                if (copyout(csr, kk.kcsr, sizeof csr))
        !           320:                        u.u_error = EFAULT;
        !           321:                return;
        !           322:        case KWRCR:
        !           323:                if (tp->k_stat&SRINT)
        !           324:                        break;
        !           325:                kp->sel6 = kk.kval;
        !           326:                return;
        !           327:        case KRUN:
        !           328:                if (tp->k_stat&SRUN)
        !           329:                        break;
        !           330:                tp->k_stat &= ~STYPE;
        !           331:                tp->k_stat |= (kk.kval&STYPE)|SRUN;
        !           332:                kp->bsel1 |= RUN;
        !           333:                if (tp->k_stat&SRINT) {
        !           334:                        spl5();
        !           335:                        kmcrint(dev);
        !           336:                        spl0();
        !           337:                }
        !           338:                return;
        !           339:        case KLU:
        !           340:                kp->bsel1 = kk.kval&(LUA|LUB);
        !           341:                return;
        !           342:        }
        !           343:        u.u_error = EIO;
        !           344: }
        !           345: 
        !           346: kmcrint(dev)
        !           347: dev_t dev;
        !           348: {
        !           349:        if (kdirint)
        !           350:                (*kdirint)();
        !           351: }
        !           352: 
        !           353: kmcxint(dev)
        !           354: {
        !           355:        if (kdixint)
        !           356:                (*kdixint)();
        !           357: }

unix.superglobalmegacorp.com

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