xref: /csrg-svn/sys/vax/stand/mba.c (revision 415)
1*415Sbill /*	mba.c	1.3	07/28/80	*/
2323Sbill 
3323Sbill #include "../h/param.h"
4323Sbill #include "../h/inode.h"
5323Sbill #include "../h/pte.h"
6323Sbill #include "../h/mba.h"
7323Sbill #include "../h/mtpr.h"
8323Sbill #include "../h/vm.h"
9323Sbill #include "saio.h"
10323Sbill 
11323Sbill /*
12323Sbill  * startup routine for MBA controllers.
13323Sbill  */
14323Sbill #define	MBAWCOM	0x30
15323Sbill #define	MBARCOM	0x38
16323Sbill #define	GO	01
17323Sbill 
18*415Sbill struct mba_info mbainfo[] = {
19*415Sbill 	PHYSMBA0,
20*415Sbill 	PHYSMBA1,
21*415Sbill };
22*415Sbill 
23323Sbill mbastart(io, adcr, func)
24323Sbill register struct iob *io;
25323Sbill int *adcr;
26323Sbill {
27323Sbill 	register int i;
28323Sbill 	int npf;
29323Sbill 	unsigned v;
30323Sbill 	register struct pte *pte;
31323Sbill 	int o;
32323Sbill 	int vaddr;
33323Sbill 	extern int mbanum[], *mbaloc[];
34323Sbill 	register struct mba_regs *mbap;
35323Sbill 
36391Sbill 	mbap = (struct mba_regs *)mbaloc[mbanum[io->i_ino.i_dev]];
37323Sbill 	pte = (struct pte *)mbap;
38323Sbill 	pte += (MBA_MAP + 128*4)/4;
39323Sbill 	v = btop(io->i_ma);
40323Sbill 	o = (int)io->i_ma & PGOFSET;
41323Sbill 	npf = btoc(io->i_cc + o);
42323Sbill 	vaddr = (128 << 9) | o;
43323Sbill 	v &= 0x1fffff;		/* drop to physical addr */
44323Sbill 	while (--npf >= 0)
45323Sbill 		*(int *)pte++ = v++ | PG_V;
46323Sbill 	mbap->mba_sr = -1;	/* clear status (error) bits */
47323Sbill 	mbap->mba_bcr = -io->i_cc;
48323Sbill 	mbap->mba_var = vaddr;
49323Sbill 	if (func == READ)
50323Sbill 		*adcr = MBARCOM | GO;
51323Sbill 	else if (func == WRITE) {
52323Sbill 		*adcr = MBAWCOM | GO;
53323Sbill 	}
54323Sbill }
55*415Sbill 
56*415Sbill mbainit(mbanum)
57*415Sbill 	int mbanum;
58*415Sbill {
59*415Sbill 	register struct mba_regs *mbap = mbainfo[mbanum];
60*415Sbill 
61*415Sbill 	mbap->mba_cr = MBA_INIT;
62*415Sbill 	mbaact |= 1<<mbanum;
63*415Sbill }
64