xref: /original-bsd/sys/vax/stand/uba.c (revision fbed46ce)
1 /*	uba.c	4.5	81/11/12	*/
2 
3 #include "../h/param.h"
4 #include "../h/inode.h"
5 #include "../h/cpu.h"
6 #include "../h/pte.h"
7 #include "../h/ubareg.h"
8 #include "../h/vm.h"
9 #include "saio.h"
10 #include "savax.h"
11 
12 /*
13  * Note... this routine does not
14  * really allocate; unless bdp == 2
15  * you always get the same space.
16  * When bdp == 2 you get some other space.
17  */
18 ubasetup(io, bdp)
19 	register struct iob *io;
20 	int bdp;
21 {
22 	int npf;
23 	unsigned v;
24 	register struct pte *pte;
25 	int o, temp, reg;
26 	static int lastreg = 128+64;
27 
28 	v = btop(io->i_ma);
29 	o = (int)io->i_ma & PGOFSET;
30 	npf = btoc(io->i_cc + o) +1;
31 	if (bdp == 2) {
32 		reg = lastreg;
33 		lastreg += npf;
34 		bdp = 0;
35 	} else
36 		reg = 0;
37 	pte = &ubauba(io->i_unit)->uba_map[reg];
38 	temp = (bdp << 21) | UBAMR_MRV;
39 	if (bdp && (o & 01))
40 		temp |= UBAMR_BO;
41 	v &= 0x1fffff;			/* drop to physical addr */
42 	while (--npf != 0)
43 		*(int *)pte++ = v++ | temp;
44 	*(int *)pte++ = 0;
45 	return ((bdp << 28) | (reg << 9) | o);
46 }
47 
48 ubafree(io, mr)
49 	struct iob *io;
50 	int mr;
51 {
52 	register int bdp;
53 
54 	bdp = (mr >> 28) & 0x0f;
55 	if (bdp == 0)
56 		return;
57 	switch (cpu) {
58 
59 	case VAX_780:
60 		ubauba(io->i_unit)->uba_dpr[bdp] |= UBADPR_BNE;
61 		break;
62 
63 	case VAX_750:
64 		ubauba(io->i_unit)->uba_dpr[bdp] |=
65 		     UBADPR_PURGE|UBADPR_NXM|UBADPR_UCE;
66 		break;
67 	case VAX_7ZZ:
68 		break;
69 	}
70 }
71