Commit | Line | Data |
---|---|---|
da1392b6 | 1 | /* mba.c 3.5 %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 | ||
80e7c811 | 24 | extern char buffers[NBUF][BSIZE]; |
b5ad10c3 BJ |
25 | |
26 | mbastart(bp, adcr) | |
80e7c811 BJ |
27 | register struct buf *bp; |
28 | int *adcr; | |
b5ad10c3 BJ |
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; | |
b5ad10c3 | 38 | |
80e7c811 | 39 | mbap = mbainfo[mbanum[major(bp->b_dev)]].mi_loc; |
b5ad10c3 | 40 | if ((bp->b_flags & B_PHYS) == 0) |
80e7c811 | 41 | vaddr = (bp->b_un.b_addr - buffers[0]); |
b5ad10c3 | 42 | else { |
80e7c811 | 43 | io = &mbap->mba_map[128]; |
b5ad10c3 BJ |
44 | v = btop(bp->b_un.b_addr); |
45 | o = (int)bp->b_un.b_addr & PGOFSET; | |
46 | npf = btoc(bp->b_bcount + o); | |
47 | rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc; | |
48 | vaddr = (128 << 9) | o; | |
49 | if (bp->b_flags & B_UAREA) { | |
50 | for (i = 0; i < UPAGES; i++) { | |
51 | if (rp->p_addr[i].pg_pfnum == 0) | |
52 | panic("mba: zero upage"); | |
53 | *(int *)io++ = rp->p_addr[i].pg_pfnum | PG_V; | |
54 | } | |
55 | } else if ((bp->b_flags & B_PHYS) == 0) { | |
56 | v &= 0x1fffff; /* drop to physical addr */ | |
57 | while (--npf >= 0) | |
58 | *(int *)io++ = v++ | PG_V; | |
59 | } else { | |
60 | if (bp->b_flags & B_PAGET) | |
61 | pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)]; | |
62 | else | |
63 | pte = vtopte(rp, v); | |
64 | while (--npf >= 0) { | |
65 | if (pte->pg_pfnum == 0) | |
66 | panic("mba, zero entry"); | |
67 | *(int *)io++ = pte++->pg_pfnum | PG_V; | |
68 | } | |
69 | } | |
70 | } | |
71 | mbap->mba_sr = -1; /* clear status (error) bits */ | |
72 | mbap->mba_bcr = -bp->b_bcount; | |
73 | mbap->mba_var = vaddr; | |
74 | if (bp->b_flags & B_READ) | |
75 | *adcr = MBARCOM | GO; | |
76 | else | |
77 | *adcr = MBAWCOM | GO; | |
78 | } | |
79 | ||
80e7c811 BJ |
80 | mbainit(mbanum) |
81 | int mbanum; | |
b5ad10c3 | 82 | { |
80e7c811 BJ |
83 | register struct pte *io, *b; |
84 | register int i; | |
85 | register struct mba_info *mi; | |
86 | register struct mba_regs *mbap; | |
87 | unsigned v; | |
b5ad10c3 | 88 | |
80e7c811 BJ |
89 | mi = &mbainfo[mbanum]; |
90 | v = btop((int)mi->mi_phys); | |
91 | b = mi->mi_map; | |
92 | for (i = 0; i < 8192; i += NBPG) { | |
93 | *(int *)b++ = PG_V | PG_KW | v; | |
94 | mtpr(TBIS, ptob(v)); | |
95 | v++; | |
96 | } | |
97 | mbap = mi->mi_loc; | |
98 | mbap->mba_cr = MBAINIT; | |
99 | mbap->mba_cr = MBAIE; | |
100 | io = mbap->mba_map; | |
101 | b = &Sysmap[btop(((int)buffers[0])&0x7fffffff)]; | |
102 | for (i = NBUF * CLSIZE; i > 0; i--) { | |
103 | *(int *)io++ = PG_V | b->pg_pfnum; | |
104 | b++; | |
105 | } | |
106 | *(int *)io = 0; | |
107 | mbaact |= (1<<mbanum); | |
b5ad10c3 | 108 | } |