summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/dacf_impl.h
blob: af32afad304afd16f5123f40b8a14a0573c5d60f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_DACF_IMPL_H
#define	_DACF_IMPL_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

/*
 * Implementation-Private definitions for Device autoconfiguration (dacf)
 */

#ifdef	__cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <sys/dacf.h>

typedef struct dacf_module {
	char *dm_name;			/* module name */
	krwlock_t dm_lock;		/* module lock */
	int dm_loaded;			/* whether dm_opsets is valid */
	dacf_opset_t *dm_opsets;	/* null-terminated array of op-sets */
} dacf_module_t;


#define	DACF_RULE_HASHSIZE	8
#define	DACF_MODULE_HASHSIZE	8
#define	DACF_INFO_HASHSIZE	16

/*
 * Flags to dacf_process_rsrvs
 */
#define	DACF_PROC_INVOKE	0x0001
#define	DACF_PROC_RELE		0x0002

typedef enum dacf_devspec {
	DACF_DS_ERROR = -1,		/* error state */
	DACF_DS_MIN_NT = 1,		/* match minor node-type */
	DACF_DS_DRV_MNAME = 2,		/* match driver minor name */
	DACF_DS_DEV_PATH = 3		/* match device path */
} dacf_devspec_t;

#define	DACF_NUM_DEVSPECS 3

typedef struct dacf_arg {
	char *arg_name;			/* operation argument name */
	char *arg_val;			/* operation argument value */
	struct dacf_arg *arg_next;	/* next arg in chain */
} dacf_arg_t;

typedef struct dacf_rule {
	char *r_devspec_data;		/* the dev-spec data to match against */
	char *r_module;			/* module implementing the operation */
	char *r_opset;			/* opset in module that impls. op */
	dacf_opid_t r_opid;		/* operation id for this rule */
	uint_t r_opts;			/* reserved for options */
	uint_t r_refs;			/* reference count */
	dacf_arg_t *r_args;		/* linked list of operation arguments */
} dacf_rule_t;

typedef struct dacf_rsrvlist {
	dacf_rule_t *rsrv_rule;		/* the rule being reserved for later */
	dacf_infohdl_t rsrv_ihdl;
	int rsrv_result;		/* retval of the last invoke */
	struct dacf_rsrvlist *rsrv_next;
} dacf_rsrvlist_t;

#ifdef _KERNEL

extern kmutex_t dacf_lock;

int dacf_module_register(char *, struct dacfsw *);
int dacf_module_unregister(char *);

int dacf_arg_insert(dacf_arg_t **, char *, char *);
void dacf_arglist_delete(dacf_arg_t **);

void dacf_init(void);
int read_dacf_binding_file(char *);
void dacf_clear_rules(void);

dacf_devspec_t dacf_get_devspec(char *);
const char *dacf_devspec_to_str(dacf_devspec_t);

dacf_opid_t dacf_get_op(char *);
const char *dacf_opid_to_str(dacf_opid_t);

int dacf_getopt(char *, uint_t *);

int dacf_rule_insert(dacf_devspec_t, char *, char *, char *,
    dacf_opid_t, uint_t, dacf_arg_t *);
void dacf_rule_hold(dacf_rule_t *);
void dacf_rule_rele(dacf_rule_t *);

struct ddi_minor_data;
void dacf_rsrv_make(dacf_rsrvlist_t *, dacf_rule_t *, void *,
    dacf_rsrvlist_t **);
void dacf_process_rsrvs(dacf_rsrvlist_t **, dacf_opid_t, int);
void dacf_clr_rsrvs(dev_info_t *, dacf_opid_t);

dacf_rule_t *dacf_match(dacf_opid_t, dacf_devspec_t, void *);

/*
 * Failure codes from dacf_op_invoke, assigned to dacf_rsrvlist_t.rsrv_result
 */
#define	DACF_ERR_MOD_NOTFOUND		-1
#define	DACF_ERR_OPSET_NOTFOUND		-2
#define	DACF_ERR_OP_NOTFOUND		-3
#define	DACF_ERR_OP_FAILED		-4

int dacf_op_invoke(dacf_rule_t *, dacf_infohdl_t, int);

/*
 * Debugging support
 */
#define	DACF_DBG_MSGS		0x00000001
#define	DACF_DBG_DEVI		0x00000002

extern int dacfdebug;


/*
 * dacf client support: definitions pertaining to the various kernel hooks
 * that utilize the dacf framework
 */

void dacfc_match_create_minor(char *, char *, dev_info_t *,
    struct ddi_minor_data *, int);

int dacfc_postattach(dev_info_t *);
int dacfc_predetach(dev_info_t *);

#endif /* _KERNEL */

#ifdef __cplusplus
}
#endif

#endif /* _DACF_IMPL_H */