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