|
|
1.1 root 1: /*
2: * machine-specific hardware routines,
3: * these for MicroVAX III
4: */
5:
6: #include "sys/param.h"
7: #include "sys/pte.h"
8: #include "sys/mtpr.h"
9: #include "sys/vm.h"
10: #include "sys/qbio.h"
11: #include "sys/clock.h"
12:
13: #define CADR 37 /* first-level cache control */
14: #define IORESET 55 /* reset all IO connections */
15: #define CEN 020 /* cacr: cache enable */
16: #define CAEN 0360 /* CADR: enable both halves, both I and D */
17:
18: /*
19: * bits in console mailbox
20: */
21:
22: #define HALTACT 03 /* halt action */
23: #define HMRBOOT 0 /* halt: restart, then boot (if halts disabled!) */
24: #define HMRST 01 /* halt: restart regardless (but never boot) */
25: #define HMBOOT 02 /* halt: boot */
26: #define BOOTIH 04 /* boot inhibit */
27: #define RSTIH 010 /* restart inhibit */
28:
29: char *iospace;
30: int delayfact = 3; /* factor for DELAY macro */
31:
32: /*
33: * adjust physical top of memory to useful top of memory:
34: * preserve memory bitmap (one bit per 512-byte page)
35: * and Q-bus map, which steals memory as well
36: * the console is meant to have left it all at the top
37: * but we may not have found the top, if intermediate bits are broken
38: */
39: machmem(hi)
40: register int hi;
41: {
42: register int qm;
43:
44: qm = *(int *)0x20080010; /* addr of Q-bus map in mem */
45: qm -= qm/(NBPG*NBBY); /* bitmap */
46: if (hi < qm) /* in case memory has holes */
47: return (hi);
48: return (qm);
49: }
50:
51: /*
52: * miscellaneous machine-dependent initialization
53: * called just after mapping turned on
54: *
55: * - make instruction emulation code accessible from user space
56: * - reset and enable IO
57: * - enable caches
58: *
59: * eventually some of the init stuff moves to machreset
60: */
61: machinit()
62: {
63: register int *p; /* pun; really struct pte */
64: register char *e;
65: register struct iomfair *q;
66: register int i;
67: extern char _emulbeg, _emulend;
68:
69: e = &_emulbeg;
70: p = (int *)&Sysmap[btop((int)e & ~KSTART)];
71: do {
72: *p = (*p &~ PG_PROT) | PG_URKR;
73: p++;
74: e += NBPG;
75: } while (e < &_emulend);
76: mtpr(IORESET, 0);
77: q = (struct iomfair *)iospace;
78: for (i = 0; i < CACHESIZE; i++)
79: q->d.cd[i] = 0; /* flush second-level cache */
80: q->d.cacr |= CEN; /* and enable it */
81: mtpr(CADR, mfpr(CADR)|CAEN);
82: machreset();
83: mcrinit();
84: }
85:
86: /*
87: * stray interrupt handling:
88: * just decrypt it and return
89: */
90: strayintr(v)
91: int v;
92: {
93: if (v < 0x200)
94: printf("stray interrupt at 0x%x\n", v);
95: else
96: printf("stray Q-bus interrupt at 0%o\n", v-0x200);
97: }
98:
99: /*
100: * how big is io space?
101: */
102:
103: mchiopsize()
104: {
105: return (sizeof(struct iomfair));
106: }
107:
108: /*
109: * set up the page tables for iospace
110: * called while the system page table is being assembled;
111: * memory mapping is off
112: * pt is the first page table of an area
113: * mapping what mchiopsize returned
114: */
115:
116: mchiopinit(pt)
117: struct pte *pt;
118: {
119: register long *p; /* pun, for efficiency */
120: register long b;
121: register int i;
122:
123: p = (long *)pt;
124: *p++ = PG_V|PG_KW|btop(0x20080000); /* cpu regs */
125: *p++ = PG_V|PG_KW|btop(0x20140400); /* NVRAM */
126: *p++ = PG_V|PG_KW|btop(0x20084000); /* cache register */
127: b = btop(0x10000000); /* cache diagnostic space */
128: for (i = 0; i < btop(CACHESIZE*sizeof(long)); i++)
129: *p++ = PG_V|PG_KW|b++;
130: b = btop(0x20088000); /* Q-bus map */
131: for (i = 0; i < btop(NQMREG*sizeof(long)); i++)
132: *p++ = PG_V|PG_KW|b++;
133: b = btop(0x20000000); /* Q-bus io regs */
134: for (i = 0; i < btop(8192); i++)
135: *p++ = PG_V|PG_KW|b++;
136: }
137:
138: /*
139: * return the IO regs for a Q-bus adapter
140: * (there's really only one, but only this code knows that)
141: */
142:
143: caddr_t
144: qbaaddr(u)
145: int u;
146: {
147: if (u != 0)
148: return (0);
149: return ((caddr_t)&((struct iomfair *)iospace)->u[u]);
150: }
151:
152: /*
153: * arrange for a restart on halt
154: * -- it would be slightly preferable
155: * to fall back to a boot if the restart fails;
156: * alas, to do that on MicroVAX II or III,
157: * you must disable console halts
158: */
159:
160: setrestart()
161: {
162: register short *p;
163:
164: p = &((struct iomfair *)iospace)->w.cpmbx;
165: *p &=~ (BOOTIH|RSTIH|HALTACT);
166: *p |= HMRST; /* always just restart */
167: }
168:
169: /*
170: * arrange for a boot, now or on next halt
171: * -- sometimes called with mapping disabled
172: */
173:
174: setboot()
175: {
176: register short *p;
177:
178: if (mfpr(MAPEN))
179: p = &((struct iomfair *)iospace)->w.cpmbx;
180: else
181: p = (short *)0x20140400;
182: *p &=~ (BOOTIH|RSTIH|HALTACT);
183: *p |= HMBOOT; /* halt mode `boot' */
184: }
185:
186: /*
187: * fetch/set time-of-year clock
188: */
189:
190: gettodr()
191: {
192: return (mfpr(TODR));
193: }
194:
195: settodr(t)
196: long t;
197: {
198: mtpr(TODR, t);
199: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.