|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)autoconf.c 7.12 (Berkeley) 8/27/88
7: */
8:
9: #include "param.h"
10: #include "reboot.h"
11:
12: #include "../vax/cpu.h"
13: #include "../vax/nexus.h"
14: #include "../vax/pte.h"
15: #include "../vax/mtpr.h"
16: #include "../vaxuba/ubareg.h"
17: #include "../vaxmba/mbareg.h"
18:
19: #include "savax.h"
20:
21: #ifdef VAX8200
22: #include "../vaxbi/bireg.h"
23: #endif
24:
25: #if VAX8600 || VAX8200 || VAX780
26: /*
27: * These are used on CPU's that do configuration.
28: */
29: struct uba_regs *ubaddrspace[MAXNUBA];
30: caddr_t uioaddrspace[MAXNUBA];
31: struct mba_regs *mbaddrspace[MAXNMBA];
32: #endif
33:
34: #if VAX750
35: #define UTR(i) ((struct uba_regs *)(NEX750+(i)))
36: #define UMA(i) ((caddr_t)UMEM750(i)+UBAIOADDR)
37: #define MTR(i) ((struct mba_regs *)(NEX750+(i)))
38:
39: struct uba_regs *ubaddr750[] = { UTR(8), UTR(9) };
40: caddr_t uioaddr750[] = { UMA(0), UMA(1) };
41: struct mba_regs *mbaddr750[] = { MTR(4), MTR(5), MTR(6), MTR(7) };
42:
43: #undef UTR
44: #undef UMA
45: #undef MTR
46: #endif
47:
48: #if VAX730
49: #define UTR(i) ((struct uba_regs *)(NEX730+(i)))
50: #define UMA ((caddr_t)UMEM730+UBAIOADDR)
51:
52: struct uba_regs *ubaddr730[] = { UTR(3) };
53: caddr_t uioaddr730[] = { UMA };
54:
55: #undef UTR
56: #undef UMA
57: #endif
58:
59: #if VAX630 || VAX650
60: /*
61: * The map registers start at 20088000 on the ka630, so
62: * subtract a 2k offset to make things work.
63: *
64: * This could stand serious cleanup.
65: */
66: struct uba_regs *ubaddr630[] =
67: { (struct uba_regs *)((caddr_t)QBAMAP630 - 0x800) };
68: caddr_t uioaddr630[] = { (caddr_t)QIOPAGE630 };
69:
70: int (*v_getc)(), (*v_putc)();
71:
72: #ifndef SMALL
73: /*
74: * Virtual console configuration tables.
75: */
76: extern qv_init(),qd_init();
77:
78: int (*vcons_init[])() = {
79: qd_init,
80: qv_init,
81: 0
82: };
83: #endif
84: #endif
85:
86: #ifndef SMALL
87: extern int boothowto;
88: int debug = 0;
89: #endif
90: int cpuspeed = 1;
91:
92: configure()
93: {
94: union cpusid cpusid;
95: register int i;
96:
97: #ifndef SMALL
98: if (boothowto & RB_KDB) /* XXX */
99: debug = 1;
100: #endif
101: cpusid.cpusid = mfpr(SID);
102: cpu = cpusid.cpuany.cp_type;
103: switch (cpu) {
104:
105: #if VAX8600
106: case VAX_8600:
107: #ifndef SMALL
108: if (debug)
109: printf("cpu: 8600\nsbia 0:\n");
110: #endif
111: cpuspeed = 6;
112: probenexi(NEXA8600, (caddr_t)UMEMA8600(0)+UBAIOADDR, 0);
113: probenexi(NEXB8600, (caddr_t)UMEMB8600(0)+UBAIOADDR, 1);
114: break;
115: #endif
116:
117: #if VAX780
118: case VAX_780:
119: #ifndef SMALL
120: if (debug)
121: printf("cpu: 780\n");
122: #endif
123: cpuspeed = 2;
124: probenexi(NEX780, (caddr_t)UMEM780(0)+UBAIOADDR, 0);
125: break;
126: #endif
127:
128: #if VAX8200
129: case VAX_8200: {
130: register struct bi_node *bi;
131:
132: cpuspeed = 2;
133: for (i = 0, bi = BI_BASE(0); i < NNODEBI; i++, bi++) {
134: if (badaddr((caddr_t)bi, sizeof (long)))
135: continue;
136: #ifdef notdef
137: /* clear bus errors */
138: bi->biic.bi_ber = ~(BIBER_MBZ|BIBER_NMR|BIBER_UPEN);
139: #endif
140: #ifndef SMALL
141: if (debug)
142: printf("node%d: ", i);
143: #endif
144: switch (bi->biic.bi_dtype) {
145:
146: case BIDT_DWBUA:
147: if (nuba >= MAXNUBA) /* sorry */
148: break;
149: #ifndef SMALL
150: if (debug)
151: printf("uba%d\n", nuba);
152: #endif
153: ubaddrspace[nuba] = (struct uba_regs *)bi;
154: uioaddrspace[nuba] = (caddr_t)UMEM8200(i) +
155: UBAIOADDR;
156: ((struct dwbua_regs *)bi)->bua_csr |=
157: BUACSR_UPI;
158: nuba++;
159: break;
160:
161: case BIDT_KDB50:
162: if (nkdb < MAXNKDB) {
163: kdbaddr[nkdb++] = (caddr_t)bi;
164: #ifndef SMALL
165: if (debug)
166: printf("kdb%d\n", nkdb);
167: #endif
168: }
169: break;
170: #ifndef SMALL
171: default:
172: if (debug)
173: printf("unknown type %x\n",
174: bi->biic.bi_dtype);
175: break;
176: #endif
177: }
178: }
179: ubaddr = ubaddrspace;
180: uioaddr = uioaddrspace;
181: }
182: break;
183: #endif
184:
185: #if VAX750
186: case VAX_750:
187: #ifndef SMALL
188: if (debug)
189: printf("cpu: 750 -- assuming standard config\n");
190: #endif
191: mbaddr = mbaddr750;
192: ubaddr = ubaddr750;
193: uioaddr = uioaddr750;
194: nmba = sizeof (mbaddr750) / sizeof (mbaddr750[0]);
195: nuba = 2;
196: break;
197: #endif
198:
199: #if VAX730
200: case VAX_730:
201: #ifndef SMALL
202: if (debug)
203: printf("cpu: 730 -- assuming standard config\n");
204: #endif
205: ubaddr = ubaddr730;
206: uioaddr = uioaddr730;
207: nuba = 1;
208: break;
209: #endif
210:
211: #if VAX630
212: case VAX_630:
213: #ifndef SMALL
214: if (debug)
215: printf("cpu: uVAX II\n");
216: #endif
217: ubaddr = ubaddr630;
218: uioaddr = uioaddr630;
219: nuba = 1;
220: break;
221: #endif
222:
223: #if VAX650
224: case VAX_650:
225: #ifndef SMALL
226: if (debug)
227: printf("cpu: uVAX 3000\n");
228: #endif
229: ubaddr = ubaddr630;
230: uioaddr = uioaddr630;
231: nuba = 1;
232: break;
233: #endif
234: }
235:
236: /*
237: * Forward into the past...
238: */
239: /*
240: for (i = 0; i < nmba; i++)
241: if (!badaddr(mbaddr[i], sizeof(long)))
242: mbaddr[i]->mba_cr = MBCR_INIT;
243: */
244:
245: switch (cpu) {
246:
247: #if VAX750 || VAX730
248: case VAX_750:
249: case VAX_730:
250: mtpr(IUR, 0);
251: break;
252: #endif
253:
254: #if VAX630 || VAX650
255: case VAX_630:
256: case VAX_650:
257: mtpr(IUR, 0);
258: *((char *)QIOPAGE630 + QIPCR) = Q_LMEAE;
259: #if !defined(SMALL)
260: /*
261: * configure the console
262: */
263: for(i = 0; vcons_init[i] && !(*vcons_init[i])(); i++)
264: ;
265: #endif
266: break;
267: #endif
268: }
269:
270: /* give unibus devices a chance to recover... */
271: if (nuba > 0)
272: DELAY(500000);
273: }
274:
275: #if VAX8600 || VAX780
276: probenexi(nxp, umembase, sbia)
277: register struct nexus *nxp;
278: caddr_t umembase;
279: int sbia;
280: {
281: register int i;
282: union nexcsr nexcsr;
283: int first = 1;
284:
285: for (i = 0; i < 16; i++, nxp++) {
286: if (badaddr(nxp, sizeof(long)))
287: continue;
288: nexcsr = nxp->nexcsr;
289: if (nexcsr.nex_csr & NEX_APD)
290: continue;
291: #ifndef SMALL
292: if (debug) {
293: if (first && sbia != 0)
294: printf("sbia %d:\n", sbia);
295: printf("tr%d: ", i);
296: first = 0;
297: }
298: #endif
299: switch (nexcsr.nex_type) {
300: default:
301: #ifndef SMALL
302: if (debug)
303: printf("nexid %2x\n", nexcsr.nex_type);
304: #endif
305: break;
306:
307: case NEX_MEM4:
308: case NEX_MEM4I:
309: case NEX_MEM16:
310: case NEX_MEM16I:
311: case NEX_MEM64L:
312: case NEX_MEM64LI:
313: case NEX_MEM64U:
314: case NEX_MEM64UI:
315: case NEX_MEM64I:
316: #ifndef SMALL
317: if (debug)
318: printf("mem\n");
319: #endif
320: break;
321:
322: case NEX_CI:
323: #ifndef SMALL
324: if (debug)
325: printf("ci\n");
326: #endif
327: break;
328:
329: case NEX_DR32:
330: #ifndef SMALL
331: if (debug)
332: printf("dr32\n");
333: #endif
334: break;
335:
336: case NEX_MPM0:
337: case NEX_MPM1:
338: case NEX_MPM2:
339: case NEX_MPM3:
340: #ifndef SMALL
341: if (debug)
342: printf("mpm\n");
343: #endif
344: break;
345:
346: case NEX_MBA:
347: if (nmba >= MAXNMBA) {
348: #ifndef SMALL
349: if (debug)
350: printf("unsupported mba\n");
351: #endif
352: break;
353: }
354: #ifndef SMALL
355: if (debug)
356: printf("mba%d\n", nmba);
357: #endif
358: mbaddrspace[nmba] = (struct mba_regs *)nxp;
359: nmba++;
360: break;
361:
362: case NEX_UBA0:
363: case NEX_UBA1:
364: case NEX_UBA2:
365: case NEX_UBA3:
366: if (nuba >= MAXNUBA) {
367: #ifndef SMALL
368: if (debug)
369: printf("unsupported uba\n");
370: #endif
371: break;
372: }
373: #ifndef SMALL
374: if (debug)
375: printf("uba%d umem%d", nuba,
376: nexcsr.nex_type&3);
377: #endif
378: ubaddrspace[nuba] = (struct uba_regs *)nxp;
379: uioaddrspace[nuba] = umembase +
380: (nexcsr.nex_csr & 3) * (512*NBPG);
381: #ifndef SMALL
382: if (debug)
383: printf(" (%x)\n", uioaddrspace[nuba]);
384: #endif
385: nuba++;
386: ((struct uba_regs *)nxp)->uba_cr = UBACR_ADINIT;
387: break;
388: }
389: }
390: mbaddr = mbaddrspace;
391: ubaddr = ubaddrspace;
392: uioaddr = uioaddrspace;
393: #undef UTR
394: #undef UMA
395: #undef MTR
396: }
397: #endif /* VAX780 || VAX8600 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.