xref: /original-bsd/sys/vax/stand/mba.c (revision 552e81d8)
1 /*	mba.c	1.4	07/29/80	*/
2 
3 #include "../h/param.h"
4 #include "../h/inode.h"
5 #include "../h/pte.h"
6 #include "../h/mba.h"
7 #include "../h/mtpr.h"
8 #include "../h/vm.h"
9 #include "saio.h"
10 
11 /*
12  * startup routine for MBA controllers.
13  */
14 #define	MBAWCOM	0x30
15 #define	MBARCOM	0x38
16 #define	GO	01
17 
18 struct mba_info mbainfo[] = {
19 	PHYSMBA0,
20 	PHYSMBA1,
21 };
22 
23 mbastart(io, adcr, func)
24 register struct iob *io;
25 int *adcr;
26 {
27 	register int i;
28 	int npf;
29 	unsigned v;
30 	register struct pte *pte;
31 	int o;
32 	int vaddr;
33 	extern int mbanum[], *mbaloc[];
34 	register struct mba_regs *mbap;
35 
36 	mbap = (struct mba_regs *)mbaloc[mbanum[io->i_ino.i_dev]];
37 	pte = &mbap->mba_map[128];
38 	v = btop(io->i_ma);
39 	o = (int)io->i_ma & PGOFSET;
40 	npf = btoc(io->i_cc + o);
41 	vaddr = (128 << 9) | o;
42 	v &= 0x1fffff;		/* drop to physical addr */
43 	while (--npf >= 0)
44 		*(int *)pte++ = v++ | PG_V;
45 	mbap->mba_sr = -1;	/* clear status (error) bits */
46 	mbap->mba_bcr = -io->i_cc;
47 	mbap->mba_var = vaddr;
48 	if (func == READ)
49 		*adcr = MBARCOM | GO;
50 	else if (func == WRITE) {
51 		*adcr = MBAWCOM | GO;
52 	}
53 }
54 
55 mbainit(mbanum)
56 	int mbanum;
57 {
58 	register struct mba_regs *mbap = mbainfo[mbanum].mi_phys;
59 
60 	mbap->mba_cr = MBAINIT;
61 	mbaact |= 1<<mbanum;
62 }
63