Module Name:    src
Committed By:   thorpej
Date:           Sun Mar  9 01:06:42 UTC 2025

Modified Files:
        src/sys/arch/alpha/alpha: api_up1000.c autoconf.c dec_1000a.c
            dec_2000_300.c dec_2100_a50.c dec_2100_a500.c dec_3000_300.c
            dec_3000_500.c dec_550.c dec_6600.c dec_alphabook1.c
            dec_axppci_33.c dec_eb164.c dec_eb64plus.c dec_eb66.c dec_kn20aa.c
            dec_kn300.c dec_kn8ae.c
        src/sys/arch/alpha/conf: files.alpha
        src/sys/arch/alpha/include: autoconf.h pci_machdep.h tc_machdep.h
Added Files:
        src/sys/arch/alpha/pci: pci_bootdev.c pci_consinit.c
        src/sys/arch/alpha/tc: tc_bootdev.c

Log Message:
Re-factor the boot device and consinit routines into common functions
per platform type (PCI vs TC), eliminating a bunch of copy-pasta.


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/alpha/alpha/api_up1000.c
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/alpha/alpha/autoconf.c
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/alpha/alpha/dec_1000a.c
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/alpha/alpha/dec_2000_300.c
cvs rdiff -u -r1.70 -r1.71 src/sys/arch/alpha/alpha/dec_2100_a50.c \
    src/sys/arch/alpha/alpha/dec_axppci_33.c
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/alpha/alpha/dec_2100_a500.c
cvs rdiff -u -r1.49 -r1.50 src/sys/arch/alpha/alpha/dec_3000_300.c
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/alpha/alpha/dec_3000_500.c
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/alpha/alpha/dec_550.c \
    src/sys/arch/alpha/alpha/dec_6600.c
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/alpha/alpha/dec_alphabook1.c
cvs rdiff -u -r1.64 -r1.65 src/sys/arch/alpha/alpha/dec_eb164.c
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/alpha/alpha/dec_eb64plus.c
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/alpha/alpha/dec_eb66.c
cvs rdiff -u -r1.68 -r1.69 src/sys/arch/alpha/alpha/dec_kn20aa.c
cvs rdiff -u -r1.44 -r1.45 src/sys/arch/alpha/alpha/dec_kn300.c \
    src/sys/arch/alpha/alpha/dec_kn8ae.c
cvs rdiff -u -r1.198 -r1.199 src/sys/arch/alpha/conf/files.alpha
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/alpha/include/autoconf.h
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/alpha/include/pci_machdep.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/alpha/include/tc_machdep.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/alpha/pci/pci_bootdev.c \
    src/sys/arch/alpha/pci/pci_consinit.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/alpha/tc/tc_bootdev.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/alpha/alpha/api_up1000.c
diff -u src/sys/arch/alpha/alpha/api_up1000.c:1.33 src/sys/arch/alpha/alpha/api_up1000.c:1.34
--- src/sys/arch/alpha/alpha/api_up1000.c:1.33	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/api_up1000.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: api_up1000.c,v 1.33 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: api_up1000.c,v 1.34 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,65 +30,28 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: api_up1000.c,v 1.33 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: api_up1000.c,v 1.34 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/alpha.h>
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
-
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
 
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/irongatereg.h>
 #include <alpha/pci/irongatevar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-#include <dev/ata/atavar.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
-#define	DPRINTF(x)	if (bootdev_debug) printf x
-
 void api_up1000_init(void);
 static void api_up1000_cons_init(void);
 static void api_up1000_device_register(device_t, void *);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 void
 api_up1000_init(void)
 {
@@ -109,174 +72,18 @@ api_up1000_init(void)
 static void
 api_up1000_cons_init(void)
 {
-	struct ctb *ctb;
 	struct irongate_config *icp;
 	extern struct irongate_config irongate_configuration;
 
 	icp = &irongate_configuration;
 	irongate_init(icp);
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&icp->ic_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&icp->ic_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&icp->ic_iot, &icp->ic_memt);
-		else
-			pci_display_console(&icp->ic_iot, &icp->ic_memt,
-			    &icp->ic_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &icp->ic_iot);
-#endif /* KGDB */
+	pci_consinit(&icp->ic_pc, &icp->ic_iot, &icp->ic_memt,
+	    &icp->ic_iot, &icp->ic_memt);
 }
 
 static void
 api_up1000_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0) ||
-		    (strcasecmp(b->protocol, "IDE") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-		DPRINTF(("\ndiskboot = %d, netboot = %d\n", diskboot, netboot));
-		initted = 1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-			DPRINTF(("\npcidev = %s\n", device_xname(dev)));
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-				DPRINTF(("\nbooted_device = %s\n",
-				    device_xname(dev)));
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-				DPRINTF(("\nctrlrdev = %s\n", device_xname(dev)));
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-		DPRINTF(("\nbooted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
-
-	/*
-	 * Support to boot from IDE drives.
-	 */
-	if (device_is_a(dev, "wd")) {
-		struct ata_device *adev = aux;
-
-		if (!device_is_a(parent, "atabus"))
-			return;
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		DPRINTF(("\natapi info: drive %d, channel %d\n",
-		    adev->adev_drv_data->drive, adev->adev_channel));
-		DPRINTF(("bootdev info: unit: %d, channel: %d\n",
-		    b->unit, b->channel));
-		if (b->unit != adev->adev_drv_data->drive ||
-		    b->channel != adev->adev_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-		DPRINTF(("booted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }

Index: src/sys/arch/alpha/alpha/autoconf.c
diff -u src/sys/arch/alpha/alpha/autoconf.c:1.59 src/sys/arch/alpha/alpha/autoconf.c:1.60
--- src/sys/arch/alpha/alpha/autoconf.c:1.59	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/autoconf.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.59 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: autoconf.c,v 1.60 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -42,7 +42,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.59 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.60 2025/03/09 01:06:41 thorpej Exp $");
 
 #include "pci.h"
 
@@ -68,6 +68,8 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v
 #include <machine/intr.h>
 
 struct bootdev_data	*bootdev_data;
+bool			 bootdev_is_disk;
+bool			 bootdev_is_net;
 
 static void	parse_prom_bootdev(void);
 
@@ -186,8 +188,7 @@ netboot_find_rootdev_planb(void)
 	char ifname[IFNAMSIZ];
 	int i;
 
-	if (strncasecmp(bootinfo.booted_dev, "BOOTP ", 6) != 0 &&
-	    strncasecmp(bootinfo.booted_dev, "MOP ", 4) != 0) {
+	if (!bootdev_is_net) {
 		/* We weren't netbooted. */
 		return;
 	}
@@ -313,6 +314,18 @@ parse_prom_bootdev(void)
 #endif
 
 	bootdev_data = &bd;
+
+	bootdev_is_disk = (strcasecmp(bd.protocol, "SCSI") == 0) ||
+			  (strcasecmp(bd.protocol, "RAID") == 0) ||
+			  (strcasecmp(bd.protocol, "I2O") == 0)  ||
+			  (strcasecmp(bd.protocol, "IDE") == 0);
+
+	bootdev_is_net  = (strcasecmp(bd.protocol, "BOOTP") == 0) ||
+			  (strcasecmp(bd.protocol, "MOP") == 0);
+#if 0
+	printf("bootdev_is_disk = %d, bootdev_is_net = %d\n",
+	    bootdev_is_disk, bootdev_is_net);
+#endif
 }
 
 void

Index: src/sys/arch/alpha/alpha/dec_1000a.c
diff -u src/sys/arch/alpha/alpha/dec_1000a.c:1.35 src/sys/arch/alpha/alpha/dec_1000a.c:1.36
--- src/sys/arch/alpha/alpha/dec_1000a.c:1.35	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_1000a.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_1000a.c,v 1.35 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_1000a.c,v 1.36 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -61,32 +61,18 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_1000a.c,v 1.35 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_1000a.c,v 1.36 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
-
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
 
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/apecsreg.h>
@@ -94,33 +80,10 @@ __KERNEL_RCSID(0, "$NetBSD: dec_1000a.c,
 #include <alpha/pci/ciareg.h>
 #include <alpha/pci/ciavar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include <dev/ic/mlxio.h>
-#include <dev/ic/mlxvar.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
 void _dec_1000a_init(void);
 static void dec_1000a_cons_init(void);
 static void dec_1000a_device_register(device_t, void *);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 static const struct alpha_variation_table dec_1000_variations[] = {
 	{ 0, "AlphaServer 1000" },
 	{ 0, NULL },
@@ -169,8 +132,9 @@ dec_1000a_cons_init(void)
 	extern struct apecs_config apecs_configuration;
 	bus_space_tag_t iot, memt;
 	struct alpha_pci_chipset *pcichipset;
+	uint64_t saveslot;
 
-	if(strcmp(platform.iobus, "cia") == 0) {
+	if (strcmp(platform.iobus, "cia") == 0) {
 		ccp = &cia_configuration;
 		cia_init(ccp);
 		iot = &ccp->cc_iot;
@@ -186,178 +150,26 @@ dec_1000a_cons_init(void)
 
 	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
 
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(iot, IO_KBD, KBCMDP, PCKBC_KBD_SLOT, 0);
+	saveslot = ctb->ctb_turboslot;
 
+	if (ctb->ctb_term_type == CTB_GRAPHICS &&
+	    CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) != CTB_TURBOSLOT_TYPE_PCI) {
 		/*
 		 * AlphaServer 1000s have a firmware bug whereby the
 		 * built-in ISA VGA is reported incorrectly -- ctb_turboslot
-		 * is mostly 0.
+		 * is mostly 0.  Patch it up to what the common code expects.
+		 * We'll restore it at the end in case the firmware is picky.
 		 */
-		switch (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot)) {
-		case CTB_TURBOSLOT_TYPE_PCI:
-			pci_display_console(iot, memt, pcichipset,
-			    CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-			break;
-
-		default:
-			isa_display_console(iot, memt);
-			break;
-		}
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
+		ctb->ctb_turboslot = CTB_TURBOSLOT_TYPE_ISA << 16;
+	}
 
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
+	pci_consinit(pcichipset, iot, memt, iot, memt);
 
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, iot);
-#endif /* KGDB */
+	ctb->ctb_turboslot = saveslot;
 }
 
 static void
 dec_1000a_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0) ||
-		    (strcasecmp(b->protocol, "RAID") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted =1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if 0
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-
-			if (netboot) {
-				booted_device = dev;
-#if 0
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if 0
-				printf("\nctrlrdev = %s\n", device_xname(dev));
-#endif
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
-
-	if (device_is_a(dev, "ld") && device_is_a(parent, "mlx")) {
-		/*
-		 * Argh!  The attach arguments for ld devices is not
-		 * consistent, so each supported raid controller requires
-		 * different checks.
-		 */
-		struct mlx_attach_args *mlxa = aux;
-
-		if (parent != ctrlrdev)
-			return;
-
-		if (b->unit != mlxa->mlxa_unit)
-			return;
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }

Index: src/sys/arch/alpha/alpha/dec_2000_300.c
diff -u src/sys/arch/alpha/alpha/dec_2000_300.c:1.22 src/sys/arch/alpha/alpha/dec_2000_300.c:1.23
--- src/sys/arch/alpha/alpha/dec_2000_300.c:1.22	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_2000_300.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_2000_300.c,v 1.22 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_2000_300.c,v 1.23 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_2000_300.c,v 1.22 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_2000_300.c,v 1.23 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -199,47 +199,38 @@ dec_2000_300_cons_init(void)
 static void
 dec_2000_300_device_register(device_t dev, void *aux)
 {
-	static int found, initted, scsiboot, netboot;
 	static device_t eisadev, isadev, scsidev;
 	struct bootdev_data *b = bootdev_data;
 	device_t parent = device_parent(dev);
 
-	if (b == NULL || found)
+	if (booted_device != NULL || b == NULL) {
 		return;
-
-	if (!initted) {
-		scsiboot = (strcmp(b->protocol, "SCSI") == 0);
-		netboot = (strcmp(b->protocol, "BOOTP") == 0);
-#if 0
-		printf("scsiboot = %d, netboot = %d\n", scsiboot, netboot);
-#endif
-		initted = 1;
 	}
 
-	if (eisadev == NULL && device_is_a(dev, "eisa"))
+	if (eisadev == NULL && device_is_a(dev, "eisa")) {
 		eisadev = dev;
+	}
 
-	if (isadev == NULL && device_is_a(dev, "isa"))
+	if (isadev == NULL && device_is_a(dev, "isa")) {
 		isadev = dev;
+	}
 
-	if (scsiboot && (scsidev == NULL)) {
-		if (eisadev == NULL || parent != eisadev)
-			return;
-		else {
+	if (bootdev_is_disk && scsidev == NULL) {
+		if (eisadev != NULL && parent == eisadev) {
 			struct eisa_attach_args *ea = aux;
 
-			if (b->slot != ea->ea_slot)
-				return;
-
-			scsidev = dev;
+			if (b->slot == ea->ea_slot) {
+				scsidev = dev;
 #if 0
-			printf("\nscsidev = %s\n", device_xname(scsidev));
+				printf("\nscsidev = %s\n",
+				    device_xname(scsidev));
 #endif
-			return;
+			}
 		}
+		return;
 	}
 
-	if (scsiboot &&
+	if (bootdev_is_disk &&
 	    (device_is_a(dev, "sd") ||
 	     device_is_a(dev, "st") ||
 	     device_is_a(dev, "cd"))) {
@@ -267,33 +258,27 @@ dec_2000_300_device_register(device_t de
 			return;
 		}
 
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(booted_device));
-#endif
-		found = 1;
-		return;
+		goto foundit;
 	}
 
-	if (netboot) {
+	if (bootdev_is_net) {
 		/*
 		 * XXX WHAT ABOUT ISA NETWORK CARDS?
 		 */
-		if (eisadev == NULL || parent != eisadev)
-			return;
-		else {
+		if (eisadev != NULL && parent == eisadev) {
 			struct eisa_attach_args *ea = aux;
 
-			if (b->slot != ea->ea_slot)
-				return;
+			if (b->slot == ea->ea_slot) {
+				goto foundit;
+			}
+		}
+	}
 
-			booted_device = dev;
+	return;
+
+ foundit:
+	booted_device = dev;
 #if 0
-			printf("\nbooted_device = %s\n", device_xname(booted_device));
+	printf("\nbooted_device = %s\n", device_xname(booted_device));
 #endif
-			found = 1;
-			return;
-		}
-	}
 }

Index: src/sys/arch/alpha/alpha/dec_2100_a50.c
diff -u src/sys/arch/alpha/alpha/dec_2100_a50.c:1.70 src/sys/arch/alpha/alpha/dec_2100_a50.c:1.71
--- src/sys/arch/alpha/alpha/dec_2100_a50.c:1.70	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_2100_a50.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_2100_a50.c,v 1.70 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_2100_a50.c,v 1.71 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,51 +30,25 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_2100_a50.c,v 1.70 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_2100_a50.c,v 1.71 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/lwp.h>
-#include <sys/termios.h>
-
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/alpha.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
-
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
+#include <machine/logout.h>
 
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/apecsreg.h>
 #include <alpha/pci/apecsvar.h>
-#include <machine/logout.h>
-
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
 
 void dec_2100_a50_init(void);
 static void dec_2100_a50_cons_init(void);
@@ -87,15 +61,6 @@ static void dec_2100_a50_mcheck(unsigned
 				     unsigned long, struct trapframe *);
 
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 const struct alpha_variation_table dec_2100_a50_variations[] = {
 	{ SV_ST_AVANTI,	"AlphaStation 400 4/233 (\"Avanti\")" },
 	{ SV_ST_MUSTANG2_4_166, "AlphaStation 200 4/166 (\"Mustang II\")" },
@@ -134,162 +99,22 @@ dec_2100_a50_init(void)
 static void
 dec_2100_a50_cons_init(void)
 {
-	struct ctb *ctb;
 	struct apecs_config *acp;
 	extern struct apecs_config apecs_configuration;
 
 	acp = &apecs_configuration;
 	apecs_init(acp);
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&acp->ac_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&acp->ac_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&acp->ac_iot, &acp->ac_memt);
-		else
-			pci_display_console(&acp->ac_iot, &acp->ac_memt,
-			    &acp->ac_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &acp->ac_iot);
-#endif /* KGDB */
+	pci_consinit(&acp->ac_pc, &acp->ac_iot, &acp->ac_memt,
+	    &acp->ac_iot, &acp->ac_memt);
 }
 
 static void
 dec_2100_a50_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted =1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if 0
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-#if 0
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if 0
-				printf("\nctrlrdev = %s\n", device_xname(dev));
-#endif
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }
 
-
 static void
 dec_2100_a50_mcheck(unsigned long mces, unsigned long type, unsigned long logout, struct trapframe *framep)
 {
Index: src/sys/arch/alpha/alpha/dec_axppci_33.c
diff -u src/sys/arch/alpha/alpha/dec_axppci_33.c:1.70 src/sys/arch/alpha/alpha/dec_axppci_33.c:1.71
--- src/sys/arch/alpha/alpha/dec_axppci_33.c:1.70	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_axppci_33.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_axppci_33.c,v 1.70 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_axppci_33.c,v 1.71 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,61 +30,27 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_axppci_33.c,v 1.70 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_axppci_33.c,v 1.71 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
-#include <machine/alpha.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
 
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
-
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/lcareg.h>
 #include <alpha/pci/lcavar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
 void dec_axppci_33_init(void);
 static void dec_axppci_33_cons_init(void);
 static void dec_axppci_33_device_register(device_t, void *);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 const struct alpha_variation_table dec_axppci_33_variations[] = {
 	{ 0, "Alpha PC AXPpci33 (\"NoName\")" },
 	{ 0, NULL },
@@ -160,155 +126,16 @@ dec_axppci_33_init(void)
 static void
 dec_axppci_33_cons_init(void)
 {
-	struct ctb *ctb;
 	struct lca_config *lcp;
 
 	lcp = lca_preinit();
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&lcp->lc_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&lcp->lc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&lcp->lc_iot, &lcp->lc_memt);
-		else
-			pci_display_console(&lcp->lc_iot, &lcp->lc_memt,
-			    &lcp->lc_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &lcp->lc_iot);
-#endif /* KGDB */
+	pci_consinit(&lcp->lc_pc, &lcp->lc_iot, &lcp->lc_memt,
+	    &lcp->lc_iot, &lcp->lc_memt);
 }
 
 static void
 dec_axppci_33_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted =1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if 0
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-#if 0
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if 0
-				printf("\nctrlrdev = %s\n", device_xname(dev));
-#endif
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }

Index: src/sys/arch/alpha/alpha/dec_2100_a500.c
diff -u src/sys/arch/alpha/alpha/dec_2100_a500.c:1.26 src/sys/arch/alpha/alpha/dec_2100_a500.c:1.27
--- src/sys/arch/alpha/alpha/dec_2100_a500.c:1.26	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_2100_a500.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_2100_a500.c,v 1.26 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_2100_a500.c,v 1.27 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -56,53 +56,26 @@
  * rights to redistribute these changes.
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_2100_a500.c,v 1.26 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_2100_a500.c,v 1.27 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/lwp.h>
-#include <sys/termios.h>
-
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
 #include <machine/alpha.h>
 
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
-
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/ttwogareg.h>
 #include <alpha/pci/ttwogavar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include <dev/ic/mlxio.h>
-#include <dev/ic/mlxvar.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
+#define	DR_VERBOSE(f)	while (0)
 
 void _dec_2100_a500_init(void);
 static void dec_2100_a500_cons_init(void);
@@ -110,15 +83,6 @@ static void dec_2100_a500_device_registe
 static void dec_2100_a500_machine_check(unsigned long, struct trapframe *,
 	unsigned long, unsigned long);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 void
 _dec_2100_a500_init(void)
 {
@@ -156,200 +120,62 @@ dec_2100_a500_cons_init(void)
 	struct ctb *ctb;
 	uint64_t ctbslot;
 	struct ttwoga_config *tcp;
+	bus_space_tag_t isa_iot, isa_memt;
 
 	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
 	ctbslot = ctb->ctb_turboslot;
 
 	tcp = ttwoga_init(0);
 
+	isa_iot = &tcp->tc_iot;
+	isa_memt = &tcp->tc_memt;
+
 	switch (ctb->ctb_term_type) {
 	case CTB_PRINTERPORT:
 		/* serial console ... */
 		assert(CTB_TURBOSLOT_HOSE(ctbslot) == 0);
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&tcp->tc_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
+		break;
 
 	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&tcp->tc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		switch (CTB_TURBOSLOT_TYPE(ctbslot)) {
-		case CTB_TURBOSLOT_TYPE_ISA:
-		/*
-		 * XXX The following is apparently necessary for an
-		 * XXX ISA VGA card, but what happens with real EISA
-		 * XXX VGA cards?
-		 */
-		case CTB_TURBOSLOT_TYPE_EISA:
-			isa_display_console(&tcp->tc_iot, &tcp->tc_memt);
-			break;
-
-		case CTB_TURBOSLOT_TYPE_PCI:
-			/* The display PCI might be different */
+		/* PCI display might be on a different hose. */
+		if (CTB_TURBOSLOT_TYPE(ctbslot) == CTB_TURBOSLOT_TYPE_PCI) {
 			tcp = ttwoga_init(CTB_TURBOSLOT_HOSE(ctbslot));
-			pci_display_console(&tcp->tc_iot, &tcp->tc_memt,
-			    &tcp->tc_pc, CTB_TURBOSLOT_BUS(ctbslot),
-			    CTB_TURBOSLOT_SLOT(ctbslot), 0);
-			break;
-
-		default:
-			printf("type = 0x%lx, hose = 0x%lx, bus = 0x%lx, "
-			    "slot = 0x%lx\n",
-			    CTB_TURBOSLOT_TYPE(ctbslot),
-			    CTB_TURBOSLOT_HOSE(ctbslot),
-			    CTB_TURBOSLOT_BUS(ctbslot),
-			    CTB_TURBOSLOT_SLOT(ctbslot));
-			panic("unknown display console type");
 		}
-#else
-		panic("not configured to use display && keyboard console");
-#endif
 		break;
 
 	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
+		/* Let pci_consinit() handle it. */
+		break;
 	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &tcp->tc_iot);
-#endif /* KGDB */
+
+	pci_consinit(&tcp->tc_pc, &tcp->tc_iot, &tcp->tc_memt,
+	    isa_iot, isa_memt);
 }
 
 static void
 dec_2100_a500_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
+	static device_t primarydev;
 	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
 
-	if (b == NULL || found)
+	if (booted_device != NULL || b == NULL) {
 		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0) ||
-		    (strcasecmp(b->protocol, "RAID") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted =1;
 	}
 
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
+	if (primarydev == NULL) {
+		if (device_is_a(dev, "ttwopci")) {
 			struct pcibus_attach_args *pba = aux;
 
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if 0
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-#if 0
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if 0
-				printf("\nctrlrdev = %s\n", device_xname(dev));
-#endif
+			if (b->bus == pba->pba_bus) {
+				primarydev = dev;
+				DR_VERBOSE(printf("\nprimarydev = %s\n",
+				    device_xname(dev)));
 			}
-			return;
 		}
-	}
-
-	if (!diskboot)
 		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
 	}
 
-	if (device_is_a(dev, "ld") && device_is_a(parent, "mlx")) {
-		/*
-		 * Argh!  The attach arguments for ld devices is not
-		 * consistent, so each supported raid controller requires
-		 * different checks.
-		 */
-		struct mlx_attach_args *mlxa = aux;
-
-		if (parent != ctrlrdev)
-			return;
-
-		if (b->unit != mlxa->mlxa_unit)
-			return;
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(primarydev, dev, aux);
 }
 
 /*

Index: src/sys/arch/alpha/alpha/dec_3000_300.c
diff -u src/sys/arch/alpha/alpha/dec_3000_300.c:1.49 src/sys/arch/alpha/alpha/dec_3000_300.c:1.50
--- src/sys/arch/alpha/alpha/dec_3000_300.c:1.49	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_3000_300.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_3000_300.c,v 1.49 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_3000_300.c,v 1.50 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996 Carnegie-Mellon University.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_3000_300.c,v 1.49 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_3000_300.c,v 1.50 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -52,10 +52,6 @@ __KERNEL_RCSID(0, "$NetBSD: dec_3000_300
 #include <machine/z8530var.h>
 #include <dev/tc/zs_ioasicvar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
 #include "wsdisplay.h"
 
 void dec_3000_300_init(void);
@@ -145,112 +141,5 @@ dec_3000_300_cons_init(void)
 static void
 dec_3000_300_device_register(device_t dev, void *aux)
 {
-	static int found, initted, scsiboot, netboot;
-	static device_t scsidev;
-	static device_t tcdsdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		scsiboot = (strcmp(b->protocol, "SCSI") == 0);
-		netboot = (strcmp(b->protocol, "BOOTP") == 0) ||
-		    (strcmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("scsiboot = %d, netboot = %d\n", scsiboot, netboot);
-#endif
-		initted = 1;
-	}
-
-	/*
-	 * for scsi boot, we look for "tcds", make sure it has the
-	 * right slot number, then find the "asc" on this tcds that
-	 * as the right channel.  then we find the actual scsi
-	 * device we came from.  note: no SCSI LUN support (yet).
-	 */
-	if (scsiboot && device_is_a(dev, "tcds")) {
-		struct tc_attach_args *tcargs = aux;
-
-		if (b->slot != tcargs->ta_slot)
-			return;
-
-		tcdsdev = dev;
-#if 0
-		printf("\ntcdsdev = %s\n", device_xname(dev));
-#endif
-	}
-	if (scsiboot && tcdsdev &&
-	    device_is_a(dev, "asc")) {
-		struct tcdsdev_attach_args *ta = aux;
-
-		if (parent != tcdsdev)
-			return;
-
-		if (ta->tcdsda_chip != b->channel)
-			return;
-
-		scsidev = dev;
-#if 0
-		printf("\nscsidev = %s\n", device_xname(dev));
-#endif
-	}
-
-	if (scsiboot && scsidev &&
-	    (device_is_a(dev, "sd") ||
-	     device_is_a(dev, "st") ||
-	     device_is_a(dev, "cd"))) {
-		struct scsipibus_attach_args *sa = aux;
-
-		if (device_parent(parent) != scsidev)
-			return;
-
-		if (b->unit / 100 != sa->sa_periph->periph_target)
-			return;
-
-		/* XXX LUN! */
-
-		switch (b->boot_dev_type) {
-		case 0:
-			if (!device_is_a(dev, "sd") &&
-			    !device_is_a(dev, "cd"))
-				return;
-			break;
-		case 1:
-			if (!device_is_a(dev, "st"))
-				return;
-			break;
-		default:
-			return;
-		}
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(booted_device));
-#endif
-		found = 1;
-	}
-
-	if (netboot) {
-	        if (b->slot == 5 && device_is_a(dev, "le") &&
-		    device_is_a(parent, "ioasic")) {
-			/*
-			 * no need to check ioasic_attach_args, since only
-			 * one le on ioasic.
-			 */
-
-			booted_device = dev;
-#if 0
-			printf("\nbooted_device = %s\n", device_xname(booted_device));
-#endif
-			found = 1;
-			return;
-		}
-
-		/*
-		 * XXX GENERIC SUPPORT FOR TC NETWORK BOARDS
-		 */
-	}
+	tc_find_bootdev(dev, aux);
 }

Index: src/sys/arch/alpha/alpha/dec_3000_500.c
diff -u src/sys/arch/alpha/alpha/dec_3000_500.c:1.48 src/sys/arch/alpha/alpha/dec_3000_500.c:1.49
--- src/sys/arch/alpha/alpha/dec_3000_500.c:1.48	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_3000_500.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_3000_500.c,v 1.48 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_3000_500.c,v 1.49 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_3000_500.c,v 1.48 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_3000_500.c,v 1.49 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -52,10 +52,6 @@ __KERNEL_RCSID(0, "$NetBSD: dec_3000_500
 #include <machine/z8530var.h>
 #include <dev/tc/zs_ioasicvar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
 #include "wsdisplay.h"
 
 void dec_3000_500_init(void);
@@ -165,112 +161,5 @@ dec_3000_500_cons_init(void)
 static void
 dec_3000_500_device_register(device_t dev, void *aux)
 {
-	static int found, initted, scsiboot, netboot;
-	static device_t scsidev;
-	static device_t tcdsdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		scsiboot = (strcmp(b->protocol, "SCSI") == 0);
-		netboot = (strcmp(b->protocol, "BOOTP") == 0) ||
-		    (strcmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("scsiboot = %d, netboot = %d\n", scsiboot, netboot);
-#endif
-		initted = 1;
-	}
-
-	/*
-	 * for scsi boot, we look for "tcds", make sure it has the
-	 * right slot number, then find the "asc" on this tcds that
-	 * as the right channel.  then we find the actual scsi
-	 * device we came from.  note: no SCSI LUN support (yet).
-	 */
-	if (scsiboot && device_is_a(dev, "tcds")) {
-		struct tc_attach_args *tcargs = aux;
-
-		if (b->slot != tcargs->ta_slot)
-			return;
-
-		tcdsdev = dev;
-#if 0
-		printf("\ntcdsdev = %s\n", device_xname(dev));
-#endif
-	}
-	if (scsiboot && tcdsdev &&
-	    device_is_a(dev, "asc")) {
-		struct tcdsdev_attach_args *ta = aux;
-
-		if (parent != tcdsdev)
-			return;
-
-		if (ta->tcdsda_chip != b->channel)
-			return;
-
-		scsidev = dev;
-#if 0
-		printf("\nscsidev = %s\n", device_xname(dev));
-#endif
-	}
-
-	if (scsiboot && scsidev &&
-	    (device_is_a(dev, "sd") ||
-	     device_is_a(dev, "st") ||
-	     device_is_a(dev, "cd"))) {
-		struct scsipibus_attach_args *sa = aux;
-
-		if (device_parent(parent) != scsidev)
-			return;
-
-		if (b->unit / 100 != sa->sa_periph->periph_target)
-			return;
-
-		/* XXX LUN! */
-
-		switch (b->boot_dev_type) {
-		case 0:
-			if (!device_is_a(dev, "sd") &&
-			    !device_is_a(dev, "cd"))
-				return;
-			break;
-		case 1:
-			if (!device_is_a(dev, "st"))
-				return;
-			break;
-		default:
-			return;
-		}
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(booted_device));
-#endif
-		found = 1;
-	}
-
-	if (netboot) {
-	        if (b->slot == 7 && device_is_a(dev, "le") &&
-		    device_is_a(parent, "ioasic")) {
-			/*
-			 * no need to check ioasic_attach_args, since only
-			 * one le on ioasic.
-			 */
-
-			booted_device = dev;
-#if 0
-			printf("\nbooted_device = %s\n", device_xname(booted_device));
-#endif
-			found = 1;
-			return;
-		}
-
-		/*
-		 * XXX GENERIC SUPPORT FOR TC NETWORK BOARDS
-		 */
-	}
+	tc_find_bootdev(dev, aux);
 }

Index: src/sys/arch/alpha/alpha/dec_550.c
diff -u src/sys/arch/alpha/alpha/dec_550.c:1.38 src/sys/arch/alpha/alpha/dec_550.c:1.39
--- src/sys/arch/alpha/alpha/dec_550.c:1.38	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_550.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_550.c,v 1.38 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_550.c,v 1.39 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,70 +30,33 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_550.c,v 1.38 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_550.c,v 1.39 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <uvm/uvm_extern.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
-
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
 
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/ciareg.h>
 #include <alpha/pci/ciavar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-#include <dev/ata/atavar.h>
-
 /* Write this to Pyxis General Purpose Output to turn off the power. */
 #define	DEC_550_PYXIS_GPO_POWERDOWN	0x00000400
 
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
-#define	DR_VERBOSE(f) while (0)
-
 void dec_550_init(void);
 static void dec_550_cons_init(void);
 static void dec_550_device_register(device_t, void *);
 static void dec_550_powerdown(void);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 void
 dec_550_init(void)
 {
@@ -119,178 +82,20 @@ dec_550_init(void)
 static void
 dec_550_cons_init(void)
 {
-	struct ctb *ctb;
 	struct cia_config *ccp;
 	extern struct cia_config cia_configuration;
 
 	ccp = &cia_configuration;
 	cia_init(ccp);
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&ccp->cc_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&ccp->cc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&ccp->cc_iot, &ccp->cc_memt);
-		else
-			pci_display_console(&ccp->cc_iot, &ccp->cc_memt,
-			    &ccp->cc_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &ccp->cc_iot);
-#endif /* KGDB */
+	pci_consinit(&ccp->cc_pc, &ccp->cc_iot, &ccp->cc_memt,
+	    &ccp->cc_iot, &ccp->cc_memt);
 }
 
 static void
 dec_550_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0) ||
-		    (strcasecmp(b->protocol, "IDE") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-		DR_VERBOSE(printf("diskboot = %d, netboot = %d\n", diskboot,
-		    netboot));
-		initted = 1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-			DR_VERBOSE(printf("\npcidev = %s\n", device_xname(dev)));
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-
-			if (netboot) {
-				booted_device = dev;
-				DR_VERBOSE(printf("\nbooted_device = %s\n",
-				    device_xname(dev)));
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-				DR_VERBOSE(printf("\nctrlrdev = %s\n",
-				    device_xname(dev)));
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-		DR_VERBOSE(printf("\nbooted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
-
-	/*
-	 * Support to boot from IDE drives.
-	 */
-	if (device_is_a(dev, "wd")) {
-		struct ata_device *adev = aux;
-
-		if (!device_is_a(parent, "atabus"))
-			return;
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		DR_VERBOSE(printf("\nAtapi info: drive: %d, channel %d\n",
-		    adev->adev_drv_data->drive, adev->adev_channel));
-		DR_VERBOSE(printf("Bootdev info: unit: %d, channel: %d\n",
-		    b->unit, b->channel));
-		if (b->unit != adev->adev_drv_data->drive ||
-		    b->channel != adev->adev_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-		DR_VERBOSE(printf("booted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }
 
 static void
Index: src/sys/arch/alpha/alpha/dec_6600.c
diff -u src/sys/arch/alpha/alpha/dec_6600.c:1.38 src/sys/arch/alpha/alpha/dec_6600.c:1.39
--- src/sys/arch/alpha/alpha/dec_6600.c:1.38	Sun Mar 31 19:11:21 2024
+++ src/sys/arch/alpha/alpha/dec_6600.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_6600.c,v 1.38 2024/03/31 19:11:21 thorpej Exp $ */
+/* $NetBSD: dec_6600.c,v 1.39 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -27,63 +27,28 @@
  * rights to redistribute these changes.
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_6600.c,v 1.38 2024/03/31 19:11:21 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_6600.c,v 1.39 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/lwp.h>
-#include <sys/termios.h>
-
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
 #include <machine/alpha.h>
 #include <machine/logout.h>
 
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
-
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/tsreg.h>
 #include <alpha/pci/tsvar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-#include <dev/ata/atavar.h>
-
-#include <dev/ic/mlxio.h>
-#include <dev/ic/mlxvar.h>
-
-#include <dev/i2o/i2o.h>
-#include <dev/i2o/iopio.h>
-#include <dev/i2o/iopvar.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-
 #define	DR_VERBOSE(f) while (0)
 
-static int comcnrate __attribute__((unused)) = CONSPEED;
-
 void dec_6600_init(void);
 static void dec_6600_cons_init(void);
 static void dec_6600_device_register(device_t, void *);
@@ -92,15 +57,6 @@ static void dec_6600_mcheck_sys(unsigned
 static void dec_6600_mcheck_handler(unsigned long, struct trapframe *,
 				    unsigned long, unsigned long);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 static const struct alpha_variation_table dec_6600_variations[] = {
 	{ SV_ST_DP264, "AlphaPC DP264" },
 	{ SV_ST_CLIPPER, "AlphaServer ES40 (\"Clipper\")" },
@@ -149,6 +105,7 @@ dec_6600_cons_init(void)
 	struct ctb *ctb;
 	uint64_t ctbslot;
 	struct tsp_config *tsp;
+	bus_space_tag_t isa_iot, isa_memt;
 
 	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
 	ctbslot = ctb->ctb_turboslot;
@@ -158,69 +115,36 @@ dec_6600_cons_init(void)
 
 	tsp = tsp_init(tsp_console_hose);
 
+	isa_iot = &tsp->pc_iot;
+	isa_memt = &tsp->pc_memt;
+
 	switch (ctb->ctb_term_type) {
 	case CTB_PRINTERPORT:
 		/* serial console ... */
 		assert(CTB_TURBOSLOT_HOSE(ctbslot) == 0);
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&tsp->pc_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
+		break;
 
 	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&tsp->pc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctbslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&tsp->pc_iot, &tsp->pc_memt);
-		else {
-			/* The display PCI might be different */
+		/* PCI display might be on a different hose. */
+		if (CTB_TURBOSLOT_TYPE(ctbslot) != CTB_TURBOSLOT_TYPE_ISA) {
 			tsp_console_hose = CTB_TURBOSLOT_HOSE(ctbslot);
 			tsp = tsp_init(tsp_console_hose);
-			pci_display_console(&tsp->pc_iot, &tsp->pc_memt,
-			    &tsp->pc_pc, CTB_TURBOSLOT_BUS(ctbslot),
-			    CTB_TURBOSLOT_SLOT(ctbslot), 0);
 		}
-#else
-		panic("not configured to use display && keyboard console");
-#endif
 		break;
 
 	default:
-		printf("ctb_term_type = 0x%lx ctb_turboslot = 0x%lx"
-		    " hose = %ld\n", ctb->ctb_term_type, ctbslot,
-		    CTB_TURBOSLOT_HOSE(ctbslot));
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
+		/* Let pci_consinit() handle it. */
+		break;
 	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &tsp->pc_iot);
-#endif /* KGDB */
+
+	pci_consinit(&tsp->pc_pc, &tsp->pc_iot, &tsp->pc_memt,
+	    isa_iot, isa_memt);
 }
 
 static void
 dec_6600_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t primarydev, pcidev, ctrlrdev;
+	static device_t primarydev;
 	struct bootdev_data *b = bootdev_data;
 	device_t parent = device_parent(dev);
 
@@ -255,178 +179,26 @@ dec_6600_device_register(device_t dev, v
 	 * Second section: Boot device detection.
 	 */
 
-	if (b == NULL || found)
+	if (booted_device != NULL || b == NULL) {
 		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0) ||
-		    (strcasecmp(b->protocol, "RAID") == 0) ||
-		    (strcasecmp(b->protocol, "I2O") == 0) ||
-		    (strcasecmp(b->protocol, "IDE") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-		DR_VERBOSE(printf("diskboot = %d, netboot = %d\n", diskboot,
-		    netboot));
-		initted = 1;
 	}
 
 	if (primarydev == NULL) {
-		if (!device_is_a(dev, "tsp"))
-			return;
-		else {
+		if (device_is_a(dev, "tsp")) {
 			struct tsp_attach_args *tsp = aux;
 
-			if (b->bus != tsp->tsp_slot)
-				return;
-			primarydev = dev;
-			DR_VERBOSE(printf("\nprimarydev = %s\n",
-			    device_xname(dev)));
-			return;
-		}
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		/*
-		 * Try to find primarydev anywhere in the ancestry.  This is
-		 * necessary if the PCI bus is hidden behind a bridge.
-		 */
-		while (parent) {
-			if (parent == primarydev)
-				break;
-			parent = device_parent(parent);
-		}
-		if (!parent)
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-			DR_VERBOSE(printf("\npcidev = %s\n", device_xname(dev)));
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-				DR_VERBOSE(printf("\nbooted_device = %s\n",
-				    device_xname(dev)));
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-				DR_VERBOSE(printf("\nctrlrdev = %s\n",
+			if (b->bus == tsp->tsp_slot) {
+				primarydev = dev;
+				DR_VERBOSE(printf("\nprimarydev = %s\n",
 				    device_xname(dev)));
 			}
-			return;
 		}
-	}
-
-	if (!diskboot)
 		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-		DR_VERBOSE(printf("\nbooted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
-
-	if (device_is_a(dev, "ld") && device_is_a(parent, "iop")) {
-		/*
-		 * Argh!  The attach arguments for ld devices is not
-		 * consistent, so each supported raid controller requires
-		 * different checks.
-		 */
-		struct iop_attach_args *iopa = aux;
-
-		if (parent != ctrlrdev)
-			return;
-
-		if (b->unit != iopa->ia_tid)
-			return;
-		/* we've found it! */
-		booted_device = dev;
-		DR_VERBOSE(printf("\nbooted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
-
-	if (device_is_a(dev, "ld") && device_is_a(parent, "mlx")) {
-		/*
-		 * Argh!  The attach arguments for ld devices is not
-		 * consistent, so each supported raid controller requires
-		 * different checks.
-		 */
-		struct mlx_attach_args *mlxa = aux;
-
-		if (parent != ctrlrdev)
-			return;
-
-		if (b->unit != mlxa->mlxa_unit)
-			return;
-		/* we've found it! */
-		booted_device = dev;
-		DR_VERBOSE(printf("\nbooted_device = %s\n", device_xname(dev)));
-		found = 1;
 	}
 
-	/*
-	 * Support to boot from IDE drives.
-	 */
-	if (device_is_a(dev, "wd")) {
-		struct ata_device *adev = aux;
-
-		if (!device_is_a(parent, "atabus"))
-			return;
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		DR_VERBOSE(printf("\nAtapi info: drive: %d, channel %d\n",
-		    adev->adev_drv_data->drive, adev->adev_channel));
-		DR_VERBOSE(printf("Bootdev info: unit: %d, channel: %d\n",
-		    b->unit, b->channel));
-		if (b->unit != adev->adev_drv_data->drive ||
-		    b->channel != adev->adev_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-		DR_VERBOSE(printf("booted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
+	pci_find_bootdev(primarydev, dev, aux);
 }
 
-
 static void
 dec_6600_mcheck(unsigned long vector, struct ev6_logout_area *la)
 {

Index: src/sys/arch/alpha/alpha/dec_alphabook1.c
diff -u src/sys/arch/alpha/alpha/dec_alphabook1.c:1.30 src/sys/arch/alpha/alpha/dec_alphabook1.c:1.31
--- src/sys/arch/alpha/alpha/dec_alphabook1.c:1.30	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_alphabook1.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_alphabook1.c,v 1.30 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_alphabook1.c,v 1.31 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,61 +30,27 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_alphabook1.c,v 1.30 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_alphabook1.c,v 1.31 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
-
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
 
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/lcareg.h>
 #include <alpha/pci/lcavar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
 void dec_alphabook1_init(void);
 static void dec_alphabook1_cons_init(void);
 static void dec_alphabook1_device_register(device_t, void *);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 const struct alpha_variation_table dec_alphabook1_variations[] = {
 	{ 0, "AlphaBook" },
 	{ 0, NULL },
@@ -114,157 +80,18 @@ dec_alphabook1_init(void)
 static void
 dec_alphabook1_cons_init(void)
 {
-	struct ctb *ctb;
 	struct lca_config *lcp;
 	extern struct lca_config lca_configuration;
 
 	lcp = &lca_configuration;
 	lca_init(lcp);
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&lcp->lc_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&lcp->lc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&lcp->lc_iot, &lcp->lc_memt);
-		else
-			pci_display_console(&lcp->lc_iot, &lcp->lc_memt,
-			    &lcp->lc_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &lcp->lc_iot);
-#endif /* KGDB */
+	pci_consinit(&lcp->lc_pc, &lcp->lc_iot, &lcp->lc_memt,
+	    &lcp->lc_iot, &lcp->lc_memt);
 }
 
 static void
 dec_alphabook1_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted =1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if 0
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-#if 0
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if 0
-				printf("\nctrlrdev = %s\n", device_xname(dev));
-#endif
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }

Index: src/sys/arch/alpha/alpha/dec_eb164.c
diff -u src/sys/arch/alpha/alpha/dec_eb164.c:1.64 src/sys/arch/alpha/alpha/dec_eb164.c:1.65
--- src/sys/arch/alpha/alpha/dec_eb164.c:1.64	Sun Mar 31 19:06:30 2024
+++ src/sys/arch/alpha/alpha/dec_eb164.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_eb164.c,v 1.64 2024/03/31 19:06:30 thorpej Exp $ */
+/* $NetBSD: dec_eb164.c,v 1.65 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,66 +30,29 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_eb164.c,v 1.64 2024/03/31 19:06:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_eb164.c,v 1.65 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <uvm/uvm_extern.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
-
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
 
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/ciareg.h>
 #include <alpha/pci/ciavar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-#include <dev/ata/atavar.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
-#define	DR_VERBOSE(f) while (0)
-
 void dec_eb164_init(void);
 static void dec_eb164_cons_init(void);
 static void dec_eb164_device_register(device_t, void *);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 void
 dec_eb164_init(void)
 {
@@ -114,176 +77,18 @@ dec_eb164_init(void)
 static void
 dec_eb164_cons_init(void)
 {
-	struct ctb *ctb;
 	struct cia_config *ccp;
 	extern struct cia_config cia_configuration;
 
 	ccp = &cia_configuration;
 	cia_init(ccp);
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&ccp->cc_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&ccp->cc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&ccp->cc_iot, &ccp->cc_memt);
-		else
-			pci_display_console(&ccp->cc_iot, &ccp->cc_memt,
-			    &ccp->cc_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &ccp->cc_iot);
-#endif /* KGDB */
+	pci_consinit(&ccp->cc_pc, &ccp->cc_iot, &ccp->cc_memt,
+	    &ccp->cc_iot, &ccp->cc_memt);
 }
 
 static void
 dec_eb164_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0) ||
-		    (strcasecmp(b->protocol, "IDE") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-		DR_VERBOSE(printf("diskboot = %d, netboot = %d\n", diskboot,
-		    netboot));
-		initted = 1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-			DR_VERBOSE(printf("\npcidev = %s\n", device_xname(dev)));
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-				DR_VERBOSE(printf("\nbooted_device = %s\n",
-				    device_xname(dev)));
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-				DR_VERBOSE(printf("\nctrlrdev = %s\n",
-				    device_xname(dev)));
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-		DR_VERBOSE(printf("\nbooted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
-
-	/*
-	 * Support to boot from IDE drives.
-	 */
-	if (device_is_a(dev, "wd")) {
-		struct ata_device *adev = aux;
-
-		if (!device_is_a(parent, "atabus"))
-			return;
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		DR_VERBOSE(printf("\nAtapi info: drive: %d, channel %d\n",
-		    adev->adev_drv_data->drive, adev->adev_channel));
-		DR_VERBOSE(printf("Bootdev info: unit: %d, channel: %d\n",
-		    b->unit, b->channel));
-		if (b->unit != adev->adev_drv_data->drive ||
-		    b->channel != adev->adev_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-		DR_VERBOSE(printf("booted_device = %s\n", device_xname(dev)));
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }

Index: src/sys/arch/alpha/alpha/dec_eb64plus.c
diff -u src/sys/arch/alpha/alpha/dec_eb64plus.c:1.43 src/sys/arch/alpha/alpha/dec_eb64plus.c:1.44
--- src/sys/arch/alpha/alpha/dec_eb64plus.c:1.43	Sun Mar 31 19:06:31 2024
+++ src/sys/arch/alpha/alpha/dec_eb64plus.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_eb64plus.c,v 1.43 2024/03/31 19:06:31 thorpej Exp $ */
+/* $NetBSD: dec_eb64plus.c,v 1.44 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,63 +30,29 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_eb64plus.c,v 1.43 2024/03/31 19:06:31 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_eb64plus.c,v 1.44 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <uvm/uvm_extern.h>
 
 #include <machine/rpb.h>
-#include <machine/alpha.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
 
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
-
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/apecsreg.h>
 #include <alpha/pci/apecsvar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
 void dec_eb64plus_init(void);
 static void dec_eb64plus_cons_init(void);
 static void dec_eb64plus_device_register(device_t, void *);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 const struct alpha_variation_table dec_eb64plus_variations[] = {
 	{ 0, "DEC EB64+" },
 	{ 0, NULL },
@@ -122,157 +88,18 @@ dec_eb64plus_init(void)
 static void
 dec_eb64plus_cons_init(void)
 {
-	struct ctb *ctb;
 	struct apecs_config *acp;
 	extern struct apecs_config apecs_configuration;
 
 	acp = &apecs_configuration;
 	apecs_init(acp);
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&acp->ac_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&acp->ac_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&acp->ac_iot, &acp->ac_memt);
-		else
-			pci_display_console(&acp->ac_iot, &acp->ac_memt,
-			    &acp->ac_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &acp->ac_iot);
-#endif /* KGDB */
+	pci_consinit(&acp->ac_pc, &acp->ac_iot, &acp->ac_memt,
+	    &acp->ac_iot, &acp->ac_memt);
 }
 
 static void
 dec_eb64plus_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted =1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if 0
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-#if 0
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if 0
-				printf("\nctrlrdev = %s\n", device_xname(dev));
-#endif
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }

Index: src/sys/arch/alpha/alpha/dec_eb66.c
diff -u src/sys/arch/alpha/alpha/dec_eb66.c:1.31 src/sys/arch/alpha/alpha/dec_eb66.c:1.32
--- src/sys/arch/alpha/alpha/dec_eb66.c:1.31	Sun Mar 31 19:06:31 2024
+++ src/sys/arch/alpha/alpha/dec_eb66.c	Sun Mar  9 01:06:41 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_eb66.c,v 1.31 2024/03/31 19:06:31 thorpej Exp $ */
+/* $NetBSD: dec_eb66.c,v 1.32 2025/03/09 01:06:41 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,61 +30,27 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_eb66.c,v 1.31 2024/03/31 19:06:31 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_eb66.c,v 1.32 2025/03/09 01:06:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
-
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
 
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/lcareg.h>
 #include <alpha/pci/lcavar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
 void dec_eb66_init(void);
 static void dec_eb66_cons_init(void);
 static void dec_eb66_device_register(device_t, void *);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 const struct alpha_variation_table dec_eb66_variations[] = {
 	{ 0, "DEC EB66" },
 	{ 0, NULL },
@@ -114,157 +80,18 @@ dec_eb66_init(void)
 static void
 dec_eb66_cons_init(void)
 {
-	struct ctb *ctb;
 	struct lca_config *lcp;
 	extern struct lca_config lca_configuration;
 
 	lcp = &lca_configuration;
 	lca_init(lcp);
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&lcp->lc_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&lcp->lc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&lcp->lc_iot, &lcp->lc_memt);
-		else
-			pci_display_console(&lcp->lc_iot, &lcp->lc_memt,
-			    &lcp->lc_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &lcp->lc_iot);
-#endif /* KGDB */
+	pci_consinit(&lcp->lc_pc, &lcp->lc_iot, &lcp->lc_memt,
+	    &lcp->lc_iot, &lcp->lc_memt);
 }
 
 static void
 dec_eb66_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted =1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if 0
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-#if 0
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if 0
-				printf("\nctrlrdev = %s\n", device_xname(dev));
-#endif
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }

Index: src/sys/arch/alpha/alpha/dec_kn20aa.c
diff -u src/sys/arch/alpha/alpha/dec_kn20aa.c:1.68 src/sys/arch/alpha/alpha/dec_kn20aa.c:1.69
--- src/sys/arch/alpha/alpha/dec_kn20aa.c:1.68	Sun Mar 31 19:06:31 2024
+++ src/sys/arch/alpha/alpha/dec_kn20aa.c	Sun Mar  9 01:06:42 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_kn20aa.c,v 1.68 2024/03/31 19:06:31 thorpej Exp $ */
+/* $NetBSD: dec_kn20aa.c,v 1.69 2025/03/09 01:06:42 thorpej Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
@@ -30,52 +30,26 @@
  * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_kn20aa.c,v 1.68 2024/03/31 19:06:31 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_kn20aa.c,v 1.69 2025/03/09 01:06:42 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/lwp.h>
-#include <sys/termios.h>
-
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
 #include <machine/cpuconf.h>
-#include <sys/bus.h>
 #include <machine/alpha.h>
 #include <machine/logout.h>
 
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
-
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <alpha/pci/ciareg.h>
 #include <alpha/pci/ciavar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include "pckbd.h"
-
-#ifndef CONSPEED
-#define CONSPEED TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
-
 void dec_kn20aa_init(void);
 static void dec_kn20aa_cons_init(void);
 static void dec_kn20aa_device_register(device_t, void *);
@@ -86,15 +60,6 @@ static void dec_kn20aa_mcheck_handler
 static void dec_kn20aa_mcheck(unsigned long, unsigned long,
 				     unsigned long, struct trapframe *);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 const struct alpha_variation_table dec_kn20aa_variations[] = {
 	{ 0, "AlphaStation 500 or 600 (KN20AA)" },
 	{ 0, NULL },
@@ -123,159 +88,20 @@ dec_kn20aa_init(void)
 static void
 dec_kn20aa_cons_init(void)
 {
-	struct ctb *ctb;
 	struct cia_config *ccp;
 	extern struct cia_config cia_configuration;
 
 	ccp = &cia_configuration;
 	cia_init(ccp);
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/* XXX */
-		{
-			/*
-			 * Delay to allow PROM putchars to complete.
-			 * FIFO depth * character time,
-			 * character time = (1000000 / (defaultrate / 10))
-			 */
-			DELAY(160000000 / comcnrate);
-
-			if(comcnattach(&ccp->cc_iot, 0x3f8, comcnrate,
-			    COM_FREQ, COM_TYPE_NORMAL,
-			    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8))
-				panic("can't init serial console");
-
-			break;
-		}
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&ccp->cc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&ccp->cc_iot, &ccp->cc_memt);
-		else
-			pci_display_console(&ccp->cc_iot, &ccp->cc_memt,
-			    &ccp->cc_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &ccp->cc_iot);
-#endif /* KGDB */
+	pci_consinit(&ccp->cc_pc, &ccp->cc_iot, &ccp->cc_memt,
+	    &ccp->cc_iot, &ccp->cc_memt);
 }
 
 static void
 dec_kn20aa_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t pcidev, ctrlrdev;
-	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
-
-	if (b == NULL || found)
-		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if 0
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted =1;
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if 0
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-#if 0
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if 0
-				printf("\nctrlrdev = %s\n", device_xname(dev));
-#endif
-			}
-			return;
-		}
-	}
-
-	if (!diskboot)
-		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(NULL, dev, aux);
 }
 
 static void

Index: src/sys/arch/alpha/alpha/dec_kn300.c
diff -u src/sys/arch/alpha/alpha/dec_kn300.c:1.44 src/sys/arch/alpha/alpha/dec_kn300.c:1.45
--- src/sys/arch/alpha/alpha/dec_kn300.c:1.44	Sun Mar 31 19:06:31 2024
+++ src/sys/arch/alpha/alpha/dec_kn300.c	Sun Mar  9 01:06:42 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_kn300.c,v 1.44 2024/03/31 19:06:31 thorpej Exp $ */
+/* $NetBSD: dec_kn300.c,v 1.45 2025/03/09 01:06:42 thorpej Exp $ */
 
 /*
  * Copyright (c) 1998 by Matthew Jacob
@@ -30,33 +30,21 @@
  * SUCH DAMAGE.
  */
 
-#include "opt_kgdb.h"
-
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_kn300.c,v 1.44 2024/03/31 19:06:31 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_kn300.c,v 1.45 2025/03/09 01:06:42 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/alpha.h>
 #include <machine/autoconf.h>
 #include <machine/frame.h>
 #include <machine/cpuconf.h>
+#include <machine/logout.h>
 
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
-
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/i8042reg.h>
-#include <dev/ic/pckbcvar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
 #include <uvm/uvm_extern.h>
@@ -65,22 +53,6 @@ __KERNEL_RCSID(0, "$NetBSD: dec_kn300.c,
 #include <alpha/mcbus/mcbusvar.h>
 #include <alpha/pci/mcpciareg.h>
 #include <alpha/pci/mcpciavar.h>
-#include <machine/logout.h>
-
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
-#include <dev/ic/mlxio.h>
-#include <dev/ic/mlxvar.h>
-
-
-#include "pckbd.h"
-
-#ifndef	CONSPEED
-#define	CONSPEED	TTYDEF_SPEED
-#endif
-static int comcnrate = CONSPEED;
 
 void dec_kn300_init(void);
 void dec_kn300_cons_init(void);
@@ -88,15 +60,6 @@ static void dec_kn300_device_register(de
 static void dec_kn300_mcheck_handler
 (unsigned long, struct trapframe *, unsigned long, unsigned long);
 
-#ifdef KGDB
-#include <machine/db_machdep.h>
-
-static const char *kgdb_devlist[] = {
-	"com",
-	NULL,
-};
-#endif /* KGDB */
-
 #define	ALPHASERVER_4100	"AlphaServer 4100"
 
 const struct alpha_variation_table dec_kn300_variations[] = {
@@ -160,215 +123,43 @@ dec_kn300_init(void)
 void
 dec_kn300_cons_init(void)
 {
-	struct ctb *ctb;
 	struct mcpcia_config *ccp;
 	extern struct mcpcia_config mcpcia_console_configuration;
 
 	ccp = &mcpcia_console_configuration;
 	/* It's already initialized. */
 
-	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
-
-	switch (ctb->ctb_term_type) {
-	case CTB_PRINTERPORT:
-		/* serial console ... */
-		/*
-		 * Delay to allow PROM putchars to complete.
-		 * FIFO depth * character time,
-		 * character time = (1000000 / (defaultrate / 10))
-		 */
-		DELAY(160000000 / comcnrate);
-		if (comcnattach(&ccp->cc_iot, 0x3f8, comcnrate,
-		    COM_FREQ, COM_TYPE_NORMAL,
-		    (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8)) {
-			panic("can't init serial console");
-
-		}
-		break;
-
-	case CTB_GRAPHICS:
-#if NPCKBD > 0
-		/* display console ... */
-		/* XXX */
-		(void) pckbc_cnattach(&ccp->cc_iot, IO_KBD, KBCMDP,
-		    PCKBC_KBD_SLOT, 0);
-
-		if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
-		    CTB_TURBOSLOT_TYPE_ISA)
-			isa_display_console(&ccp->cc_iot, &ccp->cc_memt);
-		else
-			pci_display_console(&ccp->cc_iot, &ccp->cc_memt,
-			    &ccp->cc_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
-			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
-#else
-		panic("not configured to use display && keyboard console");
-#endif
-		break;
-
-	default:
-		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
-		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
-
-		panic("consinit: unknown console type %ld",
-		    ctb->ctb_term_type);
-	}
-#ifdef KGDB
-	/* Attach the KGDB device. */
-	alpha_kgdb_init(kgdb_devlist, &ccp->cc_iot);
-#endif /* KGDB */
+	pci_consinit(&ccp->cc_pc, &ccp->cc_iot, &ccp->cc_memt,
+	    &ccp->cc_iot, &ccp->cc_memt);
 }
 
 /* #define	BDEBUG	1 */
 static void
 dec_kn300_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t primarydev, pcidev, ctrlrdev;
+	static device_t primarydev;
 	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
 
-	if (b == NULL || found)
+	if (booted_device != NULL || b == NULL) {
 		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0) ||
-		    (strcasecmp(b->protocol, "RAID") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#ifdef BDEBUG
-		printf("proto:%s bus:%d slot:%d chan:%d", b->protocol,
-		    b->bus, b->slot, b->channel);
-		if (b->remote_address)
-			printf(" remote_addr:%s", b->remote_address);
-		printf(" un:%d bdt:%d", b->unit, b->boot_dev_type);
-		if (b->ctrl_dev_type)
-			printf(" cdt:%s\n", b->ctrl_dev_type);
-		else
-			printf("\n");
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted = 1;
 	}
 
 	if (primarydev == NULL) {
-		if (!device_is_a(dev, "mcpcia"))
-			return;
-		else {
+		if (device_is_a(dev, "mcpcia")) {
 			struct mcbus_dev_attach_args *ma = aux;
 
-			if (b->bus != ma->ma_mid - 4)
-				return;
-			primarydev = dev;
-#ifdef BDEBUG
-			printf("\nprimarydev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		/*
-		 * Try to find primarydev anywhere in the ancestry.  This is
-		 * necessary if the PCI bus is hidden behind a bridge.
-		 */
-		while (parent) {
-			if (parent == primarydev)
-				break;
-			parent = device_parent(parent);
-		}
-		if (!parent)
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#ifdef BDEBUG
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
-#ifdef BDEBUG
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
+			if (b->bus == ma->ma_mid - 4) {
+				primarydev = dev;
 #ifdef BDEBUG
-				printf("\nctrlrdev = %s\n", device_xname(dev));
+				printf("\nprimarydev = %s\n",
+				    device_xname(dev));
 #endif
 			}
-			return;
 		}
-	}
-
-	if (!diskboot)
 		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#ifdef BDEBUG
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
 	}
 
-	if (device_is_a(dev, "ld") && device_is_a(parent, "mlx")) {
-		/*
-		 * Argh!  The attach arguments for ld devices is not
-		 * consistent, so each supported raid controller requires
-		 * different checks.
-		 */
-		struct mlx_attach_args *mlxa = aux;
-
-		if (parent != ctrlrdev)
-			return;
-
-		if (b->unit != mlxa->mlxa_unit)
-			return;
-		/* we've found it! */
-		booted_device = dev;
-#if 0
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
-	}
+	pci_find_bootdev(primarydev, dev, aux);
 }
 
 
Index: src/sys/arch/alpha/alpha/dec_kn8ae.c
diff -u src/sys/arch/alpha/alpha/dec_kn8ae.c:1.44 src/sys/arch/alpha/alpha/dec_kn8ae.c:1.45
--- src/sys/arch/alpha/alpha/dec_kn8ae.c:1.44	Sun Mar 31 19:06:31 2024
+++ src/sys/arch/alpha/alpha/dec_kn8ae.c	Sun Mar  9 01:06:42 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: dec_kn8ae.c,v 1.44 2024/03/31 19:06:31 thorpej Exp $ */
+/* $NetBSD: dec_kn8ae.c,v 1.45 2025/03/09 01:06:42 thorpej Exp $ */
 
 /*
  * Copyright (c) 1997 by Matthew Jacob
@@ -32,16 +32,12 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: dec_kn8ae.c,v 1.44 2024/03/31 19:06:31 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dec_kn8ae.c,v 1.45 2025/03/09 01:06:42 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/lwp.h>
-#include <sys/termios.h>
-#include <sys/conf.h>
-
-#include <dev/cons.h>
 
 #include <machine/rpb.h>
 #include <machine/autoconf.h>
@@ -50,23 +46,14 @@ __KERNEL_RCSID(0, "$NetBSD: dec_kn8ae.c,
 #include <machine/alpha.h>
 #include <machine/logout.h>
 
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
-
-#include <dev/isa/isavar.h>
-#include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
-#include <dev/scsipi/scsi_all.h>
-#include <dev/scsipi/scsipi_all.h>
-#include <dev/scsipi/scsiconf.h>
-
 #include <alpha/tlsb/tlsbreg.h>
 #include <alpha/tlsb/tlsbvar.h>
 #include <alpha/tlsb/kftxxreg.h>
 #include <alpha/tlsb/kftxxvar.h>
-#define	KV(_addr)	((void *)ALPHA_PHYS_TO_K0SEG((_addr)))
 
+#define	KV(_addr)	((void *)ALPHA_PHYS_TO_K0SEG((_addr)))
 
 void dec_kn8ae_init(void);
 void dec_kn8ae_cons_init(void);
@@ -119,131 +106,29 @@ dec_kn8ae_cons_init(void)
 static void
 dec_kn8ae_device_register(device_t dev, void *aux)
 {
-	static int found, initted, diskboot, netboot;
-	static device_t primarydev, pcidev, ctrlrdev;
+	static device_t primarydev;
 	struct bootdev_data *b = bootdev_data;
-	device_t parent = device_parent(dev);
 
-	if (b == NULL || found)
+	if (booted_device != NULL || b == NULL) {
 		return;
-
-	if (!initted) {
-		diskboot = (strcasecmp(b->protocol, "SCSI") == 0);
-		netboot = (strcasecmp(b->protocol, "BOOTP") == 0) ||
-		    (strcasecmp(b->protocol, "MOP") == 0);
-#if	BDEBUG
-		printf("proto:%s bus:%d slot:%d chan:%d", b->protocol,
-		    b->bus, b->slot, b->channel);
-		if (b->remote_address)
-			printf(" remote_addr:%s", b->remote_address);
-		printf(" un:%d bdt:%d", b->unit, b->boot_dev_type);
-		if (b->ctrl_dev_type)
-			printf(" cdt:%s\n", b->ctrl_dev_type);
-		else
-			printf("\n");
-		printf("diskboot = %d, netboot = %d\n", diskboot, netboot);
-#endif
-		initted = 1;
 	}
 
 	if (primarydev == NULL) {
-		if (!device_is_a(dev, "dwlpx"))
-			return;
-		else {
+		if (device_is_a(dev, "dwlpx")) {
 			struct kft_dev_attach_args *ka = aux;
 
-			if (b->bus != ka->ka_hosenum)
-				return;
-			primarydev = dev;
-#ifdef BDEBUG
-			printf("\nprimarydev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (pcidev == NULL) {
-		if (!device_is_a(dev, "pci"))
-			return;
-		/*
-		 * Try to find primarydev anywhere in the ancestry.  This is
-		 * necessary if the PCI bus is hidden behind a bridge.
-		 */
-		while (parent) {
-			if (parent == primarydev)
-				break;
-			parent = device_parent(parent);
-		}
-		if (!parent)
-			return;
-		else {
-			struct pcibus_attach_args *pba = aux;
-
-			if ((b->slot / 1000) != pba->pba_bus)
-				return;
-	
-			pcidev = dev;
-#if	BDEBUG
-			printf("\npcidev = %s\n", device_xname(dev));
-#endif
-			return;
-		}
-	}
-
-	if (ctrlrdev == NULL) {
-		if (parent != pcidev)
-			return;
-		else {
-			struct pci_attach_args *pa = aux;
-			int slot;
-
-			slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
-			    pa->pa_device;
-			if (b->slot != slot)
-				return;
-	
-			if (netboot) {
-				booted_device = dev;
+			if (b->bus == ka->ka_hosenum) {
+				primarydev = dev;
 #ifdef BDEBUG
-				printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-				found = 1;
-			} else {
-				ctrlrdev = dev;
-#if	BDEBUG
-				printf("\nctrlrdev = %s\n", device_xname(dev));
+				printf("\nprimarydev = %s\n",
+				    device_xname(dev));
 #endif
 			}
-			return;
 		}
-	}
-
-	if (!diskboot)
 		return;
-
-	if (device_is_a(dev, "sd") ||
-	    device_is_a(dev, "st") ||
-	    device_is_a(dev, "cd")) {
-		struct scsipibus_attach_args *sa = aux;
-		struct scsipi_periph *periph = sa->sa_periph;
-		int unit;
-
-		if (device_parent(parent) != ctrlrdev)
-			return;
-
-		unit = periph->periph_target * 100 + periph->periph_lun;
-		if (b->unit != unit)
-			return;
-		if (b->channel != periph->periph_channel->chan_channel)
-			return;
-
-		/* we've found it! */
-		booted_device = dev;
-#if	BDEBUG
-		printf("\nbooted_device = %s\n", device_xname(dev));
-#endif
-		found = 1;
 	}
+
+	pci_find_bootdev(primarydev, dev, aux);
 }
 
 /*

Index: src/sys/arch/alpha/conf/files.alpha
diff -u src/sys/arch/alpha/conf/files.alpha:1.198 src/sys/arch/alpha/conf/files.alpha:1.199
--- src/sys/arch/alpha/conf/files.alpha:1.198	Wed Mar  6 13:37:35 2024
+++ src/sys/arch/alpha/conf/files.alpha	Sun Mar  9 01:06:42 2025
@@ -1,4 +1,4 @@
-# $NetBSD: files.alpha,v 1.198 2024/03/06 13:37:35 thorpej Exp $
+# $NetBSD: files.alpha,v 1.199 2025/03/09 01:06:42 thorpej Exp $
 #
 # alpha-specific configuration info
 
@@ -7,27 +7,74 @@ maxpartitions 8
 
 maxusers 8 16 64
 
+# Common Alpha system support attributes.
+define	alpha_pci_bootdev
+define	alpha_pci_consinit
+define	alpha_tc_bootdev
+
+#
 # CPU support option headers
-defflag		DEC_2000_300	# "Jensen":	2000/300 (DECpc AXP 150)
-defflag		DEC_2100_A50	# Avanti etc:	AlphaStation 400, 200, etc.
-defflag		DEC_2100_A500	# Sable etc:	AlphaServer 2100
-defflag		DEC_2100A_A500	# Lynx etc:	AlphaServer 2100A
-defflag		DEC_3000_300	# Pelican etc:	3000/300*
-defflag		DEC_3000_500	# Flamingo etc:	3000/[4-9]00*
-defflag		DEC_550		# Miata:	Personal Workstation (550)
-defflag		DEC_AXPPCI_33	# NoName:	AXPpci33, etc.
-defflag		DEC_EB164	# EB164:	AlphaPC 164
-defflag		DEC_EB64PLUS	# EB64+:	AlphaPC 64, etc.
-defflag		DEC_KN20AA	# KN20AA:	AlphaStation 500 and 600
-defflag		DEC_KN7AA	# KN7AA:	DEC 7000 and 10000
-defflag		DEC_KN8AE	# KN8AE:	AlphaServer 8200 and 8400
-defflag		DEC_KN300	# KN300:	AlphaServer 4X00
-defflag		DEC_1000	# Mikasa etc:	AlphaServer 1000
-defflag		DEC_1000A	# Corelle etc:	AlphaServer 800 and 1000A
-defflag		DEC_ALPHABOOK1	# AlphaBook1:	Tadpole/DEC AlphaBook
-defflag		DEC_EB66	# EB66:		21066 Evaluation Board
-defflag		DEC_6600	# EV6		Various EV6 Systems
-defflag		API_UP1000	# EV6		Alpha Processor, Inc. UP1000
+#
+
+# "Jensen":	2000/300 (DECpc AXP 150)
+defflag		DEC_2000_300
+
+# Avanti etc:	AlphaStation 400, 200, etc.
+defflag		DEC_2100_A50: alpha_pci_bootdev, alpha_pci_consinit
+
+# Sable etc:	AlphaServer 2100
+defflag		DEC_2100_A500: alpha_pci_bootdev, alpha_pci_consinit
+
+# Lynx etc:	AlphaServer 2100A
+defflag		DEC_2100A_A500: alpha_pci_bootdev, alpha_pci_consinit
+
+# Pelican etc:	3000/300*
+defflag		DEC_3000_300: alpha_tc_bootdev
+
+# Flamingo etc:	3000/[4-9]00*
+defflag		DEC_3000_500: alpha_tc_bootdev
+
+# Miata:	Personal Workstation (550)
+defflag		DEC_550: alpha_pci_bootdev, alpha_pci_consinit
+
+# NoName:	AXPpci33, etc.
+defflag		DEC_AXPPCI_33: alpha_pci_bootdev, alpha_pci_consinit
+
+# EB164:	AlphaPC 164
+defflag		DEC_EB164: alpha_pci_bootdev, alpha_pci_consinit
+
+# EB64+:	AlphaPC 64, etc.
+defflag		DEC_EB64PLUS: alpha_pci_bootdev, alpha_pci_consinit
+
+# KN20AA:	AlphaStation 500 and 600
+defflag		DEC_KN20AA: alpha_pci_bootdev, alpha_pci_consinit
+
+# KN7AA:	DEC 7000 and 10000
+defflag		DEC_KN7AA
+
+# KN8AE:	AlphaServer 8200 and 8400
+defflag		DEC_KN8AE: alpha_pci_bootdev
+
+# KN300:	AlphaServer 4X00
+defflag		DEC_KN300: alpha_pci_bootdev, alpha_pci_consinit
+
+# Mikasa etc:	AlphaServer 1000
+defflag		DEC_1000: alpha_pci_bootdev, alpha_pci_consinit
+
+# Corelle etc:	AlphaServer 800 and 1000A
+defflag		DEC_1000A: alpha_pci_bootdev, alpha_pci_consinit
+
+# AlphaBook1:	Tadpole/DEC AlphaBook
+defflag		DEC_ALPHABOOK1: alpha_pci_bootdev, alpha_pci_consinit
+
+# EB66:		21066 Evaluation Board
+defflag		DEC_EB66: alpha_pci_bootdev, alpha_pci_consinit
+
+# Tsunami/Titan	Tsunami/Titan EV6 workstation and server systems
+defflag		DEC_6600: alpha_pci_bootdev, alpha_pci_consinit
+
+# Nautilus	Alpha Processor, Inc. UP1000 (EV6 + AMD-751)
+defflag		API_UP1000: alpha_pci_bootdev, alpha_pci_consinit
 
 # Miscellaneous CPU-specific option headers
 defflag		FIX_UNALIGNED_VAX_FP
@@ -132,6 +179,8 @@ include "dev/tc/files.tc"
 define	tcbus	{ }			# TURBOchannel attachment
 attach	tc at tcbus
 
+file	arch/alpha/tc/tc_bootdev.c	alpha_tc_bootdev
+
 device	tcasic: tcbus
 attach	tcasic at mainbus
 file	arch/alpha/tc/tcasic.c		tcasic
@@ -346,6 +395,8 @@ file	arch/alpha/pci/pci_6600.c	dec_6600
 # PCI Bus devices
 #
 
+file	arch/alpha/pci/pci_bootdev.c	alpha_pci_bootdev
+file	arch/alpha/pci/pci_consinit.c	alpha_pci_consinit
 file	arch/alpha/pci/pci_machdep.c	pci
 file	arch/alpha/pci/agp_machdep.c	agp
 

Index: src/sys/arch/alpha/include/autoconf.h
diff -u src/sys/arch/alpha/include/autoconf.h:1.23 src/sys/arch/alpha/include/autoconf.h:1.24
--- src/sys/arch/alpha/include/autoconf.h:1.23	Mon Feb  6 02:14:13 2012
+++ src/sys/arch/alpha/include/autoconf.h	Sun Mar  9 01:06:42 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.h,v 1.23 2012/02/06 02:14:13 matt Exp $ */
+/* $NetBSD: autoconf.h,v 1.24 2025/03/09 01:06:42 thorpej Exp $ */
 
 /*
  * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@@ -110,6 +110,7 @@ struct alpha_variation_table {
 #ifdef _KERNEL
 extern struct bootdev_data *bootdev_data;
 extern struct bootinfo_kernel bootinfo;
+extern bool bootdev_is_disk, bootdev_is_net;
 
 const char *alpha_variation_name(uint64_t,
     const struct alpha_variation_table *);

Index: src/sys/arch/alpha/include/pci_machdep.h
diff -u src/sys/arch/alpha/include/pci_machdep.h:1.24 src/sys/arch/alpha/include/pci_machdep.h:1.25
--- src/sys/arch/alpha/include/pci_machdep.h:1.24	Sun Jul  4 22:36:43 2021
+++ src/sys/arch/alpha/include/pci_machdep.h	Sun Mar  9 01:06:42 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_machdep.h,v 1.24 2021/07/04 22:36:43 thorpej Exp $ */
+/* $NetBSD: pci_machdep.h,v 1.25 2025/03/09 01:06:42 thorpej Exp $ */
 
 /*
  * Copyright (c) 1996 Carnegie-Mellon University.
@@ -130,8 +130,11 @@ void	pci_intr_disestablish(pci_chipset_t
  * alpha-specific PCI functions.
  * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE.
  */
+void	pci_consinit(pci_chipset_tag_t, bus_space_tag_t, bus_space_tag_t,
+	    bus_space_tag_t, bus_space_tag_t);
 void	pci_display_console(bus_space_tag_t, bus_space_tag_t,
 	    pci_chipset_tag_t, int, int, int);
+void	pci_find_bootdev(device_t, device_t, void *);
 void	device_pci_register(device_t, void *);
 
 void	alpha_pci_intr_init(void *, bus_space_tag_t, bus_space_tag_t,

Index: src/sys/arch/alpha/include/tc_machdep.h
diff -u src/sys/arch/alpha/include/tc_machdep.h:1.8 src/sys/arch/alpha/include/tc_machdep.h:1.9
--- src/sys/arch/alpha/include/tc_machdep.h:1.8	Wed Jul 20 15:45:28 2022
+++ src/sys/arch/alpha/include/tc_machdep.h	Sun Mar  9 01:06:42 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: tc_machdep.h,v 1.8 2022/07/20 15:45:28 thorpej Exp $ */
+/* $NetBSD: tc_machdep.h,v 1.9 2025/03/09 01:06:42 thorpej Exp $ */
 
 /*
  * Copyright (c) 1994, 1995 Carnegie-Mellon University.
@@ -101,8 +101,9 @@ typedef int32_t		tc_offset_t;
  * These functions are private, and may not be called by
  * machine-independent code.
  */
-bus_space_tag_t tc_bus_mem_init(void *memv);
-void tc_dma_init(void);
+void		tc_find_bootdev(device_t, void *);
+bus_space_tag_t	tc_bus_mem_init(void *memv);
+void		tc_dma_init(void);
 
 /*
  * Address of scatter/gather SRAM on the 3000/500-series.

Added files:

Index: src/sys/arch/alpha/pci/pci_bootdev.c
diff -u /dev/null src/sys/arch/alpha/pci/pci_bootdev.c:1.1
--- /dev/null	Sun Mar  9 01:06:42 2025
+++ src/sys/arch/alpha/pci/pci_bootdev.c	Sun Mar  9 01:06:42 2025
@@ -0,0 +1,188 @@
+/* $NetBSD: pci_bootdev.c,v 1.1 2025/03/09 01:06:42 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ *  Software Distribution Coordinator  or  software.distribut...@cs.cmu.edu
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
+
+__KERNEL_RCSID(0, "$NetBSD: pci_bootdev.c,v 1.1 2025/03/09 01:06:42 thorpej Exp $");
+
+#include <sys/systm.h>
+#include <sys/device.h>
+
+#include <machine/alpha.h>
+#include <machine/autoconf.h>
+
+#include <dev/ata/atavar.h>
+#include <dev/pci/pcivar.h>
+#include <dev/scsipi/scsiconf.h>
+
+#include <dev/ic/mlxio.h>		/* XXX */
+#include <dev/ic/mlxvar.h>		/* XXX */
+
+#include <dev/i2o/i2o.h>		/* XXX */
+#include <dev/i2o/iopio.h>		/* XXX */
+#include <dev/i2o/iopvar.h>		/* XXX */
+
+#define	DPRINTF(x)	if (bootdev_debug) printf x
+
+void
+pci_find_bootdev(device_t hosedev, device_t dev, void *aux)
+{
+	static device_t pcidev, ctrlrdev;
+	struct bootdev_data *b = bootdev_data;
+	device_t parent = device_parent(dev);
+
+	if (booted_device != NULL || b == NULL) {
+		return;
+	}
+
+	if (pcidev == NULL) {
+		if (device_is_a(dev, "pci")) {
+			struct pcibus_attach_args *pba = aux;
+
+			/*
+			 * If a hose device was specified, ensure that
+			 * this PCI instance has that device as an ancestor.
+			 */
+			if (hosedev) {
+				while (parent) {
+					if (parent == hosedev) {
+						break;
+					}
+					parent = device_parent(parent);
+				}
+				if (!parent) {
+					return;
+				}
+			}
+			if ((b->slot / 1000) == pba->pba_bus) {
+				pcidev = dev;
+				DPRINTF(("\npcidev = %s\n", device_xname(dev)));
+			}
+		}
+		return;
+	}
+
+	if (ctrlrdev == NULL) {
+		if (parent == pcidev) {
+			struct pci_attach_args *pa = aux;
+			int slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
+			    pa->pa_device;
+
+			if (b->slot == slot) {
+				if (bootdev_is_net) {
+					goto foundit;
+				} else {
+					ctrlrdev = dev;
+					DPRINTF(("\nctrlrdev = %s\n",
+					    device_xname(dev)));
+				}
+			}
+		}
+		return;
+	}
+
+	if (!bootdev_is_disk) {
+		return;
+	}
+
+	if (device_is_a(dev, "sd") ||
+	    device_is_a(dev, "st") ||
+	    device_is_a(dev, "cd")) {
+		struct scsipibus_attach_args *sa = aux;
+		struct scsipi_periph *periph = sa->sa_periph;
+		int unit;
+
+		if (device_parent(parent) != ctrlrdev) {
+			return;
+		}
+
+		unit = periph->periph_target * 100 + periph->periph_lun;
+		if (b->unit != unit ||
+		    b->channel != periph->periph_channel->chan_channel) {
+			return;
+		}
+		goto foundit;
+	}
+
+	if (device_is_a(dev, "wd")) {
+		struct ata_device *adev = aux;
+
+		if (!device_is_a(parent, "atabus")) {
+			return;
+		}
+		if (device_parent(parent) != ctrlrdev) {
+			return;
+		}
+
+		DPRINTF(("\natapi info: drive %d, channel %d\n",
+		    adev->adev_drv_data->drive, adev->adev_channel));
+		DPRINTF(("bootdev info: unit: %d, channel: %d\n",
+		    b->unit, b->channel));
+		if (b->unit != adev->adev_drv_data->drive ||
+		    b->channel != adev->adev_channel) {
+			return;
+		}
+		goto foundit;
+	}
+
+	if (device_is_a(dev, "ld")) {
+		/*
+		 * XXX Attach arguments for ld devices is not consistent,
+		 * XXX so we have to special-case each supported RAID
+		 * XXX controller.
+		 */
+		if (parent != ctrlrdev) {
+			return;
+		}
+
+		if (device_is_a(parent, "mlx")) {
+			struct mlx_attach_args *mlxa = aux;
+
+			if (b->unit != mlxa->mlxa_unit) {
+				return;
+			}
+			goto foundit;
+		}
+
+		if (device_is_a(parent, "iop")) {
+			struct iop_attach_args *iopa = aux;
+
+			if (b->unit != iopa->ia_tid) {
+				return;
+			}
+			goto foundit;
+		}
+	}
+
+	return;
+
+ foundit:
+	booted_device = dev;
+	DPRINTF(("\nbooted_device = %s\n", device_xname(dev)));
+}
Index: src/sys/arch/alpha/pci/pci_consinit.c
diff -u /dev/null src/sys/arch/alpha/pci/pci_consinit.c:1.1
--- /dev/null	Sun Mar  9 01:06:42 2025
+++ src/sys/arch/alpha/pci/pci_consinit.c	Sun Mar  9 01:06:42 2025
@@ -0,0 +1,136 @@
+/* $NetBSD: pci_consinit.c,v 1.1 2025/03/09 01:06:42 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ *  Software Distribution Coordinator  or  software.distribut...@cs.cmu.edu
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include "opt_kgdb.h"
+
+#include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
+
+__KERNEL_RCSID(0, "$NetBSD: pci_consinit.c,v 1.1 2025/03/09 01:06:42 thorpej Exp $");
+
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/termios.h>
+#include <sys/time.h>
+#include <sys/bus.h>
+
+#include <machine/rpb.h>
+#include <machine/autoconf.h>
+
+#include <dev/ic/comreg.h>
+#include <dev/ic/comvar.h>
+
+#include <dev/ic/i8042reg.h>
+#include <dev/ic/pckbcvar.h>
+
+#include <dev/isa/isareg.h>
+#include <dev/isa/isavar.h>
+
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+
+#include "pckbd.h"
+
+#ifndef CONSPEED
+#define	CONSPEED	TTYDEF_SPEED
+#endif
+static int comcnrate = CONSPEED;
+
+#ifdef KGDB
+#include <machine/db_machdep.h>
+
+static const char *kgdb_devlist[] = {
+	"com",
+	NULL,
+};
+#endif /* KGDB */
+
+void
+pci_consinit(pci_chipset_tag_t disp_pc,
+    bus_space_tag_t disp_iot, bus_space_tag_t disp_memt,
+    bus_space_tag_t isa_iot, bus_space_tag_t isa_memt)
+{
+	const struct ctb *ctb;
+
+	ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
+
+	switch (ctb->ctb_term_type) {
+	case CTB_PRINTERPORT:
+		/* serial console ... */
+		/* XXX */
+		/*
+		 * Delay to allow PROM putchars to complete.
+		 * FIFO depth * character time,
+		 * character time = (1000000 / (defaultrate / 10))
+		 */
+		DELAY(160000000 / comcnrate);
+
+		if (comcnattach(isa_iot, 0x3f8, comcnrate, COM_FREQ,
+				COM_TYPE_NORMAL,
+				(TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8)) {
+			panic("can't init serial console");
+		}
+		break;
+
+	case CTB_GRAPHICS:
+#if NPCKBD > 0
+		/* display console ... */
+		/* XXX */
+		(void) pckbc_cnattach(isa_iot, IO_KBD, KBCMDP,
+		    PCKBC_KBD_SLOT, 0);
+
+		switch (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot)) {
+		case CTB_TURBOSLOT_TYPE_ISA:
+		case CTB_TURBOSLOT_TYPE_EISA:
+			isa_display_console(isa_iot, isa_memt);
+			break;
+
+		case CTB_TURBOSLOT_TYPE_PCI:
+		default:
+			pci_display_console(disp_iot, disp_memt, disp_pc,
+			    CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
+			    CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
+			break;
+		}
+#else
+		panic("not configured to use display && keyboard console");
+#endif
+		break;
+
+	default:
+		printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
+		printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
+
+		panic("%s: unknown console type %ld", __func__,
+		    ctb->ctb_term_type);
+	}
+#ifdef KGDB
+	/* Attach the KGDB device. */
+	alpha_kgdb_init(kgdb_devlist, isa_iot);
+#endif /* KGDB */
+}

Index: src/sys/arch/alpha/tc/tc_bootdev.c
diff -u /dev/null src/sys/arch/alpha/tc/tc_bootdev.c:1.1
--- /dev/null	Sun Mar  9 01:06:42 2025
+++ src/sys/arch/alpha/tc/tc_bootdev.c	Sun Mar  9 01:06:42 2025
@@ -0,0 +1,152 @@
+/* $NetBSD: tc_bootdev.c,v 1.1 2025/03/09 01:06:42 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1995, 1996 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ *  Software Distribution Coordinator  or  software.distribut...@cs.cmu.edu
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
+
+__KERNEL_RCSID(0, "$NetBSD: tc_bootdev.c,v 1.1 2025/03/09 01:06:42 thorpej Exp $");
+
+#include <sys/systm.h>
+#include <sys/device.h>
+
+#include <machine/alpha.h>
+#include <machine/autoconf.h>
+#include <machine/rpb.h>
+
+#include <dev/scsipi/scsiconf.h>
+
+#include <dev/tc/tcvar.h>
+#include <dev/tc/tcdsvar.h>
+
+#define	DPRINTF(x)	if (bootdev_debug) printf x
+
+static inline int
+tc_ioasic_slot(void)
+{
+	/* 5 on 3000/300, 7 on everything else. */
+	return cputype == ST_DEC_3000_300 ? 5 : 7;
+}
+
+void
+tc_find_bootdev(device_t dev, void *aux)
+{
+	static device_t scsidev, tcdsdev;
+	struct bootdev_data *b = bootdev_data;
+	device_t parent = device_parent(dev);
+
+	if (booted_device != NULL || b == NULL) {
+		return;
+	}
+
+	/*
+	 * For SCSI boot, we look for "tcds", make sure it has the
+	 * right slot number, then find the "asc" on this tcds that
+	 * has the right channel.  Then we find the actual SCSI
+	 * device we came from.  NOTE: No SCSI LUN support (yet).
+	 */
+	if (bootdev_is_disk) {
+		if (tcdsdev == NULL) {
+			if (device_is_a(dev, "tcds")) {
+				struct tc_attach_args *tcargs = aux;
+
+				if (b->slot == tcargs->ta_slot) {
+					tcdsdev = dev;
+					DPRINTF(("\ntcdsdev = %s\n",
+					    device_xname(dev)));
+				}
+			}
+			return;
+		}
+		if (scsidev == NULL) {
+			if (device_is_a(dev, "asc")) {
+				struct tcdsdev_attach_args *ta = aux;
+
+				if (parent == tcdsdev &&
+				    b->channel == ta->tcdsda_chip) {
+					scsidev = dev;
+					DPRINTF(("\nscsidev = %s\n",
+					    device_xname(dev)));
+				}
+			}
+			return;
+		}
+		if (device_is_a(dev, "sd") ||
+		    device_is_a(dev, "st") ||
+		    device_is_a(dev, "cd")) {
+			struct scsipibus_attach_args *sa = aux;
+
+			if (device_parent(parent) != scsidev ||
+			    b->unit / 100 != sa->sa_periph->periph_target) {
+				return;
+			}
+
+			/* XXX LUN */
+
+			switch (b->boot_dev_type) {
+			case 0:
+				if (!device_is_a(dev, "sd") &&
+				    !device_is_a(dev, "cd")) {
+					return;
+				}
+				break;
+
+			case 1:
+				if (!device_is_a(dev, "st")) {
+					return;
+				}
+				break;
+
+			default:
+				return;
+			}
+			goto foundit;
+		}
+	}
+
+	if (bootdev_is_net) {
+		if (device_is_a(dev, "le") &&
+		    device_is_a(parent, "ioasic") &&
+		    b->slot == tc_ioasic_slot()) {
+			/*
+			 * No need to check ioasic_attach_args, since only
+			 * one le on ioasic.
+			 */
+			goto foundit;
+		}
+
+		/*
+		 * XXX GENERIC SUPPORT FOR TC NETWORK BOARDS
+		 */
+	}
+
+	return;
+
+ foundit:
+	booted_device = dev;
+	DPRINTF(("\nbooted_device = %s\n", device_xname(dev)));
+}

Reply via email to