1*1412Sbill /* mba.c 3.6 10/13/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 2428Sbill mbastart(bp, adcr) 25420Sbill register struct buf *bp; 26420Sbill int *adcr; 2728Sbill { 2828Sbill register int i; 2928Sbill int npf; 3028Sbill unsigned v; 3128Sbill register struct pte *pte, *io; 3228Sbill int o; 3328Sbill int vaddr; 3428Sbill register struct mba_regs *mbap; 3528Sbill struct proc *rp; 3628Sbill 37420Sbill mbap = mbainfo[mbanum[major(bp->b_dev)]].mi_loc; 38*1412Sbill io = mbap->mba_map; 39*1412Sbill v = btop(bp->b_un.b_addr); 40*1412Sbill o = (int)bp->b_un.b_addr & PGOFSET; 41*1412Sbill npf = btoc(bp->b_bcount + o); 42*1412Sbill rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc; 43*1412Sbill vaddr = o; 44*1412Sbill if (bp->b_flags & B_UAREA) { 45*1412Sbill for (i = 0; i < UPAGES; i++) { 46*1412Sbill if (rp->p_addr[i].pg_pfnum == 0) 47*1412Sbill panic("mba: zero upage"); 48*1412Sbill *(int *)io++ = rp->p_addr[i].pg_pfnum | PG_V; 4928Sbill } 50*1412Sbill } else if ((bp->b_flags & B_PHYS) == 0) { 51*1412Sbill pte = &Sysmap[btop(((int)bp->b_un.b_addr)&0x7fffffff)]; 52*1412Sbill while (--npf >= 0) 53*1412Sbill *(int *)io++ = pte++->pg_pfnum | PG_V; 54*1412Sbill } else { 55*1412Sbill if (bp->b_flags & B_PAGET) 56*1412Sbill pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)]; 57*1412Sbill else 58*1412Sbill pte = vtopte(rp, v); 59*1412Sbill while (--npf >= 0) { 60*1412Sbill if (pte->pg_pfnum == 0) 61*1412Sbill panic("mba, zero entry"); 62*1412Sbill *(int *)io++ = pte++->pg_pfnum | PG_V; 63*1412Sbill } 6428Sbill } 65*1412Sbill *(int *)io++ = 0; 6628Sbill mbap->mba_sr = -1; /* clear status (error) bits */ 6728Sbill mbap->mba_bcr = -bp->b_bcount; 6828Sbill mbap->mba_var = vaddr; 6928Sbill if (bp->b_flags & B_READ) 7028Sbill *adcr = MBARCOM | GO; 7128Sbill else 7228Sbill *adcr = MBAWCOM | GO; 7328Sbill } 7428Sbill 75420Sbill mbainit(mbanum) 76420Sbill int mbanum; 7728Sbill { 78*1412Sbill register struct pte *b; 79420Sbill register int i; 80420Sbill register struct mba_info *mi; 81420Sbill register struct mba_regs *mbap; 82420Sbill unsigned v; 8328Sbill 84420Sbill mi = &mbainfo[mbanum]; 85420Sbill v = btop((int)mi->mi_phys); 86420Sbill b = mi->mi_map; 87420Sbill for (i = 0; i < 8192; i += NBPG) { 88420Sbill *(int *)b++ = PG_V | PG_KW | v; 89420Sbill mtpr(TBIS, ptob(v)); 90420Sbill v++; 91420Sbill } 92420Sbill mbap = mi->mi_loc; 93420Sbill mbap->mba_cr = MBAINIT; 94420Sbill mbap->mba_cr = MBAIE; 95420Sbill mbaact |= (1<<mbanum); 9628Sbill } 97