Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / device.h @ 13

History | View | Annotate | Download (20 KB)

1 13 up20180614
/* $NetBSD: device.h,v 1.147 2015/03/06 09:28:15 mrg Exp $ */
2
3
/*
4
 * Copyright (c) 1996, 2000 Christopher G. Demetriou
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 * 3. All advertising materials mentioning features or use of this software
16
 *    must display the following acknowledgement:
17
 *          This product includes software developed for the
18
 *          NetBSD Project.  See http://www.NetBSD.org/ for
19
 *          information about NetBSD.
20
 * 4. The name of the author may not be used to endorse or promote products
21
 *    derived from this software without specific prior written permission.
22
 *
23
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
 *
34
 * --(license Id: LICENSE.proto,v 1.1 2000/06/13 21:40:26 cgd Exp )--
35
 */
36
37
/*
38
 * Copyright (c) 1992, 1993
39
 *        The Regents of the University of California.  All rights reserved.
40
 *
41
 * This software was developed by the Computer Systems Engineering group
42
 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
43
 * contributed to Berkeley.
44
 *
45
 * All advertising materials mentioning features or use of this software
46
 * must display the following acknowledgement:
47
 *        This product includes software developed by the University of
48
 *        California, Lawrence Berkeley Laboratories.
49
 *
50
 * Redistribution and use in source and binary forms, with or without
51
 * modification, are permitted provided that the following conditions
52
 * are met:
53
 * 1. Redistributions of source code must retain the above copyright
54
 *    notice, this list of conditions and the following disclaimer.
55
 * 2. Redistributions in binary form must reproduce the above copyright
56
 *    notice, this list of conditions and the following disclaimer in the
57
 *    documentation and/or other materials provided with the distribution.
58
 * 3. Neither the name of the University nor the names of its contributors
59
 *    may be used to endorse or promote products derived from this software
60
 *    without specific prior written permission.
61
 *
62
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
63
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
64
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
65
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
66
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
67
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
68
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
69
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
70
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
71
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
72
 * SUCH DAMAGE.
73
 *
74
 *        @(#)device.h        8.2 (Berkeley) 2/17/94
75
 */
76
77
#ifndef _SYS_DEVICE_H_
78
#define        _SYS_DEVICE_H_
79
80
#include <sys/device_if.h>
81
#include <sys/evcnt.h>
82
#include <sys/queue.h>
83
84
#ifdef _KERNEL
85
#include <sys/mutex.h>
86
#include <sys/condvar.h>
87
#include <sys/pmf.h>
88
#endif
89
90
#include <prop/proplib.h>
91
92
/*
93
 * Minimal device structures.
94
 * Note that all ``system'' device types are listed here.
95
 */
96
typedef enum devclass {
97
        DV_DULL,                /* generic, no special info */
98
        DV_CPU,                        /* CPU (carries resource utilization) */
99
        DV_DISK,                /* disk drive (label, etc) */
100
        DV_IFNET,                /* network interface */
101
        DV_TAPE,                /* tape device */
102
        DV_TTY,                        /* serial line interface (?) */
103
        DV_AUDIODEV,                /* audio device */
104
        DV_DISPLAYDEV,                /* display device */
105
        DV_BUS,                        /* bus device */
106
        DV_VIRTUAL,                /* unbacked virtual device */
107
} devclass_t;
108
109
/*
110
 * Actions for ca_activate.
111
 */
112
typedef enum devact {
113
        DVACT_DEACTIVATE        /* deactivate the device */
114
} devact_t;
115
116
typedef enum {
117
        DVA_SYSTEM,
118
        DVA_HARDWARE
119
} devactive_t;
120
121
typedef struct cfdata *cfdata_t;
122
typedef struct cfdriver *cfdriver_t;
123
typedef struct cfattach *cfattach_t;
124
125
#ifdef _KERNEL
126
struct device_lock {
127
        int                dvl_nwait;
128
        int                dvl_nlock;
129
        lwp_t                *dvl_holder;
130
        kmutex_t        dvl_mtx;
131
        kcondvar_t        dvl_cv;
132
};
133
134
struct device_suspensor {
135
        const device_suspensor_t        *ds_delegator;
136
        char                                ds_name[32];
137
};
138
139
#define        DEVICE_SUSPENSORS_MAX        16
140
141
struct device_garbage {
142
        device_t        *dg_devs;
143
        int                dg_ndevs;
144
};
145
146
struct device {
147
        devclass_t        dv_class;        /* this device's classification */
148
        TAILQ_ENTRY(device) dv_list;        /* entry on list of all devices */
149
        cfdata_t        dv_cfdata;        /* config data that found us
150
                                           (NULL if pseudo-device) */
151
        cfdriver_t        dv_cfdriver;        /* our cfdriver */
152
        cfattach_t        dv_cfattach;        /* our cfattach */
153
        int                dv_unit;        /* device unit number */
154
        char                dv_xname[16];        /* external name (name + unit) */
155
        device_t        dv_parent;        /* pointer to parent device
156
                                           (NULL if pseudo- or root node) */
157
        int                dv_depth;        /* number of parents until root */
158
        int                dv_flags;        /* misc. flags; see below */
159
        void                *dv_private;        /* this device's private storage */
160
        int                *dv_locators;        /* our actual locators (optional) */
161
        prop_dictionary_t dv_properties;/* properties dictionary */
162
163
        size_t                dv_activity_count;
164
        void                (**dv_activity_handlers)(device_t, devactive_t);
165
166
        bool                (*dv_driver_suspend)(device_t, const pmf_qual_t *);
167
        bool                (*dv_driver_resume)(device_t, const pmf_qual_t *);
168
        bool                (*dv_driver_shutdown)(device_t, int);
169
        bool                (*dv_driver_child_register)(device_t);
170
171
        void                *dv_bus_private;
172
        bool                (*dv_bus_suspend)(device_t, const pmf_qual_t *);
173
        bool                (*dv_bus_resume)(device_t, const pmf_qual_t *);
174
        bool                (*dv_bus_shutdown)(device_t, int);
175
        void                (*dv_bus_deregister)(device_t);
176
177
        void                *dv_class_private;
178
        bool                (*dv_class_suspend)(device_t, const pmf_qual_t *);
179
        bool                (*dv_class_resume)(device_t, const pmf_qual_t *);
180
        void                (*dv_class_deregister)(device_t);
181
182
        devgen_t                dv_add_gen,
183
                                dv_del_gen;
184
185
        struct device_lock        dv_lock;
186
        const device_suspensor_t
187
            *dv_bus_suspensors[DEVICE_SUSPENSORS_MAX],
188
            *dv_driver_suspensors[DEVICE_SUSPENSORS_MAX],
189
            *dv_class_suspensors[DEVICE_SUSPENSORS_MAX];
190
        struct device_garbage dv_garbage;
191
};
192
193
/* dv_flags */
194
#define        DVF_ACTIVE                0x0001        /* device is activated */
195
#define        DVF_PRIV_ALLOC                0x0002        /* device private storage != device */
196
#define        DVF_POWER_HANDLERS        0x0004        /* device has suspend/resume support */
197
#define        DVF_CLASS_SUSPENDED        0x0008        /* device class suspend was called */
198
#define        DVF_DRIVER_SUSPENDED        0x0010        /* device driver suspend was called */
199
#define        DVF_BUS_SUSPENDED        0x0020        /* device bus suspend was called */
200
#define        DVF_DETACH_SHUTDOWN        0x0080        /* device detaches safely at shutdown */
201
202
TAILQ_HEAD(devicelist, device);
203
204
enum deviter_flags {
205
          DEVITER_F_RW =                0x1
206
        , DEVITER_F_SHUTDOWN =                0x2
207
        , DEVITER_F_LEAVES_FIRST =        0x4
208
        , DEVITER_F_ROOT_FIRST =        0x8
209
};
210
211
typedef enum deviter_flags deviter_flags_t;
212
213
struct deviter {
214
        device_t        di_prev;
215
        deviter_flags_t        di_flags;
216
        int                di_curdepth;
217
        int                di_maxdepth;
218
        devgen_t        di_gen;
219
};
220
221
typedef struct deviter deviter_t;
222
223
struct shutdown_state {
224
        bool initialized;
225
        deviter_t di;
226
};
227
#endif
228
229
/*
230
 * Description of a locator, as part of interface attribute definitions.
231
 */
232
struct cflocdesc {
233
        const char *cld_name;
234
        const char *cld_defaultstr; /* NULL if no default */
235
        int cld_default;
236
};
237
238
/*
239
 * Description of an interface attribute, provided by potential
240
 * parent device drivers, referred to by child device configuration data.
241
 */
242
struct cfiattrdata {
243
        const char *ci_name;
244
        int ci_loclen;
245
        const struct cflocdesc ci_locdesc[
246
#if defined(__GNUC__) && __GNUC__ <= 2
247
                0
248
#endif
249
        ];
250
};
251
252
/*
253
 * Description of a configuration parent.  Each device attachment attaches
254
 * to an "interface attribute", which is given in this structure.  The parent
255
 * *must* carry this attribute.  Optionally, an individual device instance
256
 * may also specify a specific parent device instance.
257
 */
258
struct cfparent {
259
        const char *cfp_iattr;                /* interface attribute */
260
        const char *cfp_parent;                /* optional specific parent */
261
        int cfp_unit;                        /* optional specific unit
262
                                           (DVUNIT_ANY to wildcard) */
263
};
264
265
/*
266
 * Configuration data (i.e., data placed in ioconf.c).
267
 */
268
struct cfdata {
269
        const char *cf_name;                /* driver name */
270
        const char *cf_atname;                /* attachment name */
271
        short        cf_unit;                /* unit number */
272
        short        cf_fstate;                /* finding state (below) */
273
        int        *cf_loc;                /* locators (machine dependent) */
274
        int        cf_flags;                /* flags from config */
275
        const struct cfparent *cf_pspec;/* parent specification */
276
};
277
#define FSTATE_NOTFOUND                0        /* has not been found */
278
#define        FSTATE_FOUND                1        /* has been found */
279
#define        FSTATE_STAR                2        /* duplicable */
280
#define FSTATE_DSTAR                3        /* has not been found, and disabled */
281
#define FSTATE_DNOTFOUND        4        /* duplicate, and disabled */
282
283
/*
284
 * Multiple configuration data tables may be maintained.  This structure
285
 * provides the linkage.
286
 */
287
struct cftable {
288
        cfdata_t        ct_cfdata;        /* pointer to cfdata table */
289
        TAILQ_ENTRY(cftable) ct_list;        /* list linkage */
290
};
291
TAILQ_HEAD(cftablelist, cftable);
292
293
typedef int (*cfsubmatch_t)(device_t, cfdata_t, const int *, void *);
294
295
/*
296
 * `configuration' attachment and driver (what the machine-independent
297
 * autoconf uses).  As devices are found, they are applied against all
298
 * the potential matches.  The one with the best match is taken, and a
299
 * device structure (plus any other data desired) is allocated.  Pointers
300
 * to these are placed into an array of pointers.  The array itself must
301
 * be dynamic since devices can be found long after the machine is up
302
 * and running.
303
 *
304
 * Devices can have multiple configuration attachments if they attach
305
 * to different attributes (busses, or whatever), to allow specification
306
 * of multiple match and attach functions.  There is only one configuration
307
 * driver per driver, so that things like unit numbers and the device
308
 * structure array will be shared.
309
 */
310
struct cfattach {
311
        const char *ca_name;                /* name of attachment */
312
        LIST_ENTRY(cfattach) ca_list;        /* link on cfdriver's list */
313
        size_t          ca_devsize;                /* size of dev data (for alloc) */
314
        int          ca_flags;                /* flags for driver allocation etc */
315
        int        (*ca_match)(device_t, cfdata_t, void *);
316
        void        (*ca_attach)(device_t, device_t, void *);
317
        int        (*ca_detach)(device_t, int);
318
        int        (*ca_activate)(device_t, devact_t);
319
        /* technically, the next 2 belong into "struct cfdriver" */
320
        int        (*ca_rescan)(device_t, const char *,
321
                             const int *); /* scan for new children */
322
        void        (*ca_childdetached)(device_t, device_t);
323
};
324
LIST_HEAD(cfattachlist, cfattach);
325
326
#define        CFATTACH_DECL3_NEW(name, ddsize, matfn, attfn, detfn, actfn, \
327
        rescanfn, chdetfn, __flags) \
328
struct cfattach __CONCAT(name,_ca) = {                                        \
329
        .ca_name                = ___STRING(name),                        \
330
        .ca_devsize                = ddsize,                                \
331
        .ca_flags                = (__flags) | DVF_PRIV_ALLOC,                \
332
        .ca_match                 = matfn,                                \
333
        .ca_attach                = attfn,                                \
334
        .ca_detach                = detfn,                                \
335
        .ca_activate                = actfn,                                \
336
        .ca_rescan                = rescanfn,                                \
337
        .ca_childdetached        = chdetfn,                                \
338
}
339
340
#define        CFATTACH_DECL2_NEW(name, ddsize, matfn, attfn, detfn, actfn,        \
341
        rescanfn, chdetfn)                                                \
342
        CFATTACH_DECL3_NEW(name, ddsize, matfn, attfn, detfn, actfn,        \
343
            rescanfn, chdetfn, 0)
344
345
#define        CFATTACH_DECL_NEW(name, ddsize, matfn, attfn, detfn, actfn)        \
346
        CFATTACH_DECL2_NEW(name, ddsize, matfn, attfn, detfn, actfn, NULL, NULL)
347
348
/* Flags given to config_detach(), and the ca_detach function. */
349
#define        DETACH_FORCE        0x01                /* force detachment; hardware gone */
350
#define        DETACH_QUIET        0x02                /* don't print a notice */
351
#define        DETACH_SHUTDOWN        0x04                /* detach because of system shutdown */
352
353
struct cfdriver {
354
        LIST_ENTRY(cfdriver) cd_list;        /* link on allcfdrivers */
355
        struct cfattachlist cd_attach;        /* list of all attachments */
356
        device_t *cd_devs;                /* devices found */
357
        const char *cd_name;                /* device name */
358
        enum        devclass cd_class;        /* device classification */
359
        int        cd_ndevs;                /* size of cd_devs array */
360
        const struct cfiattrdata * const *cd_attrs; /* attributes provided */
361
};
362
LIST_HEAD(cfdriverlist, cfdriver);
363
364
#define        CFDRIVER_DECL(name, class, attrs)                                \
365
struct cfdriver __CONCAT(name,_cd) = {                                        \
366
        .cd_name                = ___STRING(name),                        \
367
        .cd_class                = class,                                \
368
        .cd_attrs                = attrs,                                \
369
}
370
371
/*
372
 * The cfattachinit is a data structure used to associate a list of
373
 * cfattach's with cfdrivers as found in the static kernel configuration.
374
 */
375
struct cfattachinit {
376
        const char *cfai_name;                 /* driver name */
377
        struct cfattach * const *cfai_list;/* list of attachments */
378
};
379
/*
380
 * the same, but with a non-constant list so it can be modified
381
 * for module bookkeeping
382
 */
383
struct cfattachlkminit {
384
        const char *cfai_name;                /* driver name */
385
        struct cfattach **cfai_list;        /* list of attachments */
386
};
387
388
/*
389
 * Configuration printing functions, and their return codes.  The second
390
 * argument is NULL if the device was configured; otherwise it is the name
391
 * of the parent device.  The return value is ignored if the device was
392
 * configured, so most functions can return UNCONF unconditionally.
393
 */
394
typedef int (*cfprint_t)(void *, const char *);                /* XXX const char * */
395
#define        QUIET        0                /* print nothing */
396
#define        UNCONF        1                /* print " not configured\n" */
397
#define        UNSUPP        2                /* print " not supported\n" */
398
399
/*
400
 * Pseudo-device attach information (function + number of pseudo-devs).
401
 */
402
struct pdevinit {
403
        void        (*pdev_attach)(int);
404
        int        pdev_count;
405
};
406
407
/* This allows us to wildcard a device unit. */
408
#define        DVUNIT_ANY        -1
409
410
#ifdef _KERNEL
411
412
extern struct cfdriverlist allcfdrivers;/* list of all cfdrivers */
413
extern struct cftablelist allcftables;        /* list of all cfdata tables */
414
extern device_t booted_device;                /* the device we booted from */
415
extern int booted_partition;                /* the partition on that device */
416
extern daddr_t booted_startblk;                /* or the start of a wedge */
417
extern uint64_t booted_nblks;                /* and the size of that wedge */
418
extern char *bootspec;                        /* and the device/wedge name */
419
420
struct vnode *opendisk(device_t);
421
int getdisksize(struct vnode *, uint64_t *, unsigned int *);
422
struct dkwedge_info;
423
int getdiskinfo(struct vnode *, struct dkwedge_info *);
424
425
void        config_init(void);
426
int        config_init_component(struct cfdriver *const*,
427
                              const struct cfattachinit *, struct cfdata *);
428
int        config_fini_component(struct cfdriver *const*,
429
                              const struct cfattachinit *, struct cfdata *);
430
void        config_init_mi(void);
431
void        drvctl_init(void);
432
433
int        config_cfdriver_attach(struct cfdriver *);
434
int        config_cfdriver_detach(struct cfdriver *);
435
436
int        config_cfattach_attach(const char *, struct cfattach *);
437
int        config_cfattach_detach(const char *, struct cfattach *);
438
439
int        config_cfdata_attach(cfdata_t, int);
440
int        config_cfdata_detach(cfdata_t);
441
442
struct cfdriver *config_cfdriver_lookup(const char *);
443
struct cfattach *config_cfattach_lookup(const char *, const char *);
444
const struct cfiattrdata *cfiattr_lookup(const char *, const struct cfdriver *);
445
446
const char *cfdata_ifattr(const struct cfdata *);
447
448
int        config_stdsubmatch(device_t, cfdata_t, const int *, void *);
449
cfdata_t config_search_loc(cfsubmatch_t, device_t,
450
                                 const char *, const int *, void *);
451
cfdata_t config_search_ia(cfsubmatch_t, device_t,
452
                                 const char *, void *);
453
cfdata_t config_rootsearch(cfsubmatch_t, const char *, void *);
454
device_t config_found_sm_loc(device_t, const char *, const int *,
455
                             void *, cfprint_t, cfsubmatch_t);
456
device_t config_found_ia(device_t, const char *, void *, cfprint_t);
457
device_t config_found(device_t, void *, cfprint_t);
458
device_t config_rootfound(const char *, void *);
459
device_t config_attach_loc(device_t, cfdata_t, const int *, void *, cfprint_t);
460
device_t config_attach(device_t, cfdata_t, void *, cfprint_t);
461
int        config_match(device_t, cfdata_t, void *);
462
463
bool ifattr_match(const char *, const char *);
464
465
device_t config_attach_pseudo(cfdata_t);
466
467
int        config_detach(device_t, int);
468
int        config_detach_children(device_t, int flags);
469
bool        config_detach_all(int);
470
int        config_deactivate(device_t);
471
void        config_defer(device_t, void (*)(device_t));
472
void        config_deferred(device_t);
473
void        config_interrupts(device_t, void (*)(device_t));
474
void        config_mountroot(device_t, void (*)(device_t));
475
void        config_pending_incr(device_t);
476
void        config_pending_decr(device_t);
477
void        config_create_interruptthreads(void);
478
void        config_create_mountrootthreads(void);
479
480
int        config_finalize_register(device_t, int (*)(device_t));
481
void        config_finalize(void);
482
void        config_finalize_mountroot(void);
483
484
void        config_twiddle_init(void);
485
void        config_twiddle_fn(void *);
486
487
void        null_childdetached(device_t, device_t);
488
489
device_t        device_lookup(cfdriver_t, int);
490
void                *device_lookup_private(cfdriver_t, int);
491
void                device_register(device_t, void *);
492
void                device_register_post_config(device_t, void *);
493
494
devclass_t        device_class(device_t);
495
cfdata_t        device_cfdata(device_t);
496
cfdriver_t        device_cfdriver(device_t);
497
cfattach_t        device_cfattach(device_t);
498
int                device_unit(device_t);
499
const char        *device_xname(device_t);
500
device_t        device_parent(device_t);
501
bool                device_is_active(device_t);
502
bool                device_activation(device_t, devact_level_t);
503
bool                device_is_enabled(device_t);
504
bool                device_has_power(device_t);
505
int                device_locator(device_t, u_int);
506
void                *device_private(device_t);
507
prop_dictionary_t device_properties(device_t);
508
509
device_t        deviter_first(deviter_t *, deviter_flags_t);
510
void                deviter_init(deviter_t *, deviter_flags_t);
511
device_t        deviter_next(deviter_t *);
512
void                deviter_release(deviter_t *);
513
514
bool                device_active(device_t, devactive_t);
515
bool                device_active_register(device_t,
516
                                       void (*)(device_t, devactive_t));
517
void                device_active_deregister(device_t,
518
                                         void (*)(device_t, devactive_t));
519
520
bool                device_is_a(device_t, const char *);
521
522
device_t        device_find_by_xname(const char *);
523
device_t        device_find_by_driver_unit(const char *, int);
524
525
bool                device_pmf_is_registered(device_t);
526
527
bool                device_pmf_driver_suspend(device_t, const pmf_qual_t *);
528
bool                device_pmf_driver_resume(device_t, const pmf_qual_t *);
529
bool                device_pmf_driver_shutdown(device_t, int);
530
531
bool                device_pmf_driver_register(device_t,
532
                    bool (*)(device_t, const pmf_qual_t *),
533
                    bool (*)(device_t, const pmf_qual_t *),
534
                    bool (*)(device_t, int));
535
void                device_pmf_driver_deregister(device_t);
536
537
bool                device_pmf_driver_child_register(device_t);
538
void                device_pmf_driver_set_child_register(device_t,
539
                    bool (*)(device_t));
540
541
void                *device_pmf_bus_private(device_t);
542
bool                device_pmf_bus_suspend(device_t, const pmf_qual_t *);
543
bool                device_pmf_bus_resume(device_t, const pmf_qual_t *);
544
bool                device_pmf_bus_shutdown(device_t, int);
545
546
device_lock_t        device_getlock(device_t);
547
void                device_pmf_unlock(device_t);
548
bool                device_pmf_lock(device_t);
549
550
bool                device_is_self_suspended(device_t);
551
void                device_pmf_self_suspend(device_t, const pmf_qual_t *);
552
void                device_pmf_self_resume(device_t, const pmf_qual_t *);
553
bool                device_pmf_self_wait(device_t, const pmf_qual_t *);
554
555
void                device_pmf_bus_register(device_t, void *,
556
                    bool (*)(device_t, const pmf_qual_t *),
557
                    bool (*)(device_t, const pmf_qual_t *),
558
                    bool (*)(device_t, int),
559
                    void (*)(device_t));
560
void                device_pmf_bus_deregister(device_t);
561
562
void                *device_pmf_class_private(device_t);
563
bool                device_pmf_class_suspend(device_t, const pmf_qual_t *);
564
bool                device_pmf_class_resume(device_t, const pmf_qual_t *);
565
566
void                device_pmf_class_register(device_t, void *,
567
                    bool (*)(device_t, const pmf_qual_t *),
568
                    bool (*)(device_t, const pmf_qual_t *),
569
                    void (*)(device_t));
570
void                device_pmf_class_deregister(device_t);
571
572
device_t        shutdown_first(struct shutdown_state *);
573
device_t        shutdown_next(struct shutdown_state *);
574
#endif /* _KERNEL */
575
576
#endif /* !_SYS_DEVICE_H_ */