xref: /freebsd/sys/dev/firewire/firewire.h (revision 44956c9863dc03344b03bdf6a83acf4e743f8e50)
1 /*
2  * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the acknowledgement as bellow:
15  *
16  *    This product includes software developed by K. Kobayashi and H. Shimokawa
17  *
18  * 4. The name of the author may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * $FreeBSD$
34  *
35  */
36 
37 #ifndef _FIREWIRE_H
38 #define _FIREWIRE_H 1
39 
40 #define	DEV_DEF  0
41 #define	DEV_DV   2
42 
43 struct dv_data{
44 	u_int32_t n_write;
45 	u_int32_t a_write;
46 	u_int32_t k_write;
47 	u_int32_t write_done;
48 	u_int32_t write_len[16];
49 	u_int32_t write_off[16];
50 	u_int32_t n_read;
51 	u_int32_t a_read;
52 	u_int32_t k_read;
53 	u_int32_t read_done;
54 	u_int32_t read_len[16];
55 	u_int32_t read_off[16];
56 };
57 
58 struct dv_data_req_t {
59 	unsigned long index;
60 	unsigned long len;
61 	unsigned long off;
62 };
63 
64 struct fw_isochreq {
65 	unsigned char	ch:6,
66 			tag:2;
67 };
68 
69 struct fw_isobufreq {
70 	struct {
71 		unsigned int nchunk;
72 		unsigned int npacket;
73 		unsigned int psize;
74 	} tx, rx;
75 };
76 
77 struct fw_addr{
78 	unsigned long hi;
79 	unsigned long lo;
80 };
81 
82 struct fw_asybindreq {
83 	struct fw_addr start;
84 	unsigned long len;
85 };
86 
87 struct fw_reg_req_t{
88 	unsigned long addr;
89 	unsigned long data;
90 };
91 
92 #define MAXREC(x)	(2 << (x))
93 #define FWPMAX_S400 (2048 + 20)	/* MAXREC plus space for control data */
94 #define FWMAXQUEUE 128
95 
96 #define	FWLOCALBUS	0xffc0
97 
98 #define FWTCODE_WREQQ	0
99 #define FWTCODE_WREQB	1
100 #define FWTCODE_WRES	2
101 #define FWTCODE_RREQQ	4
102 #define FWTCODE_RREQB	5
103 #define FWTCODE_RRESQ	6
104 #define FWTCODE_RRESB	7
105 #define FWTCODE_CYCS	8
106 #define FWTCODE_LREQ	9
107 #define FWTCODE_STREAM	0xa
108 #define FWTCODE_LRES	0xb
109 #define FWTCODE_PHY	0xe
110 
111 #define	FWRETRY_1	0
112 #define	FWRETRY_X	1
113 #define	FWRETRY_A	2
114 #define	FWRETRY_B	3
115 
116 #define FWRCODE_COMPLETE	0
117 #define FWRCODE_ER_CONFL	4
118 #define FWRCODE_ER_DATA		5
119 #define FWRCODE_ER_TYPE		6
120 #define FWRCODE_ER_ADDR		7
121 
122 #define FWSPD_S100	0
123 #define FWSPD_S200	1
124 #define FWSPD_S400	2
125 
126 #define	FWP_TL_VALID (1 << 7)
127 
128 struct fw_isohdr{
129 	u_int32_t hdr[1];
130 };
131 struct fw_asyhdr{
132 	u_int32_t hdr[4];
133 };
134 #define FWPHYSIDSUBS(SID) (((SID) >> 23) & 1)
135 #define FWPHYSIDNODE(SID) (((SID) >> 24) & 0x3f)
136 #define FWPHYSIDLINK(SID) (((SID) >> 22) & 1)
137 #define FWPHYSIDGAP(SID) (((SID) >> 16) & 0x3f)
138 #define FWPHYSIDSPD(SID) (((SID) >> 14) & 0x3)
139 #define FWPHYSIDDEL(SID) (((SID) >> 12) & 0x3)
140 #define FWPHYSIDCON(SID) (((SID) >> 11) & 1)
141 #define FWPHYSIDPWR(SID) (((SID) >> 8) & 0x7)
142 #define FWPHYSIDP0(SID) (((SID) >> 6) & 0x3)
143 #define FWPHYSIDP1(SID) (((SID) >> 4) & 0x3)
144 #define FWPHYSIDP2(SID) (((SID) >> 2) & 0x3)
145 #define FWPHYSIDIR(SID) (((SID) >> 1) & 1)
146 #define FWPHYSIDMORE(SID) ((SID) & 1)
147 #define FWPHYSIDSEQ(SID) (((SID) >> 20) & 0x7)
148 #define FWPHYSIDPA(SID) (((SID) >> 16) & 0x3)
149 #define FWPHYSIDPB(SID) (((SID) >> 14) & 0x3)
150 #define FWPHYSIDPC(SID) (((SID) >> 12) & 0x3)
151 #define FWPHYSIDPD(SID) (((SID) >> 10) & 0x3)
152 #define FWPHYSIDPE(SID) (((SID) >> 8) & 0x3)
153 #define FWPHYSIDPF(SID) (((SID) >> 6) & 0x3)
154 #define FWPHYSIDPG(SID) (((SID) >> 4) & 0x3)
155 #define FWPHYSIDPH(SID) (((SID) >> 2) & 0x3)
156 struct fw_pkt{
157 #if BYTE_ORDER == LITTLE_ENDIAN
158 	union{
159 		u_int32_t ld[0];
160 		struct {
161 			u_int32_t :28,
162 				  tcode:4;
163 		}common;
164 		struct {
165 			u_int16_t len;
166 			u_int8_t chtag;
167 			u_int8_t sy:4,
168 				 tcode:4;
169 			u_int32_t payload[0];
170 		}stream;
171 		struct {
172 			u_int16_t dst;
173 			u_int8_t tlrt;
174 			u_int8_t pri:4,
175 				 tcode:4;
176 			u_int16_t src;
177 		}hdr;
178 		struct {
179 			u_int16_t dst;
180 			u_int8_t tlrt;
181 			u_int8_t pri:4,
182 				 tcode:4;
183 			u_int16_t src;
184 			u_int16_t dest_hi;
185 			u_int32_t dest_lo;
186 		}rreqq;
187 		struct {
188 			u_int16_t dst;
189 			u_int8_t tlrt;
190 			u_int8_t pri:4,
191 				 tcode:4;
192 			u_int16_t src;
193 			u_int16_t res1:4,
194 				  rtcode:4,
195 				  res2:8;
196 			u_int32_t res3;
197 		}wres;
198 		struct {
199 			u_int16_t dst;
200 			u_int8_t tlrt;
201 			u_int8_t pri:4,
202 				 tcode:4;
203 			u_int16_t src;
204 			u_int16_t dest_hi;
205 			u_int32_t dest_lo;
206 			u_int16_t len;
207 			u_int16_t extcode:16;
208 		}rreqb;
209 		struct {
210 			u_int16_t dst;
211 			u_int8_t tlrt;
212 			u_int8_t pri:4,
213 				 tcode:4;
214 			u_int16_t src;
215 			u_int16_t dest_hi:16;
216 			u_int32_t dest_lo;
217 			u_int32_t data;
218 		}wreqq;
219 		struct {
220 			u_int16_t dst;
221 			u_int8_t tlrt;
222 			u_int8_t pri:4,
223 				 tcode:4;
224 			u_int16_t src;
225 			u_int16_t dest_hi;
226 			u_int32_t dest_lo;
227 			u_int32_t data;
228 		}cyc;
229 		struct {
230 			u_int16_t dst;
231 			u_int8_t tlrt;
232 			u_int8_t pri:4,
233 				 tcode:4;
234 			u_int16_t src;
235 			u_int16_t res1:4,
236 				  rtcode:4,
237 				  res2:8;
238 			u_int32_t res3;
239 			u_int32_t data;
240 		}rresq;
241 		struct {
242 			u_int16_t dst;
243 			u_int8_t tlrt;
244 			u_int8_t pri:4,
245 				 tcode:4;
246 			u_int16_t src;
247 			u_int16_t dest_hi;
248 			u_int32_t dest_lo;
249 			u_int16_t len;
250 			u_int16_t extcode;
251 			u_int32_t payload[0];
252 		}wreqb;
253 		struct {
254 			u_int16_t dst;
255 			u_int8_t tlrt;
256 			u_int8_t pri:4,
257 				 tcode:4;
258 			u_int16_t src;
259 			u_int16_t dest_hi;
260 			u_int32_t dest_lo;
261 			u_int16_t len;
262 			u_int16_t extcode;
263 #define FW_LREQ_MSKSWAP	1
264 #define FW_LREQ_CMPSWAP	2
265 #define FW_LREQ_FTADD	3
266 #define FW_LREQ_LTADD	4
267 #define FW_LREQ_BDADD	5
268 #define FW_LREQ_WRADD	6
269 			u_int32_t payload[0];
270 		}lreq;
271 		struct {
272 			u_int16_t dst;
273 			u_int8_t tlrt;
274 			u_int8_t pri:4,
275 				 tcode:4;
276 			u_int16_t src;
277 			u_int16_t res1:4,
278 				  rtcode:4,
279 				  res2:8;
280 			u_int32_t res3;
281 			u_int16_t len;
282 			u_int16_t extcode;
283 			u_int32_t payload[0];
284 		}rresb;
285 		struct {
286 			u_int16_t dst;
287 			u_int8_t tlrt;
288 			u_int8_t pri:4,
289 				 tcode:4;
290 			u_int16_t src;
291 			u_int16_t res1:4,
292 				  rtcode:4,
293 				  res2:8;
294 			u_int32_t res3;
295 			u_int16_t len;
296 			u_int16_t extcode;
297 			u_int32_t payload[0];
298 		}lres;
299 	}mode;
300 #else
301 	union{
302 		u_int32_t ld[0];
303 		struct {
304 			u_int32_t :4,
305 				  tcode:4,
306 				  :24;
307 		}common;
308 		struct {
309 			u_int8_t sy:4,
310 				 tcode:4;
311 			u_int8_t chtag;
312 			u_int16_t len;
313 			u_int32_t payload[0];
314 		}stream;
315 		struct {
316 			u_int32_t pri:4,
317 				  tcode:4,
318 				  tlrt:8,
319 				  dst:16;
320 			u_int32_t :16,
321 				  src:16;
322 		}hdr;
323 		struct {
324 			u_int8_t pri:4,
325 				 tcode:4;
326 			u_int8_t tlrt;
327 			u_int16_t dst;
328 			u_int16_t dest_hi;
329 			u_int16_t src;
330 			u_int32_t dest_lo;
331 		}rreqq;
332 		struct {
333 			u_int8_t pri:4,
334 				 tcode:4;
335 			u_int8_t tlrt;
336 			u_int16_t dst;
337 			u_int16_t res1:12,
338 				  rtcode:4;
339 			u_int16_t src;
340 			u_int32_t res3;
341 		}wres;
342 		struct {
343 			u_int8_t pri:4,
344 				 tcode:4;
345 			u_int8_t tlrt;
346 			u_int16_t dst;
347 			u_int16_t dest_hi;
348 			u_int16_t src;
349 			u_int32_t dest_lo;
350 			u_int16_t extcode:16;
351 			u_int16_t len;
352 		}rreqb;
353 		struct {
354 			u_int8_t pri:4,
355 				 tcode:4;
356 			u_int8_t tlrt;
357 			u_int16_t dst;
358 			u_int16_t dest_hi:16;
359 			u_int16_t src;
360 			u_int32_t dest_lo;
361 			u_int32_t data;
362 		}wreqq;
363 		struct {
364 			u_int8_t pri:4,
365 				 tcode:4;
366 			u_int8_t tlrt;
367 			u_int16_t dst;
368 			u_int16_t dest_hi;
369 			u_int16_t src;
370 			u_int32_t dest_lo;
371 			u_int32_t data;
372 		}cyc;
373 		struct {
374 			u_int8_t pri:4,
375 				 tcode:4;
376 			u_int8_t tlrt;
377 			u_int16_t dst;
378 			u_int16_t res1:12,
379 				  rtcode:4;
380 			u_int16_t src;
381 			u_int32_t res3;
382 			u_int32_t data;
383 		}rresq;
384 		struct {
385 			u_int8_t pri:4,
386 				 tcode:4;
387 			u_int8_t tlrt;
388 			u_int16_t dst;
389 			u_int16_t dest_hi;
390 			u_int16_t src;
391 			u_int32_t dest_lo;
392 			u_int16_t extcode;
393 			u_int16_t len;
394 			u_int32_t payload[0];
395 		}wreqb;
396 		struct {
397 			u_int8_t pri:4,
398 				 tcode:4;
399 			u_int8_t tlrt;
400 			u_int16_t dst;
401 			u_int16_t dest_hi;
402 			u_int16_t src;
403 			u_int32_t dest_lo;
404 			u_int16_t extcode;
405 			u_int16_t len;
406 #define FW_LREQ_MSKSWAP	1
407 #define FW_LREQ_CMPSWAP	2
408 #define FW_LREQ_FTADD	3
409 #define FW_LREQ_LTADD	4
410 #define FW_LREQ_BDADD	5
411 #define FW_LREQ_WRADD	6
412 			u_int32_t payload[0];
413 		}lreq;
414 		struct {
415 			u_int8_t pri:4,
416 				 tcode:4;
417 			u_int8_t tlrt;
418 			u_int16_t dst;
419 			u_int16_t res1:12,
420 				  rtcode:4;
421 			u_int16_t src;
422 			u_int32_t res3;
423 			u_int16_t extcode;
424 			u_int16_t len;
425 			u_int32_t payload[0];
426 		}rresb;
427 		struct {
428 			u_int8_t pri:4,
429 				 tcode:4;
430 			u_int8_t tlrt;
431 			u_int16_t dst;
432 			u_int16_t res1:12,
433 				  rtcode:4;
434 			u_int16_t src;
435 			u_int32_t res3;
436 			u_int16_t extcode;
437 			u_int16_t len;
438 			u_int32_t payload[0];
439 		}lres;
440 	}mode;
441 #endif
442 };
443 struct fw_eui64 {
444 	u_int32_t hi, lo;
445 };
446 struct fw_asyreq {
447 	struct fw_asyreq_t{
448 		unsigned char sped;
449 		unsigned int type;
450 #define FWASREQNODE	0
451 #define FWASREQEUI	1
452 #define FWASRESTL	2
453 #define FWASREQSTREAM	3
454 		unsigned short len;
455 		union {
456 			struct fw_eui64 eui;
457 		}dst;
458 	}req;
459 	struct fw_pkt pkt;
460 	u_int32_t data[512];
461 };
462 struct fw_devlstreq {
463 	int n;
464 	struct fw_eui64 eui[64];
465 	u_int16_t dst[64];
466 	u_int16_t status[64];
467 };
468 #define FW_SELF_ID_PORT_CONNECTED_TO_CHILD 3
469 #define FW_SELF_ID_PORT_CONNECTED_TO_PARENT 2
470 #define FW_SELF_ID_PORT_NOT_CONNECTED 1
471 #define FW_SELF_ID_PORT_NOT_EXISTS 0
472 union fw_self_id {
473 	struct {
474 		u_int32_t more_packets:1,
475 			  initiated_reset:1,
476 			  port2:2,
477 			  port1:2,
478 			  port0:2,
479 			  power_class:3,
480 			  contender:1,
481 			  phy_delay:2,
482 			  phy_speed:2,
483 			  gap_count:6,
484 			  link_active:1,
485 			  sequel:1,
486 			  phy_id:6,
487 			  id:2;
488 	} p0;
489 	struct {
490 		u_int32_t more_packets:1,
491 			  reserved1:1,
492 			  porth:2,
493 			  portg:2,
494 			  portf:2,
495 			  porte:2,
496 			  portd:2,
497 			  portc:2,
498 			  portb:2,
499 			  porta:2,
500 			  reserved2:2,
501 			  sequence_num:3,
502 			  sequel:1,
503 			  phy_id:6,
504 			  id:2;
505 	} p1;
506 };
507 struct fw_topology_map {
508 	u_int32_t crc:16,
509 		  crc_len:16;
510 	u_int32_t generation;
511 	u_int32_t self_id_count:16,
512 		  node_count:16;
513 	union fw_self_id self_id[4*64];
514 };
515 struct fw_speed_map {
516 	u_int32_t crc:16,
517 		  crc_len:16;
518 	u_int32_t generation;
519 	u_int8_t  speed[64][64];
520 };
521 struct fw_map_buf {
522 	int len;
523 	void *ptr;
524 };
525 struct fw_crom_buf {
526 	struct fw_eui64 eui;
527 	int len;
528 	void *ptr;
529 };
530 #define FWSTMAXCHUNK 16
531 /*
532  * FireWire specific system requests.
533  */
534 #define	FW_SSTDV	_IOWR('S', 85, unsigned int)
535 #define	FW_SSTBUF	_IOWR('S', 86, struct fw_isobufreq)
536 #define	FW_GSTBUF	_IOWR('S', 87, struct fw_isobufreq)
537 #define	FW_SRSTREAM	_IOWR('S', 88, struct fw_isochreq)
538 #define	FW_GRSTREAM	_IOWR('S', 89, struct fw_isochreq)
539 #define	FW_STSTREAM	_IOWR('S', 90, struct fw_isochreq)
540 #define	FW_GTSTREAM	_IOWR('S', 91, struct fw_isochreq)
541 
542 #define	FW_ASYREQ	_IOWR('S', 92, struct fw_asyreq)
543 #define FW_IBUSRST	_IOR('S', 1, unsigned int)
544 #define FW_GDEVLST	_IOWR('S', 2, struct fw_devlstreq)
545 #define	FW_SBINDADDR	_IOWR('S', 3, struct fw_asybindreq)
546 #define	FW_CBINDADDR	_IOWR('S', 4, struct fw_asybindreq)
547 #define	FW_GTPMAP	_IOR('S', 5, struct fw_topology_map)
548 #define	FW_GCROM	_IOWR('S', 7, struct fw_crom_buf)
549 
550 #define FWOHCI_RDREG	_IOWR('S', 80, struct fw_reg_req_t)
551 #define FWOHCI_WRREG	_IOWR('S', 81, struct fw_reg_req_t)
552 
553 #define DUMPDMA		_IOWR('S', 82, u_int32_t)
554 
555 #ifdef _KERNEL
556 
557 #define FWMAXNDMA 0x100 /* 8 bits DMA channel id. in device No. */
558 
559 #if __FreeBSD_version < 500000
560 #define dev2unit(x)	((minor(x) & 0xff) | (minor(x) >> 8))
561 #define unit2minor(x)	(((x) & 0xff) | (((x) << 8) & ~0xffff))
562 #endif
563 
564 #define UNIT2MIN(x)	(((x) & 0xff) << 8)
565 #define DEV2UNIT(x)	((dev2unit(x) & 0xff00) >> 8)
566 #define DEV2DMACH(x)	(dev2unit(x) & 0xff)
567 
568 #define FWMEM_FLAG	0x10000
569 #define DEV_FWMEM(x)	(dev2unit(x) & FWMEM_FLAG)
570 #endif
571 #endif
572