]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/dev/firewire/firewire.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / dev / firewire / firewire.h
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 /*
288  * Defined in IEEE 1394a-2000
289  * 4.3.4.1
290  */
291 #define FW_SELF_ID_PORT_CONNECTED_TO_CHILD 3
292 #define FW_SELF_ID_PORT_CONNECTED_TO_PARENT 2
293 #define FW_SELF_ID_PORT_NOT_CONNECTED 1
294 #define FW_SELF_ID_PORT_NOT_EXISTS 0
295
296 #define FW_SELF_ID_PAGE0 0
297 #define FW_SELF_ID_PAGE1 1
298
299 #if BYTE_ORDER == BIG_ENDIAN
300 union fw_self_id {
301         struct {
302                 uint32_t  id:2,
303                           phy_id:6,
304                           sequel:1,
305                           link_active:1,
306                           gap_count:6,
307                           phy_speed:2,
308                           reserved:2,
309                           contender:1,
310                           power_class:3,
311                           port0:2,
312                           port1:2,
313                           port2:2,
314                           initiated_reset:1,
315                           more_packets:1;
316         } p0;
317         struct {
318                 uint32_t
319                           id:2,
320                           phy_id:6,
321                           sequel:1,
322                           sequence_num:3,
323                           reserved2:2,
324                           port3:2,
325                           port4:2,
326                           port5:2,
327                           port6:2,
328                           port7:2,
329                           port8:2,
330                           port9:2,
331                           port10:2,
332                           reserved1:1,
333                           more_packets:1;
334         } p1;
335         struct {
336                 uint32_t
337                           id:2,
338                           phy_id:6,
339                           sequel:1,
340                           sequence_num:3,
341                           :2,
342                           port11:2,
343                           port12:2,
344                           port13:2,
345                           port14:2,
346                           port15:2,
347                           :8;
348         } p2;
349 };
350 #else
351 union fw_self_id {
352         struct {
353                 uint32_t  more_packets:1,
354                           initiated_reset:1,
355                           port2:2,
356                           port1:2,
357                           port0:2,
358                           power_class:3,
359                           contender:1,
360                           reserved:2,
361                           phy_speed:2,
362                           gap_count:6,
363                           link_active:1,
364                           sequel:1,
365                           phy_id:6,
366                           id:2;
367         } p0;
368         struct {
369                 uint32_t  more_packets:1,
370                           reserved1:1,
371                           port10:2,
372                           port9:2,
373                           port8:2,
374                           port7:2,
375                           port6:2,
376                           port5:2,
377                           port4:2,
378                           port3:2,
379                           reserved2:2,
380                           sequence_num:3,
381                           sequel:1,
382                           phy_id:6,
383                           id:2;
384         } p1;
385         struct {
386                 uint32_t
387                           reserved3:8,
388                           port15:2,
389                           port14:2,
390                           port13:2,
391                           port12:2,
392                           port11:2,
393                           reserved4:2,
394                           sequence_num:3,
395                           sequel:1,
396                           phy_id:6,
397                           id:2;
398         } p2;
399 };
400 #endif
401
402
403 struct fw_topology_map {
404         uint32_t crc:16,
405                  crc_len:16;
406         uint32_t generation;
407         uint32_t self_id_count:16,
408                  node_count:16;
409         union fw_self_id self_id[4*64];
410 };
411
412 struct fw_speed_map {
413         uint32_t crc:16,
414                  crc_len:16;
415         uint32_t generation;
416         uint8_t  speed[64][64];
417 };
418
419 struct fw_crom_buf {
420         struct fw_eui64 eui;
421         uint32_t len;
422         void *ptr;
423 };
424
425 /*
426  * FireWire specific system requests.
427  */
428 #define FW_SSTBUF       _IOWR('S', 86, struct fw_isobufreq)
429 #define FW_GSTBUF       _IOWR('S', 87, struct fw_isobufreq)
430 #define FW_SRSTREAM     _IOWR('S', 88, struct fw_isochreq)
431 #define FW_GRSTREAM     _IOWR('S', 89, struct fw_isochreq)
432 #define FW_STSTREAM     _IOWR('S', 90, struct fw_isochreq)
433 #define FW_GTSTREAM     _IOWR('S', 91, struct fw_isochreq)
434
435 #define FW_ASYREQ       _IOWR('S', 92, struct fw_asyreq)
436 #define FW_IBUSRST      _IOR('S', 1, unsigned int)
437 #define FW_GDEVLST      _IOWR('S', 2, struct fw_devlstreq)
438 #define FW_SBINDADDR    _IOWR('S', 3, struct fw_asybindreq)
439 #define FW_CBINDADDR    _IOWR('S', 4, struct fw_asybindreq)
440 #define FW_GTPMAP       _IOR('S', 5, struct fw_topology_map)
441 #define FW_GCROM        _IOWR('S', 7, struct fw_crom_buf)
442
443 #define FW_SDEUI64      _IOW('S', 20, struct fw_eui64)
444 #define FW_GDEUI64      _IOR('S', 21, struct fw_eui64)
445
446 #define FWOHCI_RDREG    _IOWR('S', 80, struct fw_reg_req_t)
447 #define FWOHCI_WRREG    _IOWR('S', 81, struct fw_reg_req_t)
448 #define FWOHCI_RDPHYREG _IOWR('S', 82, struct fw_reg_req_t)
449 #define FWOHCI_WRPHYREG _IOWR('S', 83, struct fw_reg_req_t)
450
451 #define DUMPDMA         _IOWR('S', 82, uint32_t)
452
453 #ifdef _KERNEL
454
455 #define FWMAXNDMA 0x100 /* 8 bits DMA channel id. in device No. */
456
457 #if defined(__DragonFly__) || __FreeBSD_version < 500000
458 #define dev2unit(x)     ((minor(x) & 0xff) | (minor(x) >> 8))
459 #define unit2minor(x)   (((x) & 0xff) | (((x) << 8) & ~0xffff))
460 #endif
461
462 #define MAKEMINOR(f, u, s)      \
463         ((f) | (((u) & 0xff) << 8) | (s & 0xff))
464 #define DEV2UNIT(x)     ((dev2unit(x) & 0xff00) >> 8)
465 #define DEV2SUB(x)      (dev2unit(x) & 0xff)
466
467 #define FWMEM_FLAG      0x10000
468 #define DEV_FWMEM(x)    (dev2unit(x) & FWMEM_FLAG)
469 #endif
470 #endif