|
|
1.1 root 1: /* mba.c 4.2 11/9/80 */
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:
24: mbastart(bp, adcr)
25: register struct buf *bp;
26: int *adcr;
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;
36:
37: mbap = mbainfo[mbanum[major(bp->b_dev)]].mi_loc;
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;
63: }
64: }
65: *(int *)io++ = 0;
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:
75: mbainit(mbano)
76: int mbano;
77: {
78: register struct pte *b;
79: register int i;
80: register struct mba_info *mi;
81: register struct mba_regs *mbap;
82: unsigned v;
83:
84: mi = &mbainfo[mbano];
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;
95: mbaact |= (1<<mbano);
96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.