1*420Sbill /* mba.c 3.4 07/29/80 */ 228Sbill 328Sbill #include "../h/param.h" 428Sbill #include "../h/buf.h" 528Sbill #include "../h/conf.h" 628Sbill #include "../h/systm.h" 728Sbill #include "../h/dir.h" 828Sbill #include "../h/user.h" 928Sbill #include "../h/proc.h" 1028Sbill #include "../h/seg.h" 1128Sbill #include "../h/pte.h" 1228Sbill #include "../h/map.h" 1328Sbill #include "../h/mba.h" 1428Sbill #include "../h/mtpr.h" 1528Sbill #include "../h/vm.h" 1628Sbill 1728Sbill /* 1828Sbill * startup routine for MBA controllers. 1928Sbill */ 2028Sbill #define MBAWCOM 0x30 2128Sbill #define MBARCOM 0x38 2228Sbill #define GO 01 2328Sbill 24*420Sbill extern char buffers[NBUF][BSIZE]; 2528Sbill 2628Sbill mbastart(bp, adcr) 27*420Sbill register struct buf *bp; 28*420Sbill int *adcr; 2928Sbill { 3028Sbill register int i; 3128Sbill int npf; 3228Sbill unsigned v; 3328Sbill register struct pte *pte, *io; 3428Sbill int o; 3528Sbill int vaddr; 3628Sbill register struct mba_regs *mbap; 3728Sbill struct proc *rp; 3828Sbill 39*420Sbill mbap = mbainfo[mbanum[major(bp->b_dev)]].mi_loc; 4028Sbill if ((bp->b_flags & B_PHYS) == 0) 41*420Sbill vaddr = (bp->b_un.b_addr - buffers[0]); 4228Sbill else { 43*420Sbill io = &mbap->mba_map[128]; 4428Sbill v = btop(bp->b_un.b_addr); 4528Sbill o = (int)bp->b_un.b_addr & PGOFSET; 4628Sbill npf = btoc(bp->b_bcount + o); 4728Sbill rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc; 4828Sbill vaddr = (128 << 9) | o; 4928Sbill if (bp->b_flags & B_UAREA) { 5028Sbill for (i = 0; i < UPAGES; i++) { 5128Sbill if (rp->p_addr[i].pg_pfnum == 0) 5228Sbill panic("mba: zero upage"); 5328Sbill *(int *)io++ = rp->p_addr[i].pg_pfnum | PG_V; 5428Sbill } 5528Sbill } else if ((bp->b_flags & B_PHYS) == 0) { 5628Sbill v &= 0x1fffff; /* drop to physical addr */ 5728Sbill while (--npf >= 0) 5828Sbill *(int *)io++ = v++ | PG_V; 5928Sbill } else { 6028Sbill if (bp->b_flags & B_PAGET) 6128Sbill pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)]; 6228Sbill else 6328Sbill pte = vtopte(rp, v); 6428Sbill while (--npf >= 0) { 6528Sbill if (pte->pg_pfnum == 0) 6628Sbill panic("mba, zero entry"); 6728Sbill *(int *)io++ = pte++->pg_pfnum | PG_V; 6828Sbill } 6928Sbill } 7028Sbill } 7128Sbill mbap->mba_sr = -1; /* clear status (error) bits */ 7228Sbill mbap->mba_bcr = -bp->b_bcount; 7328Sbill mbap->mba_var = vaddr; 7428Sbill if (bp->b_flags & B_READ) 7528Sbill *adcr = MBARCOM | GO; 7628Sbill else 7728Sbill *adcr = MBAWCOM | GO; 7828Sbill } 7928Sbill 80*420Sbill mbainit(mbanum) 81*420Sbill int mbanum; 8228Sbill { 83*420Sbill register struct pte *io, *b; 84*420Sbill register int i; 85*420Sbill register struct mba_info *mi; 86*420Sbill register struct mba_regs *mbap; 87*420Sbill unsigned v; 8828Sbill 89*420Sbill mi = &mbainfo[mbanum]; 90*420Sbill v = btop((int)mi->mi_phys); 91*420Sbill b = mi->mi_map; 92*420Sbill for (i = 0; i < 8192; i += NBPG) { 93*420Sbill *(int *)b++ = PG_V | PG_KW | v; 94*420Sbill mtpr(TBIS, ptob(v)); 95*420Sbill v++; 96*420Sbill } 97*420Sbill mbap = mi->mi_loc; 98*420Sbill mbap->mba_cr = MBAINIT; 99*420Sbill mbap->mba_cr = MBAIE; 100*420Sbill io = mbap->mba_map; 101*420Sbill b = &Sysmap[btop(((int)buffers[0])&0x7fffffff)]; 102*420Sbill for (i = NBUF * CLSIZE; i > 0; i--) { 103*420Sbill *(int *)io++ = PG_V | b->pg_pfnum; 104*420Sbill b++; 105*420Sbill } 106*420Sbill *(int *)io = 0; 107*420Sbill mbaact |= (1<<mbanum); 10828Sbill } 109