(no message)
[unix-history] / usr / src / sys / vax / mba / mba.c
CommitLineData
f86df66c 1/* mba.c 3.3 %G% */
b5ad10c3
BJ
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
24int mbaboff;
25
26mbastart(bp, adcr)
27register struct buf *bp;
28int *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 extern int mbanum[], *mbaloc[];
5f3edb0e 39 extern char buffers[NBUF][BSIZE];
b5ad10c3
BJ
40
41 mbap = (struct mba_regs *)mbaloc[mbanum[major(bp->b_dev)]];
42 if ((bp->b_flags & B_PHYS) == 0)
43 vaddr = (bp->b_un.b_addr - (char *)buffers) + mbaboff;
44 else {
45 io = (struct pte *)mbap;
46 io += (MBA_MAP + 128*4)/4;
47 v = btop(bp->b_un.b_addr);
48 o = (int)bp->b_un.b_addr & PGOFSET;
49 npf = btoc(bp->b_bcount + o);
50 rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc;
51 vaddr = (128 << 9) | o;
52 if (bp->b_flags & B_UAREA) {
53 for (i = 0; i < UPAGES; i++) {
54 if (rp->p_addr[i].pg_pfnum == 0)
55 panic("mba: zero upage");
56 *(int *)io++ = rp->p_addr[i].pg_pfnum | PG_V;
57 }
58 } else if ((bp->b_flags & B_PHYS) == 0) {
59 v &= 0x1fffff; /* drop to physical addr */
60 while (--npf >= 0)
61 *(int *)io++ = v++ | PG_V;
62 } else {
63 if (bp->b_flags & B_PAGET)
64 pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)];
65 else
66 pte = vtopte(rp, v);
67 while (--npf >= 0) {
68 if (pte->pg_pfnum == 0)
69 panic("mba, zero entry");
70 *(int *)io++ = pte++->pg_pfnum | PG_V;
71 }
72 }
73 }
74 mbap->mba_sr = -1; /* clear status (error) bits */
75 mbap->mba_bcr = -bp->b_bcount;
76 mbap->mba_var = vaddr;
77 if (bp->b_flags & B_READ)
78 *adcr = MBARCOM | GO;
79 else
80 *adcr = MBAWCOM | GO;
81}
82
83mbainit()
84{
85 register int *io0, *io1, *b, t, j;
86 extern int *mbaloc[];
5f3edb0e 87 extern char buffers[NBUF][BSIZE];
b5ad10c3
BJ
88
89 io0 = mbaloc[0] + (MBA_MAP/4);
90 io1 = mbaloc[1] + (MBA_MAP/4);
91 b = (int *)Sysmap + ((((int) buffers)>>9)&PG_PFNUM);
92 j = NBUF * CLSIZE + ((int)buffers & 0x1ff ? 1 : 0);
93 do {
94 t = PG_V | (*b++ & PG_PFNUM);
95 *io0++ = t;
96 *io1++ = t;
97 } while (--j>0);
98 *io0 = 0; /* invalidate next entry */
99 *io1 = 0;
100 mbaboff = (int)buffers & 0x1ff;
101}