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