The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/bus.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 1997,1998 Doug Rabson
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  *
   26  * $FreeBSD$
   27  */
   28 
   29 #ifndef _SYS_BUS_H_
   30 #define _SYS_BUS_H_
   31 
   32 #ifdef _KERNEL
   33 
   34 #include <sys/queue.h>
   35 
   36 /*
   37  * Forward declarations
   38  */
   39 typedef struct device           *device_t;
   40 typedef struct driver           driver_t;
   41 typedef struct device_method    device_method_t;
   42 typedef struct devclass         *devclass_t;
   43 typedef struct device_ops       *device_ops_t;
   44 typedef struct device_op_desc   *device_op_desc_t;
   45 
   46 typedef void driver_intr_t(void*);
   47 
   48 /*
   49  * We define this in terms of bits because some devices may belong
   50  * to multiple classes (and therefore need to be included in
   51  * multiple interrupt masks, which is what this really serves to
   52  * indicate.  Buses which do interrupt remapping will want to
   53  * change their type to reflect what sort of devices are underneath.
   54  */
   55 enum intr_type {
   56     INTR_TYPE_TTY = 1,
   57     INTR_TYPE_BIO = 2,
   58     INTR_TYPE_NET = 4,
   59     INTR_TYPE_CAM = 8,
   60     INTR_TYPE_MISC = 16,
   61     INTR_TYPE_FAST = 128
   62 };
   63 #define INTR_TYPE_AV INTR_TYPE_TTY      /* for source compatability with 5.x */
   64 
   65 typedef int (*devop_t)(void);
   66 
   67 struct device_method {
   68     device_op_desc_t    desc;
   69     devop_t             func;
   70 };
   71 
   72 struct driver {
   73     const char          *name;          /* driver name */
   74     device_method_t     *methods;       /* method table */
   75     size_t              softc;          /* size of device softc struct */
   76     void                *priv;          /* driver private data */
   77     device_ops_t        ops;            /* compiled method table */
   78     int                 refs;           /* # devclasses containing driver */
   79 };
   80 
   81 typedef enum device_state {
   82     DS_NOTPRESENT,                      /* not probed or probe failed */
   83     DS_ALIVE,                           /* probe succeeded */
   84     DS_ATTACHED,                        /* attach method called */
   85     DS_BUSY                             /* device is open */
   86 } device_state_t;
   87 
   88 /*
   89  * Definitions for drivers which need to keep simple lists of resources
   90  * for their child devices.
   91  */
   92 struct  resource;
   93 
   94 struct resource_list_entry {
   95     SLIST_ENTRY(resource_list_entry) link;
   96     int                 type;           /* type argument to alloc_resource */
   97     int                 rid;            /* resource identifier */
   98     struct resource     *res;           /* the real resource when allocated */
   99     u_long              start;          /* start of resource range */
  100     u_long              end;            /* end of resource range */
  101     u_long              count;          /* count within range */
  102 };
  103 SLIST_HEAD(resource_list, resource_list_entry);
  104 
  105 /*
  106  * Initialise a resource list.
  107  */
  108 void    resource_list_init(struct resource_list *rl);
  109 
  110 /*
  111  * Reclaim memory used by a resource list.
  112  */
  113 void    resource_list_free(struct resource_list *rl);
  114 
  115 /*
  116  * Add a resource entry or modify an existing entry if one exists with 
  117  * the same type and rid.
  118  */
  119 void    resource_list_add(struct resource_list *rl,
  120                           int type, int rid,
  121                           u_long start, u_long end, u_long count);
  122 
  123 /*
  124  * Find a resource entry by type and rid.
  125  */
  126 struct resource_list_entry*
  127         resource_list_find(struct resource_list *rl,
  128                            int type, int rid);
  129 
  130 /*
  131  * Delete a resource entry.
  132  */
  133 void    resource_list_delete(struct resource_list *rl,
  134                              int type, int rid);
  135 
  136 /*
  137  * Implement BUS_ALLOC_RESOURCE by looking up a resource from the list 
  138  * and passing the allocation up to the parent of bus. This assumes
  139  * that the first entry of device_get_ivars(child) is a struct
  140  * resource_list. This also handles 'passthrough' allocations where a
  141  * child is a remote descendant of bus by passing the allocation up to 
  142  * the parent of bus.
  143  */
  144 struct resource *
  145         resource_list_alloc(struct resource_list *rl,
  146                             device_t bus, device_t child,
  147                             int type, int *rid,
  148                             u_long start, u_long end,
  149                             u_long count, u_int flags);
  150 
  151 /*
  152  * Implement BUS_RELEASE_RESOURCE.
  153  */
  154 int     resource_list_release(struct resource_list *rl,
  155                               device_t bus, device_t child,
  156                               int type, int rid, struct resource *res);
  157 
  158 /*
  159  * Print all resources of a specified type, for use in bus_print_child.
  160  * The name is printed if at least one resource of the given type is available.
  161  * The format ist used to print resource start and end.
  162  */
  163 int     resource_list_print_type(struct resource_list *rl,
  164                                  const char *name, int type,
  165                                  const char *format);
  166 
  167 /*
  168  * The root bus, to which all top-level busses are attached.
  169  */
  170 extern device_t root_bus;
  171 extern devclass_t root_devclass;
  172 void    root_bus_configure(void);
  173 
  174 /*
  175  * Useful functions for implementing busses.
  176  */
  177 
  178 int     bus_generic_activate_resource(device_t dev, device_t child, int type,
  179                                       int rid, struct resource *r);
  180 struct resource *bus_generic_alloc_resource(device_t bus, device_t child,
  181                                             int type, int *rid,
  182                                             u_long start, u_long end,
  183                                             u_long count, u_int flags);
  184 int     bus_generic_attach(device_t dev);
  185 int     bus_generic_deactivate_resource(device_t dev, device_t child, int type,
  186                                         int rid, struct resource *r);
  187 int     bus_generic_detach(device_t dev);
  188 void    bus_generic_driver_added(device_t dev, driver_t *driver);
  189 int     bus_print_child_header(device_t dev, device_t child);
  190 int     bus_print_child_footer(device_t dev, device_t child);
  191 int     bus_generic_print_child(device_t dev, device_t child);
  192 int     bus_generic_probe(device_t dev);
  193 int     bus_generic_read_ivar(device_t dev, device_t child, int which,
  194                               uintptr_t *result);
  195 int     bus_generic_release_resource(device_t bus, device_t child,
  196                                      int type, int rid, struct resource *r);
  197 int     bus_generic_resume(device_t dev);
  198 int     bus_generic_setup_intr(device_t dev, device_t child,
  199                                struct resource *irq, int flags,
  200                                driver_intr_t *intr, void *arg, void **cookiep);
  201 int     bus_generic_shutdown(device_t dev);
  202 int     bus_generic_suspend(device_t dev);
  203 int     bus_generic_teardown_intr(device_t dev, device_t child,
  204                                   struct resource *irq, void *cookie);
  205 int     bus_generic_write_ivar(device_t dev, device_t child, int which,
  206                                uintptr_t value);
  207 
  208 /*
  209  * Wrapper functions for the BUS_*_RESOURCE methods to make client code
  210  * a little simpler.
  211  */
  212 struct  resource *bus_alloc_resource(device_t dev, int type, int *rid,
  213                                      u_long start, u_long end, u_long count,
  214                                      u_int flags);
  215 int     bus_activate_resource(device_t dev, int type, int rid, 
  216                               struct resource *r);
  217 int     bus_deactivate_resource(device_t dev, int type, int rid,
  218                                 struct resource *r);
  219 int     bus_release_resource(device_t dev, int type, int rid, 
  220                              struct resource *r);
  221 int     bus_setup_intr(device_t dev, struct resource *r, int flags,
  222                        driver_intr_t handler, void *arg, void **cookiep);
  223 int     bus_teardown_intr(device_t dev, struct resource *r, void *cookie);
  224 int     bus_set_resource(device_t dev, int type, int rid,
  225                          u_long start, u_long count);
  226 int     bus_get_resource(device_t dev, int type, int rid,
  227                          u_long *startp, u_long *countp);
  228 u_long  bus_get_resource_start(device_t dev, int type, int rid);
  229 u_long  bus_get_resource_count(device_t dev, int type, int rid);
  230 void    bus_delete_resource(device_t dev, int type, int rid);
  231 
  232 static __inline struct resource *
  233 bus_alloc_resource_any(device_t dev, int type, int *rid, u_int flags)
  234 {
  235         return (bus_alloc_resource(dev, type, rid, 0ul, ~0ul, 1, flags));
  236 }
  237 
  238 /*
  239  * Access functions for device.
  240  */
  241 device_t        device_add_child(device_t dev, const char *name, int unit);
  242 device_t        device_add_child_ordered(device_t dev, int order,
  243                                          const char *name, int unit);
  244 void    device_busy(device_t dev);
  245 int     device_delete_child(device_t dev, device_t child);
  246 int     device_detach(device_t dev);
  247 void    device_disable(device_t dev);
  248 void    device_enable(device_t dev);
  249 device_t        device_find_child(device_t dev, const char *classname,
  250                                   int unit);
  251 const char      *device_get_desc(device_t dev);
  252 devclass_t      device_get_devclass(device_t dev);
  253 driver_t        *device_get_driver(device_t dev);
  254 u_int32_t       device_get_flags(device_t dev);
  255 device_t        device_get_parent(device_t dev);
  256 int     device_get_children(device_t dev, device_t **listp, int *countp);
  257 void    *device_get_ivars(device_t dev);
  258 void    device_set_ivars(device_t dev, void *ivars);
  259 const   char *device_get_name(device_t dev);
  260 const   char *device_get_nameunit(device_t dev);
  261 void    *device_get_softc(device_t dev);
  262 device_state_t  device_get_state(device_t dev);
  263 int     device_get_unit(device_t dev);
  264 int     device_is_alive(device_t dev); /* did probe succeed? */
  265 int     device_is_attached(device_t dev);
  266 int     device_is_enabled(device_t dev);
  267 int     device_is_quiet(device_t dev);
  268 int     device_print_prettyname(device_t dev);
  269 int     device_printf(device_t dev, const char *, ...) __printflike(2, 3);
  270 int     device_probe_and_attach(device_t dev);
  271 void    device_quiet(device_t dev);
  272 void    device_set_desc(device_t dev, const char* desc);
  273 void    device_set_desc_copy(device_t dev, const char* desc);
  274 int     device_set_devclass(device_t dev, const char *classname);
  275 int     device_set_driver(device_t dev, driver_t *driver);
  276 void    device_set_flags(device_t dev, u_int32_t flags);
  277 void    device_set_softc(device_t dev, void *softc);
  278 int     device_set_unit(device_t dev, int unit);        /* XXX DONT USE XXX */
  279 int     device_shutdown(device_t dev);
  280 void    device_unbusy(device_t dev);
  281 void    device_verbose(device_t dev);
  282 
  283 /*
  284  * Access functions for devclass.
  285  */
  286 int     devclass_add_driver(devclass_t dc, driver_t *driver);
  287 int     devclass_delete_driver(devclass_t dc, driver_t *driver);
  288 devclass_t      devclass_create(const char *classname);
  289 devclass_t      devclass_find(const char *classname);
  290 driver_t        *devclass_find_driver(devclass_t dc, const char *classname);
  291 const char      *devclass_get_name(devclass_t dc);
  292 device_t        devclass_get_device(devclass_t dc, int unit);
  293 void    *devclass_get_softc(devclass_t dc, int unit);
  294 int     devclass_get_devices(devclass_t dc, device_t **listp, int *countp);
  295 int     devclass_get_maxunit(devclass_t dc);
  296 
  297 /*
  298  * Access functions for device resources.
  299  */
  300 
  301 int     resource_int_value(const char *name, int unit, const char *resname,
  302                            int *result);
  303 int     resource_long_value(const char *name, int unit, const char *resname,
  304                             long *result);
  305 int     resource_string_value(const char *name, int unit, const char *resname,
  306                               char **result);
  307 int     resource_query_string(int i, const char *resname, const char *value);
  308 char    *resource_query_name(int i);
  309 int     resource_query_unit(int i);
  310 int     resource_locate(int i, const char *resname);
  311 int     resource_set_int(const char *name, int unit, const char *resname,
  312                          int value);
  313 int     resource_set_long(const char *name, int unit, const char *resname,
  314                           long value);
  315 int     resource_set_string(const char *name, int unit, const char *resname,
  316                             const char *value);
  317 int     resource_count(void);
  318 
  319 /*
  320  * Shorthand for constructing method tables.
  321  */
  322 #define DEVMETHOD(NAME, FUNC) { &NAME##_desc, (devop_t) FUNC }
  323 
  324 /*
  325  * Some common device interfaces.
  326  */
  327 #include "device_if.h"
  328 #include "bus_if.h"
  329 
  330 struct  module;
  331 
  332 int     driver_module_handler(struct module *, int, void *);
  333 
  334 /*
  335  * Module support for automatically adding drivers to busses.
  336  */
  337 struct driver_module_data {
  338         int             (*dmd_chainevh)(struct module *, int, void *);
  339         void            *dmd_chainarg;
  340         const char      *dmd_busname;
  341         driver_t        **dmd_drivers;
  342         int             dmd_ndrivers;
  343         devclass_t      *dmd_devclass;
  344 };
  345 
  346 #define DRIVER_MODULE(name, busname, driver, devclass, evh, arg)        \
  347                                                                         \
  348 static driver_t *name##_##busname##_driver_list[] = { &driver };        \
  349 static struct driver_module_data name##_##busname##_driver_mod = {      \
  350         evh, arg,                                                       \
  351         #busname,                                                       \
  352         name##_##busname##_driver_list,                                 \
  353         (sizeof name##_##busname##_driver_list) /                       \
  354                 (sizeof name##_##busname##_driver_list[0]),             \
  355         &devclass                                                       \
  356 };                                                                      \
  357                                                                         \
  358 static moduledata_t name##_##busname##_mod = {                          \
  359         #busname "/" #name,                                             \
  360         driver_module_handler,                                          \
  361         &name##_##busname##_driver_mod                                  \
  362 };                                                                      \
  363 DECLARE_MODULE(name##_##busname, name##_##busname##_mod,                \
  364                SI_SUB_DRIVERS, SI_ORDER_MIDDLE)
  365 
  366 #define MULTI_DRIVER_MODULE(name, busname, drivers, devclass, evh, arg) \
  367                                                                         \
  368 static driver_t name##_##busname##_driver_list[] = drivers;             \
  369 static struct driver_module_data name##_##busname##_driver_mod = {      \
  370         evh, arg,                                                       \
  371         #busname,                                                       \
  372         name##_##busname##_driver_list,                                 \
  373         (sizeof name##_##busname##_driver_list) /                       \
  374                 (sizeof name##_##busname##_driver_list[0]),             \
  375         &devclass                                                       \
  376 };                                                                      \
  377                                                                         \
  378 static moduledata_t name##_##busname##_mod = {                          \
  379         #busname "/" #name,                                             \
  380         driver_module_handler,                                          \
  381         &name##_##busname##_driver_mod                                  \
  382 };                                                                      \
  383 DECLARE_MODULE(name##_##busname, name##_##busname##_mod,                \
  384                SI_SUB_DRIVERS, SI_ORDER_MIDDLE)
  385 
  386 #endif /* _KERNEL */
  387 
  388 #endif /* !_SYS_BUS_H_ */

Cache object: cd3af3a6ce504674e8ef86390bb1e03c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.