zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

firewire.h (10458B) - Raw


      1 /*-
      2  * SPDX-License-Identifier: BSD-4-Clause
      3  *
      4  * Copyright (c) 2003 Hidetoshi Shimokawa
      5  * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. All advertising materials mentioning features or use of this software
     17  *    must display the acknowledgement as bellow:
     18  *
     19  *    This product includes software developed by K. Kobayashi and H. Shimokawa
     20  *
     21  * 4. The name of the author may not be used to endorse or promote products
     22  *    derived from this software without specific prior written permission.
     23  *
     24  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     26  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     27  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     28  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     29  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     30  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     32  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     33  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     34  * POSSIBILITY OF SUCH DAMAGE.
     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 	unsigned char 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 #define MAKEMINOR(f, u, s)	\
    458 	((f) | (((u) & 0xff) << 8) | (s & 0xff))
    459 #define DEV2UNIT(x)	((dev2unit(x) & 0xff00) >> 8)
    460 #define DEV2SUB(x)	(dev2unit(x) & 0xff)
    461 
    462 #define FWMEM_FLAG	0x10000
    463 #define DEV_FWMEM(x)	(dev2unit(x) & FWMEM_FLAG)
    464 #endif
    465 #endif