|
|
1.1 ! root 1: /* ik.c 6.1 83/07/29 */ ! 2: ! 3: #include "ik.h" ! 4: #if NIK > 0 ! 5: /* ! 6: * Ikonas Frame Buffer Interface -- Bill Reeves. ! 7: */ ! 8: #include "../machine/pte.h" ! 9: ! 10: #include "../h/param.h" ! 11: #include "../h/dir.h" ! 12: #include "../h/user.h" ! 13: #include "../h/buf.h" ! 14: #include "../h/systm.h" ! 15: #include "../h/map.h" ! 16: #include "../h/uio.h" ! 17: #include "../h/ioctl.h" ! 18: ! 19: #include "../vaxuba/ubareg.h" ! 20: #include "../vaxuba/ubavar.h" ! 21: #include "../vaxuba/ikreg.h" ! 22: ! 23: #define IKBUSY 01 ! 24: #define IKDMAPRI (PZERO-1) ! 25: #define IKWAITPRI (PZERO+1) ! 26: ! 27: int ikprobe(), ikattach(), ikintr(); ! 28: struct uba_device *ikdinfo[NIK]; ! 29: u_short ikstd[] = { 0772460, 0000000, 0 }; ! 30: struct uba_driver ikdriver = ! 31: { ikprobe, 0, ikattach, 0, ikstd, "ik", ikdinfo, 0, 0 }; ! 32: ! 33: struct ik_softc { ! 34: char ik_open; ! 35: short ik_uid; ! 36: short ik_state; ! 37: int ik_ubinfo; ! 38: int ik_count; ! 39: struct buf *ik_bp; ! 40: int ik_bufp; ! 41: int ik_icnt; ! 42: } ik_softc[NIK]; ! 43: ! 44: int ikstrategy(); ! 45: u_int ikminphys(); ! 46: struct buf rikbuf[NIK]; ! 47: ! 48: #define IKUNIT(dev) (minor(dev)) ! 49: ! 50: ikprobe(reg) ! 51: caddr_t reg; ! 52: { ! 53: register int br, cvec; /* value-result */ ! 54: register struct ikdevice *ikaddr = (struct ikdevice *) reg; ! 55: ! 56: #ifdef lint ! 57: br = 0; cvec = br; br = cvec; ! 58: ikintr(0); ! 59: #endif ! 60: ikaddr->ik_istat = 0; ! 61: ikaddr->ik_xaddr = 0; ! 62: ikaddr->ik_yaddr = 0; ! 63: ikaddr->ik_ustat = IK_IENABLE | IK_GO; ! 64: DELAY(10000); ! 65: ikaddr->ik_ustat = 0; ! 66: return (sizeof (struct ikdevice)); ! 67: } ! 68: ! 69: /*ARGSUSED*/ ! 70: ikattach(ui) ! 71: struct uba_device *ui; ! 72: { ! 73: ! 74: } ! 75: ! 76: ikopen(dev) ! 77: dev_t dev; ! 78: { ! 79: register struct ik_softc *ikp; ! 80: register struct uba_device *ui; ! 81: ! 82: if (IKUNIT(dev) >= NIK || (ikp = &ik_softc[minor(dev)])->ik_open || ! 83: (ui = ikdinfo[IKUNIT(dev)]) == 0 || ui->ui_alive == 0) ! 84: return (ENXIO); ! 85: ikp->ik_open = 1; ! 86: ikp->ik_icnt = 0; ! 87: ikp->ik_state = 0; ! 88: ikp->ik_uid = u.u_uid; ! 89: maptouser(ui->ui_addr); ! 90: return (0); ! 91: } ! 92: ! 93: ikclose(dev) ! 94: dev_t dev; ! 95: { ! 96: ! 97: ik_softc[minor(dev)].ik_open = 0; ! 98: ik_softc[minor(dev)].ik_state = 0; ! 99: unmaptouser(ikdinfo[IKUNIT(dev)]->ui_addr); ! 100: } ! 101: ! 102: ikread(dev, uio) ! 103: dev_t dev; ! 104: struct uio *uio; ! 105: { ! 106: register int unit = IKUNIT(dev); ! 107: ! 108: if (unit >= NIK) ! 109: return (ENXIO); ! 110: return (physio(ikstrategy, &rikbuf[unit], dev, B_READ, ikminphys, uio)); ! 111: } ! 112: ! 113: ikwrite(dev, uio) ! 114: dev_t dev; ! 115: struct uio *uio; ! 116: { ! 117: register int unit = IKUNIT(dev); ! 118: ! 119: if (unit >= NIK) ! 120: return (ENXIO); ! 121: return (physio(ikstrategy, &rikbuf[unit], dev, B_WRITE, ikminphys, uio)); ! 122: } ! 123: ! 124: u_int ! 125: ikminphys(bp) ! 126: register struct buf *bp; ! 127: { ! 128: ! 129: if (bp->b_bcount > 65536) /* may be able to do twice as much */ ! 130: bp->b_bcount = 65536; ! 131: } ! 132: ! 133: ikstrategy(bp) ! 134: register struct buf *bp; ! 135: { ! 136: register struct ik_softc *ikp = &ik_softc[IKUNIT(bp->b_dev)]; ! 137: register struct uba_device *ui; ! 138: ! 139: if (IKUNIT(bp->b_dev) >= NIK || (ui = ikdinfo[IKUNIT(bp->b_dev)]) == 0 ! 140: || ui->ui_alive == 0) ! 141: goto bad; ! 142: (void) spl5(); ! 143: while (ikp->ik_state & IKBUSY) ! 144: sleep((caddr_t)ikp, IKDMAPRI+1); ! 145: ikp->ik_state |= IKBUSY; ! 146: ikp->ik_bp = bp; ! 147: ikp->ik_ubinfo = ubasetup(ui->ui_ubanum, bp, UBA_NEEDBDP); ! 148: ikp->ik_bufp = ikp->ik_ubinfo & 0x3ffff; ! 149: ikp->ik_count = -(bp->b_bcount>>1); /* its a word count */ ! 150: ikstart(ui); ! 151: while (ikp->ik_state&IKBUSY) ! 152: sleep((caddr_t)ikp, IKDMAPRI); ! 153: ikp->ik_count = 0; ! 154: ikp->ik_bufp = 0; ! 155: (void) spl0(); ! 156: ubarelse(ui->ui_ubanum, &ikp->ik_ubinfo); ! 157: ikp->ik_bp = 0; ! 158: iodone(bp); ! 159: wakeup((caddr_t)ikp); ! 160: return; ! 161: bad: ! 162: bp->b_flags |= B_ERROR; ! 163: iodone(bp); ! 164: return; ! 165: } ! 166: ! 167: ikstart(ui) ! 168: register struct uba_device *ui; ! 169: { ! 170: register int istat; ! 171: register struct ikdevice *ikaddr = (struct ikdevice *) ui->ui_addr; ! 172: register struct ik_softc *ikp = &ik_softc[IKUNIT(ui->ui_unit)]; ! 173: ! 174: istat = ikaddr->ik_istat|DMAENABLE; ! 175: ikaddr->ik_istat = istat; ! 176: ikaddr->ik_wc = ikp->ik_count; ! 177: ikaddr->ik_ubaddr = ikp->ik_bufp; ! 178: ikaddr->ik_ustat = IK_GO|IK_IENABLE|((ikp->ik_bufp>>12)&060); ! 179: } ! 180: ! 181: /*ARGSUSED*/ ! 182: ikioctl(dev, cmd, data, flag) ! 183: dev_t dev; ! 184: int cmd; ! 185: register caddr_t data; ! 186: int flag; ! 187: { ! 188: register struct uba_device *ui = ikdinfo[IKUNIT(dev)]; ! 189: register struct ik_softc *ikp; ! 190: ! 191: switch (cmd) { ! 192: ! 193: case IKIOGETADDR: ! 194: *(caddr_t *)data = ui->ui_addr; ! 195: break; ! 196: ! 197: case IKIOWAITINT: ! 198: ikp = &ik_softc[IKUNIT(dev)]; ! 199: ikp->ik_state |= IKBUSY; ! 200: while (ikp->ik_state&IKBUSY) ! 201: sleep((caddr_t)ikp, IKWAITPRI); ! 202: break; ! 203: ! 204: default: ! 205: return (ENOTTY); ! 206: } ! 207: return (0); ! 208: } ! 209: ! 210: /*ARGSUSED*/ ! 211: ikintr(dev) ! 212: dev_t dev; ! 213: { ! 214: register struct ikdevice *ikaddr = ! 215: (struct ikdevice *) ikdinfo[IKUNIT(dev)]->ui_addr; ! 216: register struct ik_softc *ikp = &ik_softc[IKUNIT(dev)]; ! 217: ! 218: ikp->ik_icnt++; ! 219: if (ikp->ik_state&IKBUSY) { ! 220: ikaddr->ik_ustat = 0; ! 221: ikp->ik_state &= ~IKBUSY; ! 222: wakeup((caddr_t)ikp); ! 223: } ! 224: } ! 225: ! 226: ikreset(uban) ! 227: int uban; ! 228: { ! 229: register int i; ! 230: register struct uba_device *ui; ! 231: register struct ik_softc *ikp = ik_softc; ! 232: ! 233: for (i = 0; i < NIK; i++, ikp++) { ! 234: if ((ui = ikdinfo[i]) == 0 || ui->ui_alive == 0 || ! 235: ui->ui_ubanum != uban || ikp->ik_open == 0) ! 236: continue; ! 237: printf(" ik%d", i); ! 238: if ((ikp->ik_state&IKBUSY) == 0) ! 239: continue; ! 240: ikp->ik_ubinfo = ! 241: ubasetup(ui->ui_ubanum, ikp->ik_bp, UBA_NEEDBDP); ! 242: ikp->ik_count = -(ikp->ik_bp->b_bcount/2); ! 243: ikstart(ui); ! 244: } ! 245: } ! 246: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.