xref: /illumos-gate/usr/src/uts/common/sys/av/iec61883.h (revision defc4c8acfa01dba1ef3c13ca0cafccfcede51c0)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _SYS_AV_IEC61883_H
28 #define	_SYS_AV_IEC61883_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 /*
33  * IEC 61883 interfaces
34  */
35 
36 #include <sys/types.h>
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 /* current interface version */
43 #define	IEC61883_IMPL_MKVER(major, minor) (((major) << 8) | (minor))
44 #define	IEC61883_IMPL_VER_MAJOR(ver)	(((ver) >> 8) & 0xff)
45 #define	IEC61883_IMPL_VER_MINOR(ver)	((ver) & 0xff)
46 #define	IEC61883_V1_0			IEC61883_IMPL_MKVER(1, 0)
47 
48 /*
49  * asyncronous request (ARQ)
50  */
51 typedef struct iec61883_arq {
52 	int		arq_type;	/* type */
53 	int		arq_len;	/* length */
54 	union {
55 		uint32_t	quadlet;
56 		uint64_t	octlet;
57 		uint8_t		buf[8];
58 	} arq_data;			/* data */
59 } iec61883_arq_t;
60 
61 /* ARQ types (arq_type) */
62 enum {
63 	IEC61883_ARQ_FCP_CMD,
64 	IEC61883_ARQ_FCP_RESP,
65 	IEC61883_ARQ_BUS_RESET
66 };
67 
68 /*
69  * IEC61883_ISOCH_INIT argument
70  */
71 typedef struct iec61883_isoch_init {
72 	int		ii_version;	/* interface version */
73 	int		ii_pkt_size;	/* packet size */
74 	int		ii_frame_size;	/* packets/frame */
75 	int		ii_frame_cnt;	/* # of frames */
76 	int		ii_direction;	/* xfer direction */
77 	int		ii_bus_speed;	/* bus speed */
78 	uint64_t	ii_channel;	/* channel mask */
79 	int		ii_dbs;		/* DBS */
80 	int		ii_fn;		/* FN */
81 	int		ii_rate_n;	/* rate numerator */
82 	int		ii_rate_d;	/* rate denominator */
83 	int		ii_ts_mode;	/* timestamp mode */
84 	int		ii_flags;	/* flags */
85 	int		ii_handle;	/* isoch handle */
86 	int		ii_frame_rcnt;	/* # of frames */
87 	off_t		ii_mmap_off;	/* mmap offset */
88 	int		ii_rchannel;	/* channel */
89 	int		ii_error;	/* error code */
90 } iec61883_isoch_init_t;
91 
92 /* xfer directions (ii_direction) */
93 enum {
94 	IEC61883_DIR_RECV,
95 	IEC61883_DIR_XMIT
96 };
97 
98 /* bus speeds (ii_bus_speed) */
99 enum {
100 	IEC61883_S100,
101 	IEC61883_S200,
102 	IEC61883_S400
103 };
104 
105 /* special rate coefficients (ii_rate_n, ii_rate_d) */
106 #define	IEC61883_RATE_N_DV_NTSC		1
107 #define	IEC61883_RATE_D_DV_NTSC		0
108 #define	IEC61883_RATE_N_DV_PAL		2
109 #define	IEC61883_RATE_D_DV_PAL		0
110 
111 /* timestamp modes (ii_ts_mode) */
112 enum {
113 	IEC61883_TS_NONE	= 0,
114 	IEC61883_TS_SYT		= 0x0206
115 };
116 
117 /* error codes (ii_error) */
118 enum {
119 	IEC61883_ERR_NOMEM	= 1,
120 	IEC61883_ERR_NOCHANNEL,
121 	IEC61883_ERR_PKT_SIZE,
122 	IEC61883_ERR_VERSION,
123 	IEC61883_ERR_INVAL,
124 	IEC61883_ERR_OTHER
125 };
126 
127 /*
128  * data transfer strusture
129  */
130 typedef struct iec61883_xfer {
131 	int	xf_empty_idx;	/* first empty frame */
132 	int	xf_empty_cnt;	/* empty frame count */
133 	int	xf_full_idx;	/* first full frame */
134 	int	xf_full_cnt;	/* full frame count */
135 	int	xf_error;	/* error */
136 } iec61883_xfer_t;
137 
138 /*
139  * IEC61883_RECV argument
140  */
141 typedef struct iec61883_recv {
142 	int		rx_handle;	/* isoch handle */
143 	int		rx_flags;	/* flags */
144 	iec61883_xfer_t	rx_xfer;	/* xfer params */
145 } iec61883_recv_t;
146 
147 /*
148  * IEC61883_XMIT argument
149  */
150 typedef struct iec61883_xmit {
151 	int		tx_handle;	/* isoch handle */
152 	int		tx_flags;	/* flags */
153 	iec61883_xfer_t	tx_xfer;	/* xfer params */
154 	int		tx_miss_cnt;	/* missed cycles */
155 } iec61883_xmit_t;
156 
157 /*
158  * IEC61883_PLUG_INIT argument
159  */
160 typedef struct iec61883_plug_init {
161 	int		pi_ver;		/* interface version */
162 	int		pi_loc;		/* plug location */
163 	int		pi_type;	/* plug type */
164 	int		pi_num;		/* plug number */
165 	int		pi_flags;	/* flags */
166 	int		pi_handle;	/* plug handle */
167 	int		pi_rnum;	/* plug number */
168 } iec61883_plug_init_t;
169 
170 /* plug locations (pi_loc) */
171 enum {
172 	IEC61883_LOC_LOCAL,
173 	IEC61883_LOC_REMOTE
174 };
175 
176 /* plug types (pi_type) */
177 enum {
178 	IEC61883_PLUG_IN,
179 	IEC61883_PLUG_OUT,
180 	IEC61883_PLUG_MASTER_IN,
181 	IEC61883_PLUG_MASTER_OUT
182 };
183 
184 /* special plug number (pi_num) */
185 enum {
186 	IEC61883_PLUG_ANY	= -1
187 };
188 
189 /*
190  * IEC61883_PLUG_REG_READ argument
191  */
192 typedef struct iec61883_plug_reg_val {
193 	int		pr_handle;	/* plug handle */
194 	uint32_t	pr_val;		/* register value */
195 } iec61883_plug_reg_val_t;
196 
197 /*
198  * IEC61883_PLUG_REG_CAS argument
199  */
200 typedef struct iec61883_plug_reg_lock {
201 	int		pl_handle;	/* plug handle */
202 	uint32_t	pl_arg;		/* compare arg */
203 	uint32_t	pl_data;	/* write value */
204 	uint32_t	pl_old;		/* original value */
205 } iec61883_plug_reg_lock_t;
206 
207 /*
208  * IEC61883_NODE_GET_TEXT_LEAF argument
209  */
210 typedef struct iec61883_node_text_leaf {
211 	int		tl_parent;	/* ROM parent */
212 	int		tl_num;		/* leaf number */
213 	int		tl_len;		/* buffer length */
214 	uint32_t	*tl_data;	/* data buffer */
215 	int		tl_cnt;		/* leaf count */
216 	int		tl_rlen;	/* real length */
217 	uint32_t	tl_spec;	/* specifier */
218 	uint32_t	tl_lang_id;	/* language id */
219 	uint32_t	tl_desc_entry;	/* entry described by this leaf */
220 } iec61883_node_text_leaf_t;
221 
222 /* ROM parent types (tl_parent) */
223 enum {
224 	IEC61883_ROM_ROOT,	/* leaf in the root directory */
225 	IEC61883_ROM_UNIT	/* leaf in the unit directory */
226 };
227 
228 /* ioctl codes */
229 #define	IEC61883_IMPL_IOC		('i' << 8)
230 #define	IEC61883_IMPL_MKIOC(c)		(c | IEC61883_IMPL_IOC)
231 
232 #define	IEC61883_ISOCH_INIT		IEC61883_IMPL_MKIOC(0x01)
233 #define	IEC61883_ISOCH_FINI		IEC61883_IMPL_MKIOC(0x02)
234 #define	IEC61883_START			IEC61883_IMPL_MKIOC(0x03)
235 #define	IEC61883_STOP			IEC61883_IMPL_MKIOC(0x04)
236 #define	IEC61883_RECV			IEC61883_IMPL_MKIOC(0x05)
237 #define	IEC61883_XMIT			IEC61883_IMPL_MKIOC(0x06)
238 #define	IEC61883_PLUG_INIT		IEC61883_IMPL_MKIOC(0x07)
239 #define	IEC61883_PLUG_FINI		IEC61883_IMPL_MKIOC(0x08)
240 #define	IEC61883_PLUG_REG_READ		IEC61883_IMPL_MKIOC(0x09)
241 #define	IEC61883_PLUG_REG_CAS		IEC61883_IMPL_MKIOC(0x0A)
242 #define	IEC61883_ARQ_GET_IBUF_SIZE	IEC61883_IMPL_MKIOC(0x0B)
243 #define	IEC61883_ARQ_SET_IBUF_SIZE	IEC61883_IMPL_MKIOC(0x0C)
244 #define	IEC61883_NODE_GET_BUS_NAME	IEC61883_IMPL_MKIOC(0x0D)
245 #define	IEC61883_NODE_GET_UID		IEC61883_IMPL_MKIOC(0x0E)
246 #define	IEC61883_NODE_GET_TEXT_LEAF	IEC61883_IMPL_MKIOC(0x0F)
247 
248 
249 /* 32-bit structures for the drivers */
250 #ifdef _KERNEL
251 typedef struct iec61883_isoch_init32 {
252 	int		ii_version;	/* interface version */
253 	int		ii_pkt_size;	/* packet size */
254 	int		ii_frame_size;	/* packets/frame */
255 	int		ii_frame_cnt;	/* # of frames */
256 	int		ii_direction;	/* xfer direction */
257 	int		ii_bus_speed;	/* bus speed */
258 	uint64_t	ii_channel;	/* channel mask */
259 	int		ii_dbs;		/* DBS */
260 	int		ii_fn;		/* FN */
261 	int		ii_rate_n;	/* rate numerator */
262 	int		ii_rate_d;	/* rate denominator */
263 	int		ii_ts_mode;	/* timestamp mode */
264 	int		ii_flags;	/* flags */
265 	int		ii_handle;	/* isoch handle */
266 	int		ii_frame_rcnt;	/* # of frames */
267 	int32_t		ii_mmap_off;	/* mmap offset */
268 	int		ii_rchannel;	/* channel */
269 	int		ii_error;	/* error code */
270 } iec61883_isoch_init32_t;
271 
272 typedef struct iec61883_node_text_leaf32 {
273 	int		tl_parent;	/* ROM parent */
274 	int		tl_num;		/* leaf number */
275 	int		tl_len;		/* buffer length */
276 	caddr32_t	tl_data;	/* data buffer */
277 	int		tl_cnt;		/* leaf count */
278 	int		tl_rlen;	/* real length */
279 	uint32_t	tl_spec;	/* specifier */
280 	uint32_t	tl_lang_id;	/* language id */
281 	uint32_t	tl_desc_entry;	/* entry described by this leaf */
282 } iec61883_node_text_leaf32_t;
283 #endif /* _KERNEL */
284 
285 #ifdef __cplusplus
286 }
287 #endif
288 
289 #endif /* _SYS_AV_IEC61883_H */
290