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