autoconf.c revision 1.5
11.1Smw/*
21.1Smw * Copyright (c) 1988 University of Utah.
31.1Smw * Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
41.1Smw * All rights reserved.
51.1Smw *
61.1Smw * This code is derived from software contributed to Berkeley by
71.1Smw * the Systems Programming Group of the University of Utah Computer
81.1Smw * Science Department.
91.1Smw *
101.1Smw * Redistribution and use in source and binary forms, with or without
111.1Smw * modification, are permitted provided that the following conditions
121.1Smw * are met:
131.1Smw * 1. Redistributions of source code must retain the above copyright
141.1Smw *    notice, this list of conditions and the following disclaimer.
151.1Smw * 2. Redistributions in binary form must reproduce the above copyright
161.1Smw *    notice, this list of conditions and the following disclaimer in the
171.1Smw *    documentation and/or other materials provided with the distribution.
181.1Smw * 3. All advertising materials mentioning features or use of this software
191.1Smw *    must display the following acknowledgement:
201.1Smw *	This product includes software developed by the University of
211.1Smw *	California, Berkeley and its contributors.
221.1Smw * 4. Neither the name of the University nor the names of its contributors
231.1Smw *    may be used to endorse or promote products derived from this software
241.1Smw *    without specific prior written permission.
251.1Smw *
261.1Smw * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
271.1Smw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
281.1Smw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
291.1Smw * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
301.1Smw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
311.1Smw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
321.1Smw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
331.1Smw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
341.1Smw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
351.1Smw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
361.1Smw * SUCH DAMAGE.
371.1Smw *
381.4Smw * from: Utah $Hdr: autoconf.c 1.31 91/01/21$
391.4Smw *
401.4Smw *	@(#)autoconf.c	7.5 (Berkeley) 5/7/91
411.1Smw */
421.1Smw
431.1Smw/*
441.1Smw * Setup the system to run on the current machine.
451.1Smw *
461.1Smw * Configure() is called at boot time.  Available
471.1Smw * devices are determined (from possibilities mentioned in ioconf.c),
481.1Smw * and the drivers are initialized.
491.1Smw */
501.1Smw
511.1Smw#include "sys/param.h"
521.1Smw#include "sys/systm.h"
531.1Smw#include "sys/buf.h"
541.1Smw#include "sys/dkstat.h"
551.1Smw#include "sys/conf.h"
561.1Smw#include "sys/dmap.h"
571.1Smw#include "sys/reboot.h"
581.1Smw
591.1Smw#include "machine/vmparam.h"
601.1Smw#include "machine/cpu.h"
611.1Smw#include "pte.h"
621.1Smw#include "../dev/device.h"
631.1Smw
641.3Smw#include "configdev.h"
651.3Smw#include "custom.h"
661.1Smw
671.1Smw/*
681.1Smw * The following several variables are related to
691.1Smw * the configuration process, and are used in initializing
701.1Smw * the machine.
711.1Smw */
721.1Smwint	cold;		    /* if 1, still working on cold-start */
731.1Smwint	dkn;		    /* number of iostat dk numbers assigned so far */
741.1Smwint	cpuspeed = MHZ_8;   /* relative cpu speed */
751.1Smwstruct	amiga_hw sc_table[MAXCTLRS];
761.1Smw
771.3Smw/* set up in amiga_init.c */
781.3Smwextern caddr_t ZORRO2ADDR;
791.3Smw
801.3Smw/* maps a zorro2 and/or A3000 builtin address into the mapped kva address */
811.3Smw#define zorro2map(pa) ((caddr_t) ((u_int)ZORRO2ADDR - ZORRO2BASE + (u_int)pa))
821.3Smw/* tests whether the address lies in our zorro2 space */
831.3Smw#define iszorro2kva(kva) ((u_int)kva >= (u_int)ZORRO2ADDR && (u_int)kva < ((u_int)ZORRO2ADDR+(u_int)ZORRO2TOP-(u_int)ZORRO2BASE))
841.3Smw#define iszorro2pa(pa) ((u_int)pa >= ZORRO2BASE && (u_int)pa <= ZORRO2TOP)
851.3Smw
861.1Smw#ifdef DEBUG
871.1Smwint	acdebug = 0;
881.1Smw#endif
891.1Smw
901.1Smw/*
911.1Smw * Determine mass storage and memory configuration for a machine.
921.1Smw */
931.1Smwconfigure()
941.1Smw{
951.1Smw	register struct amiga_hw *hw;
961.1Smw	int found;
971.3Smw
981.3Smw	/* XXXX I HATE IT XXXX */
991.3Smw	custom.intena = INTF_INTEN;
1001.1Smw
1011.1Smw	/*
1021.1Smw	 * Look over each hardware device actually found and attempt
1031.1Smw	 * to match it with an ioconf.c table entry.
1041.1Smw	 */
1051.1Smw	for (hw = sc_table; hw->hw_type; hw++) {
1061.1Smw		if (HW_ISCTLR(hw))
1071.1Smw			found = find_controller(hw);
1081.1Smw		else
1091.1Smw			found = find_device(hw);
1101.1Smw#ifdef DEBUG
1111.1Smw		if (!found && acdebug) {
1121.1Smw			printf("unconfigured device %d/%d\n",
1131.1Smw			       hw->hw_manufacturer, hw->hw_product);
1141.1Smw		}
1151.1Smw#endif
1161.1Smw	}
1171.1Smw
1181.1Smw#if 0
1191.1Smw#include "cd.h"
1201.1Smw#if NCD > 0
1211.1Smw	/*
1221.1Smw	 * Now deal with concatenated disks
1231.1Smw	 */
1241.1Smw	find_cdevices();
1251.1Smw#endif
1261.1Smw#endif
1271.1Smw
1281.1Smw#if GENERIC
1291.1Smw	if ((boothowto & RB_ASKNAME) == 0)
1301.1Smw		setroot();
1311.1Smw	setconf();
1321.1Smw#else
1331.1Smw	setroot();
1341.1Smw#endif
1351.1Smw	swapconf();
1361.1Smw	cold = 0;
1371.3Smw
1381.3Smw	custom.intena = INTF_SETCLR | INTF_INTEN;
1391.1Smw}
1401.1Smw
1411.1Smw#define dr_type(d, s)	\
1421.1Smw	(strcmp((d)->d_name, (s)) == 0)
1431.1Smw
1441.1Smw#define same_hw_ctlr(hw, ac) \
1451.1Smw	(HW_ISFLOPPY(hw) && dr_type((ac)->amiga_driver, "floppy") || \
1461.5Smw	 HW_ISSCSI(hw) && (dr_type((ac)->amiga_driver, "a3000scsi") \
1471.5Smw	 || dr_type((ac)->amiga_driver, "a2091scsi") \
1481.5Smw	 || dr_type((ac)->amiga_driver, "GVPIIscsi") \
1491.5Smw	 || dr_type((ac)->amiga_driver, "Zeusscsi") \
1501.5Smw	 || dr_type((ac)->amiga_driver, "Magnumscsi")))
1511.1Smw
1521.1Smwfind_controller(hw)
1531.1Smw	register struct amiga_hw *hw;
1541.1Smw{
1551.1Smw	register struct amiga_ctlr *ac;
1561.1Smw	struct amiga_ctlr *match_c;
1571.1Smw	caddr_t oaddr;
1581.1Smw	int sc;
1591.1Smw
1601.1Smw#ifdef DEBUG
1611.1Smw	if (acdebug)
1621.1Smw		printf("find_controller: hw: [%d/%d] (%x), type %x...",
1631.1Smw		       hw->hw_manufacturer, hw->hw_product,
1641.1Smw		       hw->hw_kva, hw->hw_type);
1651.1Smw#endif
1661.1Smw	sc = (hw->hw_manufacturer << 16) | hw->hw_product;
1671.1Smw	match_c = NULL;
1681.1Smw	for (ac = amiga_cinit; ac->amiga_driver; ac++) {
1691.1Smw		if (ac->amiga_alive)
1701.1Smw			continue;
1711.1Smw		/*
1721.1Smw		 * Make sure we are looking at the right
1731.1Smw		 * controller type.
1741.1Smw		 */
1751.1Smw		if (!same_hw_ctlr(hw, ac))
1761.1Smw			continue;
1771.1Smw		/*
1781.1Smw		 * Exact match; all done
1791.1Smw		 */
1801.1Smw		if ((int)ac->amiga_addr == sc) {
1811.1Smw			match_c = ac;
1821.1Smw			break;
1831.1Smw		}
1841.1Smw		/*
1851.1Smw		 * Wildcard; possible match so remember first instance
1861.1Smw		 * but continue looking for exact match.
1871.1Smw		 */
1881.1Smw		if (ac->amiga_addr == NULL && match_c == NULL)
1891.1Smw			match_c = ac;
1901.1Smw	}
1911.1Smw#ifdef DEBUG
1921.1Smw	if (acdebug) {
1931.1Smw		if (match_c)
1941.1Smw			printf("found %s%d\n",
1951.1Smw			       match_c->amiga_driver->d_name,
1961.1Smw			       match_c->amiga_unit);
1971.1Smw		else
1981.1Smw			printf("not found\n");
1991.1Smw	}
2001.1Smw#endif
2011.1Smw	/*
2021.1Smw	 * Didn't find an ioconf entry for this piece of hardware,
2031.1Smw	 * just ignore it.
2041.1Smw	 */
2051.1Smw	if (match_c == NULL)
2061.1Smw		return(0);
2071.1Smw	/*
2081.1Smw	 * Found a match, attempt to initialize and configure all attached
2091.1Smw	 * slaves.  Note, we can still fail if HW won't initialize.
2101.1Smw	 */
2111.1Smw	ac = match_c;
2121.1Smw	oaddr = ac->amiga_addr;
2131.1Smw	ac->amiga_addr = hw->hw_kva;
2141.1Smw	if ((*ac->amiga_driver->d_init)(ac)) {
2151.1Smw		ac->amiga_alive = 1;
2161.1Smw		printf ("%s%d", ac->amiga_driver->d_name, ac->amiga_unit);
2171.1Smw		printf (" [%d/%d]", hw->hw_manufacturer, hw->hw_product);
2181.1Smw		if (ac->amiga_flags)
2191.1Smw			printf(", flags 0x%x", ac->amiga_flags);
2201.1Smw		printf("\n");
2211.1Smw		find_slaves(ac);
2221.1Smw	} else
2231.1Smw		ac->amiga_addr = oaddr;
2241.1Smw	return(1);
2251.1Smw}
2261.1Smw
2271.1Smwfind_device(hw)
2281.1Smw	register struct amiga_hw *hw;
2291.1Smw{
2301.1Smw	register struct amiga_device *ad;
2311.1Smw	struct amiga_device *match_d;
2321.1Smw	caddr_t oaddr;
2331.1Smw	int sc;
2341.1Smw
2351.1Smw#ifdef DEBUG
2361.1Smw	if (acdebug)
2371.1Smw		printf("find_device: hw: [%d/%d] (%x), type %x...",
2381.1Smw		       hw->hw_manufacturer, hw->hw_product,
2391.1Smw		       hw->hw_kva, hw->hw_type);
2401.1Smw#endif
2411.1Smw	match_d = NULL;
2421.1Smw	for (ad = amiga_dinit; ad->amiga_driver; ad++) {
2431.1Smw		if (ad->amiga_alive)
2441.1Smw			continue;
2451.1Smw		/* Must not be a slave */
2461.1Smw		if (ad->amiga_cdriver)
2471.1Smw			continue;
2481.1Smw
2491.3Smw		/*
2501.3Smw		 * XXX: A graphics device that was found as part of the
2511.3Smw		 * console init will have the amiga_addr field already set
2521.3Smw		 * (i.e. no longer the select code).  Gotta perform a
2531.3Smw		 * slightly different check for an exact match.
2541.3Smw		 */
2551.3Smw		if (HW_ISDEV(hw, D_BITMAP) && iszorro2kva(ad->amiga_addr))
2561.3Smw		  {
2571.3Smw		    if (ad->amiga_addr == hw->hw_kva)
2581.3Smw		      {
2591.3Smw		        match_d = ad;
2601.3Smw		        break;
2611.3Smw		      }
2621.3Smw		    continue;
2631.3Smw		  }
2641.1Smw		sc = (int) ad->amiga_addr;
2651.1Smw		/*
2661.1Smw		 * Exact match; all done.
2671.1Smw		 */
2681.1Smw		if (sc > 0 && sc == ((hw->hw_manufacturer << 16) | hw->hw_product)) {
2691.1Smw			match_d = ad;
2701.1Smw			break;
2711.1Smw		}
2721.1Smw		/*
2731.1Smw		 * Wildcard; possible match so remember first instance
2741.1Smw		 * but continue looking for exact match.
2751.1Smw		 */
2761.1Smw		if (sc == 0 && same_hw_device(hw, ad) && match_d == NULL)
2771.1Smw			match_d = ad;
2781.1Smw	}
2791.1Smw#ifdef DEBUG
2801.1Smw	if (acdebug) {
2811.1Smw		if (match_d)
2821.1Smw			printf("found %s%d\n",
2831.1Smw			       match_d->amiga_driver->d_name,
2841.1Smw			       match_d->amiga_unit);
2851.1Smw		else
2861.1Smw			printf("not found\n");
2871.1Smw	}
2881.1Smw#endif
2891.1Smw	/*
2901.1Smw	 * Didn't find an ioconf entry for this piece
2911.1Smw	 * of hardware, just ignore it.
2921.1Smw	 */
2931.1Smw	if (match_d == NULL)
2941.1Smw		return(0);
2951.1Smw	/*
2961.1Smw	 * Found a match, attempt to initialize.
2971.1Smw	 * Note, we can still fail if HW won't initialize.
2981.1Smw	 */
2991.1Smw	ad = match_d;
3001.1Smw	oaddr = ad->amiga_addr;
3011.1Smw	ad->amiga_addr = hw->hw_kva;
3021.3Smw	ad->amiga_serno = hw->hw_serno;
3031.3Smw	ad->amiga_size = hw->hw_size;
3041.1Smw	if ((*ad->amiga_driver->d_init)(ad)) {
3051.1Smw		ad->amiga_alive = 1;
3061.1Smw		printf("%s%d", ad->amiga_driver->d_name, ad->amiga_unit);
3071.1Smw		printf (" [%d/%d]", hw->hw_manufacturer, hw->hw_product);
3081.1Smw		if (ad->amiga_flags)
3091.1Smw			printf(", flags 0x%x", ad->amiga_flags);
3101.1Smw		printf("\n");
3111.1Smw	} else
3121.1Smw		ad->amiga_addr = oaddr;
3131.1Smw	return(1);
3141.1Smw}
3151.1Smw
3161.1Smwfind_slaves(ac)
3171.1Smw	struct amiga_ctlr *ac;
3181.1Smw{
3191.1Smw	if (dr_type(ac->amiga_driver, "floppy"))
3201.1Smw		find_busslaves(ac, 4);
3211.5Smw	else if (dr_type(ac->amiga_driver, "a3000scsi")
3221.5Smw            || dr_type(ac->amiga_driver, "a2091scsi")
3231.5Smw	    || dr_type(ac->amiga_driver, "GVPIIscsi")
3241.5Smw	    || dr_type(ac->amiga_driver, "Zeusscsi")
3251.5Smw	    || dr_type(ac->amiga_driver, "Magnumscsi"))
3261.1Smw		find_busslaves(ac, 7);
3271.1Smw}
3281.1Smw
3291.1Smw/*
3301.1Smw */
3311.1Smwfind_busslaves(ac, maxslaves)
3321.1Smw	register struct amiga_ctlr *ac;
3331.1Smw	int maxslaves;
3341.1Smw{
3351.1Smw	register int s;
3361.1Smw	register struct amiga_device *ad;
3371.1Smw	struct amiga_device *match_s;
3381.1Smw	int new_s, new_c, old_s, old_c;
3391.1Smw	int rescan;
3401.1Smw
3411.1Smw#ifdef DEBUG
3421.1Smw	if (acdebug)
3431.1Smw		printf("find_busslaves: for %s%d\n",
3441.1Smw		       ac->amiga_driver->d_name, ac->amiga_unit);
3451.1Smw#endif
3461.1Smw	for (s = 0; s < maxslaves; s++) {
3471.1Smw		rescan = 1;
3481.1Smw		match_s = NULL;
3491.1Smw		for (ad = amiga_dinit; ad->amiga_driver; ad++) {
3501.1Smw			/*
3511.1Smw			 * Rule out the easy ones:
3521.1Smw			 * 1. slave already assigned or not a slave
3531.1Smw			 * 2. not of the proper type
3541.1Smw			 * 3. controller specified but not this one
3551.1Smw			 * 4. slave specified but not this one
3561.1Smw			 */
3571.1Smw			if (ad->amiga_alive || ad->amiga_cdriver == NULL)
3581.1Smw				continue;
3591.1Smw			if (!dr_type(ac->amiga_driver, ad->amiga_cdriver->d_name))
3601.1Smw				continue;
3611.1Smw			if (ad->amiga_ctlr >= 0 && ad->amiga_ctlr != ac->amiga_unit)
3621.1Smw				continue;
3631.1Smw			if (ad->amiga_slave >= 0 && ad->amiga_slave != s)
3641.1Smw				continue;
3651.1Smw			/*
3661.1Smw			 * Case 0: first possible match.
3671.1Smw			 * Remember it and keep looking for better.
3681.1Smw			 */
3691.1Smw			if (match_s == NULL) {
3701.1Smw				match_s = ad;
3711.1Smw				new_c = ac->amiga_unit;
3721.1Smw				new_s = s;
3731.1Smw				continue;
3741.1Smw			}
3751.1Smw			/*
3761.1Smw			 * Case 1: exact match.
3771.1Smw			 * All done.  Note that we do not attempt any other
3781.1Smw			 * matches if this one fails.  This allows us to
3791.1Smw			 * "reserve" locations for dynamic addition of
3801.1Smw			 * disk/tape drives by fully qualifing the location.
3811.1Smw			 */
3821.1Smw			if (ad->amiga_slave == s && ad->amiga_ctlr == ac->amiga_unit) {
3831.1Smw				match_s = ad;
3841.1Smw				rescan = 0;
3851.1Smw				break;
3861.1Smw			}
3871.1Smw			/*
3881.1Smw			 * Case 2: right controller, wildcarded slave.
3891.1Smw			 * Remember first and keep looking for an exact match.
3901.1Smw			 */
3911.1Smw			if (ad->amiga_ctlr == ac->amiga_unit &&
3921.1Smw			    match_s->amiga_ctlr < 0) {
3931.1Smw				match_s = ad;
3941.1Smw				new_s = s;
3951.1Smw				continue;
3961.1Smw			}
3971.1Smw			/*
3981.1Smw			 * Case 3: right slave, wildcarded controller.
3991.1Smw			 * Remember and keep looking for a better match.
4001.1Smw			 */
4011.1Smw			if (ad->amiga_slave == s &&
4021.1Smw			    match_s->amiga_ctlr < 0 && match_s->amiga_slave < 0) {
4031.1Smw				match_s = ad;
4041.1Smw				new_c = ac->amiga_unit;
4051.1Smw				continue;
4061.1Smw			}
4071.1Smw			/*
4081.1Smw			 * OW: we had a totally wildcarded spec.
4091.1Smw			 * If we got this far, we have found a possible
4101.1Smw			 * match already (match_s != NULL) so there is no
4111.1Smw			 * reason to remember this one.
4121.1Smw			 */
4131.1Smw			continue;
4141.1Smw		}
4151.1Smw		/*
4161.1Smw		 * Found a match.  We need to set amiga_ctlr/amiga_slave properly
4171.1Smw		 * for the init routines but we also need to remember all
4181.1Smw		 * the old values in case this doesn't pan out.
4191.1Smw		 */
4201.1Smw		if (match_s) {
4211.1Smw			ad = match_s;
4221.1Smw			old_c = ad->amiga_ctlr;
4231.1Smw			old_s = ad->amiga_slave;
4241.1Smw			if (ad->amiga_ctlr < 0)
4251.1Smw				ad->amiga_ctlr = new_c;
4261.1Smw			if (ad->amiga_slave < 0)
4271.1Smw				ad->amiga_slave = new_s;
4281.1Smw#ifdef DEBUG
4291.1Smw			if (acdebug)
4301.1Smw				printf("looking for %s%d at slave %d...",
4311.1Smw				       ad->amiga_driver->d_name,
4321.1Smw				       ad->amiga_unit, ad->amiga_slave);
4331.1Smw#endif
4341.1Smw
4351.1Smw			if ((*ad->amiga_driver->d_init)(ad)) {
4361.1Smw#ifdef DEBUG
4371.1Smw				if (acdebug)
4381.1Smw					printf("found\n");
4391.1Smw#endif
4401.1Smw				printf("%s%d at %s%d, slave %d",
4411.1Smw				       ad->amiga_driver->d_name, ad->amiga_unit,
4421.1Smw				       ac->amiga_driver->d_name, ad->amiga_ctlr,
4431.1Smw				       ad->amiga_slave);
4441.1Smw				if (ad->amiga_flags)
4451.1Smw					printf(" flags 0x%x", ad->amiga_flags);
4461.1Smw				printf("\n");
4471.1Smw				ad->amiga_alive = 1;
4481.1Smw				if (ad->amiga_dk && dkn < DK_NDRIVE)
4491.1Smw					ad->amiga_dk = dkn++;
4501.1Smw				else
4511.1Smw					ad->amiga_dk = -1;
4521.1Smw				rescan = 1;
4531.1Smw			} else {
4541.1Smw#ifdef DEBUG
4551.1Smw				if (acdebug)
4561.1Smw					printf("not found\n");
4571.1Smw#endif
4581.1Smw				ad->amiga_ctlr = old_c;
4591.1Smw				ad->amiga_slave = old_s;
4601.1Smw			}
4611.1Smw			/*
4621.1Smw			 * XXX: This should be handled better.
4631.1Smw			 * Re-scan a slave.  There are two reasons to do this.
4641.1Smw			 * 1. It is possible to have both a tape and disk
4651.1Smw			 *    (e.g. 7946) or two disks (e.g. 9122) at the
4661.1Smw			 *    same slave address.  Here we need to rescan
4671.1Smw			 *    looking only at entries with a different
4681.1Smw			 *    physical unit number (amiga_flags).
4691.1Smw			 * 2. It is possible that an init failed because the
4701.1Smw			 *    slave was there but of the wrong type.  In this
4711.1Smw			 *    case it may still be possible to match the slave
4721.1Smw			 *    to another ioconf entry of a different type.
4731.1Smw			 *    Here we need to rescan looking only at entries
4741.1Smw			 *    of different types.
4751.1Smw			 * In both cases we avoid looking at undesirable
4761.1Smw			 * ioconf entries of the same type by setting their
4771.1Smw			 * alive fields to -1.
4781.1Smw			 */
4791.1Smw			if (rescan) {
4801.1Smw				for (ad = amiga_dinit; ad->amiga_driver; ad++) {
4811.1Smw					if (ad->amiga_alive)
4821.1Smw						continue;
4831.1Smw					if (match_s->amiga_alive == 1) {	/* 1 */
4841.1Smw						if (ad->amiga_flags == match_s->amiga_flags)
4851.1Smw							ad->amiga_alive = -1;
4861.1Smw					} else {			/* 2 */
4871.1Smw						if (ad->amiga_driver == match_s->amiga_driver)
4881.1Smw							ad->amiga_alive = -1;
4891.1Smw					}
4901.1Smw				}
4911.1Smw				s--;
4921.1Smw				continue;
4931.1Smw			}
4941.1Smw		}
4951.1Smw		/*
4961.1Smw		 * Reset bogon alive fields prior to attempting next slave
4971.1Smw		 */
4981.1Smw		for (ad = amiga_dinit; ad->amiga_driver; ad++)
4991.1Smw			if (ad->amiga_alive == -1)
5001.1Smw				ad->amiga_alive = 0;
5011.1Smw	}
5021.1Smw}
5031.1Smw
5041.1Smwsame_hw_device(hw, ad)
5051.1Smw	struct amiga_hw *hw;
5061.1Smw	struct amiga_device *ad;
5071.1Smw{
5081.1Smw	int found = 0;
5091.1Smw
5101.1Smw	switch (hw->hw_type & ~B_MASK) {
5111.1Smw	case C_FLOPPY:
5121.1Smw		found = dr_type(ad->amiga_driver, "floppy");
5131.1Smw		break;
5141.1Smw	case C_SCSI:
5151.3Smw		found = (dr_type(ad->amiga_driver, "a3000scsi")
5161.3Smw			 || dr_type(ad->amiga_driver, "a2091scsi")
5171.5Smw			 || dr_type(ad->amiga_driver, "GVPIIscsi")
5181.5Smw			 || dr_type(ad->amiga_driver, "Zeusscsi")
5191.5Smw			 || dr_type(ad->amiga_driver, "Magnumscsi"));
5201.1Smw		break;
5211.1Smw	case D_BITMAP:
5221.1Smw		found = dr_type(ad->amiga_driver, "grf");
5231.1Smw		break;
5241.1Smw	case D_LAN:
5251.1Smw		found = dr_type(ad->amiga_driver, "le");
5261.1Smw		break;
5271.1Smw	case D_COMMSER:
5281.1Smw		found = dr_type(ad->amiga_driver, "ser");
5291.1Smw		break;
5301.3Smw	case D_CLOCK:
5311.3Smw		found = dr_type(ad->amiga_driver, "rtclock");
5321.4Smw		break;
5331.4Smw	case D_PPORT:
5341.4Smw		found = dr_type(ad->amiga_driver, "par");
5351.3Smw		break;
5361.1Smw	default:
5371.1Smw		break;
5381.1Smw	}
5391.1Smw	return(found);
5401.1Smw}
5411.1Smw
5421.1Smwchar notmappedmsg[] = "WARNING: no space to map IO card, ignored\n";
5431.1Smw
5441.1Smw/*
5451.1Smw * Scan the IO space looking for devices.
5461.1Smw */
5471.1Smwfind_devs()
5481.1Smw{
5491.1Smw  short sc;
5501.1Smw  u_char *id_reg;
5511.1Smw  register caddr_t addr;
5521.1Smw  register struct amiga_hw *hw;
5531.1Smw  int didmap, sctop;
5541.1Smw  extern int num_ConfigDev;
5551.1Smw  extern struct ConfigDev *ConfigDev;
5561.1Smw  struct ConfigDev *cd;
5571.1Smw
5581.1Smw#if 0
5591.1Smw  /*
5601.1Smw   * Initialize IO resource map for iomap().
5611.1Smw   */
5621.1Smw  rminit(extiomap, (long)EIOMAPSIZE, (long)1, "extio", EIOMAPSIZE/16);
5631.1Smw#endif
5641.1Smw  hw = sc_table;
5651.1Smw
5661.1Smw  /* first enter builtin devices */
5671.1Smw
5681.5Smw  if (is_a4000 ())
5691.5Smw    {
5701.5Smw      /* The A4000 appears to use the same realtime clock as the A3000.
5711.5Smw         Add the IDE controller when that information becomes available.
5721.5Smw	 */
5731.5Smw
5741.5Smw      hw->hw_pa	      	  = 0xdc0000;
5751.5Smw      hw->hw_size	  = NBPG;
5761.5Smw      hw->hw_kva	  = zorro2map (0xdc0000);
5771.5Smw      hw->hw_manufacturer = MANUF_BUILTIN;
5781.5Smw      hw->hw_product      = PROD_BUILTIN_CLOCK;
5791.5Smw      hw->hw_type	  = B_BUILTIN | D_CLOCK;
5801.5Smw      hw->hw_serno	  = 0;
5811.5Smw      hw++;
5821.5Smw    }
5831.5Smw  else if (is_a3000 ())
5841.3Smw    {
5851.3Smw      /* hm, this doesn't belong here... */
5861.3Smw      volatile u_char *magic_reset_reg = zorro2map (0xde0002);
5871.3Smw      /* this bit makes the next reset look like a powerup reset, Amiga
5881.3Smw	 Unix sets this bit, and perhaps it will enable 16M machines to
5891.3Smw	 boot again... */
5901.3Smw      *magic_reset_reg   |= 0x80;
5911.3Smw
5921.3Smw      hw->hw_pa		  = 0xdd0000;
5931.3Smw      hw->hw_size	  = NBPG;
5941.3Smw      hw->hw_kva	  = zorro2map (0xdd0000);
5951.3Smw      hw->hw_manufacturer = MANUF_BUILTIN;
5961.3Smw      hw->hw_product      = PROD_BUILTIN_SCSI;
5971.3Smw      hw->hw_type	  = B_BUILTIN | C_SCSI;
5981.3Smw      hw->hw_serno	  = 0;
5991.3Smw      hw++;
6001.1Smw
6011.3Smw      hw->hw_pa	      	  = 0xdc0000;
6021.3Smw      hw->hw_size	  = NBPG;
6031.3Smw      hw->hw_kva	  = zorro2map (0xdc0000);
6041.3Smw      hw->hw_manufacturer = MANUF_BUILTIN;
6051.3Smw      hw->hw_product      = PROD_BUILTIN_CLOCK;
6061.3Smw      hw->hw_type	  = B_BUILTIN | D_CLOCK;
6071.3Smw      hw->hw_serno	  = 0;
6081.3Smw      hw++;
6091.3Smw    }
6101.3Smw  else
6111.3Smw    {
6121.3Smw      /* what about other Amigas? Oh well.. */
6131.3Smw      hw->hw_pa	      	  = 0xdc0000;
6141.3Smw      hw->hw_size	  = NBPG;
6151.3Smw      hw->hw_kva	  = zorro2map (0xdc0000);
6161.3Smw      hw->hw_manufacturer = MANUF_BUILTIN;
6171.3Smw      hw->hw_product      = PROD_BUILTIN_CLOCK2;
6181.3Smw      hw->hw_type	  = B_BUILTIN | D_CLOCK;
6191.3Smw      hw->hw_serno	  = 0;
6201.3Smw      hw++;
6211.3Smw    }
6221.1Smw
6231.1Smw  hw->hw_pa	      = 0;
6241.1Smw  hw->hw_size	      = 0;
6251.3Smw  hw->hw_kva	      = CUSTOMbase;
6261.1Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6271.1Smw  hw->hw_product      = PROD_BUILTIN_FLOPPY;
6281.1Smw  hw->hw_type	      = B_BUILTIN | C_FLOPPY;
6291.3Smw  hw->hw_serno	      = 0;
6301.1Smw  hw++;
6311.1Smw
6321.1Smw  hw->hw_pa	      = 0;
6331.1Smw  hw->hw_size	      = 0;
6341.3Smw  hw->hw_kva	      = CUSTOMbase;
6351.1Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6361.1Smw  hw->hw_product      = PROD_BUILTIN_KEYBOARD;
6371.1Smw  hw->hw_type	      = B_BUILTIN | D_KEYBOARD;
6381.3Smw  hw->hw_serno	      = 0;
6391.1Smw  hw++;
6401.1Smw
6411.1Smw  hw->hw_pa	      = 0;
6421.1Smw  hw->hw_size	      = 0;
6431.3Smw  hw->hw_kva	      = CUSTOMbase;
6441.1Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6451.1Smw  hw->hw_product      = PROD_BUILTIN_PPORT;
6461.1Smw  hw->hw_type	      = B_BUILTIN | D_PPORT;
6471.3Smw  hw->hw_serno	      = 0;
6481.1Smw  hw++;
6491.1Smw
6501.1Smw  hw->hw_pa	      = 0;
6511.1Smw  hw->hw_size	      = 0;
6521.3Smw  hw->hw_kva	      = CUSTOMbase;
6531.1Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6541.1Smw  hw->hw_product      = PROD_BUILTIN_DISPLAY;
6551.1Smw  hw->hw_type	      = B_BUILTIN | D_BITMAP;
6561.3Smw  hw->hw_serno	      = 0;
6571.3Smw  hw++;
6581.3Smw
6591.3Smw  hw->hw_pa	      = 0;
6601.3Smw  hw->hw_size	      = 0;
6611.3Smw  hw->hw_kva	      = CUSTOMbase;
6621.3Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6631.3Smw  hw->hw_product      = PROD_BUILTIN_RS232;
6641.3Smw  hw->hw_type	      = B_BUILTIN | D_COMMSER;
6651.3Smw  hw->hw_serno	      = 0;
6661.1Smw  hw++;
6671.3Smw
6681.1Smw  /* and afterwards add Zorro II/III devices passed by the loader */
6691.1Smw
6701.1Smw  for (sc = 0, cd = ConfigDev; sc < num_ConfigDev; sc++, cd++)
6711.1Smw    {
6721.1Smw      hw->hw_pa		  = cd->cd_BoardAddr;
6731.1Smw      hw->hw_size	  = cd->cd_BoardSize;
6741.3Smw      /* ADD ZORRO3 SUPPORT HERE !! */
6751.3Smw      hw->hw_kva	  = iszorro2pa(cd->cd_BoardAddr) ? zorro2map (cd->cd_BoardAddr) : 0;
6761.1Smw      hw->hw_manufacturer = cd->cd_Rom.er_Manufacturer;
6771.1Smw      hw->hw_product	  = cd->cd_Rom.er_Product;
6781.3Smw      hw->hw_serno	  = cd->cd_Rom.er_SerialNumber;
6791.1Smw
6801.1Smw      switch (hw->hw_manufacturer)
6811.1Smw        {
6821.1Smw        case MANUF_CBM_1:
6831.1Smw          switch (hw->hw_product)
6841.1Smw            {
6851.1Smw            case PROD_CBM_1_A2088:
6861.1Smw              hw->hw_type = B_ZORROII | D_MISC;
6871.1Smw              break;
6881.1Smw
6891.1Smw            default:
6901.1Smw              continue;
6911.1Smw            }
6921.3Smw          break;
6931.3Smw
6941.3Smw	case MANUF_CBM_2:
6951.3Smw	  switch (hw->hw_product)
6961.3Smw	    {
6971.3Smw	    case PROD_CBM_2_A2091:
6981.3Smw	      hw->hw_type = B_ZORROII | C_SCSI;
6991.3Smw	      break;
7001.3Smw
7011.3Smw	    case PROD_CBM_2_A2065:
7021.3Smw	      hw->hw_type = B_ZORROII | D_LAN;
7031.3Smw              /* the ethernet board uses bytes 1 to 3 for ID, set byte 0 to indicate
7041.3Smw                 whether Commodore or Ameristar board. */
7051.3Smw              hw->hw_serno = (hw->hw_serno & 0x00ffffff) | 0x01000000;
7061.3Smw	      break;
7071.3Smw
7081.3Smw	    default:
7091.3Smw	      continue;
7101.3Smw	    }
7111.3Smw	  break;
7121.3Smw
7131.3Smw	case MANUF_AMERISTAR:
7141.3Smw	  switch (hw->hw_product)
7151.3Smw	    {
7161.3Smw	    case PROD_AMERISTAR_ETHER:
7171.3Smw	      hw->hw_type = B_ZORROII | D_LAN;
7181.3Smw              /* the ethernet board uses bytes 1 to 3 for ID, set byte 0 to indicate
7191.3Smw                 whether Commodore or Ameristar board. */
7201.3Smw              hw->hw_serno = (hw->hw_serno & 0x00ffffff) | 0x02000000;
7211.3Smw	      break;
7221.3Smw
7231.3Smw	    default:
7241.3Smw	      continue;
7251.3Smw	    }
7261.3Smw	  break;
7271.3Smw
7281.1Smw        case MANUF_UNILOWELL:
7291.1Smw          switch (hw->hw_product)
7301.1Smw            {
7311.1Smw            case PROD_UNILOWELL_A2410:
7321.1Smw              hw->hw_type = B_ZORROII | D_BITMAP;
7331.1Smw              break;
7341.1Smw
7351.1Smw            default:
7361.1Smw              continue;
7371.1Smw            }
7381.3Smw          break;
7391.3Smw
7401.3Smw	case MANUF_MACROSYSTEM:
7411.3Smw	  switch (hw->hw_product)
7421.3Smw	    {
7431.3Smw	    case PROD_MACROSYSTEM_RETINA:
7441.3Smw	      hw->hw_type = B_ZORROII | D_BITMAP;
7451.3Smw	      break;
7461.3Smw
7471.3Smw	    default:
7481.3Smw	      continue;
7491.3Smw	    }
7501.3Smw	  break;
7511.3Smw
7521.3Smw	case MANUF_GVP:
7531.3Smw	  switch (hw->hw_product)
7541.3Smw	    {
7551.3Smw	    case PROD_GVP_SERIES_II:
7561.5Smw	      /* Kludge for I/O extender:
7571.5Smw		 if er_notused != 0, it's a SCSI controller
7581.5Smw		 if er_notused == 0, it's either an I/O extender or might
7591.5Smw		 possibly be a SCSI controller with autoboot disabled */
7601.5Smw	      if (cd->cd_Rom.er_notused)
7611.5Smw	        hw->hw_type = B_ZORROII | C_SCSI;
7621.5Smw	      else
7631.5Smw		hw->hw_type = B_ZORROII | D_COMMSER;
7641.3Smw	      break;
7651.3Smw
7661.3Smw	    case PROD_GVP_IV24:
7671.3Smw	      hw->hw_type = B_ZORROII | D_BITMAP;
7681.3Smw	      break;
7691.3Smw
7701.3Smw	    default:
7711.3Smw	      continue;
7721.3Smw	    }
7731.3Smw	  break;
7741.3Smw
7751.5Smw	case MANUF_PPI:
7761.5Smw	  switch (hw->hw_product)
7771.5Smw	    {
7781.5Smw	    case PROD_PPI_ZEUS:
7791.5Smw	      hw->hw_type = B_ZORROII | C_SCSI;
7801.5Smw	      break;
7811.5Smw
7821.5Smw	    default:
7831.5Smw	      continue;
7841.5Smw	    }
7851.5Smw	  break;
7861.5Smw
7871.5Smw	case MANUF_CSA:
7881.5Smw	  switch (hw->hw_product)
7891.5Smw	    {
7901.5Smw	    case PROD_CSA_MAGNUM:
7911.5Smw	      hw->hw_type = B_ZORROII | C_SCSI;
7921.5Smw	      break;
7931.5Smw
7941.5Smw	    default:
7951.5Smw	      continue;
7961.5Smw	    }
7971.5Smw	  break;
7981.5Smw
7991.1Smw        default:
8001.1Smw          continue;
8011.1Smw	}
8021.1Smw
8031.1Smw      hw++;
8041.1Smw    }
8051.1Smw}
8061.1Smw
8071.1Smw#if 0
8081.1Smw/*
8091.1Smw * Allocate/deallocate a cache-inhibited range of kernel virtual address
8101.1Smw * space mapping the indicated physical address range [pa - pa+size)
8111.1Smw */
8121.1Smwcaddr_t
8131.1Smwiomap(pa, size)
8141.1Smw	caddr_t pa;
8151.1Smw	int size;
8161.1Smw{
8171.1Smw	int ix, npf;
8181.1Smw	caddr_t kva;
8191.1Smw
8201.1Smw#ifdef DEBUG
8211.1Smw	if (((int)pa & PGOFSET) || (size & PGOFSET))
8221.1Smw		panic("iomap: unaligned");
8231.1Smw#endif
8241.1Smw	npf = btoc(size);
8251.1Smw	ix = rmalloc(extiomap, npf);
8261.1Smw	if (ix == 0)
8271.1Smw		return(0);
8281.1Smw	kva = extiobase + ctob(ix-1);
8291.1Smw	physaccess(kva, pa, size, PG_RW|PG_CI);
8301.1Smw	return(kva);
8311.1Smw}
8321.1Smw
8331.1Smwiounmap(kva, size)
8341.1Smw	caddr_t kva;
8351.1Smw	int size;
8361.1Smw{
8371.1Smw	int ix;
8381.1Smw
8391.1Smw#ifdef DEBUG
8401.1Smw	if (((int)kva & PGOFSET) || (size & PGOFSET))
8411.1Smw		panic("iounmap: unaligned");
8421.1Smw	if (kva < extiobase || kva >= extiobase + ctob(EIOMAPSIZE))
8431.1Smw		panic("iounmap: bad address");
8441.1Smw#endif
8451.1Smw	physunaccess(kva, size);
8461.1Smw	ix = btoc(kva - extiobase) + 1;
8471.1Smw	rmfree(extiomap, btoc(size), ix);
8481.1Smw}
8491.1Smw#endif
8501.1Smw
8511.1Smw#if NCD > 0
8521.1Smw#include "../dev/cdvar.h"
8531.1Smw
8541.1Smwfind_cdevices()
8551.1Smw{
8561.1Smw	register struct cddevice *cd;
8571.1Smw
8581.1Smw	for (cd = cddevice; cd->cd_unit >= 0; cd++) {
8591.1Smw		/*
8601.1Smw		 * XXX
8611.1Smw		 * Assign disk index first so that init routine
8621.1Smw		 * can use it (saves having the driver drag around
8631.1Smw		 * the cddevice pointer just to set up the dk_*
8641.1Smw		 * info in the open routine).
8651.1Smw		 */
8661.1Smw		if (dkn < DK_NDRIVE)
8671.1Smw			cd->cd_dk = dkn++;
8681.1Smw		else
8691.1Smw			cd->cd_dk = -1;
8701.1Smw		if (cdinit(cd))
8711.1Smw			printf("cd%d configured\n", cd->cd_unit);
8721.1Smw		else if (cd->cd_dk >= 0) {
8731.1Smw			cd->cd_dk = -1;
8741.1Smw			dkn--;
8751.1Smw		}
8761.1Smw	}
8771.1Smw}
8781.1Smw#endif
8791.1Smw
8801.1Smw#if 0
8811.1Smwisrinit()
8821.1Smw{
8831.1Smw	register int i;
8841.1Smw
8851.1Smw	for (i = 0; i < NISR; i++)
8861.1Smw		isrqueue[i].isr_forw = isrqueue[i].isr_back = &isrqueue[i];
8871.1Smw}
8881.1Smw
8891.1Smwvoid
8901.1Smwisrlink(isr)
8911.1Smw	register struct isr *isr;
8921.1Smw{
8931.1Smw	int i = ISRIPL(isr->isr_ipl);
8941.1Smw
8951.1Smw	if (i < 0 || i >= NISR) {
8961.1Smw		printf("bad IPL %d\n", i);
8971.1Smw		panic("configure");
8981.1Smw	}
8991.1Smw	insque(isr, isrqueue[i].isr_back);
9001.1Smw}
9011.1Smw#endif
9021.1Smw
9031.1Smw/*
9041.1Smw * Configure swap space and related parameters.
9051.1Smw */
9061.1Smwswapconf()
9071.1Smw{
9081.1Smw	register struct swdevt *swp;
9091.1Smw	register int nblks;
9101.1Smw
9111.1Smw	for (swp = swdevt; swp->sw_dev; swp++)
9121.1Smw	  {
9131.1Smw		if (bdevsw[major(swp->sw_dev)].d_psize) {
9141.1Smw			nblks =
9151.1Smw			  (*bdevsw[major(swp->sw_dev)].d_psize)(swp->sw_dev);
9161.1Smw			if (nblks != -1 &&
9171.1Smw			    (swp->sw_nblks == 0 || swp->sw_nblks > nblks))
9181.1Smw			      {
9191.1Smw				swp->sw_nblks = nblks;
9201.1Smw/*				printf ("swap: dev %x = %d\n", swp->sw_dev, nblks);*/
9211.1Smw			      }
9221.1Smw		}
9231.1Smw	  }
9241.1Smw	dumpconf();
9251.1Smw
9261.1Smw	printf ("\n");
9271.1Smw}
9281.1Smw
9291.1Smw#define	DOSWAP			/* Change swdevt and dumpdev too */
9301.1Smwu_long	bootdev;		/* should be dev_t, but not until 32 bits */
9311.1Smw
9321.1Smwstatic	char devname[][2] = {
9331.1Smw	0,0,		/* 0 = ct */
9341.1Smw	0,0,		/* 1 = xx */
9351.1Smw	'r','d',	/* 2 = rd */
9361.1Smw	0,0,		/* 3 = sw */
9371.1Smw	's','d',	/* 4 = sd */
9381.5Smw	'r','z',	/* 5 = sz */
9391.1Smw};
9401.1Smw
9411.1Smw#define	PARTITIONMASK	0x7
9421.1Smw#define	PARTITIONSHIFT	3
9431.1Smw
9441.1Smw/*
9451.1Smw * Attempt to find the device from which we were booted.
9461.1Smw * If we can do so, and not instructed not to do so,
9471.1Smw * change rootdev to correspond to the load device.
9481.1Smw */
9491.1Smwsetroot()
9501.1Smw{
9511.1Smw	register struct amiga_ctlr *ac;
9521.1Smw	register struct amiga_device *ad;
9531.1Smw	int  majdev, mindev, unit, part, adaptor;
9541.1Smw	dev_t temp, orootdev;
9551.1Smw	struct swdevt *swp;
9561.1Smw
9571.3Smw#ifdef DEBUG
9581.3Smw	if (acdebug > 1)
9591.3Smw	  printf ("setroot: boothowto = 0x%x, bootdev = 0x%x\n", boothowto, bootdev);
9601.3Smw#endif
9611.1Smw
9621.1Smw	if (boothowto & RB_DFLTROOT ||
9631.1Smw	    (bootdev & B_MAGICMASK) != (u_long)B_DEVMAGIC)
9641.3Smw	  {
9651.3Smw#ifdef DEBUG
9661.3Smw	    if (acdebug > 1)
9671.3Smw	      printf ("returning due to: bad boothowto\n");
9681.3Smw#endif
9691.3Smw	    return;
9701.3Smw	  }
9711.1Smw	majdev = (bootdev >> B_TYPESHIFT) & B_TYPEMASK;
9721.1Smw	if (majdev > sizeof(devname) / sizeof(devname[0]))
9731.3Smw	  {
9741.3Smw#ifdef DEBUG
9751.3Smw	    if (acdebug > 1)
9761.3Smw	      printf ("returning due to: majdev (%d) > maxdevs (%d)\n",
9771.3Smw		      majdev, sizeof(devname) / sizeof(devname[0]));
9781.3Smw#endif
9791.3Smw	    return;
9801.3Smw	  }
9811.1Smw	adaptor = (bootdev >> B_ADAPTORSHIFT) & B_ADAPTORMASK;
9821.1Smw	part = (bootdev >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
9831.1Smw	unit = (bootdev >> B_UNITSHIFT) & B_UNITMASK;
9841.3Smw
9851.3Smw	/* First, find the controller type which support this device.
9861.3Smw
9871.3Smw	   Can have more than one controller for the same device, with
9881.3Smw	   just one of them configured, so test for ad->amiga_cdriver != 0
9891.3Smw	   too.  */
9901.3Smw
9911.1Smw	for (ad = amiga_dinit; ad->amiga_driver; ad++)
9921.3Smw	  {
9931.3Smw	    if (ad->amiga_driver->d_name[0] != devname[majdev][0]
9941.3Smw		|| ad->amiga_driver->d_name[1] != devname[majdev][1])
9951.3Smw	      continue;
9961.3Smw
9971.3Smw	    /*
9981.3Smw	     * Next, find the controller of that type corresponding to
9991.3Smw	     * the adaptor number.
10001.3Smw	     */
10011.3Smw	    for (ac = amiga_cinit; ac->amiga_driver; ac++)
10021.3Smw	      if (ac->amiga_alive && ac->amiga_unit == adaptor &&
10031.3Smw		  ac->amiga_driver == ad->amiga_cdriver)
10041.3Smw		goto found_it;
10051.3Smw	  }
10061.3Smw
10071.3Smw/* could also place after test, but I'd like to be on the safe side */
10081.3Smwfound_it:
10091.1Smw	if (ad->amiga_driver == 0)
10101.3Smw	  {
10111.3Smw#ifdef DEBUG
10121.3Smw	    if (acdebug > 1)
10131.3Smw	      printf ("returning due to: amiga_driver == 0\n");
10141.3Smw#endif
10151.3Smw	    return;
10161.3Smw	  }
10171.3Smw
10181.1Smw	/*
10191.1Smw	 * Finally, find the device in question attached to that controller.
10201.1Smw	 */
10211.1Smw	for (ad = amiga_dinit; ad->amiga_driver; ad++)
10221.1Smw		if (ad->amiga_alive && ad->amiga_slave == unit &&
10231.1Smw		    ad->amiga_cdriver == ac->amiga_driver &&
10241.1Smw		    ad->amiga_ctlr == ac->amiga_unit)
10251.1Smw			break;
10261.1Smw	if (ad->amiga_driver == 0)
10271.3Smw	  {
10281.3Smw#ifdef DEBUG
10291.3Smw	    if (acdebug > 1)
10301.3Smw	      printf ("returning due to: no device\n");
10311.3Smw#endif
10321.3Smw	    return;
10331.3Smw	  }
10341.1Smw	mindev = ad->amiga_unit;
10351.1Smw	/*
10361.1Smw	 * Form a new rootdev
10371.1Smw	 */
10381.1Smw	mindev = (mindev << PARTITIONSHIFT) + part;
10391.1Smw	orootdev = rootdev;
10401.1Smw	rootdev = makedev(majdev, mindev);
10411.1Smw	/*
10421.1Smw	 * If the original rootdev is the same as the one
10431.1Smw	 * just calculated, don't need to adjust the swap configuration.
10441.1Smw	 */
10451.1Smw	if (rootdev == orootdev)
10461.3Smw	  {
10471.3Smw#ifdef DEBUG
10481.3Smw	    if (acdebug > 1)
10491.3Smw	      printf ("returning due to: new root == old root\n");
10501.3Smw#endif
10511.3Smw	    return;
10521.3Smw	  }
10531.3Smw
10541.3Smw
10551.1Smw
10561.1Smw	printf("Changing root device to %c%c%d%c\n",
10571.1Smw		devname[majdev][0], devname[majdev][1],
10581.1Smw		mindev >> PARTITIONSHIFT, part + 'a');
10591.1Smw
10601.1Smw#ifdef DOSWAP
10611.1Smw	mindev &= ~PARTITIONMASK;
10621.1Smw	for (swp = swdevt; swp->sw_dev; swp++) {
10631.1Smw		if (majdev == major(swp->sw_dev) &&
10641.1Smw		    mindev == (minor(swp->sw_dev) & ~PARTITIONMASK)) {
10651.1Smw			temp = swdevt[0].sw_dev;
10661.1Smw			swdevt[0].sw_dev = swp->sw_dev;
10671.1Smw			swp->sw_dev = temp;
10681.1Smw			break;
10691.1Smw		}
10701.1Smw	}
10711.1Smw	if (swp->sw_dev == 0)
10721.1Smw		return;
10731.1Smw
10741.1Smw	/*
10751.1Smw	 * If dumpdev was the same as the old primary swap
10761.1Smw	 * device, move it to the new primary swap device.
10771.1Smw	 */
10781.1Smw	if (temp == dumpdev)
10791.1Smw		dumpdev = swdevt[0].sw_dev;
10801.1Smw#endif
10811.3Smw}
10821.3Smw
10831.3Smw/* try to determine, of this machine is an A3000, which has a builtin
10841.3Smw   realtime clock and scsi controller, so that this hardware is only
10851.3Smw   included as "configured" if this IS an A3000  */
10861.5Smw
10871.5Smwint a3000_flag = 1;		/* patchable */
10881.5Smw#ifdef A4000
10891.5Smwint a4000_flag = 1;		/* patchable - default to A4000 */
10901.5Smw#else
10911.5Smwint a4000_flag = 0;		/* patchable */
10921.5Smw#endif
10931.5Smw
10941.3Smwint
10951.3Smwis_a3000 ()
10961.3Smw{
10971.3Smw  /* this is a dirty kludge.. but how do you do this RIGHT ? :-) */
10981.3Smw  extern long orig_fastram_start;
10991.5Smw  short sc;
11001.5Smw  extern int num_ConfigDev;
11011.5Smw  extern struct ConfigDev *ConfigDev;
11021.5Smw  struct ConfigDev *cd;
11031.3Smw
11041.3Smw  /* where is fastram on the A4000 ?? */
11051.5Smw  /* if fastram is below 0x07000000, assume it's not an A3000 */
11061.5Smw  if (orig_fastram_start < 0x07000000)
11071.5Smw    return (0);
11081.5Smw
11091.5Smw  /* OK, fastram starts at or above 0x07000000, check specific machines */
11101.5Smw  for (sc = 0, cd = ConfigDev; sc < num_ConfigDev; sc++, cd++) {
11111.5Smw    switch (cd->cd_Rom.er_Manufacturer) {
11121.5Smw    case MANUF_PPI:			/* Progressive Peripherals, Inc */
11131.5Smw      switch (cd->cd_Rom.er_Product) {
11141.5Smw#if 0
11151.5Smw      case PROD_PPI_MECURY:		/* PPI Mecury - it's an A3000 */
11161.5Smw        return (1);
11171.5Smw      case PROD_PPI_2000:
11181.5Smw      case PROD_PPI_500:
11191.5Smw#endif
11201.5Smw      case PROD_PPI_ZEUS:
11211.5Smw        return (0);
11221.5Smw      }
11231.5Smw    }
11241.5Smw  }
11251.5Smw  /* assume it's an A3000 */
11261.5Smw  return (a3000_flag);
11271.5Smw}
11281.5Smw
11291.5Smwint
11301.5Smwis_a4000 ()
11311.5Smw{
11321.5Smw  /* This is a real dirty kludge.. */
11331.5Smw  return (a4000_flag);
11341.1Smw}
1135