purge x68k_config_found()

Tetsuya Isaki <[email protected]> Wed, 31 Dec 2008 22:48:19 +0900
Newsgroups gmane.os.netbsd.ports.x68k
Message-ID <[email protected]>
Please review the following patch.

I purge x68k_config_found() on config_console() in
sys/arch/x68k/x68k/autoconf.c to simplify consinit routine
in x68k.  And it is used to split device_t/softc of the
rest of devices in the next step.

Before this patch, config_console() tracks special device
tree like mainbus -> grfbus -> grf -> ite and
mainbus -> intio -> mfp to only initialize grf, ite, mfp.
It is difficult to understand.  And then, x68k_config_found()
emulates 'struct device'.  It is not a good way.

In this patch, config_console() does not track the tree but
calls each initialization function directly. For example,
initalizing mfp part is mfp_config_console().  I think
it's easy way, easy to read.

Are there any comments?
I'll commit it one or two weeks later, if there are no comments.
---
Tetsuya Isaki <[email protected] / [email protected]>

Index: sys/arch/x68k/dev/grf_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/dev/grf_machdep.c,v
retrieving revision 1.27
diff -u -r1.27 grf_machdep.c
--- sys/arch/x68k/dev/grf_machdep.c	4 Mar 2007 06:01:06 -0000	1.27
+++ sys/arch/x68k/dev/grf_machdep.c	31 Dec 2008 13:39:47 -0000
@@ -90,17 +90,11 @@
 #include <sys/systm.h>
 #include <sys/device.h>
 
+#include <machine/autoconf.h>
 #include <machine/grfioctl.h>
 #include <x68k/dev/grfvar.h>
 #include <x68k/x68k/iodevice.h>
 
-/*
- * false when initing for the console.
- */
-extern int x68k_realconfig;
-extern int x68k_config_found(struct cfdata *, struct device *,
-			     void *, cfprint_t);
-
 /* grfbus: is this necessary? */
 int grfbusprint(void *auxp, const char *);
 int grfbusmatch(struct device *, struct cfdata *, void *);
@@ -120,12 +114,6 @@
 CFATTACH_DECL(grf, sizeof(struct grf_softc),
     grfmatch, grfattach, NULL, NULL);
 
-/*
- * only used in console init.
- */
-static struct cfdata *cfdata_gbus;
-static struct cfdata *cfdata_grf;
-
 extern struct cfdriver grfbus_cd;
 
 int
@@ -134,30 +122,15 @@
 	if (strcmp(auxp, grfbus_cd.cd_name))
 		return (0);
 
-	if ((x68k_realconfig == 0) || (cfdata_gbus == NULL)) {
-
-		/*
-		 * Probe layers we depend on
-		 */
-		if (x68k_realconfig == 0) {
-			cfdata_gbus = cfp;
-		}
-	}
 	return (1);
 }
 
 void
 grfbusattach(struct device *pdp, struct device *dp, void *auxp)
 {
-	int i;
 
-	if (dp == NULL) {
-		i = 0;
-		x68k_config_found(cfdata_gbus, NULL, &i, grfbusprint);
-	} else {
-		printf("\n");
-		config_search_ia(grfbussearch, dp, "grfb", NULL);
-	}
+	printf("\n");
+	config_search_ia(grfbussearch, dp, "grfb", NULL);
 }
 
 int
@@ -187,19 +160,13 @@
 	int addr;
 
 	addr = cfp->cf_loc[GRFBCF_ADDR];
-	if (x68k_realconfig == 0) {
-		if (addr != 0)
-			return 0;
-		cfdata_grf = cfp;
-	}
-
 	if (addr < 0 || addr > ngrfsw)
 		return 0;
 
 	return 1;
 }
 
-static struct grf_softc	congrf;
+struct grf_softc congrf;
 
 void
 grfattach(struct device *parent, struct device *dp, void *aux)
@@ -208,16 +175,6 @@
 	struct cfdata *cf;
 	int addr;
 
-	/*
-	 * Handle exeption case: early console init
-	 */
-	if (dp == NULL) {
-		/* Attach console ite */
-		grfinit(&congrf, 0);
-		x68k_config_found(cfdata_grf, NULL, &congrf, grfprint);
-		return;
-	}
-
 	cf = device_cfdata(dp);
 	addr = cf->cf_loc[GRFBCF_ADDR];
 	grfinit(dp, addr);
@@ -268,3 +225,9 @@
 
 	return 0;
 }
+
+void
+grf_config_console(void)
+{
+	grfinit(&congrf, 0);
+}
Index: sys/arch/x68k/dev/intio.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/dev/intio.c,v
retrieving revision 1.38
diff -u -r1.38 intio.c
--- sys/arch/x68k/dev/intio.c	18 Dec 2008 05:56:42 -0000	1.38
+++ sys/arch/x68k/dev/intio.c	31 Dec 2008 13:39:48 -0000
@@ -134,11 +134,6 @@
 	struct evcnt		*iiv_evcnt;
 } iiv[256] = {{0,},};
 
-/* used in console initialization */
-extern int x68k_realconfig;
-int x68k_config_found(struct cfdata *, struct device *, void *, cfprint_t);
-static cfdata_t cfdata_intiobus = NULL;
-
 #ifdef DEBUG
 int intio_debug = 0;
 #endif
@@ -151,38 +146,16 @@
 		return (0);
 	if (intio_attached)
 		return (0);
-	if (x68k_realconfig == 0)
-		cfdata_intiobus = cf; /* XXX */
 
 	return (1);
 }
 
-
-/* used in console initialization: configure only MFP */
-static struct intio_attach_args initial_ia = {
-	&intio_bus,
-	0/*XXX*/,
-
-	"mfp",			/* ia_name */
-	MFP_ADDR,		/* ia_addr */
-	0x30,			/* ia_size */
-	MFP_INTR,		/* ia_intr */
-	-1			/* ia_dma */
-	-1,			/* ia_dmaintr */
-};
-
 static void
 intio_attach(device_t parent, device_t self, void *aux)
 {
 	struct intio_softc *sc = device_private(self);
 	struct intio_attach_args ia;
 
-	if (self == NULL) {
-		/* console only init */
-		x68k_config_found(cfdata_intiobus, NULL, &initial_ia, NULL);
-		return;
-	}
-
 	intio_attached = 1;
 
 	aprint_normal(" mapped at %8p\n", intiobase);
Index: sys/arch/x68k/dev/ite.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/dev/ite.c,v
retrieving revision 1.55
diff -u -r1.55 ite.c
--- sys/arch/x68k/dev/ite.c	13 Jun 2008 13:57:58 -0000	1.55
+++ sys/arch/x68k/dev/ite.c	31 Dec 2008 13:39:49 -0000
@@ -106,6 +106,7 @@
 #include <machine/cpu.h>
 #include <machine/kbio.h>
 #include <machine/bus.h>
+#include <machine/autoconf.h>
 #include <machine/grfioctl.h>
 #include <machine/iteioctl.h>
 
@@ -229,37 +230,29 @@
 	struct grf_softc *gp;
 
 	gp = (struct grf_softc *)auxp;
-	if (dp) {
-		ip = (struct ite_softc *)dp;
-		if(con_itesoftc.grf != NULL
-			/*&& con_itesoftc.grf->g_unit == gp->g_unit*/) {
-			/*
-			 * console reinit copy params over.
-			 * and console always gets keyboard
-			 */
-			memcpy(&ip->grf, &con_itesoftc.grf,
-			    (char *)&ip[1] - (char *)&ip->grf);
-			con_itesoftc.grf = NULL;
-			kbd_ite = ip;
-		}
-		ip->grf = gp;
-		iteinit(device_unit(&ip->device)); /* XXX */
-		printf(": rows %d cols %d", ip->rows, ip->cols);
-		if (kbd_ite == NULL)
-			kbd_ite = ip;
-		printf("\n");
-	} else {
-		if (con_itesoftc.grf != NULL)
-			return;
-		con_itesoftc.grf = gp;
-		con_itesoftc.tabs = cons_tabs;
-	}
+	ip = (struct ite_softc *)dp;
+	if(con_itesoftc.grf != NULL
+		/*&& con_itesoftc.grf->g_unit == gp->g_unit*/) {
+		/*
+		 * console reinit copy params over.
+		 * and console always gets keyboard
+		 */
+		memcpy(&ip->grf, &con_itesoftc.grf,
+		    (char *)&ip[1] - (char *)&ip->grf);
+		con_itesoftc.grf = NULL;
+		kbd_ite = ip;
+	}
+	ip->grf = gp;
+	iteinit(device_unit(&ip->device)); /* XXX */
+	printf(": rows %d cols %d", ip->rows, ip->cols);
+	if (kbd_ite == NULL)
+		kbd_ite = ip;
+	printf("\n");
 }
 
 struct ite_softc *
 getitesp(dev_t dev)
 {
-	extern int x68k_realconfig;
 
 	if (x68k_realconfig && con_itesoftc.grf == NULL)
 		return device_lookup_private(&ite_cd, UNIT(dev));
@@ -294,6 +287,17 @@
 	ip->flags |= ITE_INITED;
 }
 
+void
+ite_config_console(void)
+{
+	struct grf_softc *gp = &congrf;
+
+	if (con_itesoftc.grf != NULL)
+		return;
+	con_itesoftc.grf = gp;
+	con_itesoftc.tabs = cons_tabs;
+}
+
 /*
  * Perform functions necessary to setup device as a terminal emulator.
  */
Index: sys/arch/x68k/dev/mfp.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/dev/mfp.c,v
retrieving revision 1.21
diff -u -r1.21 mfp.c
--- sys/arch/x68k/dev/mfp.c	31 Dec 2008 08:00:31 -0000	1.21
+++ sys/arch/x68k/dev/mfp.c	31 Dec 2008 13:39:49 -0000
@@ -51,6 +51,7 @@
 
 #include <machine/bus.h>
 #include <machine/cpu.h>
+#include <machine/autoconf.h>
 
 #include <arch/x68k/dev/intiovar.h>
 #include <arch/x68k/dev/mfp.h>
@@ -97,33 +98,22 @@
 {
 	struct mfp_softc *sc = (struct mfp_softc *)self;
 	struct intio_attach_args *ia = aux;
+	int r;
 
-	mfp_init();
+	printf("\n");
+	mfp_attached = 1;
 
-	if (sc != NULL) {
-		/* realconfig */
-		int r;
-
-		printf("\n");
-
-		mfp_attached = 1;
-		sc->sc_bst = ia->ia_bst;
-		sc->sc_intr = ia->ia_intr;
-		ia->ia_size = 0x30;
-		r = intio_map_allocate_region(parent, ia, INTIO_MAP_ALLOCATE);
+	mfp_init();
+	sc->sc_bst = ia->ia_bst;
+	sc->sc_intr = ia->ia_intr;
+	ia->ia_size = 0x30;
+	r = intio_map_allocate_region(parent, ia, INTIO_MAP_ALLOCATE);
 #ifdef DIAGNOSTIC
-		if (r)
-			panic("IO map for MFP corruption??");
+	if (r)
+		panic("IO map for MFP corruption??");
 #endif
-		bus_space_map(ia->ia_bst, ia->ia_addr, 0x2000, 0, &sc->sc_bht);
-		config_search_ia(mfp_search, self, "mfp", NULL);
-	} else {
-		/*
-		 * Called from config_console;
-		 * calibrate the DELAY loop counter
-		 */
-		mfp_calibrate_delay();
-	}
+	bus_space_map(ia->ia_bst, ia->ia_addr, 0x2000, 0, &sc->sc_bht);
+	config_search_ia(mfp_search, self, "mfp", NULL);
 }
 
 static int
@@ -134,6 +124,13 @@
 	return 0;
 }
 
+void
+mfp_config_console(void)
+{
+	mfp_init();
+	mfp_calibrate_delay();
+}
+
 static void
 mfp_init(void)
 {
Index: sys/arch/x68k/include/cpu.h
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/include/cpu.h,v
retrieving revision 1.47
diff -u -r1.47 cpu.h
--- sys/arch/x68k/include/cpu.h	18 Dec 2008 05:56:42 -0000	1.47
+++ sys/arch/x68k/include/cpu.h	31 Dec 2008 13:39:49 -0000
@@ -188,9 +188,6 @@
 extern char *intiobase;
 extern char *intiolimit;
 
-/* autoconf.c functions */
-void	config_console(void);
-
 /* fpu.c functions */
 int	fpu_probe(void);
 
Index: sys/arch/x68k/x68k/autoconf.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/x68k/autoconf.c,v
retrieving revision 1.59
diff -u -r1.59 autoconf.c
--- sys/arch/x68k/x68k/autoconf.c	21 Dec 2008 09:35:49 -0000	1.59
+++ sys/arch/x68k/x68k/autoconf.c	31 Dec 2008 13:39:49 -0000
@@ -45,14 +45,13 @@
 #include <sys/disklabel.h>
 #include <machine/cpu.h>
 #include <machine/bootinfo.h>
+#include <machine/autoconf.h>
 
 #include <dev/scsipi/scsi_all.h>
 #include <dev/scsipi/scsipi_all.h>
 #include <dev/scsipi/scsiconf.h>
 
 static void findroot(void);
-int x68k_config_found(struct cfdata *, struct device *, void *, cfprint_t);
-
 static struct device *scsi_find(dev_t);
 
 int x68k_realconfig;
@@ -83,62 +82,12 @@
 	setroot(booted_device, booted_partition);
 }
 
-/*
- * use config_search_ia to find appropriate device, then call that device
- * directly with NULL device variable storage.  A device can then
- * always tell the difference between the real and console init
- * by checking for NULL.
- */
-int
-x68k_config_found(struct cfdata *pcfp, struct device *pdp, void *auxp,
-    cfprint_t pfn)
-{
-	struct device temp;
-	struct cfdata *cf;
-	const struct cfattach *ca;
-
-	if (x68k_realconfig)
-		return(config_found(pdp, auxp, pfn) != NULL);
-
-	if (pdp == NULL)
-		pdp = &temp;
-
-	/* XXX Emulate 'struct device' of mainbus for cfparent_match() */
-	pdp->dv_cfdata = pcfp;
-	pdp->dv_cfdriver = config_cfdriver_lookup(pcfp->cf_name);
-	pdp->dv_unit = 0;
-	if ((cf = config_search_ia(NULL, pdp, NULL, auxp)) != NULL) {
-		ca = config_cfattach_lookup(cf->cf_name, cf->cf_atname);
-		if (ca != NULL) {
-			(*ca->ca_attach)(pdp, NULL, auxp);
-			pdp->dv_cfdata = NULL;
-			return(1);
-		}
-	}
-	pdp->dv_cfdata = NULL;
-	return(0);
-}
-
-/*
- * this function needs to get enough configured to do a console
- * basically this means start attaching the grfxx's that support
- * the console. Kinda hacky but it works.
- */
 void
 config_console(void)
 {	
-	struct cfdata *cf;
-
-	config_init();
-
-	/*
-	 * we need mainbus' cfdata.
-	 */
-	cf = config_rootsearch(NULL, "mainbus", NULL);
-	if (cf == NULL)
-		panic("no mainbus");
-	x68k_config_found(cf, NULL, __UNCONST("intio"), NULL);
-	x68k_config_found(cf, NULL, __UNCONST("grfbus"), NULL);
+	mfp_config_console();
+	grf_config_console();
+	ite_config_console();
 }
 
 dev_t	bootdev = 0;
Index: sys/arch/x68k/x68k/iodevice.h
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/x68k/iodevice.h,v
retrieving revision 1.16
diff -u -r1.16 iodevice.h
--- sys/arch/x68k/x68k/iodevice.h	18 Dec 2008 05:56:42 -0000	1.16
+++ sys/arch/x68k/x68k/iodevice.h	31 Dec 2008 13:39:50 -0000
@@ -357,13 +357,3 @@
 #if defined(_KERNEL) && !defined(LOCORE)
 extern volatile struct IODEVICE *IODEVbase;
 #endif
-
-#if 0
-/*
- * devices that need to configure before console use this
- * *and know it* (i.e. everything is really tight certain params won't be
- * passed in some cases and the devices will deal with it)
- */
-#include <sys/device.h>
-int x68k_config_found(struct cfdata *, struct device *, void *, cfprint_t);
-#endif
Index: sys/arch/x68k/x68k/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/x68k/machdep.c,v
retrieving revision 1.154
diff -u -r1.154 machdep.c
--- sys/arch/x68k/x68k/machdep.c	30 Nov 2008 18:21:36 -0000	1.154
+++ sys/arch/x68k/x68k/machdep.c	31 Dec 2008 13:39:50 -0000
@@ -139,6 +139,7 @@
 #include <sys/device.h>
 
 #include <machine/bus.h>
+#include <machine/autoconf.h>
 #include <arch/x68k/dev/intiovar.h>
 
 void initcpu(void);
--- /dev/null	2008-12-31 22:39:23.000000000 +0900
+++ sys/arch/x68k/include/autoconf.h	2008-12-31 22:32:13.000000000 +0900
@@ -0,0 +1,43 @@
+/* $NetBSD$ */
+
+/*
+ * Copyright (c) 2008 Tetsuya Isaki. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _X68K_AUTOCONF_H_
+#define _X68K_AUTOCONF_H_
+
+extern void config_console(void);
+extern void mfp_config_console(void);
+extern void grf_config_console(void);
+extern void ite_config_console(void);
+
+extern int  x68k_realconfig;	/* XXX should be removed ? */
+
+struct grf_softc;
+extern struct grf_softc congrf;	/* XXX Hmm... */
+
+#endif /* !_X68K_AUTOCONF_H_ */