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/kern/bus_if.m

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 #
    3 # Copyright (c) 1998-2004 Doug Rabson
    4 # All rights reserved.
    5 #
    6 # Redistribution and use in source and binary forms, with or without
    7 # modification, are permitted provided that the following conditions
    8 # are met:
    9 # 1. Redistributions of source code must retain the above copyright
   10 #    notice, this list of conditions and the following disclaimer.
   11 # 2. Redistributions in binary form must reproduce the above copyright
   12 #    notice, this list of conditions and the following disclaimer in the
   13 #    documentation and/or other materials provided with the distribution.
   14 #
   15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   25 # SUCH DAMAGE.
   26 #
   27 # $FreeBSD: releng/5.3/sys/kern/bus_if.m 136588 2004-10-16 08:43:07Z cvs2svn $
   28 #
   29 
   30 #include <sys/bus.h>
   31 
   32 /**
   33  * @defgroup BUS bus - KObj methods for drivers of devices with children
   34  * @brief A set of methods required device drivers that support
   35  * child devices.
   36  * @{
   37  */
   38 INTERFACE bus;
   39 
   40 #
   41 # Default implementations of some methods.
   42 #
   43 CODE {
   44         static struct resource *
   45         null_alloc_resource(device_t dev, device_t child,
   46             int type, int *rid, u_long start, u_long end,
   47             u_long count, u_int flags)
   48         {
   49             return (0);
   50         }
   51 };
   52 
   53 /**
   54  * @brief Print a description of a child device
   55  *
   56  * This is called from system code which prints out a description of a
   57  * device. It should describe the attachment that the child has with
   58  * the parent. For instance the TurboLaser bus prints which node the
   59  * device is attached to. See bus_generic_print_child() for more 
   60  * information.
   61  *
   62  * @param _dev          the device whose child is being printed
   63  * @param _child        the child device to describe
   64  *
   65  * @returns             the number of characters output.
   66  */
   67 METHOD int print_child {
   68         device_t _dev;
   69         device_t _child;
   70 } DEFAULT bus_generic_print_child;
   71 
   72 /**
   73  * @brief Print a notification about an unprobed child device.
   74  *
   75  * Called for each child device that did not succeed in probing for a
   76  * driver.
   77  *
   78  * @param _dev          the device whose child was being probed
   79  * @param _child        the child device which failed to probe
   80  */   
   81 METHOD void probe_nomatch {
   82         device_t _dev;
   83         device_t _child;
   84 };
   85 
   86 /**
   87  * @brief Read the value of a bus-specific attribute of a device
   88  *
   89  * This method, along with BUS_WRITE_IVAR() manages a bus-specific set
   90  * of instance variables of a child device.  The intention is that
   91  * each different type of bus defines a set of appropriate instance
   92  * variables (such as ports and irqs for ISA bus etc.)
   93  *
   94  * This information could be given to the child device as a struct but
   95  * that makes it hard for a bus to add or remove variables without
   96  * forcing an edit and recompile for all drivers which may not be
   97  * possible for vendor supplied binary drivers.
   98  *
   99  * This method copies the value of an instance variable to the
  100  * location specified by @p *_result.
  101  * 
  102  * @param _dev          the device whose child was being examined
  103  * @param _child        the child device whose instance variable is
  104  *                      being read
  105  * @param _index        the instance variable to read
  106  * @param _result       a loction to recieve the instance variable
  107  *                      value
  108  * 
  109  * @retval 0            success
  110  * @retval ENOENT       no such instance variable is supported by @p
  111  *                      _dev 
  112  */
  113 METHOD int read_ivar {
  114         device_t _dev;
  115         device_t _child;
  116         int _index;
  117         uintptr_t *_result;
  118 };
  119 
  120 /**
  121  * @brief Write the value of a bus-specific attribute of a device
  122  * 
  123  * This method sets the value of an instance variable to @p _value.
  124  * 
  125  * @param _dev          the device whose child was being updated
  126  * @param _child        the child device whose instance variable is
  127  *                      being written
  128  * @param _index        the instance variable to write
  129  * @param _value        the value to write to that instance variable
  130  * 
  131  * @retval 0            success
  132  * @retval ENOENT       no such instance variable is supported by @p
  133  *                      _dev 
  134  * @retval EINVAL       the instance variable was recognised but
  135  *                      contains a read-only value
  136  */
  137 METHOD int write_ivar {
  138         device_t _dev;
  139         device_t _child;
  140         int _indx;
  141         uintptr_t _value;
  142 };
  143 
  144 /**
  145  * @brief Notify a bus that a child was detached
  146  *
  147  * Called after the child's DEVICE_DETACH() method to allow the parent
  148  * to reclaim any resources allocated on behalf of the child.
  149  * 
  150  * @param _dev          the device whose child changed state
  151  * @param _child        the child device which changed state
  152  */
  153 METHOD void child_detached {
  154         device_t _dev;
  155         device_t _child;
  156 };
  157 
  158 /**
  159  * @brief Notify a bus that a new driver was added
  160  * 
  161  * Called when a new driver is added to the devclass which owns this
  162  * bus. The generic implementation of this method attempts to probe and
  163  * attach any un-matched children of the bus.
  164  * 
  165  * @param _dev          the device whose devclass had a new driver
  166  *                      added to it
  167  * @param _driver       the new driver which was added
  168  */
  169 METHOD void driver_added {
  170         device_t _dev;
  171         driver_t *_driver;
  172 } DEFAULT bus_generic_driver_added;
  173 
  174 /**
  175  * @brief Create a new child device
  176  *
  177  * For busses which use use drivers supporting DEVICE_IDENTIFY() to
  178  * enumerate their devices, this method is used to create new
  179  * device instances. The new device will be added after the last
  180  * existing child with the same order.
  181  * 
  182  * @param _dev          the bus device which will be the parent of the
  183  *                      new child device
  184  * @param _order        a value which is used to partially sort the
  185  *                      children of @p _dev - devices created using
  186  *                      lower values of @p _order appear first in @p
  187  *                      _dev's list of children
  188  * @param _name         devclass name for new device or @c NULL if not
  189  *                      specified
  190  * @param _unit         unit number for new device or @c -1 if not
  191  *                      specified
  192  */
  193 METHOD device_t add_child {
  194         device_t _dev;
  195         int _order;
  196         const char *_name;
  197         int _unit;
  198 };
  199 
  200 /**
  201  * @brief Allocate a system resource
  202  *
  203  * This method is called by child devices of a bus to allocate resources.
  204  * The types are defined in <machine/resource.h>; the meaning of the
  205  * resource-ID field varies from bus to bus (but @p *rid == 0 is always
  206  * valid if the resource type is). If a resource was allocated and the
  207  * caller did not use the RF_ACTIVE to specify that it should be
  208  * activated immediately, the caller is responsible for calling
  209  * BUS_ACTIVATE_RESOURCE() when it actually uses the resource.
  210  *
  211  * @param _dev          the parent device of @p _child
  212  * @param _child        the device which is requesting an allocation
  213  * @param _type         the type of resource to allocate
  214  * @param _rid          a pointer to the resource identifier
  215  * @param _start        hint at the start of the resource range - pass
  216  *                      @c 0UL for any start address
  217  * @param _end          hint at the end of the resource range - pass
  218  *                      @c ~0UL for any end address
  219  * @param _count        hint at the size of range required - pass @c 1
  220  *                      for any size
  221  * @param _flags        any extra flags to control the resource
  222  *                      allocation - see @c RF_XXX flags in
  223  *                      <sys/rman.h> for details
  224  * 
  225  * @returns             the resource which was allocated or @c NULL if no
  226  *                      resource could be allocated
  227  */
  228 METHOD struct resource * alloc_resource {
  229         device_t        _dev;
  230         device_t        _child;
  231         int             _type;
  232         int            *_rid;
  233         u_long          _start;
  234         u_long          _end;
  235         u_long          _count;
  236         u_int           _flags;
  237 } DEFAULT null_alloc_resource;
  238 
  239 /**
  240  * @brief Activate a resource
  241  *
  242  * Activate a resource previously allocated with
  243  * BUS_ALLOC_RESOURCE(). This may for instance map a memory region
  244  * into the kernel's virtual address space.
  245  *
  246  * @param _dev          the parent device of @p _child
  247  * @param _child        the device which allocated the resource
  248  * @param _type         the type of resource
  249  * @param _rid          the resource identifier
  250  * @param _r            the resource to activate
  251  */
  252 METHOD int activate_resource {
  253         device_t        _dev;
  254         device_t        _child;
  255         int             _type;
  256         int             _rid;
  257         struct resource *_r;
  258 };
  259 
  260 /**
  261  * @brief Deactivate a resource
  262  *
  263  * Deactivate a resource previously allocated with
  264  * BUS_ALLOC_RESOURCE(). This may for instance unmap a memory region
  265  * from the kernel's virtual address space.
  266  *
  267  * @param _dev          the parent device of @p _child
  268  * @param _child        the device which allocated the resource
  269  * @param _type         the type of resource
  270  * @param _rid          the resource identifier
  271  * @param _r            the resource to deactivate
  272  */
  273 METHOD int deactivate_resource {
  274         device_t        _dev;
  275         device_t        _child;
  276         int             _type;
  277         int             _rid;
  278         struct resource *_r;
  279 };
  280 
  281 /**
  282  * @brief Release a resource
  283  *
  284  * Free a resource allocated by the BUS_ALLOC_RESOURCE.  The @p _rid
  285  * value must be the same as the one returned by BUS_ALLOC_RESOURCE()
  286  * (which is not necessarily the same as the one the client passed).
  287  *
  288  * @param _dev          the parent device of @p _child
  289  * @param _child        the device which allocated the resource
  290  * @param _type         the type of resource
  291  * @param _rid          the resource identifier
  292  * @param _r            the resource to release
  293  */
  294 METHOD int release_resource {
  295         device_t        _dev;
  296         device_t        _child;
  297         int             _type;
  298         int             _rid;
  299         struct resource *_res;
  300 };
  301 
  302 /**
  303  * @brief Install an interrupt handler
  304  *
  305  * This method is used to associate an interrupt handler function with
  306  * an irq resource. When the interrupt triggers, the function @p _intr
  307  * will be called with the value of @p _arg as its single
  308  * argument. The value returned in @p *_cookiep is used to cancel the
  309  * interrupt handler - the caller should save this value to use in a
  310  * future call to BUS_TEARDOWN_INTR().
  311  * 
  312  * @param _dev          the parent device of @p _child
  313  * @param _child        the device which allocated the resource
  314  * @param _irq          the resource representing the interrupt
  315  * @param _flags        a set of bits from enum intr_type specifying
  316  *                      the class of interrupt
  317  * @param _intr         the function to call when the interrupt
  318  *                      triggers
  319  * @param _arg          a value to use as the single argument in calls
  320  *                      to @p _intr
  321  * @param _cookiep      a pointer to a location to recieve a cookie
  322  *                      value that may be used to remove the interrupt
  323  *                      handler
  324  */
  325 METHOD int setup_intr {
  326         device_t        _dev;
  327         device_t        _child;
  328         struct resource *_irq;
  329         int             _flags;
  330         driver_intr_t   *_intr;
  331         void            *_arg;
  332         void            **_cookiep;
  333 };
  334 
  335 /**
  336  * @brief Uninstall an interrupt handler
  337  *
  338  * This method is used to disassociate an interrupt handler function
  339  * with an irq resource. The value of @p _cookie must be the value
  340  * returned from a previous call to BUS_SETUP_INTR().
  341  * 
  342  * @param _dev          the parent device of @p _child
  343  * @param _child        the device which allocated the resource
  344  * @param _irq          the resource representing the interrupt
  345  * @param _cookie       the cookie value returned when the interrupt
  346  *                      was originally registered
  347  */
  348 METHOD int teardown_intr {
  349         device_t        _dev;
  350         device_t        _child;
  351         struct resource *_irq;
  352         void            *_cookie;
  353 };
  354 
  355 /**
  356  * @brief Define a resource which can be allocated with
  357  * BUS_ALLOC_RESOURCE().
  358  *
  359  * This method is used by some busses (typically ISA) to allow a
  360  * driver to describe a resource range that it would like to
  361  * allocate. The resource defined by @p _type and @p _rid is defined
  362  * to start at @p _start and to include @p _count indices in its
  363  * range.
  364  * 
  365  * @param _dev          the parent device of @p _child
  366  * @param _child        the device which owns the resource
  367  * @param _type         the type of resource
  368  * @param _rid          the resource identifier
  369  * @param _start        the start of the resource range
  370  * @param _count        the size of the resource range
  371  */
  372 METHOD int set_resource {
  373         device_t        _dev;
  374         device_t        _child;
  375         int             _type;
  376         int             _rid;
  377         u_long          _start;
  378         u_long          _count;
  379 };
  380 
  381 /**
  382  * @brief Describe a resource
  383  *
  384  * This method allows a driver to examine the range used for a given
  385  * resource without actually allocating it.
  386  * 
  387  * @param _dev          the parent device of @p _child
  388  * @param _child        the device which owns the resource
  389  * @param _type         the type of resource
  390  * @param _rid          the resource identifier
  391  * @param _start        the address of a location to recieve the start
  392  *                      index of the resource range
  393  * @param _count        the address of a location to recieve the size
  394  *                      of the resource range
  395  */
  396 METHOD int get_resource {
  397         device_t        _dev;
  398         device_t        _child;
  399         int             _type;
  400         int             _rid;
  401         u_long          *_startp;
  402         u_long          *_countp;
  403 };
  404 
  405 /**
  406  * @brief Delete a resource.
  407  * 
  408  * Use this to delete a resource (possibly one previously added with
  409  * BUS_SET_RESOURCE()).
  410  * 
  411  * @param _dev          the parent device of @p _child
  412  * @param _child        the device which owns the resource
  413  * @param _type         the type of resource
  414  * @param _rid          the resource identifier
  415  */
  416 METHOD void delete_resource {
  417         device_t        _dev;
  418         device_t        _child;
  419         int             _type;
  420         int             _rid;
  421 };
  422 
  423 /**
  424  * @brief Return a struct resource_list.
  425  *
  426  * Used by drivers which use bus_generic_rl_alloc_resource() etc. to
  427  * implement their resource handling. It should return the resource
  428  * list of the given child device.
  429  * 
  430  * @param _dev          the parent device of @p _child
  431  * @param _child        the device which owns the resource list
  432  */
  433 METHOD struct resource_list * get_resource_list {
  434         device_t        _dev;
  435         device_t        _child;
  436 } DEFAULT bus_generic_get_resource_list;
  437 
  438 /**
  439  * @brief Is the hardware described by @p _child still attached to the
  440  * system?
  441  *
  442  * This method should return 0 if the device is not present.  It
  443  * should return -1 if it is present.  Any errors in determining
  444  * should be returned as a normal errno value.  Client drivers are to
  445  * assume that the device is present, even if there is an error
  446  * determining if it is there.  Busses are to try to avoid returning
  447  * errors, but newcard will return an error if the device fails to
  448  * implement this method.
  449  * 
  450  * @param _dev          the parent device of @p _child
  451  * @param _child        the device which is being examined
  452  */
  453 METHOD int child_present {
  454         device_t        _dev;
  455         device_t        _child;
  456 } DEFAULT bus_generic_child_present;
  457 
  458 /**
  459  * @brief Returns the pnp info for this device.
  460  *
  461  * Return it as a string.  If the string is insufficient for the
  462  * storage, then return EOVERFLOW.
  463  * 
  464  * @param _dev          the parent device of @p _child
  465  * @param _child        the device which is being examined
  466  * @param _buf          the address of a buffer to receive the pnp
  467  *                      string
  468  * @param _buflen       the size of the buffer pointed to by @p _buf
  469  */
  470 METHOD int child_pnpinfo_str {
  471         device_t        _dev;
  472         device_t        _child;
  473         char            *_buf;
  474         size_t          _buflen;
  475 };
  476 
  477 /**
  478  * @brief Returns the location for this device.
  479  *
  480  * Return it as a string.  If the string is insufficient for the
  481  * storage, then return EOVERFLOW.
  482  * 
  483  * @param _dev          the parent device of @p _child
  484  * @param _child        the device which is being examined
  485  * @param _buf          the address of a buffer to receive the location
  486  *                      string
  487  * @param _buflen       the size of the buffer pointed to by @p _buf
  488  */
  489 METHOD int child_location_str {
  490         device_t        _dev;
  491         device_t        _child;
  492         char            *_buf;
  493         size_t          _buflen;
  494 };
  495 
  496 /**
  497  * @brief Allow (bus) drivers to specify the trigger mode and polarity
  498  * of the specified interrupt.
  499  * 
  500  * @param _dev          the bus device
  501  * @param _irq          the interrupt number to modify
  502  * @param _trig         the trigger mode required
  503  * @param _pol          the interrupt polarity required
  504  */
  505 METHOD int config_intr {
  506         device_t        _dev;
  507         int             _irq;
  508         enum intr_trigger _trig;
  509         enum intr_polarity _pol;
  510 } DEFAULT bus_generic_config_intr;

Cache object: a3d9ce0448f4119612dd0e7398cb2f38


[ 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.