xref: /csrg-svn/sys/vax/mba/mba.c (revision 420)
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