root/sys/device.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: device.h,v 1.36 2007/05/15 01:56:47 deraadt Exp $     */
    2 /*      $NetBSD: device.h,v 1.15 1996/04/09 20:55:24 cgd Exp $  */
    3 
    4 /*
    5  * Copyright (c) 1992, 1993
    6  *      The Regents of the University of California.  All rights reserved.
    7  *
    8  * This software was developed by the Computer Systems Engineering group
    9  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
   10  * contributed to Berkeley.
   11  *
   12  * All advertising materials mentioning features or use of this software
   13  * must display the following acknowledgement:
   14  *      This product includes software developed by the University of
   15  *      California, Lawrence Berkeley Laboratory.
   16  *
   17  * Redistribution and use in source and binary forms, with or without
   18  * modification, are permitted provided that the following conditions
   19  * are met:
   20  * 1. Redistributions of source code must retain the above copyright
   21  *    notice, this list of conditions and the following disclaimer.
   22  * 2. Redistributions in binary form must reproduce the above copyright
   23  *    notice, this list of conditions and the following disclaimer in the
   24  *    documentation and/or other materials provided with the distribution.
   25  * 3. Neither the name of the University nor the names of its contributors
   26  *    may be used to endorse or promote products derived from this software
   27  *    without specific prior written permission.
   28  *
   29  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   30  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   31  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   32  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   33  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   34  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   35  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   36  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   37  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   38  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   39  * SUCH DAMAGE.
   40  *
   41  *      @(#)device.h    8.2 (Berkeley) 2/17/94
   42  */
   43 
   44 #ifndef _SYS_DEVICE_H_
   45 #define _SYS_DEVICE_H_
   46 
   47 #include <sys/queue.h>
   48 
   49 /*
   50  * Minimal device structures.
   51  * Note that all ``system'' device types are listed here.
   52  */
   53 enum devclass {
   54         DV_DULL,                /* generic, no special info */
   55         DV_CPU,                 /* CPU (carries resource utilization) */
   56         DV_DISK,                /* disk drive (label, etc) */
   57         DV_IFNET,               /* network interface */
   58         DV_TAPE,                /* tape device */
   59         DV_TTY                  /* serial line interface (???) */
   60 };
   61 
   62 /*
   63  * Actions for ca_activate.
   64  */
   65 enum devact {
   66         DVACT_ACTIVATE,         /* activate the device */
   67         DVACT_DEACTIVATE        /* deactivate the device */
   68 };
   69 
   70 #include <sys/lock.h>
   71 
   72 struct device {
   73         enum    devclass dv_class;      /* this device's classification */
   74         TAILQ_ENTRY(device) dv_list;    /* entry on list of all devices */
   75         struct  cfdata *dv_cfdata;      /* config data that found us */
   76         int     dv_unit;                /* device unit number */
   77         char    dv_xname[16];           /* external name (name + unit) */
   78         struct  device *dv_parent;      /* pointer to parent device */
   79         int     dv_flags;               /* misc. flags; see below */
   80         int     dv_ref;                 /* ref count */
   81 };
   82 
   83 /* dv_flags */
   84 #define DVF_ACTIVE      0x0001          /* device is activated */
   85 
   86 TAILQ_HEAD(devicelist, device);
   87 
   88 /*
   89  * Configuration data (i.e., data placed in ioconf.c).
   90  */
   91 struct cfdata {
   92         struct  cfattach *cf_attach;    /* config attachment */
   93         struct  cfdriver *cf_driver;    /* config driver */
   94         short   cf_unit;                /* unit number */
   95         short   cf_fstate;              /* finding state (below) */
   96         int     *cf_loc;                /* locators (machine dependent) */
   97         int     cf_flags;               /* flags from config */
   98         short   *cf_parents;            /* potential parents */
   99         int     cf_locnames;            /* start of names */
  100         void    (**cf_ivstubs)(void);   /* config-generated vectors, if any */
  101         short   cf_starunit1;           /* 1st usable unit number by STAR */
  102 };
  103 extern struct cfdata cfdata[];
  104 #define FSTATE_NOTFOUND 0       /* has not been found */
  105 #define FSTATE_FOUND    1       /* has been found */
  106 #define FSTATE_STAR     2       /* duplicable */
  107 #define FSTATE_DNOTFOUND 3      /* has not been found, and is disabled */
  108 #define FSTATE_DSTAR    4       /* duplicable, and is disabled */
  109 
  110 typedef int (*cfmatch_t)(struct device *, void *, void *);
  111 typedef void (*cfscan_t)(struct device *, void *);
  112 
  113 /*
  114  * `configuration' attachment and driver (what the machine-independent
  115  * autoconf uses).  As devices are found, they are applied against all
  116  * the potential matches.  The one with the best match is taken, and a
  117  * device structure (plus any other data desired) is allocated.  Pointers
  118  * to these are placed into an array of pointers.  The array itself must
  119  * be dynamic since devices can be found long after the machine is up
  120  * and running.
  121  *
  122  * Devices can have multiple configuration attachments if they attach
  123  * to different attributes (busses, or whatever), to allow specification
  124  * of multiple match and attach functions.  There is only one configuration
  125  * driver per driver, so that things like unit numbers and the device
  126  * structure array will be shared.
  127  */
  128 struct cfattach {
  129         size_t    ca_devsize;           /* size of dev data (for malloc) */
  130         cfmatch_t ca_match;             /* returns a match level */
  131         void    (*ca_attach)(struct device *, struct device *, void *);
  132         int     (*ca_detach)(struct device *, int);
  133         int     (*ca_activate)(struct device *, enum devact);
  134 };
  135 
  136 /* Flags given to config_detach(), and the ca_detach function. */
  137 #define DETACH_FORCE    0x01            /* force detachment; hardware gone */
  138 #define DETACH_QUIET    0x02            /* don't print a notice */
  139 
  140 struct cfdriver {
  141         void    **cd_devs;              /* devices found */
  142         char    *cd_name;               /* device name */
  143         enum    devclass cd_class;      /* device classification */
  144         int     cd_indirect;            /* indirectly configure subdevices */
  145         int     cd_ndevs;               /* size of cd_devs array */
  146 };
  147 
  148 /*
  149  * Configuration printing functions, and their return codes.  The second
  150  * argument is NULL if the device was configured; otherwise it is the name
  151  * of the parent device.  The return value is ignored if the device was
  152  * configured, so most functions can return UNCONF unconditionally.
  153  */
  154 typedef int (*cfprint_t)(void *, const char *);
  155 #define QUIET   0               /* print nothing */
  156 #define UNCONF  1               /* print " not configured\n" */
  157 #define UNSUPP  2               /* print " not supported\n" */
  158 
  159 /*
  160  * Pseudo-device attach information (function + number of pseudo-devs).
  161  */
  162 struct pdevinit {
  163         void    (*pdev_attach)(int);
  164         int     pdev_count;
  165 };
  166 
  167 #ifdef _KERNEL
  168 struct cftable {
  169         struct cfdata *tab;
  170         TAILQ_ENTRY(cftable) list;
  171 };
  172 TAILQ_HEAD(cftable_head, cftable);
  173 
  174 extern struct devicelist alldevs;       /* list of all devices */
  175 
  176 extern int autoconf_verbose;
  177 extern __volatile int config_pending;   /* semaphore for mountroot */
  178 
  179 void config_init(void);
  180 void *config_search(cfmatch_t, struct device *, void *);
  181 void *config_rootsearch(cfmatch_t, char *, void *);
  182 struct device *config_found_sm(struct device *, void *, cfprint_t,
  183     cfmatch_t);
  184 struct device *config_rootfound(char *, void *);
  185 void config_scan(cfscan_t, struct device *);
  186 struct device *config_attach(struct device *, void *, void *, cfprint_t);
  187 int config_detach(struct device *, int);
  188 int config_detach_children(struct device *, int);
  189 int config_activate(struct device *);
  190 int config_deactivate(struct device *);
  191 int config_activate_children(struct device *, enum devact);
  192 struct device *config_make_softc(struct device *parent,
  193     struct cfdata *cf);
  194 void config_defer(struct device *, void (*)(struct device *));
  195 void config_pending_incr(void);
  196 void config_pending_decr(void);
  197 
  198 struct device *device_lookup(struct cfdriver *, int unit);
  199 void device_ref(struct device *);
  200 void device_unref(struct device *);
  201 
  202 struct nam2blk {
  203         char    *name;
  204         int     maj;
  205 };
  206 
  207 int     findblkmajor(struct device *dv);
  208 char    *findblkname(int);
  209 void    setroot(struct device *, int, int);
  210 struct  device *getdisk(char *str, int len, int defpart, dev_t *devp);
  211 struct  device *parsedisk(char *str, int len, int defpart, dev_t *devp);
  212 void    device_register(struct device *, void *);
  213 
  214 int loadfirmware(const char *name, u_char **bufp, size_t *buflen);
  215 #define FIRMWARE_MAX    5*1024*1024
  216 
  217 /* compatibility definitions */
  218 #define config_found(d, a, p)   config_found_sm((d), (a), (p), NULL)
  219 
  220 #endif /* _KERNEL */
  221 
  222 #endif /* !_SYS_DEVICE_H_ */

/* [<][>][^][v][top][bottom][index][help] */