8446 uts: pci_check_bios() should check for BIOS
[unleashed.git] / include / sys / devops.h
bloba8272a4fff78b5ff3a12c9445e8408546ebe8e4b
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 * Copyright 2012 Garrett D'Amore <garrett@damore.org>. All rights reserved.
29 #ifndef _SYS_DEVOPS_H
30 #define _SYS_DEVOPS_H
32 #include <sys/types.h>
33 #include <sys/cred.h>
34 #include <sys/uio.h>
35 #include <sys/buf.h>
36 #include <sys/poll.h>
37 #include <vm/as.h>
39 #include <sys/dditypes.h>
40 #include <sys/ddidmareq.h>
41 #include <sys/ddimapreq.h>
42 #include <sys/ddipropdefs.h>
43 #include <sys/ddidevmap.h>
44 #include <sys/ddifm.h>
45 #include <sys/nexusdefs.h>
46 #include <sys/ddi_intr.h>
47 #include <sys/ddi_hp.h>
48 #include <sys/ddi_hp_impl.h>
49 #include <sys/aio_req.h>
50 #include <vm/page.h>
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
56 #ifdef _KERNEL
59 * cb_ops: Leaf device drivers or bus nexus drivers supporting
60 * direct user process access (open/close/etc).
62 * This is an OR of cdevsw and bdevsw fields for drivers that
63 * support both character and block entry points.
65 * For streams stuff, see also sys/stream.h.
67 * The following DDI/DKI or DKI only or DDI only functions are
68 * provided in the character/block driver operations structure.
70 * block/char Function description
71 * b/c XXopen DDI/DKI
72 * b/c XXclose DDI/DKI
73 * b XXstrategy DDI/DKI
74 * b XXprint DDI/DKI
75 * b XXdump DDI(Sun)
76 * c XXread DDI/DKI
77 * c XXwrite DDI/DKI
78 * c XXioctl DDI/DKI
79 * c XXdevmap DDI(Sun)
80 * c XXmmap DKI(Obsolete)
81 * c XXsegmap DKI
82 * c XXchpoll DDI/DKI
83 * c XXprop_op DDI(Sun)
84 * c XXaread DDI(Sun)
85 * c XXawrite DDI(Sun)
88 struct cb_ops {
89 int (*cb_open)(dev_t *devp, int flag, int otyp, cred_t *credp);
90 int (*cb_close)(dev_t dev, int flag, int otyp, cred_t *credp);
91 int (*cb_strategy)(struct buf *bp);
92 int (*cb_print)(dev_t dev, char *str);
93 int (*cb_dump)(dev_t dev, caddr_t addr, daddr_t blkno, int nblk);
94 int (*cb_read)(dev_t dev, struct uio *uiop, cred_t *credp);
95 int (*cb_write)(dev_t dev, struct uio *uiop, cred_t *credp);
96 int (*cb_ioctl)(dev_t dev, int cmd, intptr_t arg, int mode,
97 cred_t *credp, int *rvalp);
98 int (*cb_devmap)(dev_t dev, devmap_cookie_t dhp, offset_t off,
99 size_t len, size_t *maplen, uint_t model);
100 int (*cb_mmap)(dev_t dev, off_t off, int prot);
101 int (*cb_segmap)(dev_t dev, off_t off, struct as *asp,
102 caddr_t *addrp, off_t len, unsigned int prot,
103 unsigned int maxprot, unsigned int flags, cred_t *credp);
104 int (*cb_chpoll)(dev_t dev, short events, int anyyet,
105 short *reventsp, struct pollhead **phpp);
106 int (*cb_prop_op)(dev_t dev, dev_info_t *dip,
107 ddi_prop_op_t prop_op, int mod_flags,
108 char *name, caddr_t valuep, int *length);
110 struct streamtab *cb_str; /* streams information */
113 * The cb_flag fields are here to tell the system a
114 * bit about the device. The bit definitions are
115 * in <sys/conf.h>.
117 int cb_flag; /* driver compatibility flag */
118 int cb_rev; /* cb_ops version number */
119 int (*cb_aread)(dev_t dev, struct aio_req *aio, cred_t *credp);
120 int (*cb_awrite)(dev_t dev, struct aio_req *aio, cred_t *credp);
124 * bus_ops: bus nexus drivers only.
126 * These functions are used to implement the Sun DDI functions
127 * described elsewhere.
129 * Only nexus drivers support these entry points.
131 * The following bus nexus functions are provided in the bus nexus
132 * driver operations structure. Note that all functions take both
133 * their dip and the requesters dip except for the child functions since
134 * they will be called from outside the ddi.
136 * bus_map - Map/unmap/control IU -> device mappings.
137 * bus_get_intrspec - obsolete, not called
138 * bus_add_intrspec - obsolete, not called
139 * bus_remove_intrspec - obsolete, not called
140 * bus_map_fault - bus fault handler
141 * bus_dma_map - obsolete, not called
142 * bus_dma_allochdl - allocate a DMA handle
143 * bus_dma_freehdl - free a DMA handle
144 * bus_dma_bindhdl - bind a DMA handle to physical mapping
145 * bus_dma_unbindhdl - unbind a DMA handle to physical mapping
146 * bus_dma_flush - flush DMA caches
147 * bus_dma_win - access DMA windows
148 * bus_dma_ctl - control dma mapping (legacy use only)
149 * bus_ctl - generic control operations
150 * bus_prop_op - request for property
151 * bus_get_eventcookie - get an event cookie
152 * bus_add_eventcall - event call management
153 * bus_remove_eventcall - event call management
154 * bus_post_event - post an event
155 * bus_config - child node configuration
156 * bus_unconfig - child node unconfiguration
157 * bus_fm_init - FMA support
158 * bus_fm_fini - FMA support
159 * bus_fm_access_enter - FMA support
160 * bus_fm_access_exit - FMA support
161 * bus_power - power management
162 * bus_intr_op - control interrupt mappings
163 * bus_hp_op - hotplug support
166 #define BUSO_REV_3 3
167 #define BUSO_REV_4 4
168 #define BUSO_REV_5 5
169 #define BUSO_REV_6 6
170 #define BUSO_REV_7 7
171 #define BUSO_REV_8 8
172 #define BUSO_REV_9 9
173 #define BUSO_REV_10 10
174 #define BUSO_REV BUSO_REV_10
177 struct bus_ops {
178 int busops_rev; /* rev of this structure */
179 int (*bus_map)(dev_info_t *dip, dev_info_t *rdip,
180 ddi_map_req_t *mp, off_t offset, off_t len,
181 caddr_t *vaddrp);
184 * NOTE: the following 3 busops entrypoints are obsoleted with
185 * version 9 or greater. Use bus_intr_op interface in place of
186 * these obsolete interfaces.
188 ddi_intrspec_t (*bus_get_intrspec)(dev_info_t *dip, dev_info_t *rdip,
189 uint_t inumber);
190 int (*bus_add_intrspec)(dev_info_t *dip,
191 dev_info_t *rdip, ddi_intrspec_t intrspec,
192 ddi_iblock_cookie_t *ibcp,
193 ddi_idevice_cookie_t *idcp,
194 uint_t (*int_handler)(caddr_t intr_handler_arg),
195 caddr_t intr_handler_arg, int kind);
196 void (*bus_remove_intrspec)(dev_info_t *dip,
197 dev_info_t *rdip, ddi_intrspec_t intrspec,
198 ddi_iblock_cookie_t iblock_cookie);
200 int (*bus_map_fault)(dev_info_t *dip, dev_info_t *rdip,
201 struct hat *hat, struct seg *seg, caddr_t addr,
202 struct devpage *dp, pfn_t pfn, uint_t prot,
203 uint_t lock);
204 int (*bus_dma_map)(dev_info_t *dip, dev_info_t *rdip,
205 struct ddi_dma_req *dmareq,
206 ddi_dma_handle_t *handlep);
207 int (*bus_dma_allochdl)(dev_info_t *dip, dev_info_t *rdip,
208 ddi_dma_attr_t *attr, int (*waitfp)(caddr_t),
209 caddr_t arg, ddi_dma_handle_t *handlep);
210 int (*bus_dma_freehdl)(dev_info_t *dip, dev_info_t *rdip,
211 ddi_dma_handle_t handle);
212 int (*bus_dma_bindhdl)(dev_info_t *dip, dev_info_t *rdip,
213 ddi_dma_handle_t handle, struct ddi_dma_req *dmareq,
214 ddi_dma_cookie_t *, uint_t *);
215 int (*bus_dma_unbindhdl)(dev_info_t *dip, dev_info_t *rdip,
216 ddi_dma_handle_t handle);
217 int (*bus_dma_flush)(dev_info_t *dip, dev_info_t *rdip,
218 ddi_dma_handle_t handle, off_t off,
219 size_t len, uint_t cache_flags);
220 int (*bus_dma_win)(dev_info_t *dip, dev_info_t *rdip,
221 ddi_dma_handle_t handle, uint_t win, off_t *offp,
222 size_t *lenp, ddi_dma_cookie_t *cookiep,
223 uint_t *ccountp);
224 int (*bus_dma_ctl)(dev_info_t *dip, dev_info_t *rdip,
225 ddi_dma_handle_t handle,
226 enum ddi_dma_ctlops request, off_t *offp,
227 size_t *lenp, caddr_t *objp, uint_t flags);
228 int (*bus_ctl)(dev_info_t *dip, dev_info_t *rdip,
229 ddi_ctl_enum_t ctlop, void *arg, void *result);
230 int (*bus_prop_op)(dev_t dev, dev_info_t *dip,
231 dev_info_t *child_dip, ddi_prop_op_t prop_op,
232 int mod_flags, char *name, caddr_t valuep,
233 int *length);
235 * NOTE: the following 4 busops entrypoints are only available
236 * with version 3 or greater. Due to interface modifications, these
237 * entrypoints can only be used with version 6 or greater.
240 int (*bus_get_eventcookie)(dev_info_t *dip,
241 dev_info_t *rdip, char *eventname,
242 ddi_eventcookie_t *cookiep);
243 int (*bus_add_eventcall)(dev_info_t *dip, dev_info_t *rdip,
244 ddi_eventcookie_t eventid,
245 void (*event_hdlr)(dev_info_t *dip,
246 ddi_eventcookie_t event, void *arg,
247 void *bus_impldata), void *arg,
248 ddi_callback_id_t *cb_id);
249 int (*bus_remove_eventcall)(dev_info_t *devi,
250 ddi_callback_id_t cb_id);
251 int (*bus_post_event)(dev_info_t *dip, dev_info_t *rdip,
252 ddi_eventcookie_t event, void *impl_data);
255 * NOTE: the following bus_intr_ctl entrypoint is obsoleted with
256 * version 9 or greater. Use bus_intr_op interface in place of
257 * this obsolete interface.
259 int (*bus_intr_ctl)(dev_info_t *dip, dev_info_t *rdip,
260 ddi_intr_ctlop_t ctlop, void * arg, void * result);
262 * NOTE: the following busop entrypoints are available with version
263 * 5 or greater.
265 int (*bus_config)(dev_info_t *parent, uint_t flags,
266 ddi_bus_config_op_t op, void *arg,
267 dev_info_t **childp);
268 int (*bus_unconfig)(dev_info_t *parent, uint_t flags,
269 ddi_bus_config_op_t op, void *arg);
272 * NOTE: the following busop entrypoints are available with version
273 * 6 or greater.
275 int (*bus_fm_init)(dev_info_t *dip, dev_info_t *tdip,
276 int cap, ddi_iblock_cookie_t *ibc);
277 void (*bus_fm_fini)(dev_info_t *dip, dev_info_t *tdip);
278 void (*bus_fm_access_enter)(dev_info_t *dip,
279 ddi_acc_handle_t handle);
280 void (*bus_fm_access_exit)(dev_info_t *dip,
281 ddi_acc_handle_t handle);
284 * NOTE: the following busop entrypoint is available with version
285 * 7 or greater.
287 int (*bus_power)(dev_info_t *dip, void *impl_arg,
288 pm_bus_power_op_t op, void *arg, void *result);
291 * NOTE: the following busop entrypoint is available with version
292 * 9 or greater.
294 int (*bus_intr_op)(dev_info_t *dip, dev_info_t *rdip,
295 ddi_intr_op_t op, ddi_intr_handle_impl_t *hdlp,
296 void *result);
299 * NOTE: the following busop entrypoint is available with version
300 * 10 or greater.
302 int (*bus_hp_op)(dev_info_t *dip, char *cn_name,
303 ddi_hp_op_t op, void *arg, void *result);
307 * REV 1 bus ops structure
310 struct bus_ops_rev1 {
311 int (*bus_map)(dev_info_t *dip, dev_info_t *rdip,
312 ddi_map_req_t *mp, off_t offset, off_t len,
313 caddr_t *vaddrp);
314 ddi_intrspec_t (*bus_get_intrspec)(dev_info_t *dip, dev_info_t *rdip,
315 uint_t inumber);
316 int (*bus_add_intrspec)(dev_info_t *dip,
317 dev_info_t *rdip, ddi_intrspec_t intrspec,
318 ddi_iblock_cookie_t *ibcp,
319 ddi_idevice_cookie_t *idcp,
320 uint_t (*int_handler)(caddr_t intr_handler_arg),
321 caddr_t intr_handler_arg, int kind);
322 void (*bus_remove_intrspec)(dev_info_t *dip,
323 dev_info_t *rdip, ddi_intrspec_t intrspec,
324 ddi_iblock_cookie_t iblock_cookie);
325 int (*bus_map_fault)(dev_info_t *dip, dev_info_t *rdip,
326 struct hat *hat, struct seg *seg, caddr_t addr,
327 struct devpage *dp, pfn_t pfn, uint_t prot,
328 uint_t lock);
329 int (*bus_dma_map)(dev_info_t *dip, dev_info_t *rdip,
330 struct ddi_dma_req *dmareq,
331 ddi_dma_handle_t *handlep);
332 int (*bus_dma_ctl)(dev_info_t *dip, dev_info_t *rdip,
333 ddi_dma_handle_t handle,
334 enum ddi_dma_ctlops request, off_t *offp,
335 uint_t *lenp, caddr_t *objp, uint_t flags);
336 int (*bus_ctl)(dev_info_t *dip, dev_info_t *rdip,
337 ddi_ctl_enum_t ctlop, void *arg, void *result);
338 int (*bus_prop_op)(dev_t dev, dev_info_t *dip,
339 dev_info_t *child_dip, ddi_prop_op_t prop_op,
340 int mod_flags, char *name, caddr_t valuep,
341 int *length);
345 * dev_ops: Contains driver common fields and pointers
346 * to the bus_ops and/or cb_ops parts.
348 * Drivers should set devo_rev to DEVO_REV at compile time.
349 * All drivers should support these entry points.
351 * the following device functions are provided in the device operations
352 * structure.
354 * devo_getinfo - Device handle conversion
355 * devo_identify - Obsolete, set to nulldev
356 * devo_probe - Probe for device's existence
357 * devo_attach - Attach driver to dev_info
358 * devo_detach - Detach/prepare driver to unload
359 * devo_reset - Reset device
360 * devo_quiesce - Quiesce device
363 #define DEVO_REV 4
364 #define CB_REV 1
367 * Return from driver's devo_probe function:
370 #define DDI_PROBE_FAILURE ENXIO /* matches nodev return */
371 #define DDI_PROBE_DONTCARE 0 /* matches nulldev return */
372 #define DDI_PROBE_PARTIAL 1
373 #define DDI_PROBE_SUCCESS 2
376 * Typedefs for the info, attach, detach and reset routines.
377 * These are mostly placeholders for now.
379 * NOTE: DDI_INFO_DEVT2DEVINFO is deprecated
381 typedef enum {
382 DDI_INFO_DEVT2DEVINFO = 0, /* Convert a dev_t to a dev_info_t */
383 DDI_INFO_DEVT2INSTANCE = 1 /* Convert a dev_t to an instance # */
384 } ddi_info_cmd_t;
386 typedef enum {
387 DDI_ATTACH = 0,
388 DDI_RESUME = 1,
389 DDI_PM_RESUME = 2
390 } ddi_attach_cmd_t;
392 typedef enum {
393 DDI_DETACH = 0,
394 DDI_SUSPEND = 1,
395 DDI_PM_SUSPEND = 2,
396 DDI_HOTPLUG_DETACH = 3 /* detach, don't try to auto-unconfig */
397 } ddi_detach_cmd_t;
399 typedef enum {
400 DDI_RESET_FORCE = 0
401 } ddi_reset_cmd_t;
403 struct dev_ops {
404 int devo_rev; /* Driver build version */
405 int devo_refcnt; /* device reference count */
407 int (*devo_getinfo)(dev_info_t *dip,
408 ddi_info_cmd_t infocmd, void *arg, void **result);
409 int (*devo_identify)(dev_info_t *dip);
410 int (*devo_probe)(dev_info_t *dip);
411 int (*devo_attach)(dev_info_t *dip, ddi_attach_cmd_t cmd);
412 int (*devo_detach)(dev_info_t *dip, ddi_detach_cmd_t cmd);
413 int (*devo_reset)(dev_info_t *dip, ddi_reset_cmd_t cmd);
415 struct cb_ops *devo_cb_ops; /* cb_ops pointer for leaf drivers */
416 struct bus_ops *devo_bus_ops; /* bus_ops pointer for nexus drivers */
417 int (*devo_power)(dev_info_t *dip, int component,
418 int level);
419 int (*devo_quiesce)(dev_info_t *dip);
423 * Create a dev_ops suitable for a streams driver:
425 * XXX: Note: Since this is a macro, it is NOT supported as
426 * XXX: part of the Sun DDI. It is not a documented Sun DDI interface.
428 * STR_OPS(name, identify, probe, attach, detach, reset,
429 * info, flag, stream_tab);
431 * XXname is the name of the dev_ops structure.
432 * XXidentify must be set to nulldev
433 * XXprobe is the name of the probe routine, or nulldev
434 * XXattach is the name of the attach routine
435 * XXdetach is the name of the detach routine, or nodev
436 * XXreset is the name of the reset routine, or nodev
437 * XXinfo is the name of the info routine
438 * XXflag is driver flag (cb_flag) in cb_ops,
439 * XXstream_tab is the obvious.
440 * XXquiesce is the name of the quiesce routine. It must be implemented
441 * for fast reboot to succeed.
442 * cb_##XXname is the name of the internally defined cb_ops struct.
444 * uses cb_XXname as name of static cb_ops structure.
448 * This file is included by genassym.c now and I couldn't get it to take the
449 * next line if it was broken into two lines joined by a '\'. So, don't try
450 * to reformat it to satisfy Cstyle because genassym.c won't compile.
452 /* CSTYLED */
453 #define DDI_DEFINE_STREAM_OPS(XXname, XXidentify, XXprobe, XXattach, XXdetach, XXreset, XXgetinfo, XXflag, XXstream_tab, XXquiesce) \
454 static struct cb_ops cb_##XXname = { \
455 nulldev, /* cb_open */ \
456 nulldev, /* cb_close */ \
457 nodev, /* cb_strategy */ \
458 nodev, /* cb_print */ \
459 nodev, /* cb_dump */ \
460 nodev, /* cb_read */ \
461 nodev, /* cb_write */ \
462 nodev, /* cb_ioctl */ \
463 nodev, /* cb_devmap */ \
464 nodev, /* cb_mmap */ \
465 nodev, /* cb_segmap */ \
466 nochpoll, /* cb_chpoll */ \
467 ddi_prop_op, /* cb_prop_op */ \
468 (XXstream_tab), /* cb_stream */ \
469 (int)(XXflag), /* cb_flag */ \
470 CB_REV, /* cb_rev */ \
471 nodev, /* cb_aread */ \
472 nodev, /* cb_awrite */ \
473 }; \
475 static struct dev_ops XXname = { \
476 DEVO_REV, /* devo_rev */ \
477 0, /* devo_refcnt */ \
478 (XXgetinfo), /* devo_getinfo */ \
479 (XXidentify), /* devo_identify */ \
480 (XXprobe), /* devo_probe */ \
481 (XXattach), /* devo_attach */ \
482 (XXdetach), /* devo_detach */ \
483 (XXreset), /* devo_reset */ \
484 &(cb_##XXname), /* devo_cb_ops */ \
485 NULL, /* devo_bus_ops */ \
486 NULL, /* devo_power */ \
487 (XXquiesce) /* devo_quiesce */ \
490 #endif /* _KERNEL */
492 #ifdef __cplusplus
494 #endif
496 #endif /* _SYS_DEVOPS_H */