xref: /csrg-svn/sys/vax/stand/mba.c (revision 3262)
1*3262Swnj /*	mba.c	4.3	81/03/15	*/
2323Sbill 
3323Sbill #include "../h/param.h"
4323Sbill #include "../h/inode.h"
5323Sbill #include "../h/pte.h"
6*3262Swnj #include "../h/mbareg.h"
7323Sbill #include "../h/mtpr.h"
8323Sbill #include "../h/vm.h"
9323Sbill #include "saio.h"
10*3262Swnj #include "savax.h"
11323Sbill 
12*3262Swnj mbastart(io, func)
13*3262Swnj 	register struct iob *io;
14*3262Swnj 	int func;
15323Sbill {
16*3262Swnj 	struct mba_regs *mba = mbamba(io->i_unit);
17*3262Swnj 	struct mba_drv *drv = mbadrv(io->i_unit);
18*3262Swnj 	register struct pte *pte = mba->mba_map;
19323Sbill 	int npf;
20323Sbill 	unsigned v;
21323Sbill 	int o;
22323Sbill 	int vaddr;
23323Sbill 
24323Sbill 	v = btop(io->i_ma);
25323Sbill 	o = (int)io->i_ma & PGOFSET;
26323Sbill 	npf = btoc(io->i_cc + o);
27*3262Swnj 	vaddr = o;
28323Sbill 	while (--npf >= 0)
29323Sbill 		*(int *)pte++ = v++ | PG_V;
30*3262Swnj 	mba->mba_sr = -1;
31*3262Swnj 	mba->mba_bcr = -io->i_cc;
32*3262Swnj 	mba->mba_var = vaddr;
33*3262Swnj 	if (func == WRITE)
34*3262Swnj 		drv->mbd_cs1 = MB_WCOM | MB_GO;
35*3262Swnj 	else
36*3262Swnj 		drv->mbd_cs1 = MB_RCOM | MB_GO;
37323Sbill }
38415Sbill 
39415Sbill mbainit(mbanum)
40415Sbill 	int mbanum;
41415Sbill {
42*3262Swnj 	register struct mba_regs *mba = mbaddr[mbanum];
43415Sbill 
44*3262Swnj 	/* SHOULD BADADDR IT */
45*3262Swnj 	if (mbaact & (1<<mbanum))
46*3262Swnj 		return;
47*3262Swnj 	mba->mba_cr = MBCR_INIT;
48415Sbill 	mbaact |= 1<<mbanum;
49415Sbill }
50