6198 Let's EOL cachefs
[illumos-gate.git] / usr / src / uts / common / sys / 1394 / ixl1394.h
blob1b10adb601ad776a26bfa097c55b9d7a28258905
1 /*
2 * CDDL HEADER START
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.
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.
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]
20 * CDDL HEADER END
23 * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
24 * All rights reserved.
27 #ifndef _SYS_1394_IXL1394_H
28 #define _SYS_1394_IXL1394_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
33 * ixl1394.h
34 * Contains all defines and structures necessary for Isochronous Transfer
35 * Language (IXL) programs. IXL programs are used to specify the transmission
36 * or receipt of isochronous packets for an isochronous channel.
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
43 #include <sys/note.h>
46 * Error codes for IXL program compilation and dynamic update
47 * Comments indicate which are source of error
48 * NOTE: Make sure IXL1394_COMP_ERR_LAST is updated if a new error code is
49 * added. t1394_errmsg.c uses *FIRST and *LAST as bounds checks.
51 #define IXL1394_EMEM_ALLOC_FAIL (-301) /* compile only */
52 #define IXL1394_EBAD_IXL_OPCODE (-302) /* compile only */
53 #define IXL1394_EFRAGMENT_OFLO (-303) /* compile only */
54 #define IXL1394_ENO_DATA_PKTS (-304) /* compile only */
55 #define IXL1394_EMISPLACED_RECV (-305) /* compile only */
56 #define IXL1394_EMISPLACED_SEND (-306) /* compile only */
57 #define IXL1394_EPKT_HDR_MISSING (-307) /* compile & update */
58 #define IXL1394_ENULL_BUFFER_ADDR (-308) /* compile only */
59 #define IXL1394_EPKTSIZE_MAX_OFLO (-309) /* compile & update */
60 #define IXL1394_EPKTSIZE_RATIO (-310) /* compile only */
61 #define IXL1394_EUNAPPLIED_SET_CMD (-311) /* compile only */
62 #define IXL1394_EDUPLICATE_SET_CMD (-312) /* compile only */
63 #define IXL1394_EJUMP_NOT_TO_LABEL (-313) /* compile & update */
64 #define IXL1394_EUPDATE_DISALLOWED (-314) /* compile & update */
65 #define IXL1394_EBAD_SKIPMODE (-315) /* compile & update */
66 #define IXL1394_EWRONG_XR_CMD_MODE (-316) /* compile only */
67 #define IXL1394_EINTERNAL_ERROR (-317) /* compile & update */
68 #define IXL1394_ENOT_IMPLEMENTED (-318) /* compile only */
69 #define IXL1394_EOPCODE_MISMATCH (-319) /* update only */
70 #define IXL1394_EOPCODE_DISALLOWED (-320) /* update only */
71 #define IXL1394_EBAD_SKIP_LABEL (-321) /* update only */
72 #define IXL1394_EXFER_BUF_MISSING (-322) /* update only */
73 #define IXL1394_EXFER_BUF_CNT_DIFF (-323) /* update only */
74 #define IXL1394_EORIG_IXL_CORRUPTED (-324) /* update only */
75 #define IXL1394_ECOUNT_MISMATCH (-325) /* update only */
76 #define IXL1394_EPRE_UPD_DMALOST (-326) /* update only */
77 #define IXL1394_EPOST_UPD_DMALOST (-327) /* update only */
78 #define IXL1394_ERISK_PROHIBITS_UPD (-328) /* update only */
80 #define IXL1394_COMP_ERR_FIRST IXL1394_EMEM_ALLOC_FAIL
81 #define IXL1394_COMP_ERR_LAST IXL1394_ERISK_PROHIBITS_UPD
83 #define IXL1394_ENO_DMA_RESRCS (-200)
87 * IXL command opcodes
89 * IXL opcodes contain a unique opcode identifier and various flags to
90 * speed compilation.
93 /* 5 flag bits at high end of opcode field. */
94 #define IXL1394_OPF_MASK 0xF800
95 #define IXL1394_OPF_UPDATE 0x8000 /* cmd update allowed during exec */
96 #define IXL1394_OPF_ONRECV 0x4000 /* cmd is allowed on recv */
97 #define IXL1394_OPF_ONXMIT 0x2000 /* cmd is allowed on xmit */
98 #define IXL1394_OPF_ENDSXFER 0x1000 /* cmd ends cur pkt xfer build */
99 #define IXL1394_OPF_ISXFER 0x0800 /* cmd is data transfer command */
101 /* Useful flag composites. */
102 #define IXL1394_OPF_ONXFER (IXL1394_OPF_ONXMIT | IXL1394_OPF_ONRECV)
103 #define IXL1394_OPF_ONXFER_ENDS (IXL1394_OPF_ONXFER | IXL1394_OPF_ENDSXFER)
104 #define IXL1394_OPF_ONRECV_ENDS (IXL1394_OPF_ONRECV | IXL1394_OPF_ENDSXFER)
105 #define IXL1394_OPF_ONXMIT_ENDS (IXL1394_OPF_ONXMIT | IXL1394_OPF_ENDSXFER)
107 /* 2 type bits whose contents are interpreted based on isxr setting */
108 #define IXL1394_OPTY_MASK 0x0600
110 /* type bits when isxfer == 0 */
111 #define IXL1394_OPTY_OTHER 0x0000
113 /* type bits when isxr == 1 */
114 #define IXL1394_OPTY_XFER_PKT (0x0000 | IXL1394_OPF_ISXFER)
115 #define IXL1394_OPTY_XFER_PKT_ST (0x0200 | IXL1394_OPF_ISXFER)
116 #define IXL1394_OPTY_XFER_BUF_ST (0x0400 | IXL1394_OPF_ISXFER)
117 #define IXL1394_OPTY_XFER_SPCL_ST (0x0600 | IXL1394_OPF_ISXFER)
120 * IXL Command Opcodes.
122 #define IXL1394_OP_LABEL (1 | IXL1394_OPTY_OTHER | IXL1394_OPF_ONXFER_ENDS)
123 #define IXL1394_OP_JUMP (2 | IXL1394_OPTY_OTHER | IXL1394_OPF_ONXFER_ENDS)
124 #define IXL1394_OP_CALLBACK (3 | IXL1394_OPTY_OTHER | IXL1394_OPF_ONXFER)
125 #define IXL1394_OP_RECV_PKT (4 | IXL1394_OPTY_XFER_PKT | IXL1394_OPF_ONRECV)
126 #define IXL1394_OP_RECV_PKT_ST \
127 (5 | IXL1394_OPTY_XFER_PKT_ST | IXL1394_OPF_ONRECV_ENDS)
128 #define IXL1394_OP_RECV_BUF \
129 (6 | IXL1394_OPTY_XFER_BUF_ST | IXL1394_OPF_ONRECV_ENDS)
130 #define IXL1394_OP_SEND_PKT (7 | IXL1394_OPTY_XFER_PKT | IXL1394_OPF_ONXMIT)
131 #define IXL1394_OP_SEND_PKT_ST \
132 (8 | IXL1394_OPTY_XFER_PKT_ST | IXL1394_OPF_ONXMIT_ENDS)
133 #define IXL1394_OP_SEND_PKT_WHDR_ST \
134 (9 | IXL1394_OPTY_XFER_PKT_ST | IXL1394_OPF_ONXMIT_ENDS)
135 #define IXL1394_OP_SEND_BUF \
136 (10 | IXL1394_OPTY_XFER_BUF_ST | IXL1394_OPF_ONXMIT_ENDS)
137 #define IXL1394_OP_SEND_HDR_ONLY \
138 (12 | IXL1394_OPTY_XFER_SPCL_ST | IXL1394_OPF_ONXMIT_ENDS)
139 #define IXL1394_OP_SEND_NO_PKT \
140 (13 | IXL1394_OPTY_XFER_SPCL_ST | IXL1394_OPF_ONXMIT_ENDS)
141 #define IXL1394_OP_STORE_TIMESTAMP \
142 (14 | IXL1394_OPTY_OTHER | IXL1394_OPF_ONXFER)
143 #define IXL1394_OP_SET_TAGSYNC \
144 (15 | IXL1394_OPTY_OTHER | IXL1394_OPF_ONXMIT_ENDS)
145 #define IXL1394_OP_SET_SKIPMODE \
146 (16 | IXL1394_OPTY_OTHER | IXL1394_OPF_ONXMIT_ENDS)
147 #define IXL1394_OP_SET_SYNCWAIT \
148 (17 | IXL1394_OPTY_OTHER | IXL1394_OPF_ONRECV_ENDS)
151 * The dynamic UPDATE versions of each updatable command.
153 #define IXL1394_OP_JUMP_U (IXL1394_OP_JUMP | IXL1394_OPF_UPDATE)
154 #define IXL1394_OP_CALLBACK_U (IXL1394_OP_CALLBACK | IXL1394_OPF_UPDATE)
155 #define IXL1394_OP_RECV_PKT_U (IXL1394_OP_RECV_PKT | IXL1394_OPF_UPDATE)
156 #define IXL1394_OP_RECV_PKT_ST_U (IXL1394_OP_RECV_PKT_ST | IXL1394_OPF_UPDATE)
157 #define IXL1394_OP_RECV_BUF_U (IXL1394_OP_RECV_BUF | IXL1394_OPF_UPDATE)
158 #define IXL1394_OP_SEND_PKT_U (IXL1394_OP_SEND_PKT | IXL1394_OPF_UPDATE)
159 #define IXL1394_OP_SEND_PKT_ST_U (IXL1394_OP_SEND_PKT_ST | IXL1394_OPF_UPDATE)
160 #define IXL1394_OP_SEND_PKT_WHDR_ST_U (IXL1394_OP_SEND_PKT_WHDR_ST | \
161 IXL1394_OPF_UPDATE)
162 #define IXL1394_OP_SEND_BUF_U (IXL1394_OP_SEND_BUF | IXL1394_OPF_UPDATE)
163 #define IXL1394_OP_SET_TAGSYNC_U (IXL1394_OP_SET_TAGSYNC | IXL1394_OPF_UPDATE)
164 #define IXL1394_OP_SET_SKIPMODE_U (IXL1394_OP_SET_SKIPMODE | IXL1394_OPF_UPDATE)
167 /* Opaque type for the ixl private data */
168 typedef struct ixl_priv_handle *ixl1394_priv_t;
170 /* IXL1394_OP_SET_SKIPMODE values (used only with isoch transmit) */
171 typedef enum {
172 IXL1394_SKIP_TO_SELF = 0,
173 IXL1394_SKIP_TO_NEXT = 1,
174 IXL1394_SKIP_TO_STOP = 2,
175 IXL1394_SKIP_TO_LABEL = 3
176 } ixl1394_skip_t;
179 * IXL Program Command Primitives
182 /* The general command format. The operands vary depending on the opcode */
183 typedef struct ixl1394_command {
184 struct ixl1394_command *next_ixlp;
185 ixl1394_priv_t compiler_privatep;
186 uint16_t compiler_resv;
187 uint16_t ixl_opcode;
188 uint32_t operands[1];
189 } ixl1394_command_t;
191 _NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", \
192 ixl1394_command::compiler_privatep \
193 ixl1394_command::compiler_resv))
196 * command structure used for a DDI_DMA bound buffer. For portability,
197 * set this _dmac_ll to the buffer's allocated and bound
198 * ddi_dma_cookie_t's _dmac_ll.
200 typedef union ixl1394_buf_u {
201 uint64_t _dmac_ll; /* 64-bit DMA address */
202 uint32_t _dmac_la[2]; /* 2 x 32-bit address */
203 } ixl1394_buf_t;
205 /* shorthand access to IXL command buffers. similar to defs in dditypes.h */
206 #define ixldmac_laddr _dmac_ll
207 #ifdef _LONG_LONG_HTOL
208 #define ixldmac_notused _dmac_la[0]
209 #define ixldmac_addr _dmac_la[1]
210 #else
211 #define ixldmac_addr _dmac_la[0]
212 #define ixldmac_notused _dmac_la[1]
213 #endif
217 * ixl1394_xfer_pkt
218 * Specifies a packet fragment.
219 * Used with IXL1394_OP_SEND_PKT_ST, IXL1394_OP_SEND_PKT_WHDR_ST,
220 * IXL1394_OP_SEND_PKT, IXL1394_OP_RECV_PKT_ST and IXL1394_OP_RECV_PKT.
222 typedef struct ixl1394_xfer_pkt {
223 ixl1394_command_t *next_ixlp;
224 ixl1394_priv_t compiler_privatep;
225 uint16_t compiler_resv;
226 uint16_t ixl_opcode;
227 uint16_t size; /* bytes in ixl_buf */
228 uint16_t resv;
229 ixl1394_buf_t ixl_buf; /* ddi_dma bound address */
230 caddr_t mem_bufp; /* kernel virtual addr */
231 } ixl1394_xfer_pkt_t;
233 _NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", \
234 ixl1394_xfer_pkt::ixl_buf._dmac_ll \
235 ixl1394_xfer_pkt::ixl_buf._dmac_la \
236 ixl1394_xfer_pkt::mem_bufp \
237 ixl1394_xfer_pkt::size))
240 * ixl1394_xfer_buf
241 * Specifies a buffer of multiple packets.
242 * Used with IXL1394_OP_SEND_BUF and IXL1394_OP_RECV_BUF.
244 typedef struct ixl1394_xfer_buf {
245 ixl1394_command_t *next_ixlp;
246 ixl1394_priv_t compiler_privatep;
247 uint16_t compiler_resv;
248 uint16_t ixl_opcode;
249 uint16_t size; /* bytes in ixl_buf */
250 uint16_t pkt_size; /* bytes in each packet */
251 ixl1394_buf_t ixl_buf; /* ddi_dma bound address */
252 caddr_t mem_bufp; /* kernel (not bound) addrss */
253 } ixl1394_xfer_buf_t;
255 _NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", \
256 ixl1394_xfer_buf::compiler_privatep \
257 ixl1394_xfer_buf::ixl_buf._dmac_ll \
258 ixl1394_xfer_buf::ixl_buf._dmac_la \
259 ixl1394_xfer_buf::mem_bufp \
260 ixl1394_xfer_buf::pkt_size \
261 ixl1394_xfer_buf::size))
264 * ixl1394_xmit_special
265 * Specifies how many cycles are to be skipped before the next packet
266 * is sent. Specifies number of header only packets to be sent, next.
267 * Used with IXL1394_OP_SEND_HDR_ONLY and IXL1394_OP_SEND_NO_PKT.
269 typedef struct ixl1394_xmit_special {
270 ixl1394_command_t *next_ixlp;
271 ixl1394_priv_t compiler_privatep;
272 uint16_t compiler_resv;
273 uint16_t ixl_opcode;
274 uint16_t count;
275 uint16_t resv;
276 } ixl1394_xmit_special_t;
279 * ixl1394_callback
280 * Specifies a callback function and callback data.
281 * When the callback is invoked, it is passed the addr of this IXL
282 * command, which it can use to retrieve the arg it has stored in
283 * this struct. Used with IXL1394_OP_CALLBACK.
285 typedef struct ixl1394_callback {
286 ixl1394_command_t *next_ixlp;
287 ixl1394_priv_t compiler_privatep;
288 uint16_t compiler_resv;
289 uint16_t ixl_opcode;
290 void (*callback)(opaque_t, struct ixl1394_callback *);
291 opaque_t callback_arg;
292 } ixl1394_callback_t;
294 _NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", \
295 ixl1394_callback::callback \
296 ixl1394_callback::callback_arg))
299 * ixl1394_label
300 * Specifies a label (location) which can be used as the target of a jump.
301 * Used with IXL1394_OP_LABEL.
303 typedef struct ixl1394_label {
304 ixl1394_command_t *next_ixlp;
305 ixl1394_priv_t compiler_privatep;
306 uint16_t compiler_resv;
307 uint16_t ixl_opcode;
308 } ixl1394_label_t;
311 * ixl1394_jump
312 * Specifies a label (location) which can then be used as the target of a jump.
313 * Used with IXL1394_OP_JUMP.
315 typedef struct ixl1394_jump {
316 ixl1394_command_t *next_ixlp;
317 ixl1394_priv_t compiler_privatep;
318 uint16_t compiler_resv;
319 uint16_t ixl_opcode;
320 ixl1394_command_t *label;
321 } ixl1394_jump_t;
323 _NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", \
324 ixl1394_jump::label))
327 * ixl1394_set_tagsync
328 * Specifies the tag and sync bits used for the port.
329 * Used with IXL1394_OP_SET_TAGSYNC.
331 typedef struct ixl1394_set_tagsync {
332 ixl1394_command_t *next_ixlp;
333 ixl1394_priv_t compiler_privatep;
334 uint16_t compiler_resv;
335 uint16_t ixl_opcode;
336 uint16_t tag;
337 uint16_t sync;
338 } ixl1394_set_tagsync_t;
340 _NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", \
341 ixl1394_set_tagsync::sync \
342 ixl1394_set_tagsync::tag))
345 * ixl1394_set_skipmode
346 * Specifies the tag and sync bits used for the port.
347 * Used with IXL1394_OP_SET_SKIPMODE.
349 typedef struct ixl1394_set_skipmode {
350 ixl1394_command_t *next_ixlp;
351 ixl1394_priv_t compiler_privatep;
352 uint16_t compiler_resv;
353 uint16_t ixl_opcode;
354 ixl1394_command_t *label;
355 ixl1394_skip_t skipmode;
356 } ixl1394_set_skipmode_t;
358 _NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", \
359 ixl1394_set_skipmode::compiler_privatep \
360 ixl1394_set_skipmode::label \
361 ixl1394_set_skipmode::skipmode))
364 * ixl1394_set_syncwait
365 * Specifies that next receive is to wait for sync before accepting input.
366 * Used with IXL1394_OP_SET_SYNCWAIT.
368 typedef struct ixl1394_set_syncwait {
369 ixl1394_command_t *next_ixlp;
370 ixl1394_priv_t compiler_privatep;
371 uint16_t compiler_resv;
372 uint16_t ixl_opcode;
373 } ixl1394_set_syncwait_t;
376 * ixl1394_store_timestamp
377 * Specifies that the timestamp value of the most recently sent
378 * packet be stored into the timestamp field of this ixl command.
379 * Used with IXL1394_OP_STORE_TIMESTAMP.
381 typedef struct ixl1394_store_timestamp {
382 ixl1394_command_t *next_ixlp;
383 ixl1394_priv_t compiler_privatep;
384 uint16_t compiler_resv;
385 uint16_t ixl_opcode;
386 uint16_t timestamp;
387 uint16_t resv;
388 } ixl1394_store_timestamp_t;
390 _NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", \
391 ixl1394_store_timestamp::timestamp))
394 * Macros for extracting isochronous packet header fields when receiving
395 * packets via IXL1394_OP_RECV_PKT_ST or IXL1394_OP_RECV_BUF with
396 * ID1394_RECV_HEADERS mode enabled.
397 * The argument to each macro is a quadlet of data.
398 * Prior to using the macro, target drivers first retrieve this quadlet from
399 * bound memory by using ddi_get32(9F).
403 * timestamp is the first quadlet in an IXL1394_OP_RECV_PKT_ST packet, and is
404 * the last quadlet (after the data payload) in an IXL1394_OP_RECV_BUF packet.
406 #define IXL1394_GET_IR_TIMESTAMP(PKT_QUADLET) ((PKT_QUADLET) & 0x0000FFFF)
409 * the following macros apply to the second quadlet in an
410 * IXL1394_OP_RECV_PKT_ST packet, and the first quadlet in an
411 * IXL1394_OP_RECV_BUF packet.
413 #define IXL1394_GET_IR_DATALEN(PKT_QUADLET) (((PKT_QUADLET) & 0xFFFF0000) >> 16)
414 #define IXL1394_GET_IR_TAG(PKT_QUADLET) (((PKT_QUADLET) & 0x0000C000) >> 14)
415 #define IXL1394_GET_IR_CHAN(PKT_QUADLET) (((PKT_QUADLET) & 0x00003F00) >> 8)
416 #define IXL1394_GET_IR_SYNC(PKT_QUADLET) ((PKT_QUADLET) & 0x0000000F)
418 #ifdef __cplusplus
420 #endif
422 #endif /* _SYS_1394_IXL1394_H */