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