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