1 /* mba.c 3.5 08/27/80 */ 2 3 #include "../h/param.h" 4 #include "../h/buf.h" 5 #include "../h/conf.h" 6 #include "../h/systm.h" 7 #include "../h/dir.h" 8 #include "../h/user.h" 9 #include "../h/proc.h" 10 #include "../h/seg.h" 11 #include "../h/pte.h" 12 #include "../h/map.h" 13 #include "../h/mba.h" 14 #include "../h/mtpr.h" 15 #include "../h/vm.h" 16 17 /* 18 * startup routine for MBA controllers. 19 */ 20 #define MBAWCOM 0x30 21 #define MBARCOM 0x38 22 #define GO 01 23 24 extern char buffers[NBUF][BSIZE]; 25 26 mbastart(bp, adcr) 27 register struct buf *bp; 28 int *adcr; 29 { 30 register int i; 31 int npf; 32 unsigned v; 33 register struct pte *pte, *io; 34 int o; 35 int vaddr; 36 register struct mba_regs *mbap; 37 struct proc *rp; 38 39 mbap = mbainfo[mbanum[major(bp->b_dev)]].mi_loc; 40 if ((bp->b_flags & B_PHYS) == 0) 41 vaddr = (bp->b_un.b_addr - buffers[0]); 42 else { 43 io = &mbap->mba_map[128]; 44 v = btop(bp->b_un.b_addr); 45 o = (int)bp->b_un.b_addr & PGOFSET; 46 npf = btoc(bp->b_bcount + o); 47 rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc; 48 vaddr = (128 << 9) | o; 49 if (bp->b_flags & B_UAREA) { 50 for (i = 0; i < UPAGES; i++) { 51 if (rp->p_addr[i].pg_pfnum == 0) 52 panic("mba: zero upage"); 53 *(int *)io++ = rp->p_addr[i].pg_pfnum | PG_V; 54 } 55 } else if ((bp->b_flags & B_PHYS) == 0) { 56 v &= 0x1fffff; /* drop to physical addr */ 57 while (--npf >= 0) 58 *(int *)io++ = v++ | PG_V; 59 } else { 60 if (bp->b_flags & B_PAGET) 61 pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)]; 62 else 63 pte = vtopte(rp, v); 64 while (--npf >= 0) { 65 if (pte->pg_pfnum == 0) 66 panic("mba, zero entry"); 67 *(int *)io++ = pte++->pg_pfnum | PG_V; 68 } 69 } 70 } 71 mbap->mba_sr = -1; /* clear status (error) bits */ 72 mbap->mba_bcr = -bp->b_bcount; 73 mbap->mba_var = vaddr; 74 if (bp->b_flags & B_READ) 75 *adcr = MBARCOM | GO; 76 else 77 *adcr = MBAWCOM | GO; 78 } 79 80 mbainit(mbanum) 81 int mbanum; 82 { 83 register struct pte *io, *b; 84 register int i; 85 register struct mba_info *mi; 86 register struct mba_regs *mbap; 87 unsigned v; 88 89 mi = &mbainfo[mbanum]; 90 v = btop((int)mi->mi_phys); 91 b = mi->mi_map; 92 for (i = 0; i < 8192; i += NBPG) { 93 *(int *)b++ = PG_V | PG_KW | v; 94 mtpr(TBIS, ptob(v)); 95 v++; 96 } 97 mbap = mi->mi_loc; 98 mbap->mba_cr = MBAINIT; 99 mbap->mba_cr = MBAIE; 100 io = mbap->mba_map; 101 b = &Sysmap[btop(((int)buffers[0])&0x7fffffff)]; 102 for (i = NBUF * CLSIZE; i > 0; i--) { 103 *(int *)io++ = PG_V | b->pg_pfnum; 104 b++; 105 } 106 *(int *)io = 0; 107 mbaact |= (1<<mbanum); 108 } 109