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