Commit | Line | Data |
---|---|---|
f7acbdcc | 1 | /* mba.c 1.4 %G% */ |
6810489f BJ |
2 | |
3 | #include "../h/param.h" | |
4 | #include "../h/inode.h" | |
5 | #include "../h/pte.h" | |
6 | #include "../h/mba.h" | |
7 | #include "../h/mtpr.h" | |
8 | #include "../h/vm.h" | |
9 | #include "saio.h" | |
10 | ||
11 | /* | |
12 | * startup routine for MBA controllers. | |
13 | */ | |
14 | #define MBAWCOM 0x30 | |
15 | #define MBARCOM 0x38 | |
16 | #define GO 01 | |
17 | ||
56a904c5 BJ |
18 | struct mba_info mbainfo[] = { |
19 | PHYSMBA0, | |
20 | PHYSMBA1, | |
21 | }; | |
22 | ||
6810489f BJ |
23 | mbastart(io, adcr, func) |
24 | register struct iob *io; | |
25 | int *adcr; | |
26 | { | |
27 | register int i; | |
28 | int npf; | |
29 | unsigned v; | |
30 | register struct pte *pte; | |
31 | int o; | |
32 | int vaddr; | |
33 | extern int mbanum[], *mbaloc[]; | |
34 | register struct mba_regs *mbap; | |
35 | ||
5a80d91a | 36 | mbap = (struct mba_regs *)mbaloc[mbanum[io->i_ino.i_dev]]; |
f7acbdcc | 37 | pte = &mbap->mba_map[128]; |
6810489f BJ |
38 | v = btop(io->i_ma); |
39 | o = (int)io->i_ma & PGOFSET; | |
40 | npf = btoc(io->i_cc + o); | |
41 | vaddr = (128 << 9) | o; | |
42 | v &= 0x1fffff; /* drop to physical addr */ | |
43 | while (--npf >= 0) | |
44 | *(int *)pte++ = v++ | PG_V; | |
45 | mbap->mba_sr = -1; /* clear status (error) bits */ | |
46 | mbap->mba_bcr = -io->i_cc; | |
47 | mbap->mba_var = vaddr; | |
48 | if (func == READ) | |
49 | *adcr = MBARCOM | GO; | |
50 | else if (func == WRITE) { | |
51 | *adcr = MBAWCOM | GO; | |
52 | } | |
53 | } | |
56a904c5 BJ |
54 | |
55 | mbainit(mbanum) | |
56 | int mbanum; | |
57 | { | |
f7acbdcc | 58 | register struct mba_regs *mbap = mbainfo[mbanum].mi_phys; |
56a904c5 | 59 | |
f7acbdcc | 60 | mbap->mba_cr = MBAINIT; |
56a904c5 BJ |
61 | mbaact |= 1<<mbanum; |
62 | } |