xref: /dragonfly/sys/sys/bus_private.h (revision 97b3c8acbaa72d96597f884abbf4d1c4d8790fab)
1 /*-
2  * Copyright (c) 1997, 1998 Doug Rabson
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD: src/sys/sys/bus_private.h,v 1.11.2.2 2000/08/03 00:25:22 peter Exp $
27  */
28 
29 #ifndef _SYS_BUS_PRIVATE_H_
30 #define _SYS_BUS_PRIVATE_H_
31 
32 #include <sys/sysctl.h>
33 
34 #if !defined(_KERNEL) && !defined(_KERNEL_STRUCTURES)
35 #error "This file should not be included by userland programs."
36 #endif
37 
38 #ifndef _SYS_BUS_H_
39 #include <sys/bus.h>
40 #endif
41 
42 /*
43  * Used to attach drivers to devclasses.
44  */
45 typedef struct driverlink *driverlink_t;
46 struct driverlink {
47           kobj_class_t                  driver;
48           TAILQ_ENTRY(driverlink) link; /* list of drivers in devclass */
49 };
50 
51 /*
52  * Forward declarations
53  */
54 typedef TAILQ_HEAD(devclass_list, devclass) devclass_list_t;
55 typedef TAILQ_HEAD(driver_list, driverlink) driver_list_t;
56 typedef TAILQ_HEAD(device_list, bsd_device) device_list_t;
57 
58 struct devclass {
59           TAILQ_ENTRY(devclass) link;
60           devclass_t          parent;             /* parent in devclass hierarchy */
61           driver_list_t       drivers;  /* bus devclasses store drivers for bus */
62           char                *name;
63           device_t  *devices; /* array of devices indexed by unit */
64           int                 maxunit;  /* size of devices array */
65 
66           struct sysctl_ctx_list sysctl_ctx;
67           struct sysctl_oid *sysctl_tree;
68 };
69 
70 /*
71  * Resources from config(8).
72  */
73 typedef enum {
74           RES_INT, RES_STRING, RES_LONG
75 } resource_type;
76 
77 struct config_resource {
78           char                *name;
79           resource_type       type;
80           union {
81                     long      longval;
82                     int       intval;
83                     char*     stringval;
84           } u;
85 };
86 
87 struct config_device {
88           char                          *name;              /* e.g. "lpt", "wdc" etc */
89           int                           unit;
90           int                           resource_count;
91           struct config_resource        *resources;
92 };
93 
94 /*
95  * Implementation of device.
96  */
97 struct bsd_device {
98           /*
99            * A device is a kernel object. The first field must be the
100            * current ops table for the object.
101            */
102           KOBJ_FIELDS;
103 
104           /*
105            * Device hierarchy.
106            */
107           TAILQ_ENTRY(bsd_device)       link;               /* list of devices in parent */
108           TAILQ_ENTRY(bsd_device)       devlink;  /* global device list membership */
109           device_t            parent;
110           device_list_t                 children; /* list of subordinate devices */
111 
112           /*
113            * Details of this device.
114            */
115           driver_t  *driver;
116           devclass_t          devclass; /* device class which we are in */
117           int                 unit;
118           char*               nameunit; /* name+unit e.g. foodev0 */
119           char*               desc;               /* driver specific description */
120           int                 busy;               /* count of calls to device_busy() */
121           device_state_t      state;
122           uint32_t  devflags; /* api level flags for device_get_flags() */
123           u_short             flags;
124 #define DF_ENABLED  0x0001              /* device should be probed/attached */
125 #define DF_FIXEDCLASS         0x0002              /* devclass specified at create time */
126 #define DF_WILDCARD 0x0004              /* unit was originally wildcard */
127 #define DF_DESCMALLOCED       0x0008              /* description was malloced */
128 #define DF_QUIET    0x0010              /* don't print verbose attach message */
129 #define DF_DONENOMATCH        0x0020              /* don't execute DEVICE_NOMATCH again */
130 #define DF_EXTERNALSOFTC 0x0040                   /* softc not allocated by us */
131 #define DF_ASYNCPROBE         0x0080              /* can be probed with its own thread */
132           u_char              order;              /* order from device_add_child_ordered() */
133           u_char              pad;
134           void                *ivars;
135           void                *softc;
136 
137           struct sysctl_ctx_list sysctl_ctx; /**< state for sysctl variables  */
138           struct sysctl_oid *sysctl_tree;         /**< state for sysctl variables */
139 };
140 
141 struct device_op_desc {
142           unsigned int        offset;             /* offset in driver ops */
143           struct method*      method;             /* internal method implementation */
144           devop_t             deflt;              /* default implementation */
145           const char*         name;               /* unique name (for registration) */
146 };
147 
148 #endif    /* !_SYS_BUS_PRIVATE_H_ */
149