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_ */