|
|
1.1 ! root 1: /* uba.c 4.2 11/9/80 */ ! 2: ! 3: #include "../h/param.h" ! 4: #include "../h/map.h" ! 5: #include "../h/pte.h" ! 6: #include "../h/uba.h" ! 7: #include "../h/buf.h" ! 8: #include "../h/dir.h" ! 9: #include "../h/user.h" ! 10: #include "../h/proc.h" ! 11: #include "../h/vm.h" ! 12: #include "../h/conf.h" ! 13: ! 14: /* ! 15: * Allocate as many contiguous UBA mapping registers ! 16: * as are necessary to do transfer of bcnt bytes ! 17: * to/from location baddr. Wait for enough map registers. ! 18: * ! 19: * Bdpflg is non-zero if a "buffered data path" (BDP) is ! 20: * to be used, else 0 -> use direct data path (DDP). Return ! 21: * ! 22: * Bits 0-8 Byte offset ! 23: * Bits 9-17 Start map reg. no. ! 24: * Bits 18-27 No. mapping reg's ! 25: * Bits 28-31 BDP no. ! 26: */ ! 27: ubasetup(bp, bdpflg) ! 28: struct buf *bp; ! 29: { ! 30: register int temp, i; ! 31: int npf, reg, bdp; ! 32: unsigned v; ! 33: register struct pte *pte, *io; ! 34: struct proc *rp; ! 35: int a, o, ubinfo; ! 36: ! 37: v = btop(bp->b_un.b_addr); ! 38: o = (int)bp->b_un.b_addr & PGOFSET; ! 39: npf = btoc(bp->b_bcount + o) + 1; ! 40: a = spl6(); ! 41: while ((reg = malloc(ubamap, npf)) == 0) { ! 42: panic("ran out of uba map"); ! 43: umrwant++; ! 44: sleep((caddr_t)ubamap, PSWP); ! 45: } ! 46: reg--; ! 47: bdp = 0; ! 48: if (bdpflg) ! 49: while ((bdp = malloc(bdpmap, 1)) == 0) { ! 50: panic("ran out of bdp's"); ! 51: bdpwant++; ! 52: sleep((caddr_t)bdpmap, PSWP); ! 53: } ! 54: splx(a); ! 55: ubinfo = (bdp << 28) | (npf << 18) | (reg << 9) | o; ! 56: io = &(((struct uba_regs *)UBA0)->uba_map[reg]); ! 57: temp = (bdp << 21) | MRV; ! 58: rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc; ! 59: if (bdp && (o & 01)) ! 60: temp |= BO; ! 61: if (bp->b_flags & B_UAREA) { ! 62: for (i = UPAGES - bp->b_bcount / NBPG; i < UPAGES; i++) { ! 63: if (rp->p_addr[i].pg_pfnum == 0) ! 64: panic("uba: zero upage"); ! 65: *(int *)io++ = rp->p_addr[i].pg_pfnum | temp; ! 66: } ! 67: } else if ((bp->b_flags & B_PHYS) == 0) { ! 68: pte = &Sysmap[btop(((int)bp->b_un.b_addr)&0x7fffffff)]; ! 69: while (--npf != 0) ! 70: *(int *)io++ = pte++->pg_pfnum | temp; ! 71: } else { ! 72: if (bp->b_flags & B_PAGET) ! 73: pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)]; ! 74: else ! 75: pte = vtopte(rp, v); ! 76: while (--npf != 0) { ! 77: if (pte->pg_pfnum == 0) ! 78: panic("uba zero uentry"); ! 79: *(int *)io++ = pte++->pg_pfnum | temp; ! 80: } ! 81: } ! 82: *(int *)io++ = 0; ! 83: return (ubinfo); ! 84: } ! 85: ! 86: /* ! 87: * Non buffer unibus interface... set up a buffer and call ubasetup. ! 88: */ ! 89: uballoc(addr, bcnt, bdpflg) ! 90: caddr_t addr; ! 91: unsigned short bcnt; ! 92: { ! 93: struct buf ubabuf; ! 94: ! 95: ubabuf.b_un.b_addr = addr; ! 96: ubabuf.b_flags = B_BUSY; ! 97: ubabuf.b_bcount = bcnt; ! 98: /* that's all the fields ubasetup() needs */ ! 99: return (ubasetup(&ubabuf, bdpflg)); ! 100: } ! 101: ! 102: ubafree(mr) ! 103: int mr; ! 104: { ! 105: register int bdp, reg, npf, a; ! 106: ! 107: a = spl6(); ! 108: bdp = (mr >> 28) & 0x0f; ! 109: if (bdp) { ! 110: ((struct uba_regs *)UBA0)->uba_dpr[bdp] |= BNE; /* purge */ ! 111: mfree(bdpmap, 1, bdp); ! 112: if (bdpwant) { ! 113: bdpwant = 0; ! 114: wakeup((caddr_t)bdpmap); ! 115: } ! 116: } ! 117: npf = (mr >> 18) & 0x3ff; ! 118: reg = ((mr >> 9) & 0x1ff) + 1; ! 119: mfree(ubamap, npf, reg); ! 120: if (umrwant) { ! 121: umrwant = 0; ! 122: wakeup((caddr_t)ubamap); ! 123: } ! 124: splx(a); ! 125: } ! 126: ! 127: ubainit() ! 128: { ! 129: ! 130: mfree(ubamap, 496, 1); ! 131: mfree(bdpmap, 15, 1); ! 132: } ! 133: ! 134: #define DELAY(N) { register int d; d = N; while (--d > 0); } ! 135: ! 136: ubareset() ! 137: { ! 138: struct uba_regs *up = (struct uba_regs *)UBA0; ! 139: register struct cdevsw *cdp; ! 140: int s; ! 141: ! 142: s = spl6(); ! 143: printf("UBA RESET:"); ! 144: up->uba_cr = ADINIT; ! 145: up->uba_cr = IFS|BRIE|USEFIE|SUEFIE; ! 146: while ((up->uba_cnfgr & UBIC) == 0) ! 147: ; ! 148: for (cdp = cdevsw; cdp->d_open; cdp++) ! 149: (*cdp->d_reset)(); ! 150: printf("\n"); ! 151: splx(s); ! 152: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.