Home | History | Annotate | Line # | Download | only in ieee1394
      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