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_ */