Module Name:    src
Committed By:   thorpej
Date:           Sun Jan 28 17:31:40 UTC 2024

Modified Files:
        src/sys/arch/hp300/dev: intio.c intiovar.h

Log Message:
Rather than having different "builtin" tables (3xx, 362, 382, 4xx),
just have a single "builtin" table with a mask indicating which of
those groups of machines have a particular built-in device.


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/hp300/dev/intio.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/hp300/dev/intiovar.h

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/hp300/dev/intio.c
diff -u src/sys/arch/hp300/dev/intio.c:1.31 src/sys/arch/hp300/dev/intio.c:1.32
--- src/sys/arch/hp300/dev/intio.c:1.31	Sat Aug  7 16:18:53 2021
+++ src/sys/arch/hp300/dev/intio.c	Sun Jan 28 17:31:40 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: intio.c,v 1.31 2021/08/07 16:18:53 thorpej Exp $	*/
+/*	$NetBSD: intio.c,v 1.32 2024/01/28 17:31:40 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1998, 2001 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intio.c,v 1.31 2021/08/07 16:18:53 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intio.c,v 1.32 2024/01/28 17:31:40 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -60,47 +60,53 @@ CFATTACH_DECL_NEW(intio, sizeof(struct i
 #if defined(HP320) || defined(HP330) || defined(HP340) || defined(HP345) || \
     defined(HP350) || defined(HP360) || defined(HP370) || defined(HP375) || \
     defined(HP380) || defined(HP385)
-static const struct intio_builtins intio_3xx_builtins[] = {
-	{ "rtc",	RTC_BASE,	-1},
-	{ "hil",	HIL_BASE,	1},
-	{ "hpib",	HPIB_BASE,	3},
-	{ "dma",	DMA_BASE,	1},
-	{ "fb",		FB_BASE,	-1},
-};
-#define nintio_3xx_builtins	__arraycount(intio_3xx_builtins)
+#define	HAVE_INTIO_FB
 #endif
 
-#if defined(HP362)
-static const struct intio_builtins intio_362_builtins[] = {
-	{ "rtc",	RTC_BASE,	-1},
-	{ "hil",	HIL_BASE,	1},
-	{ "hpib",	HPIB_BASE,	3},
-	{ "dma",	DMA_BASE,	1},
-};
-#define nintio_362_builtins	__arraycount(intio_362_builtins)
+#if defined(HP382) || defined(HP400) || defined(HP425) || defined(HP433)
+#define	HAVE_INTIO_FRODO
 #endif
 
-#if defined(HP382)
-static const struct intio_builtins intio_382_builtins[] = {
-	{ "rtc",	RTC_BASE,	-1},
-	{ "frodo",	FRODO_BASE,	5},
-	{ "hil",	HIL_BASE,	1},
-	{ "hpib",	HPIB_BASE,	3},
-	{ "dma",	DMA_BASE,	1},
-};
-#define nintio_382_builtins	__arraycount(intio_382_builtins)
+#define	INTIO_3xx_BUILTINS						\
+	(__BIT(HP_320) | __BIT(HP_330) | __BIT(HP_340) ||		\
+	 __BIT(HP_345) | __BIT(HP_345) | __BIT(HP_350) ||		\
+	 __BIT(HP_360) | __BIT(HP_370) | __BIT(HP_375) ||		\
+	 __BIT(HP_380) | __BIT(HP_385))
+
+#define	INTIO_362_BUILTINS	__BIT(HP_362)
+#define	INTIO_382_BUILTINS	__BIT(HP_382)
+
+#define	INTIO_4xx_BUILTINS						\
+	(__BIT(HP_400) | __BIT(HP_425) | __BIT(HP_433))
+
+#define	INTIO_ALL_BUILTINS						\
+	(INTIO_3xx_BUILTINS | INTIO_362_BUILTINS |			\
+	 INTIO_382_BUILTINS | INTIO_4xx_BUILTINS)
+
+static const struct intio_builtins intio_builtins[] = {
+	{ "rtc",	RTC_BASE,	-1,
+	  INTIO_ALL_BUILTINS },
+
+#ifdef HAVE_INTIO_FRODO
+	{ "frodo",	FRODO_BASE,	5,
+	  INTIO_382_BUILTINS | INTIO_4xx_BUILTINS },
 #endif
 
-#if defined(HP400) || defined(HP425) || defined(HP433)
-static const struct intio_builtins intio_4xx_builtins[] = {
-	{ "rtc",	RTC_BASE,	-1},
-	{ "frodo",	FRODO_BASE,	5},
-	{ "hil",	HIL_BASE,	1},
-	{ "hpib",	HPIB_BASE,	3},
-	{ "dma",	DMA_BASE,	1},
-};
-#define nintio_4xx_builtins	__arraycount(intio_4xx_builtins)
+	{ "hil",	HIL_BASE,	1,
+	  INTIO_ALL_BUILTINS },
+
+	{ "hpib",	HPIB_BASE,	3,
+	  INTIO_ALL_BUILTINS },
+
+	{ "dma",	DMA_BASE,	1,
+	  INTIO_ALL_BUILTINS },
+
+#ifdef HAVE_INTIO_FB
+	{ "fb",		FB_BASE,	-1,
+	  INTIO_3xx_BUILTINS },
 #endif
+};
+#define	nintio_builtins		__arraycount(intio_builtins)
 
 static int intio_matched = 0;
 extern void *internalhpib;
@@ -122,76 +128,43 @@ intioattach(device_t parent, device_t se
 {
 	struct intio_softc *sc = device_private(self);
 	struct intio_attach_args ia;
-	const struct intio_builtins *ib;
 	bus_space_tag_t bst = &sc->sc_tag;
-	int ndevs;
+	const uint32_t spumask = 1U << machineid;
 	int i;
 
 	sc->sc_dev = self;
 	aprint_normal("\n");
 
+	KASSERT(spumask != 0);
+
 	memset(bst, 0, sizeof(struct bus_space_tag));
 	bst->bustype = HP300_BUS_SPACE_INTIO;
 
-	switch (machineid) {
-#if defined(HP320) || defined(HP330) || defined(HP340) || defined(HP345) || \
-    defined(HP350) || defined(HP360) || defined(HP370) || defined(HP375) || \
-    defined(HP380) || defined(HP385)
-	case HP_320:
-	case HP_330:
-	case HP_340:
-	case HP_345:
-	case HP_350:
-	case HP_360:
-	case HP_370:
-	case HP_375:
-	case HP_380:
-	case HP_385:
-		ib = intio_3xx_builtins;
-		ndevs = nintio_3xx_builtins;
-		break;
-#endif
-#if defined(HP362)
-	case HP_362:
-		ib = intio_362_builtins;
-		ndevs = nintio_362_builtins;
-		break;
-#endif
-#if defined(HP382)
-	case HP_382:
-		ib = intio_382_builtins;
-		ndevs = nintio_382_builtins;
-		break;
-#endif
-#if defined(HP400) || defined(HP425) || defined(HP433)
-	case HP_400:
-	case HP_425:
-	case HP_433:
-		ib = intio_4xx_builtins;
-		ndevs = nintio_4xx_builtins;
-		break;
-#endif
-	default:
-		return;
-	}
-
 	memset(&ia, 0, sizeof(ia));
 
-	for (i = 0; i < ndevs; i++) {
+	for (i = 0; i < nintio_builtins; i++) {
+
+		/*
+		 * If the device doesn't exist on this specific model,
+		 * skip it.
+		 */
+		if ((intio_builtins[i].ib_spumask & spumask) == 0)
+			continue;
 
 		/*
 		 * Internal HP-IB doesn't always return a device ID,
 		 * so we rely on the sysflags.
 		 */
-		if (ib[i].ib_offset == HPIB_BASE && !internalhpib)
+		if (intio_builtins[i].ib_offset == HPIB_BASE && !internalhpib)
 			continue;
 
-		strlcpy(ia.ia_modname, ib[i].ib_modname,
+		strlcpy(ia.ia_modname, intio_builtins[i].ib_modname,
 		    sizeof(ia.ia_modname));
 		ia.ia_bst = bst;
-		ia.ia_iobase = ib[i].ib_offset;
-		ia.ia_addr = (bus_addr_t)(intiobase + ib[i].ib_offset);
-		ia.ia_ipl = ib[i].ib_ipl;
+		ia.ia_iobase = intio_builtins[i].ib_offset;
+		ia.ia_addr =
+		    (bus_addr_t)(intiobase + intio_builtins[i].ib_offset);
+		ia.ia_ipl = intio_builtins[i].ib_ipl;
 		config_found(self, &ia, intioprint, CFARGS_NONE);
 	}
 }

Index: src/sys/arch/hp300/dev/intiovar.h
diff -u src/sys/arch/hp300/dev/intiovar.h:1.14 src/sys/arch/hp300/dev/intiovar.h:1.15
--- src/sys/arch/hp300/dev/intiovar.h:1.14	Mon Aug  7 23:28:58 2023
+++ src/sys/arch/hp300/dev/intiovar.h	Sun Jan 28 17:31:40 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: intiovar.h,v 1.14 2023/08/07 23:28:58 mrg Exp $	*/
+/*	$NetBSD: intiovar.h,v 1.15 2024/01/28 17:31:40 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1998, 2001 The NetBSD Foundation, Inc.
@@ -56,6 +56,7 @@ struct intio_builtins {
 	const char *ib_modname;			/* module name */
 	bus_size_t ib_offset;			/* intio offset */
 	int ib_ipl;				/* interrupt priority level */
+	uint32_t ib_spumask;			/* which machines have it */
 };
 
 /*

Reply via email to