Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      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.
      7  *
      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.
     12  *
     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]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef	_SYS_DDIPROPDEFS_H
     27 #define	_SYS_DDIPROPDEFS_H
     28 
     29 #ifdef	__cplusplus
     30 extern "C" {
     31 #endif
     32 
     33 /*
     34  * ddiprops.h:	All definitions related to DDI properties.
     35  *		Structure definitions are private to the DDI
     36  *		implementation.  See also, ddipropfuncs.h
     37  */
     38 
     39 /*
     40  * ddi_prop_op_t:	Enum for prop_op functions
     41  */
     42 
     43 typedef enum {
     44 	PROP_LEN = 0,		/* Get prop len only */
     45 	PROP_LEN_AND_VAL_BUF,	/* Get len+val into callers buffer */
     46 	PROP_LEN_AND_VAL_ALLOC,	/* Get len+val into alloc-ed buffer */
     47 	PROP_EXISTS		/* Does the property exist? */
     48 } ddi_prop_op_t;
     49 
     50 /*
     51  * ddi_prop_t:	The basic item used to store software defined propeties.
     52  *		Note that properties are always stored by reference.
     53  */
     54 
     55 typedef struct ddi_prop {
     56 	struct ddi_prop	*prop_next;
     57 	dev_t		prop_dev;	/* specific match/wildcard */
     58 	char		*prop_name;	/* Property name */
     59 	int		prop_flags;	/* See flags below */
     60 	int		prop_len;	/* Prop length (0 == Bool. prop) */
     61 	caddr_t		prop_val;	/* ptr to property value */
     62 } ddi_prop_t;
     63 
     64 /*
     65  * A referenced property list, used for sharing properties among
     66  * multiple driver instances
     67  */
     68 typedef struct ddi_prop_list {
     69 	ddi_prop_t	*prop_list;
     70 	int		prop_ref;
     71 } ddi_prop_list_t;
     72 
     73 /*
     74  * Handle passed around to encode/decode a property value.
     75  */
     76 typedef struct ddi_prop_handle {
     77 	void			*ph_data;	/* Encoded data */
     78 	void			*ph_cur_pos;	/* encode/decode position */
     79 	void			*ph_save_pos;	/* Save/restore position */
     80 	uint_t			ph_size;	/* Size of encoded data */
     81 	uint_t			ph_flags;	/* See below */
     82 	struct prop_handle_ops	*ph_ops;	/* Encode/decode routines */
     83 } prop_handle_t;
     84 
     85 /*
     86  * Property handle encode/decode ops
     87  */
     88 typedef struct prop_handle_ops {
     89 	int (*op_prop_int)(prop_handle_t *ph, uint_t cmd, int *data);
     90 	int (*op_prop_str)(prop_handle_t *ph, uint_t cmd, char *data);
     91 	int (*op_prop_bytes)(prop_handle_t *ph, uint_t cmd,
     92 				uchar_t *data, uint_t size);
     93 	int (*op_prop_int64)(prop_handle_t *ph, uint_t cmd, int64_t *data);
     94 } prop_handle_ops_t;
     95 
     96 /*
     97  * Data passed back to driver.  The driver gets a pointer to driver_data.
     98  * When we get it back we do negative indexing to find the size and free
     99  * routine to call
    100  */
    101 struct prop_driver_data {
    102 	size_t	pdd_size;
    103 	void	(*pdd_prop_free)(struct prop_driver_data *);
    104 };
    105 
    106 
    107 /*
    108  * Macros to call the integer/string/byte OBP 1275 operators
    109  */
    110 #define	DDI_PROP_INT(ph, cmd, data)		\
    111 		(*(ph)->ph_ops->op_prop_int)((ph), (cmd), (data))
    112 #define	DDI_PROP_STR(ph, cmd, data)		\
    113 		(*(ph)->ph_ops->op_prop_str)((ph), (cmd), (data))
    114 #define	DDI_PROP_BYTES(ph, cmd, data, size)	\
    115 		(*(ph)->ph_ops->op_prop_bytes)((ph), (cmd), (data), (size))
    116 
    117 /*
    118  * Macro to call the 64 bit integer operator
    119  */
    120 #define	DDI_PROP_INT64(ph, cmd, data)		\
    121 		(*(ph)->ph_ops->op_prop_int64)((ph), (cmd), (data))
    122 
    123 /*
    124  * Property handle commands
    125  */
    126 typedef enum {
    127 	DDI_PROP_CMD_GET_ESIZE,		/* Get encoded size of data  */
    128 	DDI_PROP_CMD_GET_DSIZE,		/* Get decoded size of data */
    129 	DDI_PROP_CMD_DECODE,		/* Decode the current data */
    130 	DDI_PROP_CMD_ENCODE,		/* Encode the current data */
    131 	DDI_PROP_CMD_SKIP		/* Skip the current data */
    132 } ddi_prop_cmd_t;
    133 
    134 /*
    135  * Return values from property handle encode/decode ops
    136  * Positive numbers are used to return the encoded or
    137  * decode size of the object, so an ok return must be positive,
    138  * and all error returns negative.
    139  */
    140 typedef enum {
    141 	DDI_PROP_RESULT_ERROR = -2,	/* error in encoding/decoding data */
    142 	DDI_PROP_RESULT_EOF,		/* end of data reached */
    143 	DDI_PROP_RESULT_OK		/* if >= to DDI_PROP_RESULT_OK, */
    144 					/* operation was successful */
    145 } ddi_prop_result_t;
    146 
    147 /* 1275 property cell */
    148 typedef uint32_t prop_1275_cell_t;
    149 
    150 /* Length of a 1275 property cell */
    151 #define	PROP_1275_CELL_SIZE	sizeof (prop_1275_cell_t)
    152 #define	CELLS_1275_TO_BYTES(n)	((n) * PROP_1275_CELL_SIZE)
    153 #define	BYTES_TO_1275_CELLS(n)	((n) / PROP_1275_CELL_SIZE)
    154 
    155 /*
    156  * Property handle flags
    157  */
    158 #define	PH_FROM_PROM	0x01	/* Property came from the prom */
    159 
    160 /*
    161  * Return values from property functions:
    162  */
    163 
    164 #define	DDI_PROP_SUCCESS	0
    165 #define	DDI_PROP_NOT_FOUND	1	/* Prop not defined */
    166 #define	DDI_PROP_UNDEFINED	2	/* Overriden to undefine a prop */
    167 #define	DDI_PROP_NO_MEMORY	3	/* Unable to allocate/no sleep */
    168 #define	DDI_PROP_INVAL_ARG	4	/* Invalid calling argument */
    169 #define	DDI_PROP_BUF_TOO_SMALL	5	/* Callers buf too small */
    170 #define	DDI_PROP_CANNOT_DECODE	6	/* Could not decode prop */
    171 #define	DDI_PROP_CANNOT_ENCODE	7	/* Could not encode prop */
    172 #define	DDI_PROP_END_OF_DATA	8	/* Prop found in an encoded format */
    173 
    174 /*
    175  * used internally in the framework only
    176  */
    177 #define	DDI_PROP_FOUND_1275	255	/* Prop found in OPB 1275 format */
    178 
    179 /*
    180  * Size of a 1275 int in bytes
    181  */
    182 #define	PROP_1275_INT_SIZE	4
    183 
    184 /*
    185  * Property flags:
    186  */
    187 
    188 #define	DDI_PROP_DONTPASS	0x0001	/* Don't pass request to parent */
    189 #define	DDI_PROP_CANSLEEP	0x0002	/* Memory allocation may sleep */
    190 
    191 /*
    192  * Used internally by the DDI property rountines and masked in DDI(9F)
    193  * interfaces...
    194  */
    195 
    196 #define	DDI_PROP_SYSTEM_DEF	0x0004	/* System defined property */
    197 
    198 /*
    199  * Used in framework only, to inhibit certain pre-defined s/w property
    200  * names from coming from the prom.
    201  */
    202 #define	DDI_PROP_NOTPROM	0x0008	/* Don't look at prom properties */
    203 
    204 /*
    205  * Used interally by the DDI property routines to implement the old
    206  * depricated functions with the new functions
    207  */
    208 #define	DDI_PROP_DONTSLEEP	0x0010	/* Memory allocation may not sleep */
    209 #define	DDI_PROP_STACK_CREATE	0x0020	/* Do a LIFO stack of properties */
    210 #define	DDI_PROP_UNDEF_IT	0x0040	/* Undefine a property */
    211 #define	DDI_PROP_HW_DEF		0x0080	/* Hardware defined property */
    212 
    213 /*
    214  * Type of data property contains
    215  */
    216 #define	DDI_PROP_TYPE_INT		0x0100
    217 #define	DDI_PROP_TYPE_STRING		0x0200
    218 #define	DDI_PROP_TYPE_BYTE		0x0400
    219 #define	DDI_PROP_TYPE_COMPOSITE		0x0800
    220 #define	DDI_PROP_TYPE_INT64		0x1000
    221 
    222 #define	DDI_PROP_TYPE_ANY		(DDI_PROP_TYPE_INT	|	\
    223 					DDI_PROP_TYPE_STRING	|	\
    224 					DDI_PROP_TYPE_BYTE	|	\
    225 					DDI_PROP_TYPE_COMPOSITE)
    226 
    227 #define	DDI_PROP_TYPE_MASK		(DDI_PROP_TYPE_INT	|	\
    228 					DDI_PROP_TYPE_STRING	|	\
    229 					DDI_PROP_TYPE_BYTE	|	\
    230 					DDI_PROP_TYPE_COMPOSITE	|	\
    231 					DDI_PROP_TYPE_INT64)
    232 
    233 /*
    234  * This flag indicates that the LDI lookup routine
    235  * should match the request regardless of the actual
    236  * dev_t with which the property was created.  In other
    237  * words, any dev_t value found on the property list
    238  * is an acceptable part of the match criteria.
    239  */
    240 #define	LDI_DEV_T_ANY		0x2000
    241 
    242 /*
    243  * Private flag that should ONLY be used by the LDI Framework
    244  * to indicate a property search of an unbound dlpi2 dip.
    245  * The LDI property lookup interfaces will set this flag if
    246  * it is determined that the dip representing a dlpi-style2
    247  * driver is currently unbound (dip == NULL) at the time of
    248  * the property lookup request.
    249  */
    250 #define	DDI_UNBND_DLPI2		0x4000
    251 
    252 /*
    253  * Private flag that indicates that a typed interface that predates typed
    254  * properties is being used - the framework should set additional typed flags
    255  * (DDI_PROP_TYPE_INT64) when expanding search to DDI_PROP_TYPE_ANY.
    256  */
    257 #define	DDI_PROP_CONSUMER_TYPED	0x8000
    258 
    259 /*
    260  * Private flag that indicates that the ldi is doing a driver prop_op
    261  * call to check for driver dynamic properties.  This request should
    262  * not be passed onto the common property lookup framework since all
    263  * the ldi property interface are typed and driver prop_op lookups are
    264  * not.
    265  */
    266 #define	DDI_PROP_DYNAMIC	0x10000
    267 
    268 /*
    269  * Private flag used to lookup global properties specified in rootnex.conf file
    270  */
    271 #define	DDI_PROP_ROOTNEX_GLOBAL	0x20000
    272 
    273 
    274 /*
    275  * DDI_DEV_T_NONE:	When creating, property is not associated with
    276  *			particular dev_t.
    277  * DDI_DEV_T_ANY:	Wildcard dev_t when searching properties.
    278  */
    279 #define	DDI_DEV_T_NONE		((dev_t)-1)
    280 #define	DDI_DEV_T_ANY		((dev_t)-2)
    281 /*
    282  * DDI_MAJOR_T_UNKNOWN	Used when a driver does not know its dev_t during
    283  *			a property create.
    284  * DDI_MAJOR_T_NONE	Used when a driver does not have a major number.
    285  */
    286 #define	DDI_MAJOR_T_UNKNOWN	((major_t)0)
    287 #define	DDI_MAJOR_T_NONE	((major_t)-1)
    288 
    289 /*
    290  * Some DDI property names...
    291  */
    292 
    293 /*
    294  * One of the following boolean properties shall be defined in the
    295  * root node, and defines the addressing mode understood by the root
    296  * node of the implementation....
    297  */
    298 
    299 #define	DDI_RELATIVE_ADDRESSING		"relative-addressing"
    300 #define	DDI_GENERIC_ADDRESSING		"generic-addressing"
    301 
    302 /*
    303  * Common property encoded data search routine.  Returns the encoded data
    304  * in valuep.  Match is done on dip, dev, data type (in flags), and name.
    305  */
    306 int ddi_prop_search_common(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op,
    307     uint_t flags, char *name, void *valuep, uint_t *lengthp);
    308 
    309 
    310 /*
    311  * Property debugging support in kernel...
    312  */
    313 
    314 /*
    315  * Property debugging support...  Be careful about enabling this when
    316  * you are tipping in to the console.  Undefine PROP_DEBUG to remove
    317  * all support from the code. (c.f. autoconf.c and zs_common.c)
    318  *
    319  * It does no good to enable this if the rest of the kernel was built with
    320  * this disabled (specifically, the core kernel module.)
    321  *
    322  * #define	DDI_PROP_DEBUG	1
    323  */
    324 
    325 #ifdef	DDI_PROP_DEBUG
    326 #define	ddi_prop_printf	if (ddi_prop_debug_flag != 0) printf
    327 
    328 /*
    329  * Returns prev value of debugging flag, non-zero enables debug printf's
    330  */
    331 
    332 int ddi_prop_debug(int enable);
    333 
    334 #endif	/* DDI_PROP_DEBUG */
    335 
    336 #ifdef	__cplusplus
    337 }
    338 #endif
    339 
    340 #endif /* _SYS_DDIPROPDEFS_H */
    341