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