diff options
author | marius <marius@FreeBSD.org> | 2005-11-22 16:37:45 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2005-11-22 16:37:45 +0000 |
commit | fa92f23f1819b63d981e32c4aa232f819e0a2dc9 (patch) | |
tree | f7aa9cb591140cfeccbd2287da1d295b5b9b8703 /sys/dev/ofw | |
parent | de081fdfb1f76a022d06b493c13e2f05514b894f (diff) | |
download | FreeBSD-src-fa92f23f1819b63d981e32c4aa232f819e0a2dc9.zip FreeBSD-src-fa92f23f1819b63d981e32c4aa232f819e0a2dc9.tar.gz |
- Add a new method ofw_bus_default_get_devinfo() that allows to retrieve
a newly introduced struct ofw_bus_devinfo which can hold the OFW info
of a device recallable via the ofw_bus KOBJ interface. Introduce a set
of functions ofw_bus_gen_get_*() which use ofw_bus_default_get_devinfo()
to provide generic subroutines for implementing the rest of the ofw_bus
KOBJ interface in a bus driver.
This is inspired by bus_get_resource_list() and bus_generic_rl_*_resource()
and allows to reduce code duplication in bus drivers as they only have
to provide an ofw_bus_default_get_devinfo() implementation in order to
provide the ofw_bus KOBJ interface via ofw_bus_gen_get_*().
- While here add a comment to ofw_bus_if.m describing the intention of
the ofw_bus KOBJ interface.
Reviewed by: marcel
Diffstat (limited to 'sys/dev/ofw')
-rw-r--r-- | sys/dev/ofw/ofw_bus_if.m | 38 | ||||
-rw-r--r-- | sys/dev/ofw/ofw_bus_subr.c | 128 | ||||
-rw-r--r-- | sys/dev/ofw/ofw_bus_subr.h | 49 |
3 files changed, 213 insertions, 2 deletions
diff --git a/sys/dev/ofw/ofw_bus_if.m b/sys/dev/ofw/ofw_bus_if.m index edeee5f..446338c 100644 --- a/sys/dev/ofw/ofw_bus_if.m +++ b/sys/dev/ofw/ofw_bus_if.m @@ -1,6 +1,6 @@ #- # Copyright (c) 2001, 2003 by Thomas Moestl <tmm@FreeBSD.org> -# Copyright (c) 2004 by Marius Strobl <marius@FreeBSD.org> +# Copyright (c) 2004, 2005 by Marius Strobl <marius@FreeBSD.org> # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -25,20 +25,45 @@ # # $FreeBSD$ +# Interface for retrieving the package handle and a subset, namely +# 'compatible', 'device_type', 'model' and 'name', of the standard +# properties of a device on an Open Firmware assisted bus for use +# in device drivers. The rest of the standard properties, 'address', +# 'interrupts', 'reg' and 'status', are not covered by this interface +# as they are expected to be only of interest in the respective bus +# driver. + #include <sys/bus.h> -#include <machine/bus.h> #include <dev/ofw/openfirm.h> INTERFACE ofw_bus; +HEADER { + struct ofw_bus_devinfo { + phandle_t obd_node; + char *obd_compat; + char *obd_model; + char *obd_name; + char *obd_type; + }; +}; + CODE { + static ofw_bus_get_devinfo_t ofw_bus_default_get_devinfo; static ofw_bus_get_compat_t ofw_bus_default_get_compat; static ofw_bus_get_model_t ofw_bus_default_get_model; static ofw_bus_get_name_t ofw_bus_default_get_name; static ofw_bus_get_node_t ofw_bus_default_get_node; static ofw_bus_get_type_t ofw_bus_default_get_type; + static const struct ofw_bus_devinfo * + ofw_bus_default_get_devinfo(device_t bus, device_t dev) + { + + return (NULL); + } + static const char * ofw_bus_default_get_compat(device_t bus, device_t dev) { @@ -75,6 +100,15 @@ CODE { } }; +# Get the ofw_bus_devinfo struct for the device dev on the bus. Used for bus +# drivers which use the generic methods in ofw_bus_subr.c to implement the +# reset of this interface. The default method will return NULL, which means +# there is no such struct associated with the device. +METHOD const struct ofw_bus_devinfo * get_devinfo { + device_t bus; + device_t dev; +} DEFAULT ofw_bus_default_get_devinfo; + # Get the alternate firmware name for the device dev on the bus. The default # method will return NULL, which means the device doesn't have such a property. METHOD const char * get_compat { diff --git a/sys/dev/ofw/ofw_bus_subr.c b/sys/dev/ofw/ofw_bus_subr.c new file mode 100644 index 0000000..7a394c1 --- /dev/null +++ b/sys/dev/ofw/ofw_bus_subr.c @@ -0,0 +1,128 @@ +/*- + * Copyright (c) 2005 Marius Strobl <marius@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, + * without modification, immediately at the beginning of the file. + * 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. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/bus.h> +#include <sys/errno.h> + +#include <dev/ofw/ofw_bus_subr.h> +#include <dev/ofw/openfirm.h> + +#include "ofw_bus_if.h" + +int +ofw_bus_gen_setup_devinfo(struct ofw_bus_devinfo *obd, phandle_t node) +{ + + if (obd == NULL) + return (ENOMEM); + /* The 'name' property is considered mandatory. */ + if ((OF_getprop_alloc(node, "name", 1, (void **)&obd->obd_name)) == -1) + return (EINVAL); + OF_getprop_alloc(node, "compatible", 1, (void **)&obd->obd_compat); + OF_getprop_alloc(node, "device_type", 1, (void **)&obd->obd_type); + OF_getprop_alloc(node, "model", 1, (void **)&obd->obd_model); + obd->obd_node = node; + return (0); +} + +void +ofw_bus_gen_destroy_devinfo(struct ofw_bus_devinfo *obd) +{ + + if (obd == NULL) + return; + if (obd->obd_compat != NULL) + free(obd->obd_compat, M_OFWPROP); + if (obd->obd_model != NULL) + free(obd->obd_model, M_OFWPROP); + if (obd->obd_name != NULL) + free(obd->obd_name, M_OFWPROP); + if (obd->obd_type != NULL) + free(obd->obd_type, M_OFWPROP); +} + + +const char * +ofw_bus_gen_get_compat(device_t bus, device_t dev) +{ + const struct ofw_bus_devinfo *obd; + + obd = OFW_BUS_GET_DEVINFO(bus, dev); + if (obd == NULL) + return (NULL); + return (obd->obd_compat); +} + +const char * +ofw_bus_gen_get_model(device_t bus, device_t dev) +{ + const struct ofw_bus_devinfo *obd; + + obd = OFW_BUS_GET_DEVINFO(bus, dev); + if (obd == NULL) + return (NULL); + return (obd->obd_model); +} + +const char * +ofw_bus_gen_get_name(device_t bus, device_t dev) +{ + const struct ofw_bus_devinfo *obd; + + obd = OFW_BUS_GET_DEVINFO(bus, dev); + if (obd == NULL) + return (NULL); + return (obd->obd_name); +} + +phandle_t +ofw_bus_gen_get_node(device_t bus, device_t dev) +{ + const struct ofw_bus_devinfo *obd; + + obd = OFW_BUS_GET_DEVINFO(bus, dev); + if (obd == NULL) + return (0); + return (obd->obd_node); +} + +const char * +ofw_bus_gen_get_type(device_t bus, device_t dev) +{ + const struct ofw_bus_devinfo *obd; + + obd = OFW_BUS_GET_DEVINFO(bus, dev); + if (obd == NULL) + return (NULL); + return (obd->obd_type); +} diff --git a/sys/dev/ofw/ofw_bus_subr.h b/sys/dev/ofw/ofw_bus_subr.h new file mode 100644 index 0000000..6096b3e --- /dev/null +++ b/sys/dev/ofw/ofw_bus_subr.h @@ -0,0 +1,49 @@ +/*- + * Copyright (c) 2005 Marius Strobl <marius@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, + * without modification, immediately at the beginning of the file. + * 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. + * + * $FreeBSD$ + */ + +#ifndef _DEV_OFW_OFW_BUS_SUBR_H_ +#define _DEV_OFW_OFW_BUS_SUBR_H_ + +#include <sys/bus.h> + +#include <dev/ofw/openfirm.h> + +#include "ofw_bus_if.h" + +int ofw_bus_gen_setup_devinfo(struct ofw_bus_devinfo *, phandle_t); +void ofw_bus_gen_destroy_devinfo(struct ofw_bus_devinfo *); + +ofw_bus_get_compat_t ofw_bus_gen_get_compat; +ofw_bus_get_model_t ofw_bus_gen_get_model; +ofw_bus_get_name_t ofw_bus_gen_get_name; +ofw_bus_get_node_t ofw_bus_gen_get_node; +ofw_bus_get_type_t ofw_bus_gen_get_type; + +#endif /* !_DEV_OFW_OFW_BUS_SUBR_H_ */ |