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