FreeBSD/Linux Kernel Cross Reference
sys/sys/device.h
1 /* $OpenBSD: device.h,v 1.64 2022/09/03 18:05:10 kettenis 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 #define DVACT_DEACTIVATE 1 /* deactivate the device */
66 #define DVACT_QUIESCE 2 /* warn the device about suspend */
67 #define DVACT_SUSPEND 3 /* suspend the device */
68 #define DVACT_RESUME 4 /* resume the device */
69 #define DVACT_WAKEUP 5 /* tell device to recover after resume */
70 #define DVACT_POWERDOWN 6 /* power device down */
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 const 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 long *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 short cf_starunit1; /* 1st usable unit number by STAR */
101 };
102 extern struct cfdata cfdata[];
103 #define FSTATE_NOTFOUND 0 /* has not been found */
104 #define FSTATE_FOUND 1 /* has been found */
105 #define FSTATE_STAR 2 /* duplicable */
106 #define FSTATE_DNOTFOUND 3 /* has not been found, and is disabled */
107 #define FSTATE_DSTAR 4 /* duplicable, and is disabled */
108
109 typedef int (*cfmatch_t)(struct device *, void *, void *);
110 typedef void (*cfscan_t)(struct device *, void *);
111
112 /*
113 * `configuration' attachment and driver (what the machine-independent
114 * autoconf uses). As devices are found, they are applied against all
115 * the potential matches. The one with the best match is taken, and a
116 * device structure (plus any other data desired) is allocated. Pointers
117 * to these are placed into an array of pointers. The array itself must
118 * be dynamic since devices can be found long after the machine is up
119 * and running.
120 *
121 * Devices can have multiple configuration attachments if they attach
122 * to different attributes (busses, or whatever), to allow specification
123 * of multiple match and attach functions. There is only one configuration
124 * driver per driver, so that things like unit numbers and the device
125 * structure array will be shared.
126 */
127 struct cfattach {
128 size_t ca_devsize; /* size of dev data (for malloc) */
129 cfmatch_t ca_match; /* returns a match level */
130 void (*ca_attach)(struct device *, struct device *, void *);
131 int (*ca_detach)(struct device *, int);
132 int (*ca_activate)(struct device *, int);
133 };
134
135 /* Flags given to config_detach(), and the ca_detach function. */
136 #define DETACH_FORCE 0x01 /* force detachment; hardware gone */
137 #define DETACH_QUIET 0x02 /* don't print a notice */
138
139 /* For cd_mode, below */
140 #define CD_INDIRECT 1
141 #define CD_SKIPHIBERNATE 2
142
143 struct cfdriver {
144 void **cd_devs; /* devices found */
145 char *cd_name; /* device name */
146 enum devclass cd_class; /* device classification */
147 int cd_mode; /* device type subclassification */
148 int cd_ndevs; /* size of cd_devs array */
149 };
150
151 /*
152 * Configuration printing functions, and their return codes. The second
153 * argument is NULL if the device was configured; otherwise it is the name
154 * of the parent device. The return value is ignored if the device was
155 * configured, so most functions can return UNCONF unconditionally.
156 */
157 typedef int (*cfprint_t)(void *, const char *);
158 #define QUIET 0 /* print nothing */
159 #define UNCONF 1 /* print " not configured\n" */
160 #define UNSUPP 2 /* print " not supported\n" */
161
162 /*
163 * Pseudo-device attach information (function + number of pseudo-devs).
164 */
165 struct pdevinit {
166 void (*pdev_attach)(int);
167 int pdev_count;
168 };
169
170 #ifdef _KERNEL
171
172 #ifdef DIAGNOSTIC
173 extern int pdevinit_done;
174 #endif
175
176 extern struct devicelist alldevs; /* list of all devices */
177
178 extern int autoconf_verbose;
179 extern volatile int config_pending; /* semaphore for mountroot */
180
181 void config_init(void);
182 void *config_search(cfmatch_t, struct device *, void *);
183 struct device *config_found_sm(struct device *, void *, cfprint_t,
184 cfmatch_t);
185 struct device *config_rootfound(char *, void *);
186 void config_scan(cfscan_t, struct device *);
187 struct device *config_attach(struct device *, void *, void *, cfprint_t);
188 int config_detach(struct device *, int);
189 int config_detach_children(struct device *, int);
190 int config_deactivate(struct device *);
191 int config_suspend(struct device *, int);
192 int config_suspend_all(int);
193 int config_activate_children(struct device *, int);
194 struct device *config_make_softc(struct device *parent,
195 struct cfdata *cf);
196 void config_defer(struct device *, void (*)(struct device *));
197 void config_pending_incr(void);
198 void config_pending_decr(void);
199 void config_mountroot(struct device *, void (*)(struct device *));
200 void config_process_deferred_mountroot(void);
201
202 int sleep_state(void *, int);
203 #define SLEEP_SUSPEND 0x01
204 #define SLEEP_HIBERNATE 0x02
205 void sleep_mp(void);
206 void resume_mp(void);
207 int sleep_showstate(void *v, int sleepmode);
208 int sleep_setstate(void *v);
209 int sleep_resume(void *v);
210 void sleep_abort(void *v);
211 int gosleep(void *v);
212 int suspend_finish(void *v);
213
214 struct device *device_mainbus(void);
215 struct device *device_mpath(void);
216 struct device *device_lookup(struct cfdriver *, int unit);
217 void device_ref(struct device *);
218 void device_unref(struct device *);
219
220 struct nam2blk {
221 char *name;
222 int maj;
223 };
224
225 int findblkmajor(struct device *dv);
226 char *findblkname(int);
227 void setroot(struct device *, int, int);
228 struct device *getdisk(char *str, int len, int defpart, dev_t *devp);
229 struct device *parsedisk(char *str, int len, int defpart, dev_t *devp);
230 void device_register(struct device *, void *);
231 void device_register_wakeup(struct device *);
232
233 int loadfirmware(const char *name, u_char **bufp, size_t *buflen);
234 #define FIRMWARE_MAX 5*1024*1024
235
236 /* compatibility definitions */
237 #define config_found(d, a, p) config_found_sm((d), (a), (p), NULL)
238
239 #endif /* _KERNEL */
240
241 #endif /* !_SYS_DEVICE_H_ */
Cache object: a0f9710c9dbaff461ec15c0a1d4cfc5b
|