xref: /freebsd-12.1/sys/dev/firewire/firewire.h (revision d717909f)
1 /*-
2  * Copyright (c) 2003 Hidetoshi Shimokawa
3  * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the acknowledgement as bellow:
16  *
17  *    This product includes software developed by K. Kobayashi and H. Shimokawa
18  *
19  * 4. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
26  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * $FreeBSD$
35  *
36  */
37 
38 #ifndef _FIREWIRE_H
39 #define _FIREWIRE_H 1
40 
41 #define	DEV_DEF  0
42 #define	DEV_DV   2
43 
44 struct fw_isochreq {
45 	unsigned char	ch:6,
46 			tag:2;
47 };
48 
49 struct fw_isobufreq {
50 	struct fw_bufspec {
51 		unsigned int nchunk;
52 		unsigned int npacket;
53 		unsigned int psize;
54 	} tx, rx;
55 };
56 
57 struct fw_addr {
58 	uint32_t hi;
59 	uint32_t lo;
60 };
61 
62 struct fw_asybindreq {
63 	struct fw_addr start;
64 	unsigned long len;
65 };
66 
67 struct fw_reg_req_t {
68 	uint32_t addr;
69 	uint32_t data;
70 };
71 
72 #define MAXREC(x)	(2 << (x))
73 #define FWPMAX_S400 (2048 + 20)	/* MAXREC plus space for control data */
74 #define FWMAXQUEUE 128
75 
76 #define	FWLOCALBUS	0xffc0
77 
78 #define FWTCODE_WREQQ	0
79 #define FWTCODE_WREQB	1
80 #define FWTCODE_WRES	2
81 #define FWTCODE_RREQQ	4
82 #define FWTCODE_RREQB	5
83 #define FWTCODE_RRESQ	6
84 #define FWTCODE_RRESB	7
85 #define FWTCODE_CYCS	8
86 #define FWTCODE_LREQ	9
87 #define FWTCODE_STREAM	0xa
88 #define FWTCODE_LRES	0xb
89 #define FWTCODE_PHY	0xe
90 
91 #define	FWRETRY_1	0
92 #define	FWRETRY_X	1
93 #define	FWRETRY_A	2
94 #define	FWRETRY_B	3
95 
96 #define FWRCODE_COMPLETE	0
97 #define FWRCODE_ER_CONFL	4
98 #define FWRCODE_ER_DATA		5
99 #define FWRCODE_ER_TYPE		6
100 #define FWRCODE_ER_ADDR		7
101 
102 /*
103  * Defined 1394a-2000
104  * Table 5B-1
105  */
106 #define FWSPD_S100	0
107 #define FWSPD_S200	1
108 #define FWSPD_S400	2
109 #define FWSPD_S800	3
110 #define FWSPD_S1600	4
111 #define FWSPD_S3200	5
112 
113 #define	FWP_TL_VALID (1 << 7)
114 
115 struct fw_isohdr {
116 	uint32_t hdr[1];
117 };
118 
119 struct fw_asyhdr {
120 	uint32_t hdr[4];
121 };
122 
123 #if BYTE_ORDER == BIG_ENDIAN
124 #define BIT4x2(x,y)	 uint8_t  x:4, y:4
125 #define BIT16x2(x,y)	uint32_t x:16, y:16
126 #else
127 #define BIT4x2(x,y)	 uint8_t  y:4, x:4
128 #define BIT16x2(x,y)	uint32_t y:16, x:16
129 #endif
130 
131 
132 #if BYTE_ORDER == BIG_ENDIAN
133 #define COMMON_HDR(a,b,c,d)	uint32_t a:16,b:8,c:4,d:4
134 #define COMMON_RES(a,b,c,d)	uint32_t a:16,b:4,c:4,d:8
135 #else
136 #define COMMON_HDR(a,b,c,d)	uint32_t d:4,c:4,b:8,a:16
137 #define COMMON_RES(a,b,c,d)	uint32_t d:8,c:4,b:4,a:16
138 #endif
139 
140 struct fw_pkt {
141 	union {
142 		uint32_t ld[0];
143 		struct {
144 			COMMON_HDR(, , tcode, );
145 		} common;
146 		struct {
147 			COMMON_HDR(len, chtag, tcode, sy);
148 			uint32_t payload[0];
149 		} stream;
150 		struct {
151 			COMMON_HDR(dst, tlrt, tcode, pri);
152 			BIT16x2(src, );
153 		} hdr;
154 		struct {
155 			COMMON_HDR(dst, tlrt, tcode, pri);
156 			BIT16x2(src, dest_hi);
157 			uint32_t dest_lo;
158 		} rreqq;
159 		struct {
160 			COMMON_HDR(dst, tlrt, tcode, pri);
161 			COMMON_RES(src, rtcode, , );
162 			uint32_t :32;
163 		} wres;
164 		struct {
165 			COMMON_HDR(dst, tlrt, tcode, pri);
166 			BIT16x2(src, dest_hi);
167 			uint32_t dest_lo;
168 			BIT16x2(len, extcode);
169 		} rreqb;
170 		struct {
171 			COMMON_HDR(dst, tlrt, tcode, pri);
172 			BIT16x2(src, dest_hi);
173 			uint32_t dest_lo;
174 			uint32_t data;
175 		} wreqq;
176 		struct {
177 			COMMON_HDR(dst, tlrt, tcode, pri);
178 			BIT16x2(src, dest_hi);
179 			uint32_t dest_lo;
180 			uint32_t data;
181 		} cyc;
182 		struct {
183 			COMMON_HDR(dst, tlrt, tcode, pri);
184 			COMMON_RES(src, rtcode, , );
185 			uint32_t :32;
186 			uint32_t data;
187 		} rresq;
188 		struct {
189 			COMMON_HDR(dst, tlrt, tcode, pri);
190 			BIT16x2(src, dest_hi);
191 			uint32_t dest_lo;
192 			BIT16x2(len, extcode);
193 			uint32_t payload[0];
194 		} wreqb;
195 		struct {
196 			COMMON_HDR(dst, tlrt, tcode, pri);
197 			BIT16x2(src, dest_hi);
198 			uint32_t dest_lo;
199 			BIT16x2(len, extcode);
200 			uint32_t payload[0];
201 		} lreq;
202 		struct {
203 			COMMON_HDR(dst, tlrt, tcode, pri);
204 			COMMON_RES(src, rtcode, , );
205 			uint32_t :32;
206 			BIT16x2(len, extcode);
207 			uint32_t payload[0];
208 		} rresb;
209 		struct {
210 			COMMON_HDR(dst, tlrt, tcode, pri);
211 			COMMON_RES(src, rtcode, , );
212 			uint32_t :32;
213 			BIT16x2(len, extcode);
214 			uint32_t payload[0];
215 		} lres;
216 	} mode;
217 };
218 
219 /*
220  * Response code (rtcode)
221  */
222 /* The node has successfully completed the command. */
223 #define	RESP_CMP		0
224 /* A resource conflict was detected. The request may be retried. */
225 #define	RESP_CONFLICT_ERROR	4
226 /* Hardware error, data is unavailable. */
227 #define	RESP_DATA_ERROR		5
228 /* A field in the request packet header was set to an unsupported or incorrect
229  * value, or an invalid transaction was attempted (e.g., a write to a read-only
230  * address). */
231 #define	RESP_TYPE_ERROR		6
232 /* The destination offset field in the request was set to an address not
233  * accessible in the destination node. */
234 #define	RESP_ADDRESS_ERROR	7
235 
236 /*
237  * Extended transaction code (extcode)
238  */
239 #define EXTCODE_MASK_SWAP	1
240 #define EXTCODE_CMP_SWAP	2
241 #define EXTCODE_FETCH_ADD	3
242 #define EXTCODE_LITTLE_ADD	4
243 #define EXTCODE_BOUNDED_ADD	5
244 #define EXTCODE_WRAP_ADD	6
245 
246 struct fw_eui64 {
247 	uint32_t hi, lo;
248 };
249 #define FW_EUI64_BYTE(eui, x) \
250 	((((x)<4)?				\
251 		((eui)->hi >> (8*(3-(x)))): 	\
252 		((eui)->lo >> (8*(7-(x))))	\
253 	) & 0xff)
254 #define FW_EUI64_EQUAL(x, y) \
255 	((x).hi == (y).hi && (x).lo == (y).lo)
256 
257 struct fw_asyreq {
258 	struct fw_asyreq_t{
259 		unsigned char sped;
260 		unsigned int type;
261 #define FWASREQNODE	0
262 #define FWASREQEUI	1
263 #define FWASRESTL	2
264 #define FWASREQSTREAM	3
265 		unsigned short len;
266 		union {
267 			struct fw_eui64 eui;
268 		}dst;
269 	}req;
270 	struct fw_pkt pkt;
271 	uint32_t data[512];
272 };
273 
274 struct fw_devinfo {
275 	struct fw_eui64 eui;
276 	uint16_t dst;
277 	uint16_t status;
278 };
279 
280 #define FW_MAX_DEVLST 70
281 struct fw_devlstreq {
282 	uint16_t n;
283 	uint16_t info_len;
284 	struct fw_devinfo dev[FW_MAX_DEVLST];
285 };
286 
287 #define FW_SELF_ID_PORT_CONNECTED_TO_CHILD 3
288 #define FW_SELF_ID_PORT_CONNECTED_TO_PARENT 2
289 #define FW_SELF_ID_PORT_NOT_CONNECTED 1
290 #define FW_SELF_ID_PORT_NOT_EXISTS 0
291 #if BYTE_ORDER == BIG_ENDIAN
292 union fw_self_id {
293 	struct {
294 		uint32_t  id:2,
295 			  phy_id:6,
296 			  sequel:1,
297 			  link_active:1,
298 			  gap_count:6,
299 			  phy_speed:2,
300 			  phy_delay:2,
301 			  contender:1,
302 			  power_class:3,
303 			  port0:2,
304 			  port1:2,
305 			  port2:2,
306 			  initiated_reset:1,
307 			  more_packets:1;
308 	} p0;
309 	struct {
310 		uint32_t
311 			  id:2,
312 			  phy_id:6,
313 			  sequel:1,
314 			  sequence_num:3,
315 			  :2,
316 			  porta:2,
317 			  portb:2,
318 			  portc:2,
319 			  portd:2,
320 			  porte:2,
321 			  portf:2,
322 			  portg:2,
323 			  porth:2,
324 			  :1,
325 			  more_packets:1;
326 	} p1;
327 };
328 #else
329 union fw_self_id {
330 	struct {
331 		uint32_t  more_packets:1,
332 			  initiated_reset:1,
333 			  port2:2,
334 			  port1:2,
335 			  port0:2,
336 			  power_class:3,
337 			  contender:1,
338 			  phy_delay:2,
339 			  phy_speed:2,
340 			  gap_count:6,
341 			  link_active:1,
342 			  sequel:1,
343 			  phy_id:6,
344 			  id:2;
345 	} p0;
346 	struct {
347 		uint32_t  more_packets:1,
348 			  reserved1:1,
349 			  porth:2,
350 			  portg:2,
351 			  portf:2,
352 			  porte:2,
353 			  portd:2,
354 			  portc:2,
355 			  portb:2,
356 			  porta:2,
357 			  reserved2:2,
358 			  sequence_num:3,
359 			  sequel:1,
360 			  phy_id:6,
361 			  id:2;
362 	} p1;
363 };
364 #endif
365 
366 
367 struct fw_topology_map {
368 	uint32_t crc:16,
369 		 crc_len:16;
370 	uint32_t generation;
371 	uint32_t self_id_count:16,
372 		 node_count:16;
373 	union fw_self_id self_id[4*64];
374 };
375 
376 struct fw_speed_map {
377 	uint32_t crc:16,
378 		 crc_len:16;
379 	uint32_t generation;
380 	uint8_t  speed[64][64];
381 };
382 
383 struct fw_crom_buf {
384 	struct fw_eui64 eui;
385 	uint32_t len;
386 	void *ptr;
387 };
388 
389 /*
390  * FireWire specific system requests.
391  */
392 #define	FW_SSTBUF	_IOWR('S', 86, struct fw_isobufreq)
393 #define	FW_GSTBUF	_IOWR('S', 87, struct fw_isobufreq)
394 #define	FW_SRSTREAM	_IOWR('S', 88, struct fw_isochreq)
395 #define	FW_GRSTREAM	_IOWR('S', 89, struct fw_isochreq)
396 #define	FW_STSTREAM	_IOWR('S', 90, struct fw_isochreq)
397 #define	FW_GTSTREAM	_IOWR('S', 91, struct fw_isochreq)
398 
399 #define	FW_ASYREQ	_IOWR('S', 92, struct fw_asyreq)
400 #define FW_IBUSRST	_IOR('S', 1, unsigned int)
401 #define FW_GDEVLST	_IOWR('S', 2, struct fw_devlstreq)
402 #define	FW_SBINDADDR	_IOWR('S', 3, struct fw_asybindreq)
403 #define	FW_CBINDADDR	_IOWR('S', 4, struct fw_asybindreq)
404 #define	FW_GTPMAP	_IOR('S', 5, struct fw_topology_map)
405 #define	FW_GCROM	_IOWR('S', 7, struct fw_crom_buf)
406 
407 #define	FW_SDEUI64	_IOW('S', 20, struct fw_eui64)
408 #define	FW_GDEUI64	_IOR('S', 21, struct fw_eui64)
409 
410 #define FWOHCI_RDREG	_IOWR('S', 80, struct fw_reg_req_t)
411 #define FWOHCI_WRREG	_IOWR('S', 81, struct fw_reg_req_t)
412 #define FWOHCI_RDPHYREG	_IOWR('S', 82, struct fw_reg_req_t)
413 #define FWOHCI_WRPHYREG	_IOWR('S', 83, struct fw_reg_req_t)
414 
415 #define DUMPDMA		_IOWR('S', 82, uint32_t)
416 
417 #ifdef _KERNEL
418 
419 #define FWMAXNDMA 0x100 /* 8 bits DMA channel id. in device No. */
420 
421 #if defined(__DragonFly__) || __FreeBSD_version < 500000
422 #define dev2unit(x)	((minor(x) & 0xff) | (minor(x) >> 8))
423 #define unit2minor(x)	(((x) & 0xff) | (((x) << 8) & ~0xffff))
424 #endif
425 
426 #define MAKEMINOR(f, u, s)	\
427 	((f) | (((u) & 0xff) << 8) | (s & 0xff))
428 #define DEV2UNIT(x)	((dev2unit(x) & 0xff00) >> 8)
429 #define DEV2SUB(x)	(dev2unit(x) & 0xff)
430 
431 #define FWMEM_FLAG	0x10000
432 #define DEV_FWMEM(x)	(dev2unit(x) & FWMEM_FLAG)
433 #endif
434 #endif
435