autoconf.c revision 1.4
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.3Smw	 HW_ISSCSI(hw) && (dr_type((ac)->amiga_driver, "a3000scsi")||dr_type((ac)->amiga_driver, "a2091scsi")||dr_type((ac)->amiga_driver, "GVPIIscsi")))
1471.1Smw
1481.1Smwfind_controller(hw)
1491.1Smw	register struct amiga_hw *hw;
1501.1Smw{
1511.1Smw	register struct amiga_ctlr *ac;
1521.1Smw	struct amiga_ctlr *match_c;
1531.1Smw	caddr_t oaddr;
1541.1Smw	int sc;
1551.1Smw
1561.1Smw#ifdef DEBUG
1571.1Smw	if (acdebug)
1581.1Smw		printf("find_controller: hw: [%d/%d] (%x), type %x...",
1591.1Smw		       hw->hw_manufacturer, hw->hw_product,
1601.1Smw		       hw->hw_kva, hw->hw_type);
1611.1Smw#endif
1621.1Smw	sc = (hw->hw_manufacturer << 16) | hw->hw_product;
1631.1Smw	match_c = NULL;
1641.1Smw	for (ac = amiga_cinit; ac->amiga_driver; ac++) {
1651.1Smw		if (ac->amiga_alive)
1661.1Smw			continue;
1671.1Smw		/*
1681.1Smw		 * Make sure we are looking at the right
1691.1Smw		 * controller type.
1701.1Smw		 */
1711.1Smw		if (!same_hw_ctlr(hw, ac))
1721.1Smw			continue;
1731.1Smw		/*
1741.1Smw		 * Exact match; all done
1751.1Smw		 */
1761.1Smw		if ((int)ac->amiga_addr == sc) {
1771.1Smw			match_c = ac;
1781.1Smw			break;
1791.1Smw		}
1801.1Smw		/*
1811.1Smw		 * Wildcard; possible match so remember first instance
1821.1Smw		 * but continue looking for exact match.
1831.1Smw		 */
1841.1Smw		if (ac->amiga_addr == NULL && match_c == NULL)
1851.1Smw			match_c = ac;
1861.1Smw	}
1871.1Smw#ifdef DEBUG
1881.1Smw	if (acdebug) {
1891.1Smw		if (match_c)
1901.1Smw			printf("found %s%d\n",
1911.1Smw			       match_c->amiga_driver->d_name,
1921.1Smw			       match_c->amiga_unit);
1931.1Smw		else
1941.1Smw			printf("not found\n");
1951.1Smw	}
1961.1Smw#endif
1971.1Smw	/*
1981.1Smw	 * Didn't find an ioconf entry for this piece of hardware,
1991.1Smw	 * just ignore it.
2001.1Smw	 */
2011.1Smw	if (match_c == NULL)
2021.1Smw		return(0);
2031.1Smw	/*
2041.1Smw	 * Found a match, attempt to initialize and configure all attached
2051.1Smw	 * slaves.  Note, we can still fail if HW won't initialize.
2061.1Smw	 */
2071.1Smw	ac = match_c;
2081.1Smw	oaddr = ac->amiga_addr;
2091.1Smw	ac->amiga_addr = hw->hw_kva;
2101.1Smw	if ((*ac->amiga_driver->d_init)(ac)) {
2111.1Smw		ac->amiga_alive = 1;
2121.1Smw		printf ("%s%d", ac->amiga_driver->d_name, ac->amiga_unit);
2131.1Smw		printf (" [%d/%d]", hw->hw_manufacturer, hw->hw_product);
2141.1Smw		if (ac->amiga_flags)
2151.1Smw			printf(", flags 0x%x", ac->amiga_flags);
2161.1Smw		printf("\n");
2171.1Smw		find_slaves(ac);
2181.1Smw	} else
2191.1Smw		ac->amiga_addr = oaddr;
2201.1Smw	return(1);
2211.1Smw}
2221.1Smw
2231.1Smwfind_device(hw)
2241.1Smw	register struct amiga_hw *hw;
2251.1Smw{
2261.1Smw	register struct amiga_device *ad;
2271.1Smw	struct amiga_device *match_d;
2281.1Smw	caddr_t oaddr;
2291.1Smw	int sc;
2301.1Smw
2311.1Smw#ifdef DEBUG
2321.1Smw	if (acdebug)
2331.1Smw		printf("find_device: hw: [%d/%d] (%x), type %x...",
2341.1Smw		       hw->hw_manufacturer, hw->hw_product,
2351.1Smw		       hw->hw_kva, hw->hw_type);
2361.1Smw#endif
2371.1Smw	match_d = NULL;
2381.1Smw	for (ad = amiga_dinit; ad->amiga_driver; ad++) {
2391.1Smw		if (ad->amiga_alive)
2401.1Smw			continue;
2411.1Smw		/* Must not be a slave */
2421.1Smw		if (ad->amiga_cdriver)
2431.1Smw			continue;
2441.1Smw
2451.3Smw		/*
2461.3Smw		 * XXX: A graphics device that was found as part of the
2471.3Smw		 * console init will have the amiga_addr field already set
2481.3Smw		 * (i.e. no longer the select code).  Gotta perform a
2491.3Smw		 * slightly different check for an exact match.
2501.3Smw		 */
2511.3Smw		if (HW_ISDEV(hw, D_BITMAP) && iszorro2kva(ad->amiga_addr))
2521.3Smw		  {
2531.3Smw		    if (ad->amiga_addr == hw->hw_kva)
2541.3Smw		      {
2551.3Smw		        match_d = ad;
2561.3Smw		        break;
2571.3Smw		      }
2581.3Smw		    continue;
2591.3Smw		  }
2601.1Smw		sc = (int) ad->amiga_addr;
2611.1Smw		/*
2621.1Smw		 * Exact match; all done.
2631.1Smw		 */
2641.1Smw		if (sc > 0 && sc == ((hw->hw_manufacturer << 16) | hw->hw_product)) {
2651.1Smw			match_d = ad;
2661.1Smw			break;
2671.1Smw		}
2681.1Smw		/*
2691.1Smw		 * Wildcard; possible match so remember first instance
2701.1Smw		 * but continue looking for exact match.
2711.1Smw		 */
2721.1Smw		if (sc == 0 && same_hw_device(hw, ad) && match_d == NULL)
2731.1Smw			match_d = ad;
2741.1Smw	}
2751.1Smw#ifdef DEBUG
2761.1Smw	if (acdebug) {
2771.1Smw		if (match_d)
2781.1Smw			printf("found %s%d\n",
2791.1Smw			       match_d->amiga_driver->d_name,
2801.1Smw			       match_d->amiga_unit);
2811.1Smw		else
2821.1Smw			printf("not found\n");
2831.1Smw	}
2841.1Smw#endif
2851.1Smw	/*
2861.1Smw	 * Didn't find an ioconf entry for this piece
2871.1Smw	 * of hardware, just ignore it.
2881.1Smw	 */
2891.1Smw	if (match_d == NULL)
2901.1Smw		return(0);
2911.1Smw	/*
2921.1Smw	 * Found a match, attempt to initialize.
2931.1Smw	 * Note, we can still fail if HW won't initialize.
2941.1Smw	 */
2951.1Smw	ad = match_d;
2961.1Smw	oaddr = ad->amiga_addr;
2971.1Smw	ad->amiga_addr = hw->hw_kva;
2981.3Smw	ad->amiga_serno = hw->hw_serno;
2991.3Smw	ad->amiga_size = hw->hw_size;
3001.1Smw	if ((*ad->amiga_driver->d_init)(ad)) {
3011.1Smw		ad->amiga_alive = 1;
3021.1Smw		printf("%s%d", ad->amiga_driver->d_name, ad->amiga_unit);
3031.1Smw		printf (" [%d/%d]", hw->hw_manufacturer, hw->hw_product);
3041.1Smw		if (ad->amiga_flags)
3051.1Smw			printf(", flags 0x%x", ad->amiga_flags);
3061.1Smw		printf("\n");
3071.1Smw	} else
3081.1Smw		ad->amiga_addr = oaddr;
3091.1Smw	return(1);
3101.1Smw}
3111.1Smw
3121.1Smwfind_slaves(ac)
3131.1Smw	struct amiga_ctlr *ac;
3141.1Smw{
3151.1Smw	if (dr_type(ac->amiga_driver, "floppy"))
3161.1Smw		find_busslaves(ac, 4);
3171.3Smw	else if (dr_type(ac->amiga_driver, "a3000scsi")||dr_type(ac->amiga_driver, "a2091scsi")||dr_type(ac->amiga_driver, "GVPIIscsi"))
3181.1Smw		find_busslaves(ac, 7);
3191.1Smw}
3201.1Smw
3211.1Smw/*
3221.1Smw */
3231.1Smwfind_busslaves(ac, maxslaves)
3241.1Smw	register struct amiga_ctlr *ac;
3251.1Smw	int maxslaves;
3261.1Smw{
3271.1Smw	register int s;
3281.1Smw	register struct amiga_device *ad;
3291.1Smw	struct amiga_device *match_s;
3301.1Smw	int new_s, new_c, old_s, old_c;
3311.1Smw	int rescan;
3321.1Smw
3331.1Smw#ifdef DEBUG
3341.1Smw	if (acdebug)
3351.1Smw		printf("find_busslaves: for %s%d\n",
3361.1Smw		       ac->amiga_driver->d_name, ac->amiga_unit);
3371.1Smw#endif
3381.1Smw	for (s = 0; s < maxslaves; s++) {
3391.1Smw		rescan = 1;
3401.1Smw		match_s = NULL;
3411.1Smw		for (ad = amiga_dinit; ad->amiga_driver; ad++) {
3421.1Smw			/*
3431.1Smw			 * Rule out the easy ones:
3441.1Smw			 * 1. slave already assigned or not a slave
3451.1Smw			 * 2. not of the proper type
3461.1Smw			 * 3. controller specified but not this one
3471.1Smw			 * 4. slave specified but not this one
3481.1Smw			 */
3491.1Smw			if (ad->amiga_alive || ad->amiga_cdriver == NULL)
3501.1Smw				continue;
3511.1Smw			if (!dr_type(ac->amiga_driver, ad->amiga_cdriver->d_name))
3521.1Smw				continue;
3531.1Smw			if (ad->amiga_ctlr >= 0 && ad->amiga_ctlr != ac->amiga_unit)
3541.1Smw				continue;
3551.1Smw			if (ad->amiga_slave >= 0 && ad->amiga_slave != s)
3561.1Smw				continue;
3571.1Smw			/*
3581.1Smw			 * Case 0: first possible match.
3591.1Smw			 * Remember it and keep looking for better.
3601.1Smw			 */
3611.1Smw			if (match_s == NULL) {
3621.1Smw				match_s = ad;
3631.1Smw				new_c = ac->amiga_unit;
3641.1Smw				new_s = s;
3651.1Smw				continue;
3661.1Smw			}
3671.1Smw			/*
3681.1Smw			 * Case 1: exact match.
3691.1Smw			 * All done.  Note that we do not attempt any other
3701.1Smw			 * matches if this one fails.  This allows us to
3711.1Smw			 * "reserve" locations for dynamic addition of
3721.1Smw			 * disk/tape drives by fully qualifing the location.
3731.1Smw			 */
3741.1Smw			if (ad->amiga_slave == s && ad->amiga_ctlr == ac->amiga_unit) {
3751.1Smw				match_s = ad;
3761.1Smw				rescan = 0;
3771.1Smw				break;
3781.1Smw			}
3791.1Smw			/*
3801.1Smw			 * Case 2: right controller, wildcarded slave.
3811.1Smw			 * Remember first and keep looking for an exact match.
3821.1Smw			 */
3831.1Smw			if (ad->amiga_ctlr == ac->amiga_unit &&
3841.1Smw			    match_s->amiga_ctlr < 0) {
3851.1Smw				match_s = ad;
3861.1Smw				new_s = s;
3871.1Smw				continue;
3881.1Smw			}
3891.1Smw			/*
3901.1Smw			 * Case 3: right slave, wildcarded controller.
3911.1Smw			 * Remember and keep looking for a better match.
3921.1Smw			 */
3931.1Smw			if (ad->amiga_slave == s &&
3941.1Smw			    match_s->amiga_ctlr < 0 && match_s->amiga_slave < 0) {
3951.1Smw				match_s = ad;
3961.1Smw				new_c = ac->amiga_unit;
3971.1Smw				continue;
3981.1Smw			}
3991.1Smw			/*
4001.1Smw			 * OW: we had a totally wildcarded spec.
4011.1Smw			 * If we got this far, we have found a possible
4021.1Smw			 * match already (match_s != NULL) so there is no
4031.1Smw			 * reason to remember this one.
4041.1Smw			 */
4051.1Smw			continue;
4061.1Smw		}
4071.1Smw		/*
4081.1Smw		 * Found a match.  We need to set amiga_ctlr/amiga_slave properly
4091.1Smw		 * for the init routines but we also need to remember all
4101.1Smw		 * the old values in case this doesn't pan out.
4111.1Smw		 */
4121.1Smw		if (match_s) {
4131.1Smw			ad = match_s;
4141.1Smw			old_c = ad->amiga_ctlr;
4151.1Smw			old_s = ad->amiga_slave;
4161.1Smw			if (ad->amiga_ctlr < 0)
4171.1Smw				ad->amiga_ctlr = new_c;
4181.1Smw			if (ad->amiga_slave < 0)
4191.1Smw				ad->amiga_slave = new_s;
4201.1Smw#ifdef DEBUG
4211.1Smw			if (acdebug)
4221.1Smw				printf("looking for %s%d at slave %d...",
4231.1Smw				       ad->amiga_driver->d_name,
4241.1Smw				       ad->amiga_unit, ad->amiga_slave);
4251.1Smw#endif
4261.1Smw
4271.1Smw			if ((*ad->amiga_driver->d_init)(ad)) {
4281.1Smw#ifdef DEBUG
4291.1Smw				if (acdebug)
4301.1Smw					printf("found\n");
4311.1Smw#endif
4321.1Smw				printf("%s%d at %s%d, slave %d",
4331.1Smw				       ad->amiga_driver->d_name, ad->amiga_unit,
4341.1Smw				       ac->amiga_driver->d_name, ad->amiga_ctlr,
4351.1Smw				       ad->amiga_slave);
4361.1Smw				if (ad->amiga_flags)
4371.1Smw					printf(" flags 0x%x", ad->amiga_flags);
4381.1Smw				printf("\n");
4391.1Smw				ad->amiga_alive = 1;
4401.1Smw				if (ad->amiga_dk && dkn < DK_NDRIVE)
4411.1Smw					ad->amiga_dk = dkn++;
4421.1Smw				else
4431.1Smw					ad->amiga_dk = -1;
4441.1Smw				rescan = 1;
4451.1Smw			} else {
4461.1Smw#ifdef DEBUG
4471.1Smw				if (acdebug)
4481.1Smw					printf("not found\n");
4491.1Smw#endif
4501.1Smw				ad->amiga_ctlr = old_c;
4511.1Smw				ad->amiga_slave = old_s;
4521.1Smw			}
4531.1Smw			/*
4541.1Smw			 * XXX: This should be handled better.
4551.1Smw			 * Re-scan a slave.  There are two reasons to do this.
4561.1Smw			 * 1. It is possible to have both a tape and disk
4571.1Smw			 *    (e.g. 7946) or two disks (e.g. 9122) at the
4581.1Smw			 *    same slave address.  Here we need to rescan
4591.1Smw			 *    looking only at entries with a different
4601.1Smw			 *    physical unit number (amiga_flags).
4611.1Smw			 * 2. It is possible that an init failed because the
4621.1Smw			 *    slave was there but of the wrong type.  In this
4631.1Smw			 *    case it may still be possible to match the slave
4641.1Smw			 *    to another ioconf entry of a different type.
4651.1Smw			 *    Here we need to rescan looking only at entries
4661.1Smw			 *    of different types.
4671.1Smw			 * In both cases we avoid looking at undesirable
4681.1Smw			 * ioconf entries of the same type by setting their
4691.1Smw			 * alive fields to -1.
4701.1Smw			 */
4711.1Smw			if (rescan) {
4721.1Smw				for (ad = amiga_dinit; ad->amiga_driver; ad++) {
4731.1Smw					if (ad->amiga_alive)
4741.1Smw						continue;
4751.1Smw					if (match_s->amiga_alive == 1) {	/* 1 */
4761.1Smw						if (ad->amiga_flags == match_s->amiga_flags)
4771.1Smw							ad->amiga_alive = -1;
4781.1Smw					} else {			/* 2 */
4791.1Smw						if (ad->amiga_driver == match_s->amiga_driver)
4801.1Smw							ad->amiga_alive = -1;
4811.1Smw					}
4821.1Smw				}
4831.1Smw				s--;
4841.1Smw				continue;
4851.1Smw			}
4861.1Smw		}
4871.1Smw		/*
4881.1Smw		 * Reset bogon alive fields prior to attempting next slave
4891.1Smw		 */
4901.1Smw		for (ad = amiga_dinit; ad->amiga_driver; ad++)
4911.1Smw			if (ad->amiga_alive == -1)
4921.1Smw				ad->amiga_alive = 0;
4931.1Smw	}
4941.1Smw}
4951.1Smw
4961.1Smwsame_hw_device(hw, ad)
4971.1Smw	struct amiga_hw *hw;
4981.1Smw	struct amiga_device *ad;
4991.1Smw{
5001.1Smw	int found = 0;
5011.1Smw
5021.1Smw	switch (hw->hw_type & ~B_MASK) {
5031.1Smw	case C_FLOPPY:
5041.1Smw		found = dr_type(ad->amiga_driver, "floppy");
5051.1Smw		break;
5061.1Smw	case C_SCSI:
5071.3Smw		found = (dr_type(ad->amiga_driver, "a3000scsi")
5081.3Smw			 || dr_type(ad->amiga_driver, "a2091scsi")
5091.3Smw			 || dr_type(ad->amiga_driver, "GVPIIscsi"));
5101.1Smw		break;
5111.1Smw	case D_BITMAP:
5121.1Smw		found = dr_type(ad->amiga_driver, "grf");
5131.1Smw		break;
5141.1Smw	case D_LAN:
5151.1Smw		found = dr_type(ad->amiga_driver, "le");
5161.1Smw		break;
5171.1Smw	case D_COMMSER:
5181.1Smw		found = dr_type(ad->amiga_driver, "ser");
5191.1Smw		break;
5201.3Smw	case D_CLOCK:
5211.3Smw		found = dr_type(ad->amiga_driver, "rtclock");
5221.4Smw		break;
5231.4Smw	case D_PPORT:
5241.4Smw		found = dr_type(ad->amiga_driver, "par");
5251.3Smw		break;
5261.1Smw	default:
5271.1Smw		break;
5281.1Smw	}
5291.1Smw	return(found);
5301.1Smw}
5311.1Smw
5321.1Smwchar notmappedmsg[] = "WARNING: no space to map IO card, ignored\n";
5331.1Smw
5341.1Smw/*
5351.1Smw * Scan the IO space looking for devices.
5361.1Smw */
5371.1Smwfind_devs()
5381.1Smw{
5391.1Smw  short sc;
5401.1Smw  u_char *id_reg;
5411.1Smw  register caddr_t addr;
5421.1Smw  register struct amiga_hw *hw;
5431.1Smw  int didmap, sctop;
5441.1Smw  extern int num_ConfigDev;
5451.1Smw  extern struct ConfigDev *ConfigDev;
5461.1Smw  struct ConfigDev *cd;
5471.1Smw
5481.1Smw#if 0
5491.1Smw  /*
5501.1Smw   * Initialize IO resource map for iomap().
5511.1Smw   */
5521.1Smw  rminit(extiomap, (long)EIOMAPSIZE, (long)1, "extio", EIOMAPSIZE/16);
5531.1Smw#endif
5541.1Smw  hw = sc_table;
5551.1Smw
5561.1Smw  /* first enter builtin devices */
5571.1Smw
5581.3Smw  if (is_a3000 ())
5591.3Smw    {
5601.3Smw      /* hm, this doesn't belong here... */
5611.3Smw      volatile u_char *magic_reset_reg = zorro2map (0xde0002);
5621.3Smw      /* this bit makes the next reset look like a powerup reset, Amiga
5631.3Smw	 Unix sets this bit, and perhaps it will enable 16M machines to
5641.3Smw	 boot again... */
5651.3Smw      *magic_reset_reg   |= 0x80;
5661.3Smw
5671.3Smw      hw->hw_pa		  = 0xdd0000;
5681.3Smw      hw->hw_size	  = NBPG;
5691.3Smw      hw->hw_kva	  = zorro2map (0xdd0000);
5701.3Smw      hw->hw_manufacturer = MANUF_BUILTIN;
5711.3Smw      hw->hw_product      = PROD_BUILTIN_SCSI;
5721.3Smw      hw->hw_type	  = B_BUILTIN | C_SCSI;
5731.3Smw      hw->hw_serno	  = 0;
5741.3Smw      hw++;
5751.1Smw
5761.3Smw      hw->hw_pa	      	  = 0xdc0000;
5771.3Smw      hw->hw_size	  = NBPG;
5781.3Smw      hw->hw_kva	  = zorro2map (0xdc0000);
5791.3Smw      hw->hw_manufacturer = MANUF_BUILTIN;
5801.3Smw      hw->hw_product      = PROD_BUILTIN_CLOCK;
5811.3Smw      hw->hw_type	  = B_BUILTIN | D_CLOCK;
5821.3Smw      hw->hw_serno	  = 0;
5831.3Smw      hw++;
5841.3Smw    }
5851.3Smw  else
5861.3Smw    {
5871.3Smw      /* what about other Amigas? Oh well.. */
5881.3Smw      hw->hw_pa	      	  = 0xdc0000;
5891.3Smw      hw->hw_size	  = NBPG;
5901.3Smw      hw->hw_kva	  = zorro2map (0xdc0000);
5911.3Smw      hw->hw_manufacturer = MANUF_BUILTIN;
5921.3Smw      hw->hw_product      = PROD_BUILTIN_CLOCK2;
5931.3Smw      hw->hw_type	  = B_BUILTIN | D_CLOCK;
5941.3Smw      hw->hw_serno	  = 0;
5951.3Smw      hw++;
5961.3Smw    }
5971.1Smw
5981.1Smw  hw->hw_pa	      = 0;
5991.1Smw  hw->hw_size	      = 0;
6001.3Smw  hw->hw_kva	      = CUSTOMbase;
6011.1Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6021.1Smw  hw->hw_product      = PROD_BUILTIN_FLOPPY;
6031.1Smw  hw->hw_type	      = B_BUILTIN | C_FLOPPY;
6041.3Smw  hw->hw_serno	      = 0;
6051.1Smw  hw++;
6061.1Smw
6071.1Smw  hw->hw_pa	      = 0;
6081.1Smw  hw->hw_size	      = 0;
6091.3Smw  hw->hw_kva	      = CUSTOMbase;
6101.1Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6111.1Smw  hw->hw_product      = PROD_BUILTIN_KEYBOARD;
6121.1Smw  hw->hw_type	      = B_BUILTIN | D_KEYBOARD;
6131.3Smw  hw->hw_serno	      = 0;
6141.1Smw  hw++;
6151.1Smw
6161.1Smw  hw->hw_pa	      = 0;
6171.1Smw  hw->hw_size	      = 0;
6181.3Smw  hw->hw_kva	      = CUSTOMbase;
6191.1Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6201.1Smw  hw->hw_product      = PROD_BUILTIN_PPORT;
6211.1Smw  hw->hw_type	      = B_BUILTIN | D_PPORT;
6221.3Smw  hw->hw_serno	      = 0;
6231.1Smw  hw++;
6241.1Smw
6251.1Smw  hw->hw_pa	      = 0;
6261.1Smw  hw->hw_size	      = 0;
6271.3Smw  hw->hw_kva	      = CUSTOMbase;
6281.1Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6291.1Smw  hw->hw_product      = PROD_BUILTIN_DISPLAY;
6301.1Smw  hw->hw_type	      = B_BUILTIN | D_BITMAP;
6311.3Smw  hw->hw_serno	      = 0;
6321.3Smw  hw++;
6331.3Smw
6341.3Smw  hw->hw_pa	      = 0;
6351.3Smw  hw->hw_size	      = 0;
6361.3Smw  hw->hw_kva	      = CUSTOMbase;
6371.3Smw  hw->hw_manufacturer = MANUF_BUILTIN;
6381.3Smw  hw->hw_product      = PROD_BUILTIN_RS232;
6391.3Smw  hw->hw_type	      = B_BUILTIN | D_COMMSER;
6401.3Smw  hw->hw_serno	      = 0;
6411.1Smw  hw++;
6421.3Smw
6431.1Smw  /* and afterwards add Zorro II/III devices passed by the loader */
6441.1Smw
6451.1Smw  for (sc = 0, cd = ConfigDev; sc < num_ConfigDev; sc++, cd++)
6461.1Smw    {
6471.1Smw      hw->hw_pa		  = cd->cd_BoardAddr;
6481.1Smw      hw->hw_size	  = cd->cd_BoardSize;
6491.3Smw      /* ADD ZORRO3 SUPPORT HERE !! */
6501.3Smw      hw->hw_kva	  = iszorro2pa(cd->cd_BoardAddr) ? zorro2map (cd->cd_BoardAddr) : 0;
6511.1Smw      hw->hw_manufacturer = cd->cd_Rom.er_Manufacturer;
6521.1Smw      hw->hw_product	  = cd->cd_Rom.er_Product;
6531.3Smw      hw->hw_serno	  = cd->cd_Rom.er_SerialNumber;
6541.1Smw
6551.1Smw      switch (hw->hw_manufacturer)
6561.1Smw        {
6571.1Smw        case MANUF_CBM_1:
6581.1Smw          switch (hw->hw_product)
6591.1Smw            {
6601.1Smw            case PROD_CBM_1_A2088:
6611.1Smw              hw->hw_type = B_ZORROII | D_MISC;
6621.1Smw              break;
6631.1Smw
6641.1Smw            default:
6651.1Smw              continue;
6661.1Smw            }
6671.3Smw          break;
6681.3Smw
6691.3Smw	case MANUF_CBM_2:
6701.3Smw	  switch (hw->hw_product)
6711.3Smw	    {
6721.3Smw	    case PROD_CBM_2_A2091:
6731.3Smw	      hw->hw_type = B_ZORROII | C_SCSI;
6741.3Smw	      break;
6751.3Smw
6761.3Smw	    case PROD_CBM_2_A2065:
6771.3Smw	      hw->hw_type = B_ZORROII | D_LAN;
6781.3Smw              /* the ethernet board uses bytes 1 to 3 for ID, set byte 0 to indicate
6791.3Smw                 whether Commodore or Ameristar board. */
6801.3Smw              hw->hw_serno = (hw->hw_serno & 0x00ffffff) | 0x01000000;
6811.3Smw	      break;
6821.3Smw
6831.3Smw	    default:
6841.3Smw	      continue;
6851.3Smw	    }
6861.3Smw	  break;
6871.3Smw
6881.3Smw	case MANUF_AMERISTAR:
6891.3Smw	  switch (hw->hw_product)
6901.3Smw	    {
6911.3Smw	    case PROD_AMERISTAR_ETHER:
6921.3Smw	      hw->hw_type = B_ZORROII | D_LAN;
6931.3Smw              /* the ethernet board uses bytes 1 to 3 for ID, set byte 0 to indicate
6941.3Smw                 whether Commodore or Ameristar board. */
6951.3Smw              hw->hw_serno = (hw->hw_serno & 0x00ffffff) | 0x02000000;
6961.3Smw	      break;
6971.3Smw
6981.3Smw	    default:
6991.3Smw	      continue;
7001.3Smw	    }
7011.3Smw	  break;
7021.3Smw
7031.1Smw        case MANUF_UNILOWELL:
7041.1Smw          switch (hw->hw_product)
7051.1Smw            {
7061.1Smw            case PROD_UNILOWELL_A2410:
7071.1Smw              hw->hw_type = B_ZORROII | D_BITMAP;
7081.1Smw              break;
7091.1Smw
7101.1Smw            default:
7111.1Smw              continue;
7121.1Smw            }
7131.3Smw          break;
7141.3Smw
7151.3Smw	case MANUF_MACROSYSTEM:
7161.3Smw	  switch (hw->hw_product)
7171.3Smw	    {
7181.3Smw	    case PROD_MACROSYSTEM_RETINA:
7191.3Smw	      hw->hw_type = B_ZORROII | D_BITMAP;
7201.3Smw	      break;
7211.3Smw
7221.3Smw	    default:
7231.3Smw	      continue;
7241.3Smw	    }
7251.3Smw	  break;
7261.3Smw
7271.3Smw	case MANUF_GVP:
7281.3Smw	  switch (hw->hw_product)
7291.3Smw	    {
7301.3Smw	    case PROD_GVP_SERIES_II:
7311.3Smw	      hw->hw_type = B_ZORROII | C_SCSI;
7321.3Smw	      break;
7331.3Smw
7341.3Smw	    case PROD_GVP_IV24:
7351.3Smw	      hw->hw_type = B_ZORROII | D_BITMAP;
7361.3Smw	      break;
7371.3Smw
7381.3Smw	    default:
7391.3Smw	      continue;
7401.3Smw	    }
7411.3Smw	  break;
7421.3Smw
7431.1Smw
7441.1Smw        default:
7451.1Smw          continue;
7461.1Smw	}
7471.1Smw
7481.1Smw      hw++;
7491.1Smw    }
7501.1Smw}
7511.1Smw
7521.1Smw#if 0
7531.1Smw/*
7541.1Smw * Allocate/deallocate a cache-inhibited range of kernel virtual address
7551.1Smw * space mapping the indicated physical address range [pa - pa+size)
7561.1Smw */
7571.1Smwcaddr_t
7581.1Smwiomap(pa, size)
7591.1Smw	caddr_t pa;
7601.1Smw	int size;
7611.1Smw{
7621.1Smw	int ix, npf;
7631.1Smw	caddr_t kva;
7641.1Smw
7651.1Smw#ifdef DEBUG
7661.1Smw	if (((int)pa & PGOFSET) || (size & PGOFSET))
7671.1Smw		panic("iomap: unaligned");
7681.1Smw#endif
7691.1Smw	npf = btoc(size);
7701.1Smw	ix = rmalloc(extiomap, npf);
7711.1Smw	if (ix == 0)
7721.1Smw		return(0);
7731.1Smw	kva = extiobase + ctob(ix-1);
7741.1Smw	physaccess(kva, pa, size, PG_RW|PG_CI);
7751.1Smw	return(kva);
7761.1Smw}
7771.1Smw
7781.1Smwiounmap(kva, size)
7791.1Smw	caddr_t kva;
7801.1Smw	int size;
7811.1Smw{
7821.1Smw	int ix;
7831.1Smw
7841.1Smw#ifdef DEBUG
7851.1Smw	if (((int)kva & PGOFSET) || (size & PGOFSET))
7861.1Smw		panic("iounmap: unaligned");
7871.1Smw	if (kva < extiobase || kva >= extiobase + ctob(EIOMAPSIZE))
7881.1Smw		panic("iounmap: bad address");
7891.1Smw#endif
7901.1Smw	physunaccess(kva, size);
7911.1Smw	ix = btoc(kva - extiobase) + 1;
7921.1Smw	rmfree(extiomap, btoc(size), ix);
7931.1Smw}
7941.1Smw#endif
7951.1Smw
7961.1Smw#if NCD > 0
7971.1Smw#include "../dev/cdvar.h"
7981.1Smw
7991.1Smwfind_cdevices()
8001.1Smw{
8011.1Smw	register struct cddevice *cd;
8021.1Smw
8031.1Smw	for (cd = cddevice; cd->cd_unit >= 0; cd++) {
8041.1Smw		/*
8051.1Smw		 * XXX
8061.1Smw		 * Assign disk index first so that init routine
8071.1Smw		 * can use it (saves having the driver drag around
8081.1Smw		 * the cddevice pointer just to set up the dk_*
8091.1Smw		 * info in the open routine).
8101.1Smw		 */
8111.1Smw		if (dkn < DK_NDRIVE)
8121.1Smw			cd->cd_dk = dkn++;
8131.1Smw		else
8141.1Smw			cd->cd_dk = -1;
8151.1Smw		if (cdinit(cd))
8161.1Smw			printf("cd%d configured\n", cd->cd_unit);
8171.1Smw		else if (cd->cd_dk >= 0) {
8181.1Smw			cd->cd_dk = -1;
8191.1Smw			dkn--;
8201.1Smw		}
8211.1Smw	}
8221.1Smw}
8231.1Smw#endif
8241.1Smw
8251.1Smw#if 0
8261.1Smwisrinit()
8271.1Smw{
8281.1Smw	register int i;
8291.1Smw
8301.1Smw	for (i = 0; i < NISR; i++)
8311.1Smw		isrqueue[i].isr_forw = isrqueue[i].isr_back = &isrqueue[i];
8321.1Smw}
8331.1Smw
8341.1Smwvoid
8351.1Smwisrlink(isr)
8361.1Smw	register struct isr *isr;
8371.1Smw{
8381.1Smw	int i = ISRIPL(isr->isr_ipl);
8391.1Smw
8401.1Smw	if (i < 0 || i >= NISR) {
8411.1Smw		printf("bad IPL %d\n", i);
8421.1Smw		panic("configure");
8431.1Smw	}
8441.1Smw	insque(isr, isrqueue[i].isr_back);
8451.1Smw}
8461.1Smw#endif
8471.1Smw
8481.1Smw/*
8491.1Smw * Configure swap space and related parameters.
8501.1Smw */
8511.1Smwswapconf()
8521.1Smw{
8531.1Smw	register struct swdevt *swp;
8541.1Smw	register int nblks;
8551.1Smw
8561.1Smw	for (swp = swdevt; swp->sw_dev; swp++)
8571.1Smw	  {
8581.1Smw		if (bdevsw[major(swp->sw_dev)].d_psize) {
8591.1Smw			nblks =
8601.1Smw			  (*bdevsw[major(swp->sw_dev)].d_psize)(swp->sw_dev);
8611.1Smw			if (nblks != -1 &&
8621.1Smw			    (swp->sw_nblks == 0 || swp->sw_nblks > nblks))
8631.1Smw			      {
8641.1Smw				swp->sw_nblks = nblks;
8651.1Smw/*				printf ("swap: dev %x = %d\n", swp->sw_dev, nblks);*/
8661.1Smw			      }
8671.1Smw		}
8681.1Smw	  }
8691.1Smw	dumpconf();
8701.1Smw
8711.1Smw	printf ("\n");
8721.1Smw}
8731.1Smw
8741.1Smw#define	DOSWAP			/* Change swdevt and dumpdev too */
8751.1Smwu_long	bootdev;		/* should be dev_t, but not until 32 bits */
8761.1Smw
8771.1Smwstatic	char devname[][2] = {
8781.1Smw	0,0,		/* 0 = ct */
8791.1Smw	0,0,		/* 1 = xx */
8801.1Smw	'r','d',	/* 2 = rd */
8811.1Smw	0,0,		/* 3 = sw */
8821.1Smw	's','d',	/* 4 = sd */
8831.1Smw};
8841.1Smw
8851.1Smw#define	PARTITIONMASK	0x7
8861.1Smw#define	PARTITIONSHIFT	3
8871.1Smw
8881.1Smw/*
8891.1Smw * Attempt to find the device from which we were booted.
8901.1Smw * If we can do so, and not instructed not to do so,
8911.1Smw * change rootdev to correspond to the load device.
8921.1Smw */
8931.1Smwsetroot()
8941.1Smw{
8951.1Smw	register struct amiga_ctlr *ac;
8961.1Smw	register struct amiga_device *ad;
8971.1Smw	int  majdev, mindev, unit, part, adaptor;
8981.1Smw	dev_t temp, orootdev;
8991.1Smw	struct swdevt *swp;
9001.1Smw
9011.3Smw#ifdef DEBUG
9021.3Smw	if (acdebug > 1)
9031.3Smw	  printf ("setroot: boothowto = 0x%x, bootdev = 0x%x\n", boothowto, bootdev);
9041.3Smw#endif
9051.1Smw
9061.1Smw	if (boothowto & RB_DFLTROOT ||
9071.1Smw	    (bootdev & B_MAGICMASK) != (u_long)B_DEVMAGIC)
9081.3Smw	  {
9091.3Smw#ifdef DEBUG
9101.3Smw	    if (acdebug > 1)
9111.3Smw	      printf ("returning due to: bad boothowto\n");
9121.3Smw#endif
9131.3Smw	    return;
9141.3Smw	  }
9151.1Smw	majdev = (bootdev >> B_TYPESHIFT) & B_TYPEMASK;
9161.1Smw	if (majdev > sizeof(devname) / sizeof(devname[0]))
9171.3Smw	  {
9181.3Smw#ifdef DEBUG
9191.3Smw	    if (acdebug > 1)
9201.3Smw	      printf ("returning due to: majdev (%d) > maxdevs (%d)\n",
9211.3Smw		      majdev, sizeof(devname) / sizeof(devname[0]));
9221.3Smw#endif
9231.3Smw	    return;
9241.3Smw	  }
9251.1Smw	adaptor = (bootdev >> B_ADAPTORSHIFT) & B_ADAPTORMASK;
9261.1Smw	part = (bootdev >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
9271.1Smw	unit = (bootdev >> B_UNITSHIFT) & B_UNITMASK;
9281.3Smw
9291.3Smw	/* First, find the controller type which support this device.
9301.3Smw
9311.3Smw	   Can have more than one controller for the same device, with
9321.3Smw	   just one of them configured, so test for ad->amiga_cdriver != 0
9331.3Smw	   too.  */
9341.3Smw
9351.1Smw	for (ad = amiga_dinit; ad->amiga_driver; ad++)
9361.3Smw	  {
9371.3Smw	    if (ad->amiga_driver->d_name[0] != devname[majdev][0]
9381.3Smw		|| ad->amiga_driver->d_name[1] != devname[majdev][1])
9391.3Smw	      continue;
9401.3Smw
9411.3Smw	    /*
9421.3Smw	     * Next, find the controller of that type corresponding to
9431.3Smw	     * the adaptor number.
9441.3Smw	     */
9451.3Smw	    for (ac = amiga_cinit; ac->amiga_driver; ac++)
9461.3Smw	      if (ac->amiga_alive && ac->amiga_unit == adaptor &&
9471.3Smw		  ac->amiga_driver == ad->amiga_cdriver)
9481.3Smw		goto found_it;
9491.3Smw	  }
9501.3Smw
9511.3Smw/* could also place after test, but I'd like to be on the safe side */
9521.3Smwfound_it:
9531.1Smw	if (ad->amiga_driver == 0)
9541.3Smw	  {
9551.3Smw#ifdef DEBUG
9561.3Smw	    if (acdebug > 1)
9571.3Smw	      printf ("returning due to: amiga_driver == 0\n");
9581.3Smw#endif
9591.3Smw	    return;
9601.3Smw	  }
9611.3Smw
9621.1Smw	/*
9631.1Smw	 * Finally, find the device in question attached to that controller.
9641.1Smw	 */
9651.1Smw	for (ad = amiga_dinit; ad->amiga_driver; ad++)
9661.1Smw		if (ad->amiga_alive && ad->amiga_slave == unit &&
9671.1Smw		    ad->amiga_cdriver == ac->amiga_driver &&
9681.1Smw		    ad->amiga_ctlr == ac->amiga_unit)
9691.1Smw			break;
9701.1Smw	if (ad->amiga_driver == 0)
9711.3Smw	  {
9721.3Smw#ifdef DEBUG
9731.3Smw	    if (acdebug > 1)
9741.3Smw	      printf ("returning due to: no device\n");
9751.3Smw#endif
9761.3Smw	    return;
9771.3Smw	  }
9781.1Smw	mindev = ad->amiga_unit;
9791.1Smw	/*
9801.1Smw	 * Form a new rootdev
9811.1Smw	 */
9821.1Smw	mindev = (mindev << PARTITIONSHIFT) + part;
9831.1Smw	orootdev = rootdev;
9841.1Smw	rootdev = makedev(majdev, mindev);
9851.1Smw	/*
9861.1Smw	 * If the original rootdev is the same as the one
9871.1Smw	 * just calculated, don't need to adjust the swap configuration.
9881.1Smw	 */
9891.1Smw	if (rootdev == orootdev)
9901.3Smw	  {
9911.3Smw#ifdef DEBUG
9921.3Smw	    if (acdebug > 1)
9931.3Smw	      printf ("returning due to: new root == old root\n");
9941.3Smw#endif
9951.3Smw	    return;
9961.3Smw	  }
9971.3Smw
9981.3Smw
9991.1Smw
10001.1Smw	printf("Changing root device to %c%c%d%c\n",
10011.1Smw		devname[majdev][0], devname[majdev][1],
10021.1Smw		mindev >> PARTITIONSHIFT, part + 'a');
10031.1Smw
10041.1Smw#ifdef DOSWAP
10051.1Smw	mindev &= ~PARTITIONMASK;
10061.1Smw	for (swp = swdevt; swp->sw_dev; swp++) {
10071.1Smw		if (majdev == major(swp->sw_dev) &&
10081.1Smw		    mindev == (minor(swp->sw_dev) & ~PARTITIONMASK)) {
10091.1Smw			temp = swdevt[0].sw_dev;
10101.1Smw			swdevt[0].sw_dev = swp->sw_dev;
10111.1Smw			swp->sw_dev = temp;
10121.1Smw			break;
10131.1Smw		}
10141.1Smw	}
10151.1Smw	if (swp->sw_dev == 0)
10161.1Smw		return;
10171.1Smw
10181.1Smw	/*
10191.1Smw	 * If dumpdev was the same as the old primary swap
10201.1Smw	 * device, move it to the new primary swap device.
10211.1Smw	 */
10221.1Smw	if (temp == dumpdev)
10231.1Smw		dumpdev = swdevt[0].sw_dev;
10241.1Smw#endif
10251.3Smw}
10261.3Smw
10271.3Smw/* try to determine, of this machine is an A3000, which has a builtin
10281.3Smw   realtime clock and scsi controller, so that this hardware is only
10291.3Smw   included as "configured" if this IS an A3000  */
10301.3Smwint
10311.3Smwis_a3000 ()
10321.3Smw{
10331.3Smw  /* this is a dirty kludge.. but how do you do this RIGHT ? :-) */
10341.3Smw  extern long orig_fastram_start;
10351.3Smw
10361.3Smw  /* where is fastram on the A4000 ?? */
10371.3Smw  return orig_fastram_start >= 0x07000000;
10381.1Smw}
1039