diff options
author | tmm <tmm@FreeBSD.org> | 2004-04-30 19:50:51 +0000 |
---|---|---|
committer | tmm <tmm@FreeBSD.org> | 2004-04-30 19:50:51 +0000 |
commit | 54564c74e31dd64140489ef3c4c566d7b7385011 (patch) | |
tree | a4c92d07bb77a8cb48442fdeb80230d1987ca5d2 /sys/sparc64 | |
parent | 505a90cb0664166086547b419f95bcde591bdeab (diff) | |
download | FreeBSD-src-54564c74e31dd64140489ef3c4c566d7b7385011.zip FreeBSD-src-54564c74e31dd64140489ef3c4c566d7b7385011.tar.gz |
Some cleanups to the nexus code:
- Remove second license, the first was not that different and should be
fine.
- Add nexus_attach(), and do not perform its task in nexus_probe() any
more.
- Remove nexus_write_ivar(), since it was quite pointless.
- Remove superfluous devinfo members.
- Clean up some comments, minor style issues and prototypes.
Diffstat (limited to 'sys/sparc64')
-rw-r--r-- | sys/sparc64/include/nexusvar.h | 5 | ||||
-rw-r--r-- | sys/sparc64/sparc64/nexus.c | 171 |
2 files changed, 50 insertions, 126 deletions
diff --git a/sys/sparc64/include/nexusvar.h b/sys/sparc64/include/nexusvar.h index f62ebcd..dd8ebfc 100644 --- a/sys/sparc64/include/nexusvar.h +++ b/sys/sparc64/include/nexusvar.h @@ -40,11 +40,6 @@ enum nexus_ivars { NEXUS_IVAR_DMATAG, }; -/* - * Simplified accessors for nexus devices - * XXX: These should be made specializations of generic bus accessor macros - * instead of having multiple implementations around. - */ #define NEXUS_ACCESSOR(var, ivar, type) \ __BUS_ACCESSOR(nexus, var, NEXUS, ivar, type) diff --git a/sys/sparc64/sparc64/nexus.c b/sys/sparc64/sparc64/nexus.c index 2a7c348..7eece49 100644 --- a/sys/sparc64/sparc64/nexus.c +++ b/sys/sparc64/sparc64/nexus.c @@ -1,5 +1,7 @@ /* * Copyright 1998 Massachusetts Institute of Technology + * Copyright 2001 by Thomas Moestl <tmm@FreeBSD.org>. + * All rights reserved. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby @@ -12,7 +14,7 @@ * no representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. - * + * * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF @@ -25,30 +27,6 @@ * 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. - */ -/*- - * Copyright 2001 by Thomas Moestl <tmm@FreeBSD.org>. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. * * from: FreeBSD: src/sys/i386/i386/nexus.c,v 1.43 2001/02/09 * @@ -76,12 +54,9 @@ /* * The nexus (which is a pseudo-bus actually) iterates over the nodes that - * hang from the OpenFirmware root node and add them as devices to this bus + * hang from the OpenFirmware root node and adds them as devices to this bus * (except some special nodes which are excluded) so that drivers can be - * attached to them. This saves lots of detection work. - * Usually, all devices and bridges that are attached to the UltraSparc UPA - * bus will show up here, plus some pseudo-nodes which are excluded. - * For now, the only node that gets used is probably the pci bus one. + * attached to them. * * Additionally, interrupt setup/teardown and some resource management are * done at this level. @@ -102,8 +77,6 @@ struct nexus_devinfo { int ndi_nreg; u_int *ndi_interrupts; int ndi_ninterrupts; - bus_space_tag_t ndi_bustag; - bus_dma_tag_t ndi_dmatag; }; struct nexus_softc { @@ -111,37 +84,30 @@ struct nexus_softc { struct rman sc_mem_rman; }; -static int nexus_probe(device_t); -static void nexus_probe_nomatch(device_t, device_t); -static int nexus_read_ivar(device_t, device_t, int, uintptr_t *); -static int nexus_write_ivar(device_t, device_t, int, uintptr_t); -static int nexus_setup_intr(device_t, device_t, struct resource *, int, - driver_intr_t *, void *, void **); -static int nexus_teardown_intr(device_t, device_t, struct resource *, - void *); -static struct resource *nexus_alloc_resource(device_t, device_t, int, int *, - u_long, u_long, u_long, u_int); -static int nexus_activate_resource(device_t, device_t, int, int, - struct resource *); -static int nexus_deactivate_resource(device_t, device_t, int, int, - struct resource *); -static int nexus_release_resource(device_t, device_t, int, int, - struct resource *); +static device_probe_t nexus_probe; +static device_attach_t nexus_attach; +static bus_probe_nomatch_t nexus_probe_nomatch; +static bus_read_ivar_t nexus_read_ivar; +static bus_setup_intr_t nexus_setup_intr; +static bus_teardown_intr_t nexus_teardown_intr; +static bus_alloc_resource_t nexus_alloc_resource; +static bus_activate_resource_t nexus_activate_resource; +static bus_deactivate_resource_t nexus_deactivate_resource; +static bus_release_resource_t nexus_release_resource; static device_method_t nexus_methods[] = { /* Device interface */ DEVMETHOD(device_probe, nexus_probe), - DEVMETHOD(device_attach, bus_generic_attach), + DEVMETHOD(device_attach, nexus_attach), DEVMETHOD(device_detach, bus_generic_detach), DEVMETHOD(device_shutdown, bus_generic_shutdown), DEVMETHOD(device_suspend, bus_generic_suspend), DEVMETHOD(device_resume, bus_generic_resume), - /* Bus interface. Resource management is business of the children... */ + /* Bus interface. */ DEVMETHOD(bus_print_child, bus_generic_print_child), DEVMETHOD(bus_probe_nomatch, nexus_probe_nomatch), DEVMETHOD(bus_read_ivar, nexus_read_ivar), - DEVMETHOD(bus_write_ivar, nexus_write_ivar), DEVMETHOD(bus_setup_intr, nexus_setup_intr), DEVMETHOD(bus_teardown_intr, nexus_teardown_intr), DEVMETHOD(bus_alloc_resource, nexus_alloc_resource), @@ -200,6 +166,15 @@ nexus_inlist(char *name, char *list[]) static int nexus_probe(device_t dev) { + + /* Nexus does always match. */ + device_set_desc(dev, "OpenFirmware Nexus device"); + return (0); +} + +static int +nexus_attach(device_t dev) +{ phandle_t root; phandle_t child; device_t cdev; @@ -219,58 +194,44 @@ nexus_probe(device_t dev) rman_init(&sc->sc_mem_rman) != 0 || rman_manage_region(&sc->sc_intr_rman, 0, IV_MAX - 1) != 0 || rman_manage_region(&sc->sc_mem_rman, UPA_MEMSTART, UPA_MEMEND) != 0) - panic("nexus_probe: failed to set up rmans"); + panic("nexus_attach(): failed to set up rmans"); for (child = OF_child(root); child != 0; child = OF_peer(child)) { if (child == -1) - panic("nexus_probe(): OF_child failed."); + panic("nexus_attach(): OF_child() failed."); if (OF_getprop_alloc(child, "name", 1, (void **)&name) == -1) continue; OF_getprop_alloc(child, "device_type", 1, (void **)&type); if (NEXUS_EXCLUDED(name, type)) { free(name, M_OFWPROP); - if (type != NULL) - free(type, M_OFWPROP); + free(type, M_OFWPROP); continue; } cdev = device_add_child(dev, NULL, -1); - if (cdev != NULL) { - dinfo = malloc(sizeof(*dinfo), M_NEXUS, M_WAITOK); - dinfo->ndi_node = child; - dinfo->ndi_name = name; - dinfo->ndi_device_type = type; - OF_getprop_alloc(child, "model", 1, - (void **)&dinfo->ndi_model); - dinfo->ndi_nreg = OF_getprop_alloc(child, "reg", - sizeof(*dinfo->ndi_reg), (void **)&dinfo->ndi_reg); - dinfo->ndi_ninterrupts = OF_getprop_alloc(child, - "interrupts", sizeof(*dinfo->ndi_interrupts), - (void **)&dinfo->ndi_interrupts); - dinfo->ndi_bustag = &nexus_bustag; - dinfo->ndi_dmatag = &nexus_dmatag; - device_set_ivars(cdev, dinfo); - } else { - free(name, M_OFWPROP); - free(type, M_OFWPROP); - } - + if (cdev == NULL) + panic("nexus_attach(): device_add_child() failed."); + dinfo = malloc(sizeof(*dinfo), M_NEXUS, M_WAITOK); + dinfo->ndi_node = child; + dinfo->ndi_name = name; + dinfo->ndi_device_type = type; + OF_getprop_alloc(child, "model", 1, + (void **)&dinfo->ndi_model); + dinfo->ndi_nreg = OF_getprop_alloc(child, "reg", + sizeof(*dinfo->ndi_reg), (void **)&dinfo->ndi_reg); + dinfo->ndi_ninterrupts = OF_getprop_alloc(child, + "interrupts", sizeof(*dinfo->ndi_interrupts), + (void **)&dinfo->ndi_interrupts); + device_set_ivars(cdev, dinfo); } - device_set_desc(dev, "OpenFirmware Nexus device"); - return (0); + return (bus_generic_attach(dev)); } static void nexus_probe_nomatch(device_t dev, device_t child) { - char *name; + char *name = nexus_get_name(dev); char *type; - if (BUS_READ_IVAR(dev, child, NEXUS_IVAR_NAME, - (uintptr_t *)&name) != 0 || - BUS_READ_IVAR(dev, child, NEXUS_IVAR_DEVICE_TYPE, - (uintptr_t *)&type) != 0) - return; - - if (type == NULL) + if ((type = nexus_get_device_type(dev)) == NULL) type = "(unknown)"; device_printf(dev, "<%s>, type %s (no driver attached)\n", name, type); @@ -309,7 +270,7 @@ nexus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) *result = dinfo->ndi_ninterrupts; break; case NEXUS_IVAR_DMATAG: - *result = (uintptr_t)dinfo->ndi_dmatag; + *result = (uintptr_t)&nexus_dmatag; break; default: return (ENOENT); @@ -318,31 +279,6 @@ nexus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) } static int -nexus_write_ivar(device_t dev, device_t child, int which, uintptr_t value) -{ - struct nexus_devinfo *dinfo; - - if ((dinfo = device_get_ivars(child)) == 0) - return (ENOENT); - - switch (which) { - case NEXUS_IVAR_NODE: - case NEXUS_IVAR_NAME: - case NEXUS_IVAR_DEVICE_TYPE: - case NEXUS_IVAR_MODEL: - case NEXUS_IVAR_REG: - case NEXUS_IVAR_NREG: - case NEXUS_IVAR_INTERRUPTS: - case NEXUS_IVAR_NINTERRUPTS: - case NEXUS_IVAR_DMATAG: - return (EINVAL); - default: - return (ENOENT); - } - return 0; -} - -static int nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, driver_intr_t *intr, void *arg, void **cookiep) { @@ -354,9 +290,7 @@ nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, if ((res->r_flags & RF_SHAREABLE) == 0) flags |= INTR_EXCL; - /* - * We depend here on rman_activate_resource() being idempotent. - */ + /* We depend here on rman_activate_resource() being idempotent. */ error = rman_activate_resource(res); if (error) return (error); @@ -374,11 +308,6 @@ nexus_teardown_intr(device_t dev, device_t child, struct resource *r, void *ih) return (0); } -/* - * Allocate resources at the behalf of a child. This only handles interrupts, - * since i/o resources are usually set up by the firmware, and thus need not - * be handled here. - */ static struct resource * nexus_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) @@ -410,7 +339,7 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid, } if (needactivate) { - if (bus_activate_resource(child, type, *rid, rv)) { + if (bus_activate_resource(child, type, *rid, rv) != 0) { rman_release_resource(rv); return (NULL); } @@ -446,7 +375,7 @@ nexus_release_resource(device_t bus, device_t child, int type, int rid, if (rman_get_flags(r) & RF_ACTIVE) { error = bus_deactivate_resource(child, type, rid, r); if (error) - return error; + return (error); } return (rman_release_resource(r)); } |