xref: /original-bsd/sys/vax/vax/autoconf.c (revision 6cca134b)
1 /*
2  * Copyright (c) 1982,1986 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.17 (Berkeley) 09/02/88
7  */
8 
9 /*
10  * Setup the system to run on the current machine.
11  *
12  * Configure() is called at boot time and initializes the uba and mba
13  * device tables and the memory controller monitoring.  Available
14  * devices are determined (from possibilities mentioned in ioconf.c),
15  * and the drivers are initialized.
16  */
17 
18 #include "mba.h"
19 #include "uba.h"
20 #include "kra.h"		/* XXX wrong file */
21 
22 #include "param.h"
23 #include "systm.h"
24 #include "map.h"
25 #include "buf.h"
26 #include "dkstat.h"
27 #include "vm.h"
28 #include "malloc.h"
29 #include "conf.h"
30 #include "dmap.h"
31 #include "reboot.h"
32 
33 #include "pte.h"
34 #include "cpu.h"
35 #include "mem.h"
36 #include "mtpr.h"
37 #include "nexus.h"
38 #include "scb.h"
39 #include "ioa.h"
40 #include "../vaxbi/bireg.h"
41 #include "../vaxmba/mbareg.h"
42 #include "../vaxmba/mbavar.h"
43 #include "../vaxuba/ubareg.h"
44 #include "../vaxuba/ubavar.h"
45 
46 /*
47  * The following several variables are related to
48  * the configuration process, and are used in initializing
49  * the machine.
50  */
51 int	cold;		/* if 1, still working on cold-start */
52 int	dkn;		/* number of iostat dk numbers assigned so far */
53 int	cpuspeed = 1;	/* relative cpu speed */
54 
55 /*
56  * Addresses of the (locore) routines which bootstrap us from
57  * hardware traps to C code.  Filled into the system control block
58  * as necessary.
59  *
60  * RIDICULOUS!  CONFIG SHOULD GENERATE AN ioconf.h FOR US, with
61  * mba glue also in `glue.s'.  (Unibus adapter glue is special, though.)
62  */
63 #if NMBA > 0
64 int	(*mbaintv[4])() =	{ Xmba0int, Xmba1int, Xmba2int, Xmba3int };
65 #if NMBA > 4
66 	Need to expand the table for more than 4 massbus adaptors
67 #endif
68 #endif
69 #if defined(VAX780) || defined(VAX8600)
70 int	(*ubaintv[])() =
71 {
72 	Xua0int, Xua1int, Xua2int, Xua3int,
73 #if NUBA > 4
74 	Xua4int, Xua5int, Xua6int, Xua7int,
75 #endif
76 #if NUBA > 8
77 	Need to expand the table for more than 8 unibus adaptors
78 #endif
79 };
80 #endif
81 #if NKDB > 0
82 /* kdb50 driver does not appear in udminit[] (not without csr!) */
83 int	Xkdbintr0();		/* generated by autoconf */
84 int	(*kdbintv[])() = { Xkdbintr0 };
85 #if NKDB > 1
86 	Need to expand the table for more than 1 KDB adapter
87 #endif
88 #endif
89 
90 /*
91  * This allocates the space for the per-uba information,
92  * such as buffered data path usage.
93  */
94 struct	uba_hd uba_hd[NUBA];
95 
96 /*
97  * Determine mass storage and memory configuration for a machine.
98  * Get cpu type, and then switch out to machine specific procedures
99  * which will probe adaptors to see what is out there.
100  */
101 configure()
102 {
103 	union cpusid cpusid;
104 	register struct percpu *ocp;
105 	register struct pte *ip;
106 
107 	cpusid.cpusid = mfpr(SID);
108 	switch (cpusid.cpuany.cp_type) {
109 #if VAX8600
110 	case VAX_8600:
111 		printf("VAX 8600, serial# %d(%d), hardware ECO level %d(%d)\n",
112 			cpusid.cpu8600.cp_sno, cpusid.cpu8600.cp_plant,
113 			cpusid.cpu8600.cp_eco >> 4, cpusid.cpu8600.cp_eco);
114 		break;
115 #endif
116 #if VAX8200
117 	case VAX_8200:
118 		printf("\
119 VAX 82%c0, hardware rev %d, ucode patch rev %d, sec patch %d, ucode rev %d\n",
120 			cpusid.cpu8200.cp_5 ? '5' : '0',
121 			cpusid.cpu8200.cp_hrev, cpusid.cpu8200.cp_patch,
122 			cpusid.cpu8200.cp_secp, cpusid.cpu8200.cp_urev);
123 		mastercpu = mfpr(BINID);
124 		break;
125 #endif
126 #if VAX780
127 	case VAX_780:
128 		printf("\
129 VAX 11/78%c, serial# %d(%d), hardware ECO level %d(%d)\n",
130 			cpusid.cpu780.cp_5 ? '5' : '0',
131 			cpusid.cpu780.cp_sno, cpusid.cpu780.cp_plant,
132 			cpusid.cpu780.cp_eco >> 4, cpusid.cpu780.cp_eco);
133 		break;
134 #endif
135 #if VAX750
136 	case VAX_750:
137 		printf("VAX 11/750, hardware rev %d, ucode rev %d\n",
138 			cpusid.cpu750.cp_hrev, cpusid.cpu750.cp_urev);
139 		break;
140 #endif
141 #if VAX730
142 	case VAX_730:
143 		printf("VAX 11/730, ucode rev %d\n", cpusid.cpu730.cp_urev);
144 		break;
145 #endif
146 #if VAX630
147 	case VAX_630:
148 		printf("MicroVAX-II\n");
149 		break;
150 #endif
151 #if VAX650
152 	case VAX_650:
153 		printf("MicroVAX 3000, ucode rev %d\n", cpusid.cpu650.cp_urev);
154 		break;
155 #endif
156 	}
157 	for (ocp = percpu; ocp->pc_cputype; ocp++)
158 		if (ocp->pc_cputype == cpusid.cpuany.cp_type) {
159 			cpuspeed = ocp->pc_cpuspeed;
160 			cpuops = ocp->pc_ops;
161 			if (cpuops->cpu_init != NULL)
162 				(*cpuops->cpu_init)();
163 			probeio(ocp);
164 			/*
165 			 * Write protect the scb and UNIBUS interrupt vectors.
166 			 * It is strange that this code is here, but this is
167 			 * as soon as we are done mucking with it, and the
168 			 * write-enable was done in assembly language
169 			 * to which we will never return.
170 			 */
171 			for (ip = kvtopte(scb); ip < kvtopte(eUNIvec); ip++) {
172 				*(int *)ip &= ~PG_PROT;
173 				*(int *)ip |= PG_KR;
174 			}
175 			mtpr(TBIA, 0);
176 #if GENERIC
177 			if ((boothowto & RB_ASKNAME) == 0)
178 				setroot();
179 			setconf();
180 #else
181 			setroot();
182 #endif
183 			/*
184 			 * Configure swap area and related system
185 			 * parameter based on device(s) used.
186 			 */
187 			swapconf();
188 			cold = 0;
189 			memenable();
190 			return;
191 		}
192 	printf("cpu type %d not configured\n", cpusid.cpuany.cp_type);
193 	asm("halt");
194 }
195 
196 #if VAX8600 || VAX780 || VAX750 || VAX730
197 int	nexnum;		/* current nexus number */
198 int	nsbi;		/* current sbi number */
199 #endif
200 #if VAX8200
201 int	numkdb;		/* current ``kdb'' number */
202 int	bi_nodes;	/* XXX remembers found bi nodes */
203 #endif
204 
205 /*
206  * Probe the main IO bus(es).
207  * The percpu structure gives us a handle on the addresses and/or types.
208  */
209 probeio(pcpu)
210 	register struct percpu *pcpu;
211 {
212 	register struct iobus *iob;
213 	int ioanum;
214 
215 	ioanum = 0;
216 	for (iob = pcpu->pc_io; ioanum < pcpu->pc_nioa; ioanum++, iob++) {
217 
218 		switch (iob->io_type) {
219 
220 #if VAX630 || VAX650
221 		case IO_QBUS:
222 			probeqbus((struct qbus *)iob->io_details);
223 			break;
224 #endif
225 
226 #if VAX780 || VAX750 || VAX730
227 		case IO_SBI780:
228 		case IO_CMI750:
229 		case IO_XXX730:
230 			probenexi((struct nexusconnect *)iob->io_details);
231 			break;
232 #endif
233 
234 #if VAX8600
235 		case IO_ABUS:
236 			probe_Abus(ioanum, iob);
237 			break;
238 #endif
239 
240 #if VAX8200
241 		case IO_BI:
242 			probe_bi((struct bibus *)iob->io_details);
243 			break;
244 #endif
245 
246 		default:
247 			if (iob->io_addr) {
248 			    printf(
249 		"IO adaptor %d, type %d, at address 0x%x is unsupported\n",
250 				ioanum, iob->io_type, iob->io_addr);
251 			} else
252 			    printf("IO adaptor %d, type %d, is unsupported\n",
253 				ioanum, iob->io_type);
254 			break;
255 		}
256 	}
257 }
258 
259 #if VAX8600
260 probe_Abus(ioanum, iob)
261 	register struct iobus *iob;
262 {
263 	register struct ioa *ioap;
264 	union ioacsr ioacsr;
265 	int type;
266 	struct sbia_regs *sbiaregs;
267 #ifdef notyet
268 	int sbi1fail(), sbi1alert(), sbi1fault(), sbi1err();
269 #endif
270 
271 	ioap = &ioa[ioanum];
272 	ioaccess(iob->io_addr, Ioamap[ioanum], iob->io_size);
273 	if (badaddr((caddr_t)ioap, 4))
274 		return;
275 	ioacsr.ioa_csr = ioap->ioacsr.ioa_csr;
276 	type = ioacsr.ioa_type & IOA_TYPMSK;
277 
278 	switch (type) {
279 
280 	case IOA_SBIA:
281 		printf("SBIA%d at IO adaptor %d address 0x%x\n",
282 		    nsbi, ioanum, iob->io_addr);
283 #ifdef notyet
284 		/* I AM NOT SURE THESE ARE IN THE SAME PLACES */
285 		if (nscb == 1) {
286 			scb[1].scb_sbifail = scbentry(sbi1fail, SCB_ISTACK);
287 			/* maybe not sbifail, maybe scb1.scb_cmrd */
288 			/* but how can I find out without a broken SBIA1? */
289 			scb[1].scb_sbialert = scbentry(sbi1alert, SCB_ISTACK);
290 			scb[1].scb_sbifault = scbentry(sbi1fault, SCB_ISTACK);
291 			scb[1].scb_sbierr = scbentry(sbi1err, SCB_ISTACK);
292 		}
293 #endif
294 		probenexi((struct nexusconnect *)iob->io_details);
295 		nsbi++;
296 		sbiaregs = (struct sbia_regs *)ioap;
297 		sbiaregs->sbi_errsum = -1;
298 		sbiaregs->sbi_error = 0x1000;
299 		sbiaregs->sbi_fltsts = 0xc0000;
300 		break;
301 
302 	default:
303 		printf("IOA%d at address 0x%x is unsupported (type = 0x%x)\n",
304 		    ioanum, iob->io_addr, ioacsr.ioa_type);
305 		break;
306 	}
307 }
308 #endif
309 
310 #if VAX8600 || VAX780 || VAX750 || VAX730
311 /*
312  * Probe nexus space, finding the interconnects
313  * and setting up and probing mba's and uba's for devices.
314  */
315 probenexi(pnc)
316 	register struct nexusconnect *pnc;
317 {
318 	register struct nexus *nxv;
319 	struct nexus *nxp = pnc->psb_nexbase;
320 	union nexcsr nexcsr;
321 	int i;
322 
323 	ioaccess((caddr_t)nxp, Nexmap[nsbi * NNEXSBI],
324 	    pnc->psb_nnexus * sizeof(struct nexus));
325 	nxv = &nexus[nsbi * NNEXSBI];
326 	for (nexnum = 0; nexnum < pnc->psb_nnexus; nexnum++, nxp++, nxv++) {
327 		if (badaddr((caddr_t)nxv, 4))
328 			continue;
329 		if (pnc->psb_nextype && pnc->psb_nextype[nexnum] != NEX_ANY)
330 			nexcsr.nex_csr = pnc->psb_nextype[nexnum];
331 		else
332 			nexcsr = nxv->nexcsr;
333 		if (nexcsr.nex_csr&NEX_APD)
334 			continue;
335 		switch (nexcsr.nex_type) {
336 
337 		case NEX_MBA:
338 			printf("mba%d at tr%d\n", nummba, nexnum);
339 			if (nummba >= NMBA) {
340 				printf("%d mba's", ++nummba);
341 				goto unconfig;
342 			}
343 #if NMBA > 0
344 			mbafind(nxv, nxp);
345 			nummba++;
346 #endif
347 			break;
348 
349 		case NEX_UBA0:
350 		case NEX_UBA1:
351 		case NEX_UBA2:
352 		case NEX_UBA3:
353 			printf("uba%d at tr%d\n", numuba, nexnum);
354 			if (numuba >= NUBA) {
355 				printf("%d uba's", ++numuba);
356 				goto unconfig;
357 			}
358 #if NUBA > 0
359 #if VAX750
360 			if (numuba >= 2 && cpu == VAX_750) {
361 				printf("More than 2 UBA's");
362 				goto unsupp;
363 			}
364 #endif
365 #if defined(VAX780) || defined(VAX8600)
366 			if (cpu == VAX_780 || cpu == VAX_8600)
367 				setscbnex(ubaintv[numuba]);
368 #endif
369 			i = nexcsr.nex_type - NEX_UBA0;
370 			probeuba((struct uba_regs *)nxv, (struct uba_regs *)nxp,
371 			    pnc->psb_umaddr[i]);
372 #endif /* NUBA */
373 			break;
374 
375 		case NEX_DR32:
376 		/* there can be more than one... are there other codes??? */
377 			printf("dr32");
378 			goto unsupp;
379 
380 		case NEX_MEM4:
381 		case NEX_MEM4I:
382 		case NEX_MEM16:
383 		case NEX_MEM16I:
384 			printf("mcr%d at tr%d\n", nmcr, nexnum);
385 			if (nmcr >= MAXNMCR) {
386 				printf("%d mcr's", ++nmcr);
387 				goto unconfig;
388 			}
389 			switch (cpu) {
390 #if VAX780
391 			case VAX_780:
392 				/* only ka780 code looks at type */
393 				mcrtype[nmcr] = M780C;
394 				break;
395 #endif
396 			default:
397 				break;
398 			}
399 			mcraddr[nmcr++] = (caddr_t)nxv;
400 			break;
401 
402 #if VAX780
403 		case NEX_MEM64I:
404 		case NEX_MEM64L:
405 		case NEX_MEM64LI:
406 		case NEX_MEM256I:
407 		case NEX_MEM256L:
408 		case NEX_MEM256LI:
409 			printf("mcr%d (el) at tr%d\n", nmcr, nexnum);
410 			if (nmcr >= MAXNMCR) {
411 				printf("%d mcr's", ++nmcr);
412 				goto unconfig;
413 			}
414 			mcrtype[nmcr] = M780EL;
415 			mcraddr[nmcr++] = (caddr_t)nxv;
416 			if (nexcsr.nex_type != NEX_MEM64I &&
417 			    nexcsr.nex_type != NEX_MEM256I)
418 				break;
419 			/* fall into ... */
420 
421 		case NEX_MEM64U:
422 		case NEX_MEM64UI:
423 		case NEX_MEM256U:
424 		case NEX_MEM256UI:
425 			printf("mcr%d (eu) at tr%d\n", nmcr, nexnum);
426 			if (nmcr >= MAXNMCR) {
427 				printf("%d mcr's", ++nmcr);
428 				goto unconfig;
429 			}
430 			mcrtype[nmcr] = M780EU;
431 			mcraddr[nmcr++] = (caddr_t)nxv;
432 			break;
433 #endif
434 
435 		case NEX_MPM0:
436 		case NEX_MPM1:
437 		case NEX_MPM2:
438 		case NEX_MPM3:
439 			printf("mpm");
440 			goto unsupp;
441 
442 		case NEX_CI:
443 			printf("ci");
444 			goto unsupp;
445 
446 		default:
447 			printf("nexus type %x", nexcsr.nex_type);
448 unsupp:
449 			printf(" unsupported (at tr %d)\n", nexnum);
450 			continue;
451 unconfig:
452 			printf(" not configured\n");
453 			continue;
454 		}
455 	}
456 	if (nummba > NMBA)
457 		nummba = NMBA;
458 	if (numuba > NUBA)
459 		numuba = NUBA;
460 	if (nmcr > MAXNMCR)
461 		nmcr = MAXNMCR;
462 }
463 
464 setscbnex(fn)
465 	int (*fn)();
466 {
467 	register struct scb *scbp = &scb[nsbi];
468 
469 	scbp->scb_ipl14[nexnum] = scbp->scb_ipl15[nexnum] =
470 	    scbp->scb_ipl16[nexnum] = scbp->scb_ipl17[nexnum] =
471 		scbentry(fn, SCB_ISTACK);
472 }
473 #endif
474 
475 #include "bi.h"
476 #if NBI > 0
477 /*
478  * Probe BI node space.
479  *
480  * THIS DEPENDS ON BI SPACE == NEXUS SPACE
481  * THIS WILL NOT WORK FOR MULTIPLE BIs
482  */
483 probe_bi(p)
484 	register struct bibus *p;
485 {
486 	register struct bi_node *biv, *bip;
487 	register int node;
488 	short dtype;
489 
490 	/* must ignore BI errors while configuring */
491 	bip = p->pbi_base;
492 	ioaccess((caddr_t)bip, Nexmap[0], sizeof(*bip) * NNODEBI);/* XXX */
493 	printf("vaxbi0 at address 0x%x\n", bip);
494 	biv = (struct bi_node *) &nexus[0];	/* XXX */
495 	for (node = 0; node < NNODEBI; node++, bip++, biv++) {
496 		if (badaddr((caddr_t)biv, 4))
497 			continue;
498 		bi_nodes |= 1 << node;		/* XXX */
499 		dtype = biv->biic.bi_dtype;
500 		/* clear bus errors */
501 		biv->biic.bi_ber = ~(BIBER_MBZ|BIBER_NMR|BIBER_UPEN);
502 		switch (dtype) {
503 
504 		case BIDT_KA820: {
505 			/* is this right?? */
506 			int cp5 = biv->biic.bi_revs & 0x8000 ? '5' : '0';
507 
508 			if (node != mastercpu) {
509 				printf("slave ka82%c cpu", cp5);
510 				goto unsupp;
511 			}
512 			printf("ka82%c cpu at node %x\n", cp5, node);
513 			biv->biic.bi_intrdes = 1 << mastercpu;
514 			biv->biic.bi_csr |= BICSR_SEIE | BICSR_HEIE;
515 			break;
516 		}
517 
518 		case BIDT_DWBUA:
519 			if (numuba >= NUBA || /*XXX*/numuba > 2) {
520 				printf("%d uba's", ++numuba);
521 				goto unconfig;
522 			}
523 #if NUBA > 0
524 			printf("uba%d at node %x\n", numuba, node);
525 
526 			/*
527 			 * Run a self test reset to drop any `old' errors,
528 			 * so that they cannot cause a BI bus error.
529 			 */
530 			(void) bi_selftest(&biv->biic);
531 
532 			/*
533 			 * Enable interrupts.  DWBUAs must have
534 			 * high priority.
535 			 */
536 			biv->biic.bi_intrdes = 1 << mastercpu;
537 			biv->biic.bi_csr = (biv->biic.bi_csr&~BICSR_ARB_MASK) |
538 				BICSR_ARB_HIGH;
539 			probeuba((struct uba_regs *)biv, (struct uba_regs *)bip,
540 				(caddr_t)UMEM8200(node));
541 #endif /* NUBA */
542 			break;
543 
544 		case BIDT_MS820:
545 			printf("mcr%d at node %x\n", nmcr, node);
546 			if (nmcr >= MAXNMCR) {
547 				printf("%d mcr's", ++nmcr);
548 				goto unconfig;
549 			}
550 			mcraddr[nmcr++] = (caddr_t)biv;
551 			biv->biic.bi_intrdes = 1 << mastercpu;
552 			biv->biic.bi_csr |= BICSR_SEIE | BICSR_HEIE;
553 			break;
554 
555 		case BIDT_KDB50:
556 			if (numkdb >= NKDB) {
557 				printf("%d kdb's", ++numkdb);
558 				goto unconfig;
559 			}
560 #if NKDB > 0
561 			printf("kdb%d at node %x\n", numkdb, node);
562 			kdbconfig(numkdb, (struct biiregs *)biv,
563 				(struct biiregs *)bip,
564 				(int)&scb[0].scb_ipl15[node] - (int)&scb[0]);
565 			scb[0].scb_ipl15[node] =
566 				scbentry(kdbintv[numkdb], SCB_ISTACK);
567 			kdbfind(numkdb);
568 #endif
569 			numkdb++;
570 			break;
571 
572 		case BIDT_DEBNA:
573 		case BIDT_DEBNK:
574 			printf("debna/debnk ethernet");
575 			goto unsupp;
576 
577 		default:
578 			printf("node type 0x%x ", dtype);
579 unsupp:
580 			printf(" unsupported (at node %x)\n", node);
581 			break;
582 unconfig:
583 			printf(" not configured (at node %x)\n", node);
584 			continue;
585 		}
586 #ifdef DO_EINTRCSR
587 		biv->biic.bi_eintrcsr = BIEIC_IPL17 |
588 			(int)&scb[0].scb_bierr - (int)&scb[0];
589 		/* but bi reset will need to restore this */
590 #endif
591 	}
592 	if (numuba > NUBA)
593 		numuba = NUBA;
594 	if (numkdb > NKDB)
595 		numkdb = NKDB;
596 	if (nmcr > MAXNMCR)
597 		nmcr = MAXNMCR;
598 }
599 
600 #if NKDB > 0
601 /*
602  * Find drives attached to a particular KDB50.
603  */
604 kdbfind(kdbnum)
605 	int kdbnum;
606 {
607 	extern struct uba_driver kdbdriver;
608 	register struct uba_device *ui;
609 	register struct uba_driver *udp = &kdbdriver;
610 	int t;
611 
612 	for (ui = ubdinit; ui->ui_driver; ui++) {
613 		/* ui->ui_ubanum is trash */
614 		if (ui->ui_driver != udp || ui->ui_alive ||
615 		    ui->ui_ctlr != kdbnum && ui->ui_ctlr != '?')
616 			continue;
617 		t = ui->ui_ctlr;
618 		ui->ui_ctlr = kdbnum;
619 		if ((*udp->ud_slave)(ui) == 0) {
620 			ui->ui_ctlr = t;
621 			continue;
622 		}
623 		ui->ui_alive = 1;
624 		ui->ui_ubanum = -1;
625 
626 		/* make these invalid so we can see if someone uses them */
627 		/* might as well make each one different too */
628 		ui->ui_hd = (struct uba_hd *)0xc0000010;
629 		ui->ui_addr = (caddr_t)0xc0000014;
630 		ui->ui_physaddr = (caddr_t)0xc0000018;
631 		ui->ui_mi = (struct uba_ctlr *)0xc000001c;
632 
633 		if (ui->ui_dk && dkn < DK_NDRIVE)
634 			ui->ui_dk = dkn++;
635 		else
636 			ui->ui_dk = -1;
637 		/* ui_type comes from driver */
638 		udp->ud_dinfo[ui->ui_unit] = ui;
639 		printf("%s%d at %s%d slave %d\n",
640 		    udp->ud_dname, ui->ui_unit,
641 		    udp->ud_mname, ui->ui_ctlr, ui->ui_slave);
642 		(*udp->ud_attach)(ui);
643 	}
644 }
645 #endif /* NKDB > 0 */
646 #endif /* NBI > 0 */
647 
648 #if NMBA > 0
649 struct	mba_device *mbaconfig();
650 /*
651  * Find devices attached to a particular mba
652  * and look for each device found in the massbus
653  * initialization tables.
654  */
655 mbafind(nxv, nxp)
656 	struct nexus *nxv, *nxp;
657 {
658 	register struct mba_regs *mdp;
659 	register struct mba_drv *mbd;
660 	register struct mba_device *mi;
661 	register struct mba_slave *ms;
662 	int dn, dt, sn;
663 	struct mba_device fnd;
664 
665 	mdp = (struct mba_regs *)nxv;
666 	mba_hd[nummba].mh_mba = mdp;
667 	mba_hd[nummba].mh_physmba = (struct mba_regs *)nxp;
668 	setscbnex(mbaintv[nummba]);
669 	mdp->mba_cr = MBCR_INIT;
670 	mdp->mba_cr = MBCR_IE;
671 	fnd.mi_mba = mdp;
672 	fnd.mi_mbanum = nummba;
673 	for (mbd = mdp->mba_drv, dn = 0; mbd < &mdp->mba_drv[8]; mbd++, dn++) {
674 		if ((mbd->mbd_ds&MBDS_DPR) == 0)
675 			continue;
676 		mdp->mba_sr |= MBSR_NED;		/* si kludge */
677 		dt = mbd->mbd_dt & 0xffff;
678 		if (dt == 0)
679 			continue;
680 		if (mdp->mba_sr&MBSR_NED)
681 			continue;			/* si kludge */
682 		if (dt == MBDT_MOH)
683 			continue;
684 		fnd.mi_drive = dn;
685 #define	qeq(a, b)	( a == b || a == '?' )
686 		if ((mi = mbaconfig(&fnd, dt)) && (dt & MBDT_TAP))
687 		    for (sn = 0; sn < 8; sn++) {
688 			mbd->mbd_tc = sn;
689 		        for (ms = mbsinit; ms->ms_driver; ms++)
690 			    if (ms->ms_driver == mi->mi_driver &&
691 				ms->ms_alive == 0 &&
692 				qeq(ms->ms_ctlr, mi->mi_unit) &&
693 				qeq(ms->ms_slave, sn) &&
694 				(*ms->ms_driver->md_slave)(mi, ms, sn)) {
695 					printf("%s%d at %s%d slave %d\n"
696 					    , ms->ms_driver->md_sname
697 					    , ms->ms_unit
698 					    , mi->mi_driver->md_dname
699 					    , mi->mi_unit
700 					    , sn
701 					);
702 					ms->ms_alive = 1;
703 					ms->ms_ctlr = mi->mi_unit;
704 					ms->ms_slave = sn;
705 					break;
706 				}
707 		    }
708 	}
709 }
710 
711 /*
712  * Have found a massbus device;
713  * see if it is in the configuration table.
714  * If so, fill in its data.
715  */
716 struct mba_device *
717 mbaconfig(ni, type)
718 	register struct mba_device *ni;
719 	register int type;
720 {
721 	register struct mba_device *mi;
722 	register short *tp;
723 	register struct mba_hd *mh;
724 
725 	for (mi = mbdinit; mi->mi_driver; mi++) {
726 		if (mi->mi_alive)
727 			continue;
728 		tp = mi->mi_driver->md_type;
729 		for (mi->mi_type = 0; *tp; tp++, mi->mi_type++)
730 			if (*tp == (type&MBDT_TYPE))
731 				goto found;
732 		continue;
733 found:
734 #define	match(fld)	(ni->fld == mi->fld || mi->fld == '?')
735 		if (!match(mi_drive) || !match(mi_mbanum))
736 			continue;
737 		printf("%s%d at mba%d drive %d",
738 		    mi->mi_driver->md_dname, mi->mi_unit,
739 		    ni->mi_mbanum, ni->mi_drive);
740 		mi->mi_alive = 1;
741 		mh = &mba_hd[ni->mi_mbanum];
742 		mi->mi_hd = mh;
743 		mh->mh_mbip[ni->mi_drive] = mi;
744 		mh->mh_ndrive++;
745 		mi->mi_mba = ni->mi_mba;
746 		mi->mi_drv = &mi->mi_mba->mba_drv[ni->mi_drive];
747 		mi->mi_mbanum = ni->mi_mbanum;
748 		mi->mi_drive = ni->mi_drive;
749 		/*
750 		 * If drive has never been seen before,
751 		 * give it a dkn for statistics.
752 		 */
753 		if (mi->mi_driver->md_info[mi->mi_unit] == 0) {
754 			mi->mi_driver->md_info[mi->mi_unit] = mi;
755 			if (mi->mi_dk && dkn < DK_NDRIVE)
756 				mi->mi_dk = dkn++;
757 			else
758 				mi->mi_dk = -1;
759 		}
760 		(*mi->mi_driver->md_attach)(mi);
761 		printf("\n");
762 		return (mi);
763 	}
764 	return (0);
765 }
766 #endif
767 
768 /*
769  * Fixctlrmask fixes the masks of the driver ctlr routines
770  * which otherwise save r10 and r11 where the interrupt and br
771  * level are passed through.
772  */
773 fixctlrmask()
774 {
775 	register struct uba_ctlr *um;
776 	register struct uba_device *ui;
777 	register struct uba_driver *ud;
778 #define	phys(a,b) ((b)(((int)(a))&0x7fffffff))
779 
780 	for (um = ubminit; ud = phys(um->um_driver, struct uba_driver *); um++)
781 		*phys(ud->ud_probe, short *) &= ~0xc00;
782 	for (ui = ubdinit; ud = phys(ui->ui_driver, struct uba_driver *); ui++)
783 		*phys(ud->ud_probe, short *) &= ~0xc00;
784 }
785 
786 #ifdef QBA
787 /*
788  * Configure a Q-bus.
789  */
790 probeqbus(qb)
791 	struct qbus *qb;
792 {
793 	register struct uba_hd *uhp = &uba_hd[numuba];
794 
795 	ioaccess((caddr_t)qb->qb_map, Nexmap[0],
796 		qb->qb_memsize * sizeof (struct pte));
797 	uhp->uh_type = qb->qb_type;
798 	uhp->uh_uba = (struct uba_regs *)0xc0000000;   /* no uba adaptor regs */
799 	uhp->uh_mr = (struct pte *)&nexus[0];
800 	/*
801 	 * The map registers start right at 20088000 on the
802 	 * ka630, so we have to subtract out the 2k offset to make the
803 	 * pointers work..
804 	 */
805 	uhp->uh_physuba = (struct uba_regs *)(((u_long)qb->qb_map)-0x800);
806 
807 	uhp->uh_memsize = qb->qb_memsize;
808 	ioaccess(qb->qb_maddr, UMEMmap[numuba], uhp->uh_memsize * NBPG);
809 	uhp->uh_mem = umem[numuba];
810 
811 	/*
812 	 * The I/O page is mapped to the 8K of the umem address space
813 	 * immediately after the memory section that is mapped.
814 	 */
815 	ioaccess(qb->qb_iopage, UMEMmap[numuba] + uhp->uh_memsize,
816 	    UBAIOPAGES * NBPG);
817 	uhp->uh_iopage = umem[numuba] + (uhp->uh_memsize * NBPG);
818 
819 	unifind(uhp, qb->qb_iopage);
820 }
821 #endif
822 
823 #if NUBA > 0
824 probeuba(vubp, pubp, pumem)
825 	struct uba_regs *vubp, *pubp;
826 	caddr_t pumem;
827 {
828 	register struct uba_hd *uhp = &uba_hd[numuba];
829 
830 	/*
831 	 * Save virtual and physical addresses of adaptor.
832 	 */
833 	switch (cpu) {
834 #ifdef DW780
835 	case VAX_8600:
836 	case VAX_780:
837 		uhp->uh_type = DW780;
838 		break;
839 #endif
840 #ifdef DW750
841 	case VAX_750:
842 		uhp->uh_type = DW750;
843 		break;
844 #endif
845 #ifdef DW730
846 	case VAX_730:
847 		uhp->uh_type = DW730;
848 		break;
849 #endif
850 #ifdef DWBUA
851 	case VAX_8200:
852 		uhp->uh_type = DWBUA;
853 		break;
854 #endif
855 	default:
856 		panic("unknown UBA type");
857 		/*NOTREACHED*/
858 	}
859 	uhp->uh_uba = vubp;
860 	uhp->uh_physuba = pubp;
861 	uhp->uh_mr = vubp->uba_map;
862 	uhp->uh_memsize = UBAPAGES;
863 
864 	ioaccess(pumem, UMEMmap[numuba], (UBAPAGES + UBAIOPAGES) * NBPG);
865 	uhp->uh_mem = umem[numuba];
866 	uhp->uh_iopage = umem[numuba] + (uhp->uh_memsize * NBPG);
867 
868 	unifind(uhp, pumem + (uhp->uh_memsize * NBPG));
869 }
870 
871 /*
872  * Find devices on a UNIBUS.
873  * Uses per-driver routine to set <br,cvec> into <r11,r10>,
874  * and then fills in the tables, with help from a per-driver
875  * slave initialization routine.
876  */
877 unifind(uhp0, pumem)
878 	struct uba_hd *uhp0;
879 	caddr_t pumem;
880 {
881 #ifndef lint
882 	register int br, cvec;			/* MUST BE r11, r10 */
883 #else
884 	/*
885 	 * Lint doesn't realize that these
886 	 * can be initialized asynchronously
887 	 * when devices interrupt.
888 	 */
889 	register int br = 0, cvec = 0;
890 #endif
891 	register struct uba_device *ui;
892 	register struct uba_ctlr *um;
893 	register struct uba_hd *uhp = uhp0;
894 	u_short *reg, *ap, addr;
895 	struct uba_driver *udp;
896 	int i, (**ivec)();
897 	caddr_t ualloc;
898 	extern quad catcher[128];
899 #if DW780 || DWBUA
900 	struct uba_regs *vubp = uhp->uh_uba;
901 #endif
902 
903 	/*
904 	 * Initialize the UNIBUS, by freeing the map
905 	 * registers and the buffered data path registers
906 	 */
907 	uhp->uh_map = (struct map *)
908 		malloc((u_long)(UAMSIZ * sizeof (struct map)), M_DEVBUF,
909 		    M_NOWAIT);
910 	if (uhp->uh_map == 0)
911 		panic("no mem for unibus map");
912 	bzero((caddr_t)uhp->uh_map, (unsigned)(UAMSIZ * sizeof (struct map)));
913 	ubainitmaps(uhp);
914 
915 	/*
916 	 * Initialize space for the UNIBUS interrupt vectors.
917 	 * On the 8600, can't use first slot in UNIvec
918 	 * (the vectors for the second SBI overlap it);
919 	 * move each set of vectors forward.
920 	 */
921 #if	VAX8600
922 	if (cpu == VAX_8600)
923 		uhp->uh_vec = UNIvec[numuba + 1];
924 	else
925 #endif
926 		uhp->uh_vec = UNIvec[numuba];
927 	for (i = 0; i < 128; i++)
928 		uhp->uh_vec[i] = scbentry(&catcher[i], SCB_ISTACK);
929 	/*
930 	 * Set last free interrupt vector for devices with
931 	 * programmable interrupt vectors.  Use is to decrement
932 	 * this number and use result as interrupt vector.
933 	 */
934 	uhp->uh_lastiv = 0x200;
935 
936 #ifdef DWBUA
937 	if (uhp->uh_type == DWBUA)
938 		BUA(vubp)->bua_offset = (int)uhp->uh_vec - (int)&scb[0];
939 #endif
940 
941 #ifdef DW780
942 	if (uhp->uh_type == DW780) {
943 		vubp->uba_sr = vubp->uba_sr;
944 		vubp->uba_cr = UBACR_IFS|UBACR_BRIE;
945 	}
946 #endif
947 	/*
948 	 * First configure devices that have unibus memory,
949 	 * allowing them to allocate the correct map registers.
950 	 */
951 	ubameminit(numuba);
952 	/*
953 	 * Grab some memory to record the umem address space we allocate,
954 	 * so we can be sure not to place two devices at the same address.
955 	 *
956 	 * We could use just 1/8 of this (we only want a 1 bit flag) but
957 	 * we are going to give it back anyway, and that would make the
958 	 * code here bigger (which we can't give back), so ...
959 	 *
960 	 * One day, someone will make a unibus with something other than
961 	 * an 8K i/o address space, & screw this totally.
962 	 */
963 	ualloc = (caddr_t)malloc((u_long)(8 * 1024), M_TEMP, M_NOWAIT);
964 	if (ualloc == (caddr_t)0)
965 		panic("no mem for unifind");
966 	bzero(ualloc, 8*1024);
967 
968 	/*
969 	 * Map the first page of UNIBUS i/o
970 	 * space to the first page of memory
971 	 * for devices which will need to dma
972 	 * output to produce an interrupt.
973 	 */
974 	*(int *)(&uhp->uh_mr[0]) = UBAMR_MRV;
975 
976 #define	ubaddr(uhp, off)    (u_short *)((int)(uhp)->uh_iopage + ubdevreg(off))
977 	/*
978 	 * Check each unibus mass storage controller.
979 	 * For each one which is potentially on this uba,
980 	 * see if it is really there, and if it is record it and
981 	 * then go looking for slaves.
982 	 */
983 	for (um = ubminit; udp = um->um_driver; um++) {
984 		if (um->um_ubanum != numuba && um->um_ubanum != '?' ||
985 		    um->um_alive)
986 			continue;
987 		addr = (u_short)um->um_addr;
988 		/*
989 		 * use the particular address specified first,
990 		 * or if it is given as "0", of there is no device
991 		 * at that address, try all the standard addresses
992 		 * in the driver til we find it
993 		 */
994 	    for (ap = udp->ud_addr; addr || (addr = *ap++); addr = 0) {
995 
996 		if (ualloc[ubdevreg(addr)])
997 			continue;
998 		reg = ubaddr(uhp, addr);
999 		if (badaddr((caddr_t)reg, 2))
1000 			continue;
1001 #ifdef DW780
1002 		if (uhp->uh_type == DW780 && vubp->uba_sr) {
1003 			vubp->uba_sr = vubp->uba_sr;
1004 			continue;
1005 		}
1006 #endif
1007 		cvec = 0x200;
1008 		i = (*udp->ud_probe)(reg, um->um_ctlr, um);
1009 #ifdef DW780
1010 		if (uhp->uh_type == DW780 && vubp->uba_sr) {
1011 			vubp->uba_sr = vubp->uba_sr;
1012 			continue;
1013 		}
1014 #endif
1015 		if (i == 0)
1016 			continue;
1017 		printf("%s%d at uba%d csr %o ",
1018 		    udp->ud_mname, um->um_ctlr, numuba, addr);
1019 		if (cvec == 0) {
1020 			printf("zero vector\n");
1021 			continue;
1022 		}
1023 		if (cvec == 0x200) {
1024 			printf("didn't interrupt\n");
1025 			continue;
1026 		}
1027 		printf("vec %o, ipl %x\n", cvec, br);
1028 		csralloc(ualloc, addr, i);
1029 		um->um_alive = 1;
1030 		um->um_ubanum = numuba;
1031 		um->um_hd = uhp;
1032 		um->um_addr = (caddr_t)reg;
1033 		udp->ud_minfo[um->um_ctlr] = um;
1034 		for (cvec /= 4, ivec = um->um_intr; *ivec; cvec++, ivec++)
1035 			uhp->uh_vec[cvec] = scbentry(*ivec, SCB_ISTACK);
1036 		for (ui = ubdinit; ui->ui_driver; ui++) {
1037 			int t;
1038 
1039 			if (ui->ui_driver != udp || ui->ui_alive ||
1040 			    ui->ui_ctlr != um->um_ctlr && ui->ui_ctlr != '?' ||
1041 			    ui->ui_ubanum != numuba && ui->ui_ubanum != '?')
1042 				continue;
1043 			t = ui->ui_ctlr;
1044 			ui->ui_ctlr = um->um_ctlr;
1045 			if ((*udp->ud_slave)(ui, reg) == 0)
1046 				ui->ui_ctlr = t;
1047 			else {
1048 				ui->ui_alive = 1;
1049 				ui->ui_ubanum = numuba;
1050 				ui->ui_hd = uhp;
1051 				ui->ui_addr = (caddr_t)reg;
1052 				ui->ui_physaddr = pumem + ubdevreg(addr);
1053 				if (ui->ui_dk && dkn < DK_NDRIVE)
1054 					ui->ui_dk = dkn++;
1055 				else
1056 					ui->ui_dk = -1;
1057 				ui->ui_mi = um;
1058 				/* ui_type comes from driver */
1059 				udp->ud_dinfo[ui->ui_unit] = ui;
1060 				printf("%s%d at %s%d slave %d",
1061 				    udp->ud_dname, ui->ui_unit,
1062 				    udp->ud_mname, um->um_ctlr, ui->ui_slave);
1063 				(*udp->ud_attach)(ui);
1064 				printf("\n");
1065 			}
1066 		}
1067 		break;
1068 	    }
1069 	}
1070 	/*
1071 	 * Now look for non-mass storage peripherals.
1072 	 */
1073 	for (ui = ubdinit; udp = ui->ui_driver; ui++) {
1074 		if (ui->ui_ubanum != numuba && ui->ui_ubanum != '?' ||
1075 		    ui->ui_alive || ui->ui_slave != -1)
1076 			continue;
1077 		addr = (u_short)ui->ui_addr;
1078 
1079 	    for (ap = udp->ud_addr; addr || (addr = *ap++); addr = 0) {
1080 
1081 		if (ualloc[ubdevreg(addr)])
1082 			continue;
1083 		reg = ubaddr(uhp, addr);
1084 		if (badaddr((caddr_t)reg, 2))
1085 			continue;
1086 #ifdef DW780
1087 		if (uhp->uh_type == DW780 && vubp->uba_sr) {
1088 			vubp->uba_sr = vubp->uba_sr;
1089 			continue;
1090 		}
1091 #endif
1092 		cvec = 0x200;
1093 		i = (*udp->ud_probe)(reg, ui);
1094 #ifdef DW780
1095 		if (uhp->uh_type == DW780 && vubp->uba_sr) {
1096 			vubp->uba_sr = vubp->uba_sr;
1097 			continue;
1098 		}
1099 #endif
1100 		if (i == 0)
1101 			continue;
1102 		printf("%s%d at uba%d csr %o ",
1103 		    ui->ui_driver->ud_dname, ui->ui_unit, numuba, addr);
1104 		if (cvec == 0) {
1105 			printf("zero vector\n");
1106 			continue;
1107 		}
1108 		if (cvec == 0x200) {
1109 			printf("didn't interrupt\n");
1110 			continue;
1111 		}
1112 		printf("vec %o, ipl %x\n", cvec, br);
1113 		csralloc(ualloc, addr, i);
1114 		ui->ui_hd = uhp;
1115 		for (cvec /= 4, ivec = ui->ui_intr; *ivec; cvec++, ivec++)
1116 			uhp->uh_vec[cvec] = scbentry(*ivec, SCB_ISTACK);
1117 		ui->ui_alive = 1;
1118 		ui->ui_ubanum = numuba;
1119 		ui->ui_addr = (caddr_t)reg;
1120 		ui->ui_physaddr = pumem + ubdevreg(addr);
1121 		ui->ui_dk = -1;
1122 		/* ui_type comes from driver */
1123 		udp->ud_dinfo[ui->ui_unit] = ui;
1124 		(*udp->ud_attach)(ui);
1125 		break;
1126 	    }
1127 	}
1128 
1129 #ifdef DW780
1130 	if (uhp->uh_type == DW780)
1131 		uhp->uh_uba->uba_cr = UBACR_IFS | UBACR_BRIE |
1132 		    UBACR_USEFIE | UBACR_SUEFIE |
1133 		    (uhp->uh_uba->uba_cr & 0x7c000000);
1134 #endif
1135 	numuba++;
1136 
1137 #ifdef	AUTO_DEBUG
1138 	printf("Unibus allocation map");
1139 	for (i = 0; i < 8*1024; ) {
1140 		register n, m;
1141 
1142 		if ((i % 128) == 0) {
1143 			printf("\n%6o:", i);
1144 			for (n = 0; n < 128; n++)
1145 				if (ualloc[i+n])
1146 					break;
1147 			if (n == 128) {
1148 				i += 128;
1149 				continue;
1150 			}
1151 		}
1152 
1153 		for (n = m = 0; n < 16; n++) {
1154 			m <<= 1;
1155 			m |= ualloc[i++];
1156 		}
1157 
1158 		printf(" %4x", m);
1159 	}
1160 	printf("\n");
1161 #endif
1162 
1163 	free(ualloc, M_TEMP);
1164 }
1165 #endif /* NUBA */
1166 
1167 /*
1168  * Mark addresses starting at "addr" and continuing
1169  * "size" bytes as allocated in the map "ualloc".
1170  * Warn if the new allocation overlaps a previous allocation.
1171  */
1172 static
1173 csralloc(ualloc, addr, size)
1174 	caddr_t ualloc;
1175 	u_short addr;
1176 	register int size;
1177 {
1178 	register caddr_t p;
1179 	int warned = 0;
1180 
1181 	p = &ualloc[ubdevreg(addr+size)];
1182 	while (--size >= 0) {
1183 		if (*--p && !warned) {
1184 			printf(
1185 	"WARNING: device registers overlap those for a previous device!\n");
1186 			warned = 1;
1187 		}
1188 		*p = 1;
1189 	}
1190 }
1191 
1192 /*
1193  * Make an IO register area accessible at physical address physa
1194  * by mapping kernel ptes starting at pte.
1195  */
1196 ioaccess(physa, pte, size)
1197 	caddr_t physa;
1198 	register struct pte *pte;
1199 	int size;
1200 {
1201 	register int i = btoc(size);
1202 	register unsigned v = btop(physa);
1203 
1204 	do
1205 		*(int *)pte++ = PG_V|PG_KW|v++;
1206 	while (--i > 0);
1207 	mtpr(TBIA, 0);
1208 }
1209 
1210 /*
1211  * Configure swap space and related parameters.
1212  */
1213 swapconf()
1214 {
1215 	register struct swdevt *swp;
1216 	register int nblks;
1217 
1218 	for (swp = swdevt; swp->sw_dev; swp++)
1219 		if (bdevsw[major(swp->sw_dev)].d_psize) {
1220 			nblks =
1221 			  (*bdevsw[major(swp->sw_dev)].d_psize)(swp->sw_dev);
1222 			if (nblks != -1 &&
1223 			    (swp->sw_nblks == 0 || swp->sw_nblks > nblks))
1224 				swp->sw_nblks = nblks;
1225 		}
1226 	if (dumplo == 0 && dumpdev != NODEV && bdevsw[major(dumpdev)].d_psize)
1227 		dumplo = (*bdevsw[major(dumpdev)].d_psize)(dumpdev) - physmem;
1228 	if (dumplo < 0)
1229 		dumplo = 0;
1230 }
1231 
1232 #define	DOSWAP			/* Change swdevt, argdev, and dumpdev too */
1233 u_long	bootdev;		/* should be dev_t, but not until 32 bits */
1234 
1235 static	char devname[][2] = {
1236 	'h','p',	/* 0 = hp */
1237 	0,0,		/* 1 = ht */
1238 	'u','p',	/* 2 = up */
1239 	'r','k',	/* 3 = hk */
1240 	0,0,		/* 4 = sw */
1241 	0,0,		/* 5 = tm */
1242 	0,0,		/* 6 = ts */
1243 	0,0,		/* 7 = mt */
1244 	0,0,		/* 8 = tu */
1245 	'r','a',	/* 9 = ra */
1246 	0,0,		/* 10 = ut */
1247 	'r','b',	/* 11 = rb */
1248 	0,0,		/* 12 = uu */
1249 	0,0,		/* 13 = rx */
1250 	'r','l',	/* 14 = rl */
1251 	0,0,		/* 15 = tmscp */
1252 	'k','r',	/* 16 = ra on kdb50 */
1253 };
1254 
1255 #define	PARTITIONMASK	0x7
1256 #define	PARTITIONSHIFT	3
1257 
1258 /*
1259  * Attempt to find the device from which we were booted.
1260  * If we can do so, and not instructed not to do so,
1261  * change rootdev to correspond to the load device.
1262  */
1263 setroot()
1264 {
1265 	int  majdev, mindev, unit, part, controller, adaptor;
1266 	dev_t temp, orootdev;
1267 	struct swdevt *swp;
1268 
1269 	if (boothowto & RB_DFLTROOT ||
1270 	    (bootdev & B_MAGICMASK) != (u_long)B_DEVMAGIC)
1271 		return;
1272 	majdev = B_TYPE(bootdev);
1273 	if (majdev >= sizeof(devname) / sizeof(devname[0]))
1274 		return;
1275 	adaptor = B_ADAPTOR(bootdev);
1276 	controller = B_CONTROLLER(bootdev);
1277 	part = B_PARTITION(bootdev);
1278 	unit = B_UNIT(bootdev);
1279 	if (majdev == 0) {	/* MBA device */
1280 #if NMBA > 0
1281 		register struct mba_device *mbap;
1282 		int mask;
1283 
1284 /*
1285  * The MBA number used at boot time is not necessarily the same as the
1286  * MBA number used by the kernel.  In order to change the rootdev we need to
1287  * convert the boot MBA number to the kernel MBA number.  The address space
1288  * for an MBA used by the boot code is 0x20010000 + 0x2000 * MBA_number
1289  * on the 78? and 86?0, 0xf28000 + 0x2000 * MBA_number on the 750.
1290  * Therefore we can search the mba_hd table for the MBA that has the physical
1291  * address corresponding to the boot MBA number.
1292  */
1293 #define	PHYSADRSHFT	13
1294 #define	PHYSMBAMASK780	0x7
1295 #define	PHYSMBAMASK750	0x3
1296 
1297 		switch (cpu) {
1298 
1299 		case VAX_780:
1300 		case VAX_8600:
1301 		default:
1302 			mask = PHYSMBAMASK780;
1303 			break;
1304 
1305 		case VAX_750:
1306 			mask = PHYSMBAMASK750;
1307 			break;
1308 		}
1309 		for (mbap = mbdinit; mbap->mi_driver; mbap++)
1310 			if (mbap->mi_alive && mbap->mi_drive == unit &&
1311 			    (((long)mbap->mi_hd->mh_physmba >> PHYSADRSHFT)
1312 			      & mask) == adaptor)
1313 			    	break;
1314 		if (mbap->mi_driver == 0)
1315 			return;
1316 		mindev = mbap->mi_unit;
1317 #else
1318 		return;
1319 #endif
1320 	} else {
1321 		register struct uba_device *ubap;
1322 
1323 		for (ubap = ubdinit; ubap->ui_driver; ubap++)
1324 			if (ubap->ui_alive && ubap->ui_slave == unit &&
1325 			   ubap->ui_ctlr == controller &&
1326 			   ubap->ui_ubanum == adaptor &&
1327 			   ubap->ui_driver->ud_dname[0] == devname[majdev][0] &&
1328 			   ubap->ui_driver->ud_dname[1] == devname[majdev][1])
1329 			    	break;
1330 
1331 		if (ubap->ui_driver == 0)
1332 			return;
1333 		mindev = ubap->ui_unit;
1334 	}
1335 	mindev = (mindev << PARTITIONSHIFT) + part;
1336 	orootdev = rootdev;
1337 	rootdev = makedev(majdev, mindev);
1338 	/*
1339 	 * If the original rootdev is the same as the one
1340 	 * just calculated, don't need to adjust the swap configuration.
1341 	 */
1342 	if (rootdev == orootdev)
1343 		return;
1344 
1345 	printf("Changing root device to %c%c%d%c\n",
1346 		devname[majdev][0], devname[majdev][1],
1347 		mindev >> PARTITIONSHIFT, part + 'a');
1348 
1349 #ifdef DOSWAP
1350 	mindev &= ~PARTITIONMASK;
1351 	for (swp = swdevt; swp->sw_dev; swp++) {
1352 		if (majdev == major(swp->sw_dev) &&
1353 		    mindev == (minor(swp->sw_dev) & ~PARTITIONMASK)) {
1354 			temp = swdevt[0].sw_dev;
1355 			swdevt[0].sw_dev = swp->sw_dev;
1356 			swp->sw_dev = temp;
1357 			break;
1358 		}
1359 	}
1360 	if (swp->sw_dev == 0)
1361 		return;
1362 
1363 	/*
1364 	 * If argdev and dumpdev were the same as the old primary swap
1365 	 * device, move them to the new primary swap device.
1366 	 */
1367 	if (temp == dumpdev)
1368 		dumpdev = swdevt[0].sw_dev;
1369 	if (temp == argdev)
1370 		argdev = swdevt[0].sw_dev;
1371 #endif
1372 }
1373