| Commit | Line | Data |
|---|---|---|
| 335dda38 | 1 | /* |
| 0e9b9130 | 2 | * Copyright (c) 2003,2004,2007 The DragonFly Project. All rights reserved. |
| 07dfa375 | 3 | * |
| 8c10bfcf MD |
4 | * This code is derived from software contributed to The DragonFly Project |
| 5 | * by Matthew Dillon <dillon@backplane.com> | |
| 07dfa375 | 6 | * |
| 335dda38 MD |
7 | * Redistribution and use in source and binary forms, with or without |
| 8 | * modification, are permitted provided that the following conditions | |
| 9 | * are met: | |
| 07dfa375 | 10 | * |
| 335dda38 MD |
11 | * 1. Redistributions of source code must retain the above copyright |
| 12 | * notice, this list of conditions and the following disclaimer. | |
| 13 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 8c10bfcf MD |
14 | * notice, this list of conditions and the following disclaimer in |
| 15 | * the documentation and/or other materials provided with the | |
| 16 | * distribution. | |
| 17 | * 3. Neither the name of The DragonFly Project nor the names of its | |
| 18 | * contributors may be used to endorse or promote products derived | |
| 19 | * from this software without specific, prior written permission. | |
| 07dfa375 | 20 | * |
| 8c10bfcf MD |
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 22 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
| 24 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
| 25 | * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
| 26 | * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
| 27 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| 28 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | |
| 29 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| 30 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |
| 31 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 335dda38 | 32 | * SUCH DAMAGE. |
| 07dfa375 | 33 | * |
| ca464209 | 34 | * $DragonFly: src/sys/sys/device.h,v 1.11 2007/05/17 03:02:00 dillon Exp $ |
| 335dda38 MD |
35 | */ |
| 36 | ||
| 37 | #ifndef _SYS_DEVICE_H_ | |
| 38 | #define _SYS_DEVICE_H_ | |
| 39 | ||
| 1bd40720 MD |
40 | #ifndef _SYS_TYPES_H_ |
| 41 | #include <sys/types.h> | |
| 42 | #endif | |
| 0e9b9130 MD |
43 | #ifndef _SYS_TREE_H_ |
| 44 | #include <sys/tree.h> | |
| 45 | #endif | |
| a3d02589 MD |
46 | #ifndef _SYS_SYSLINK_RPC_H_ |
| 47 | #include <sys/syslink_rpc.h> | |
| 335dda38 MD |
48 | #endif |
| 49 | ||
| b13267a5 | 50 | struct cdev; |
| cd29885a | 51 | struct ucred; |
| b96f3782 | 52 | struct devfs_bitmap; |
| b13267a5 | 53 | |
| 335dda38 | 54 | /* |
| fef8985e | 55 | * This structure is at the base of every device args structure |
| 335dda38 | 56 | */ |
| fef8985e MD |
57 | struct dev_generic_args { |
| 58 | struct syslink_desc *a_desc; | |
| b13267a5 | 59 | struct cdev *a_dev; |
| 335dda38 MD |
60 | }; |
| 61 | ||
| fef8985e MD |
62 | typedef struct dev_generic_args dev_default_args; |
| 63 | ||
| 335dda38 | 64 | /* |
| b13267a5 | 65 | * int d_open(cdev_t dev, int oflags, int devtype, struct ucred *cred) |
| 335dda38 | 66 | */ |
| fef8985e MD |
67 | struct dev_open_args { |
| 68 | struct dev_generic_args a_head; | |
| 69 | int a_oflags; | |
| 70 | int a_devtype; | |
| 71 | struct ucred *a_cred; | |
| 335dda38 MD |
72 | }; |
| 73 | ||
| 74 | /* | |
| b13267a5 | 75 | * int d_close(cdev_t dev, int fflag, int devtype) |
| 335dda38 | 76 | */ |
| fef8985e MD |
77 | struct dev_close_args { |
| 78 | struct dev_generic_args a_head; | |
| 79 | int a_fflag; | |
| 80 | int a_devtype; | |
| 335dda38 MD |
81 | }; |
| 82 | ||
| 83 | /* | |
| b13267a5 | 84 | * int d_read(cdev_t dev, struct uio *uio, int ioflag) |
| 335dda38 | 85 | */ |
| fef8985e MD |
86 | struct dev_read_args { |
| 87 | struct dev_generic_args a_head; | |
| 88 | struct uio *a_uio; | |
| 89 | int a_ioflag; | |
| 335dda38 MD |
90 | }; |
| 91 | ||
| 92 | /* | |
| b13267a5 | 93 | * int d_write(cdev_t dev, struct uio *uio, int ioflag) |
| 335dda38 | 94 | */ |
| fef8985e MD |
95 | struct dev_write_args { |
| 96 | struct dev_generic_args a_head; | |
| 97 | struct uio *a_uio; | |
| 98 | int a_ioflag; | |
| 335dda38 MD |
99 | }; |
| 100 | ||
| 101 | /* | |
| b13267a5 | 102 | * int d_ioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, |
| 87baaf0c | 103 | * struct ucred *cred, struct sysmsg *msg) |
| 335dda38 | 104 | */ |
| fef8985e MD |
105 | struct dev_ioctl_args { |
| 106 | struct dev_generic_args a_head; | |
| 107 | u_long a_cmd; | |
| 108 | caddr_t a_data; | |
| 109 | int a_fflag; | |
| 110 | struct ucred *a_cred; | |
| 87baaf0c | 111 | struct sysmsg *a_sysmsg; |
| 335dda38 MD |
112 | }; |
| 113 | ||
| 114 | /* | |
| b13267a5 | 115 | * int d_poll(cdev_t dev, int events) |
| 335dda38 | 116 | */ |
| fef8985e MD |
117 | struct dev_poll_args { |
| 118 | struct dev_generic_args a_head; | |
| 119 | int a_events; | |
| 335dda38 MD |
120 | }; |
| 121 | ||
| 122 | /* | |
| b13267a5 | 123 | * int d_mmap(cdev_t dev, vm_offset_t offset, int nprot) |
| 335dda38 | 124 | */ |
| fef8985e MD |
125 | struct dev_mmap_args { |
| 126 | struct dev_generic_args a_head; | |
| 127 | vm_offset_t a_offset; | |
| 128 | int a_nprot; | |
| 129 | int a_result; /* page number */ | |
| 335dda38 MD |
130 | }; |
| 131 | ||
| 132 | /* | |
| b13267a5 | 133 | * void d_strategy(cdev_t dev, struct bio *bio) |
| 335dda38 | 134 | */ |
| fef8985e MD |
135 | struct dev_strategy_args { |
| 136 | struct dev_generic_args a_head; | |
| 137 | struct bio *a_bio; | |
| 335dda38 MD |
138 | }; |
| 139 | ||
| 140 | /* | |
| b24cd69c AH |
141 | * void d_dump(cdev_t dev, void *virtual, vm_offset_t physical, |
| 142 | off_t offset, size_t length) | |
| 335dda38 | 143 | */ |
| fef8985e MD |
144 | struct dev_dump_args { |
| 145 | struct dev_generic_args a_head; | |
| e0fc5693 MD |
146 | u_int64_t a_count; |
| 147 | u_int64_t a_blkno; | |
| fef8985e | 148 | u_int a_secsize; |
| b24cd69c AH |
149 | void *a_virtual; |
| 150 | vm_offset_t a_physical; | |
| 151 | off_t a_offset; | |
| 152 | size_t a_length; | |
| fef8985e MD |
153 | }; |
| 154 | ||
| 155 | /* | |
| b13267a5 | 156 | * int d_psize(cdev_t dev) |
| fef8985e MD |
157 | */ |
| 158 | struct dev_psize_args { | |
| 159 | struct dev_generic_args a_head; | |
| e0fc5693 | 160 | int64_t a_result; |
| 335dda38 MD |
161 | }; |
| 162 | ||
| 163 | /* | |
| b13267a5 | 164 | * int d_kqfilter(cdev_t dev, struct knote *kn) |
| 335dda38 | 165 | */ |
| fef8985e MD |
166 | struct dev_kqfilter_args { |
| 167 | struct dev_generic_args a_head; | |
| 168 | struct knote *a_kn; | |
| 169 | int a_result; | |
| 170 | }; | |
| 171 | ||
| a32446b7 MD |
172 | /* |
| 173 | * int d_clone(cdev_t dev); | |
| 174 | */ | |
| fef8985e MD |
175 | struct dev_clone_args { |
| 176 | struct dev_generic_args a_head; | |
| cd29885a | 177 | |
| 07dfa375 AH |
178 | struct cdev *a_dev; |
| 179 | const char *a_name; | |
| 180 | size_t a_namelen; | |
| 181 | struct ucred *a_cred; | |
| 182 | int a_mode; | |
| 335dda38 MD |
183 | }; |
| 184 | ||
| 185 | /* | |
| a32446b7 MD |
186 | * int d_revoke(cdev_t dev) |
| 187 | */ | |
| 188 | struct dev_revoke_args { | |
| 189 | struct dev_generic_args a_head; | |
| 190 | }; | |
| 191 | ||
| 192 | /* | |
| fef8985e MD |
193 | * Typedefs to help drivers declare the driver routines and such |
| 194 | */ | |
| 195 | typedef int d_default_t (struct dev_generic_args *ap); | |
| 196 | typedef int d_open_t (struct dev_open_args *ap); | |
| 197 | typedef int d_close_t (struct dev_close_args *ap); | |
| 198 | typedef int d_read_t (struct dev_read_args *ap); | |
| 199 | typedef int d_write_t (struct dev_write_args *ap); | |
| 200 | typedef int d_ioctl_t (struct dev_ioctl_args *ap); | |
| 201 | typedef int d_poll_t (struct dev_poll_args *ap); | |
| 202 | typedef int d_mmap_t (struct dev_mmap_args *ap); | |
| 203 | typedef int d_strategy_t (struct dev_strategy_args *ap); | |
| 204 | typedef int d_dump_t (struct dev_dump_args *ap); | |
| 205 | typedef int d_psize_t (struct dev_psize_args *ap); | |
| 206 | typedef int d_kqfilter_t (struct dev_kqfilter_args *ap); | |
| 207 | typedef int d_clone_t (struct dev_clone_args *ap); | |
| a32446b7 | 208 | typedef int d_revoke_t (struct dev_revoke_args *ap); |
| fef8985e MD |
209 | |
| 210 | /* | |
| 211 | * Character device switch table. | |
| 212 | * | |
| 213 | * NOTE: positions are hard coded for static structure initialization. | |
| 214 | */ | |
| 215 | struct dev_ops { | |
| 216 | struct { | |
| 217 | const char *name; /* base name, e.g. 'da' */ | |
| e94d6677 SW |
218 | int maj; /* major device number */ |
| 219 | u_int flags; /* D_XXX flags */ | |
| 7cbab9da | 220 | void *data; /* custom driver data */ |
| e94d6677 SW |
221 | int refs; /* ref count */ |
| 222 | int id; | |
| fef8985e MD |
223 | } head; |
| 224 | ||
| 225 | #define dev_ops_first_field d_default | |
| 226 | d_default_t *d_default; | |
| 227 | d_open_t *d_open; | |
| 228 | d_close_t *d_close; | |
| 229 | d_read_t *d_read; | |
| 230 | d_write_t *d_write; | |
| 231 | d_ioctl_t *d_ioctl; | |
| 232 | d_poll_t *d_poll; | |
| 233 | d_mmap_t *d_mmap; | |
| 234 | d_strategy_t *d_strategy; | |
| 235 | d_dump_t *d_dump; | |
| 236 | d_psize_t *d_psize; | |
| 237 | d_kqfilter_t *d_kqfilter; | |
| 238 | d_clone_t *d_clone; /* clone from base dev_ops */ | |
| a32446b7 MD |
239 | d_revoke_t *d_revoke; |
| 240 | #define dev_ops_last_field d_revoke | |
| fef8985e MD |
241 | }; |
| 242 | ||
| 243 | /* | |
| 244 | * Types for d_flags. | |
| 335dda38 | 245 | */ |
| fef8985e MD |
246 | #define D_TAPE 0x0001 |
| 247 | #define D_DISK 0x0002 | |
| 248 | #define D_TTY 0x0004 | |
| 249 | #define D_MEM 0x0008 | |
| 250 | ||
| 251 | #define D_TYPEMASK 0xffff | |
| c0885fab | 252 | #define D_SEEKABLE (D_TAPE | D_DISK | D_MEM) |
| fef8985e MD |
253 | |
| 254 | /* | |
| 255 | * Flags for d_flags. | |
| 256 | */ | |
| 257 | #define D_MEMDISK 0x00010000 /* memory type disk */ | |
| 258 | #define D_NAGGED 0x00020000 /* nagged about missing make_dev() */ | |
| 259 | #define D_CANFREE 0x00040000 /* can free blocks */ | |
| 260 | #define D_TRACKCLOSE 0x00080000 /* track all closes */ | |
| 261 | #define D_MASTER 0x00100000 /* used by pty/tty code */ | |
| 262 | #define D_KQFILTER 0x00200000 /* has kqfilter entry */ | |
| 3a1032a6 AH |
263 | #define D_MPSAFE_READ 0x00400000 /* doesn't require mplock for reads */ |
| 264 | #define D_MPSAFE_WRITE 0x00800000 /* doesn't require mplock for writes */ | |
| 265 | #define D_MPSAFE_IOCTL 0x01000000 /* doesn't require mplock for ioctls */ | |
| fef8985e MD |
266 | |
| 267 | /* | |
| 268 | * A union of all possible argument structures. | |
| 269 | */ | |
| 270 | union dev_args_union { | |
| 271 | struct dev_generic_args du_head; | |
| 272 | struct dev_open_args du_open; | |
| 273 | struct dev_close_args du_close; | |
| 274 | struct dev_read_args du_read; | |
| 275 | struct dev_write_args du_write; | |
| 276 | struct dev_ioctl_args du_ioctl; | |
| 277 | struct dev_poll_args du_poll; | |
| 278 | struct dev_mmap_args du_mmap; | |
| 279 | struct dev_strategy_args du_strategy; | |
| 280 | struct dev_dump_args du_dump; | |
| 281 | struct dev_psize_args du_psize; | |
| 282 | struct dev_kqfilter_args du_kqfilter; | |
| 283 | struct dev_clone_args du_clone; | |
| 284 | }; | |
| 285 | ||
| 286 | /* | |
| 287 | * Linking structure for mask/match registration | |
| 288 | */ | |
| 289 | struct dev_ops_link { | |
| 290 | struct dev_ops_link *next; | |
| 291 | u_int mask; | |
| 292 | u_int match; | |
| 293 | struct dev_ops *ops; | |
| 294 | }; | |
| 335dda38 | 295 | |
| 0e9b9130 MD |
296 | struct dev_ops_maj { |
| 297 | RB_ENTRY(dev_ops_maj) rbnode; /* red-black tree of major nums */ | |
| 298 | struct dev_ops_link *link; | |
| 299 | int maj; | |
| 300 | }; | |
| 301 | ||
| 302 | RB_HEAD(dev_ops_rb_tree, dev_ops_maj); | |
| 303 | RB_PROTOTYPE2(dev_ops_rb_tree, dev_ops_maj, rbnode, rb_dev_ops_compare, int); | |
| 304 | ||
| 335dda38 MD |
305 | #ifdef _KERNEL |
| 306 | ||
| fef8985e MD |
307 | extern struct dev_ops dead_dev_ops; |
| 308 | ||
| 335dda38 | 309 | struct disk; |
| 87baaf0c | 310 | struct sysmsg; |
| 335dda38 | 311 | |
| b13267a5 MD |
312 | int dev_dopen(cdev_t dev, int oflags, int devtype, struct ucred *cred); |
| 313 | int dev_dclose(cdev_t dev, int fflag, int devtype); | |
| 314 | void dev_dstrategy(cdev_t dev, struct bio *bio); | |
| 315 | void dev_dstrategy_chain(cdev_t dev, struct bio *bio); | |
| 316 | int dev_dioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, | |
| 87baaf0c | 317 | struct ucred *cred, struct sysmsg *msg); |
| b24cd69c AH |
318 | int dev_ddump(cdev_t dev, void *virtual, vm_offset_t physical, off_t offset, |
| 319 | size_t length); | |
| e0fc5693 | 320 | int64_t dev_dpsize(cdev_t dev); |
| b13267a5 MD |
321 | int dev_dread(cdev_t dev, struct uio *uio, int ioflag); |
| 322 | int dev_dwrite(cdev_t dev, struct uio *uio, int ioflag); | |
| 323 | int dev_dpoll(cdev_t dev, int events); | |
| 324 | int dev_dkqfilter(cdev_t dev, struct knote *kn); | |
| 325 | int dev_dmmap(cdev_t dev, vm_offset_t offset, int nprot); | |
| 326 | int dev_dclone(cdev_t dev); | |
| a32446b7 | 327 | int dev_drevoke(cdev_t dev); |
| b13267a5 | 328 | |
| ca464209 | 329 | int dev_drefs(cdev_t dev); |
| b13267a5 MD |
330 | const char *dev_dname(cdev_t dev); |
| 331 | int dev_dmaj(cdev_t dev); | |
| 332 | int dev_dflags(cdev_t dev); | |
| fef8985e MD |
333 | int dev_doperate(struct dev_generic_args *ap); |
| 334 | int dev_doperate_ops(struct dev_ops *, struct dev_generic_args *ap); | |
| 335 | ||
| 336 | d_default_t nodefault; | |
| 337 | d_open_t noopen; | |
| 338 | d_close_t noclose; | |
| 339 | d_read_t noread; | |
| 340 | d_write_t nowrite; | |
| 341 | d_ioctl_t noioctl; | |
| 342 | d_poll_t nopoll; | |
| 343 | d_mmap_t nommap; | |
| 344 | d_strategy_t nostrategy; | |
| 345 | d_dump_t nodump; | |
| 346 | d_psize_t nopsize; | |
| 347 | d_kqfilter_t nokqfilter; | |
| 348 | d_clone_t noclone; | |
| a32446b7 | 349 | d_revoke_t norevoke; |
| fef8985e MD |
350 | |
| 351 | d_open_t nullopen; | |
| 352 | d_close_t nullclose; | |
| 353 | ||
| 354 | extern struct syslink_desc dev_default_desc; | |
| 355 | extern struct syslink_desc dev_open_desc; | |
| 356 | extern struct syslink_desc dev_close_desc; | |
| 357 | extern struct syslink_desc dev_read_desc; | |
| 358 | extern struct syslink_desc dev_write_desc; | |
| 359 | extern struct syslink_desc dev_ioctl_desc; | |
| 360 | extern struct syslink_desc dev_dump_desc; | |
| 361 | extern struct syslink_desc dev_psize_desc; | |
| 362 | extern struct syslink_desc dev_poll_desc; | |
| 363 | extern struct syslink_desc dev_mmap_desc; | |
| 364 | extern struct syslink_desc dev_strategu_desc; | |
| 365 | extern struct syslink_desc dev_kqfilter_desc; | |
| 366 | extern struct syslink_desc dev_clone_desc; | |
| 367 | ||
| 368 | void compile_dev_ops(struct dev_ops *); | |
| cd29885a MD |
369 | int dev_ops_remove_all(struct dev_ops *ops); |
| 370 | int dev_ops_remove_minor(struct dev_ops *ops, int minor); | |
| b13267a5 MD |
371 | struct dev_ops *dev_ops_intercept(cdev_t, struct dev_ops *); |
| 372 | void dev_ops_restore(cdev_t, struct dev_ops *); | |
| fef8985e | 373 | |
| b13267a5 | 374 | cdev_t make_dev(struct dev_ops *ops, int minor, uid_t uid, gid_t gid, |
| fef8985e | 375 | int perms, const char *fmt, ...) __printflike(6, 7); |
| 8f960aa9 AH |
376 | cdev_t make_dev_covering(struct dev_ops *ops, struct dev_ops *bops, int minor, |
| 377 | uid_t uid, gid_t gid, int perms, const char *fmt, ...) __printflike(7, 8); | |
| cd29885a MD |
378 | cdev_t make_only_dev(struct dev_ops *ops, int minor, uid_t uid, gid_t gid, |
| 379 | int perms, const char *fmt, ...) __printflike(6, 7); | |
| 380 | cdev_t make_only_devfs_dev(struct dev_ops *ops, int minor, uid_t uid, gid_t gid, | |
| 381 | int perms, const char *fmt, ...) __printflike(6, 7); | |
| 382 | void destroy_only_dev(cdev_t dev); | |
| 383 | int make_dev_alias(cdev_t target, const char *fmt, ...); | |
| b96f3782 AH |
384 | cdev_t make_autoclone_dev(struct dev_ops *ops, struct devfs_bitmap *bitmap, |
| 385 | d_clone_t *nhandler, uid_t uid, gid_t gid, int perms, const char *fmt, ...); | |
| 07dfa375 | 386 | void destroy_autoclone_dev(cdev_t dev, struct devfs_bitmap *bitmap); |
| 2a32d680 MD |
387 | void sync_devs(void); |
| 388 | ||
| 335dda38 MD |
389 | #endif |
| 390 | ||
| 391 | #endif | |
| 392 |