firewirereg.h revision 108701
1103285Sikob/* 2103285Sikob * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa 3103285Sikob * All rights reserved. 4103285Sikob * 5103285Sikob * Redistribution and use in source and binary forms, with or without 6103285Sikob * modification, are permitted provided that the following conditions 7103285Sikob * are met: 8103285Sikob * 1. Redistributions of source code must retain the above copyright 9103285Sikob * notice, this list of conditions and the following disclaimer. 10103285Sikob * 2. Redistributions in binary form must reproduce the above copyright 11103285Sikob * notice, this list of conditions and the following disclaimer in the 12103285Sikob * documentation and/or other materials provided with the distribution. 13103285Sikob * 3. All advertising materials mentioning features or use of this software 14103285Sikob * must display the acknowledgement as bellow: 15103285Sikob * 16103285Sikob * This product includes software developed by K. Kobayashi and H. Shimokawa 17103285Sikob * 18103285Sikob * 4. The name of the author may not be used to endorse or promote products 19103285Sikob * derived from this software without specific prior written permission. 20103285Sikob * 21103285Sikob * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22103285Sikob * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23103285Sikob * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24103285Sikob * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 25103285Sikob * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26103285Sikob * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27103285Sikob * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28103285Sikob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29103285Sikob * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30103285Sikob * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31103285Sikob * POSSIBILITY OF SUCH DAMAGE. 32103285Sikob * 33103285Sikob * $FreeBSD: head/sys/dev/firewire/firewirereg.h 108701 2003-01-05 06:21:30Z simokawa $ 34103285Sikob * 35103285Sikob */ 36103285Sikob 37103285Sikob#if __FreeBSD_version >= 500000 38103285Sikobtypedef struct thread fw_proc; 39103285Sikob#include <sys/selinfo.h> 40103285Sikob#else 41103285Sikobtypedef struct proc fw_proc; 42103285Sikob#include <sys/select.h> 43103285Sikob#endif 44103285Sikob 45103285Sikob#define splfw splimp 46103285Sikob 47103285Sikobstruct fw_device{ 48103285Sikob u_int16_t dst; 49103285Sikob struct fw_eui64 eui; 50108701Ssimokawa#if 0 51103285Sikob u_int32_t spec; 52103285Sikob u_int32_t ver; 53108701Ssimokawa#endif 54103285Sikob u_int8_t speed; 55103285Sikob u_int8_t maxrec; 56103285Sikob u_int8_t nport; 57103285Sikob u_int8_t power; 58103285Sikob#define CSRROMOFF 0x400 59103285Sikob#define CSRROMSIZE 0x400 60103285Sikob int rommax; /* offset from 0xffff f000 0000 */ 61103285Sikob u_int32_t csrrom[CSRROMSIZE/4]; 62103285Sikob int rcnt; 63106810Ssimokawa struct firewire_comm *fc; 64103285Sikob u_int32_t status; 65103285Sikob#define FWDEVINIT 1 66103285Sikob#define FWDEVATTACHED 2 67103285Sikob#define FWDEVINVAL 3 68103285Sikob TAILQ_ENTRY(fw_device) link; 69106810Ssimokawa#if 0 70103285Sikob LIST_HEAD(, fw_xfer) txqueue; 71103285Sikob LIST_HEAD(, fw_xfer) rxqueue; 72106810Ssimokawa#endif 73103285Sikob}; 74103285Sikobstruct firewire_softc { 75103285Sikob#if __FreeBSD_version >= 500000 76103285Sikob dev_t dev; 77103285Sikob#else 78103285Sikob dev_t dev[FWMAXNDMA+1]; 79103285Sikob#endif 80103285Sikob struct firewire_comm *fc; 81103285Sikob}; 82103285Sikob#define FW_MAX_DMACH 0x20 83103285Sikob#define FW_MAX_DEVCH FW_MAX_DMACH 84103285Sikob#define FW_XFERTIMEOUT 1 85103285Sikobstruct firewire_dev_comm { 86103285Sikob device_t dev; 87103285Sikob struct firewire_comm *fc; 88103285Sikob void (*post_explore) __P((void *)); 89103285Sikob}; 90103285Sikob 91103285Sikobstruct tcode_info { 92103285Sikob u_char hdr_len; /* IEEE1394 header length */ 93103285Sikob u_char flag; 94103285Sikob#define FWTI_REQ (1 << 0) 95103285Sikob#define FWTI_RES (1 << 1) 96103285Sikob#define FWTI_TLABEL (1 << 2) 97103285Sikob#define FWTI_BLOCK_STR (1 << 3) 98103285Sikob#define FWTI_BLOCK_ASY (1 << 4) 99103285Sikob}; 100103285Sikob 101103285Sikobstruct firewire_comm{ 102103285Sikob device_t dev; 103103285Sikob device_t bdev; 104103285Sikob u_int16_t busid:10, 105103285Sikob nodeid:6; 106103285Sikob u_int mode; 107103285Sikob u_int nport; 108103285Sikob u_int speed; 109103285Sikob u_int maxrec; 110103285Sikob u_int irm; 111103285Sikob u_int max_node; 112103285Sikob u_int max_hop; 113103285Sikob u_int max_asyretry; 114103285Sikob#define FWPHYASYST (1 << 0) 115103285Sikob u_int retry_count; 116103285Sikob u_int32_t ongobus:10, 117103285Sikob ongonode:6, 118103285Sikob ongoaddr:16; 119103285Sikob struct fw_device *ongodev; 120103285Sikob struct fw_eui64 ongoeui; 121103285Sikob#define FWMAXCSRDIR 16 122103285Sikob SLIST_HEAD(, csrdir) ongocsr; 123103285Sikob SLIST_HEAD(, csrdir) csrfree; 124103285Sikob struct csrdir{ 125103285Sikob u_int32_t ongoaddr; 126103285Sikob u_int32_t off; 127103285Sikob SLIST_ENTRY(csrdir) link; 128103285Sikob }; 129103285Sikob u_int32_t status; 130103285Sikob#define FWBUSRESET 0 131103285Sikob#define FWBUSINIT 1 132103285Sikob#define FWBUSCYMELECT 2 133103285Sikob#define FWBUSMGRELECT 3 134103285Sikob#define FWBUSMGRDONE 4 135103285Sikob#define FWBUSEXPLORE 5 136103285Sikob#define FWBUSPHYCONF 6 137103285Sikob#define FWBUSEXPDONE 7 138103285Sikob#define FWBUSCOMPLETION 10 139103285Sikob int nisodma; 140103285Sikob u_int8_t eui[8]; 141103285Sikob STAILQ_HEAD(fw_queue, fw_xfer); 142103285Sikob struct fw_xferq { 143103285Sikob int flag; 144103285Sikob#define FWXFERQ_CHTAGMASK 0xff 145103285Sikob#define FWXFERQ_RUNNING (1 << 8) 146103285Sikob#define FWXFERQ_STREAM (1 << 9) 147103285Sikob 148103285Sikob#define FWXFERQ_PACKET (1 << 10) 149103285Sikob#define FWXFERQ_BULK (1 << 11) 150103285Sikob#define FWXFERQ_DV (1 << 12) 151103285Sikob#define FWXFERQ_MODEMASK (7 << 10) 152103285Sikob 153103285Sikob#define FWXFERQ_EXTBUF (1 << 13) 154103285Sikob#define FWXFERQ_OPEN (1 << 14) 155103285Sikob 156103285Sikob#define FWXFERQ_HANDLER (1 << 16) 157103285Sikob#define FWXFERQ_WAKEUP (1 << 17) 158103285Sikob 159103285Sikob void (*start) __P((struct firewire_comm*)); 160103285Sikob void (*drain) __P((struct firewire_comm*, struct fw_xfer*)); 161103285Sikob struct fw_queue q; 162103285Sikob u_int queued; 163103285Sikob u_int maxq; 164103285Sikob u_int psize; 165103285Sikob u_int packets; 166103285Sikob u_int error; 167103285Sikob STAILQ_HEAD(, fw_bind) binds; 168103285Sikob caddr_t buf; 169103285Sikob u_int bnchunk; 170103285Sikob u_int bnpacket; 171103285Sikob u_int btpacket; 172103285Sikob struct fw_bulkxfer *bulkxfer; 173103285Sikob STAILQ_HEAD(, fw_bulkxfer) stvalid; 174103285Sikob STAILQ_HEAD(, fw_bulkxfer) stfree; 175103285Sikob struct fw_bulkxfer *stdma; 176103285Sikob struct fw_bulkxfer *stdma2; 177103285Sikob struct fw_bulkxfer *stproc; 178103285Sikob u_int procptr; 179103285Sikob int dvdbc, dvdiff, dvsync; 180103285Sikob struct fw_dvbuf *dvbuf; 181103285Sikob STAILQ_HEAD(, fw_dvbuf) dvvalid; 182103285Sikob STAILQ_HEAD(, fw_dvbuf) dvfree; 183103285Sikob struct fw_dvbuf *dvdma; 184103285Sikob struct fw_dvbuf *dvproc; 185103285Sikob u_int dvptr; 186103285Sikob u_int dvpacket; 187103285Sikob u_int need_wakeup; 188103285Sikob struct selinfo rsel; 189103285Sikob caddr_t sc; 190103285Sikob void (*hand) __P((struct fw_xferq *)); 191103285Sikob }; 192103285Sikob struct fw_xferq 193103285Sikob *arq, *atq, *ars, *ats, *it[FW_MAX_DMACH],*ir[FW_MAX_DMACH]; 194103285Sikob struct fw_bulkxfer{ 195103285Sikob u_int32_t flag; 196103285Sikob caddr_t buf; 197103285Sikob STAILQ_ENTRY(fw_bulkxfer) link; 198103285Sikob caddr_t start; 199103285Sikob caddr_t end; 200103285Sikob u_int npacket; 201103285Sikob }; 202103285Sikob struct fw_dvbuf{ 203103285Sikob caddr_t buf; 204103285Sikob STAILQ_ENTRY(fw_dvbuf) link; 205103285Sikob }; 206103285Sikob struct tlabel{ 207103285Sikob struct fw_xfer *xfer; 208103285Sikob STAILQ_ENTRY(tlabel) link; 209103285Sikob }; 210103285Sikob STAILQ_HEAD(, tlabel) tlabels[0x40]; 211103285Sikob struct fw_bind{ 212103285Sikob u_int32_t start_hi, start_lo, addrlen; 213103285Sikob struct fw_xfer* xfer; 214103285Sikob STAILQ_ENTRY(fw_bind) fclist; 215103285Sikob STAILQ_ENTRY(fw_bind) chlist; 216103285Sikob }; 217103285Sikob STAILQ_HEAD(, fw_bind) binds; 218103285Sikob TAILQ_HEAD(, fw_device) devices; 219103285Sikob STAILQ_HEAD(, fw_xfer) pending; 220103285Sikob volatile u_int32_t *sid_buf; 221103285Sikob u_int sid_cnt; 222103285Sikob#define CSRSIZE 0x4000 223103285Sikob u_int32_t csr_arc[CSRSIZE/4]; 224103285Sikob#define CROMSIZE 0x400 225103285Sikob u_int32_t *config_rom; 226103285Sikob struct fw_topology_map *topology_map; 227103285Sikob struct fw_speed_map *speed_map; 228103285Sikob struct callout_handle tlhandle; 229103285Sikob struct callout_handle bmrhandle; 230103285Sikob struct callout_handle timeouthandle; 231103285Sikob struct callout_handle retry_probe_handle; 232103285Sikob u_int32_t (*cyctimer) __P((struct firewire_comm *)); 233103285Sikob void (*ibr) __P((struct firewire_comm *)); 234103285Sikob u_int32_t (*set_bmr) __P((struct firewire_comm *, u_int32_t)); 235103285Sikob int (*ioctl) __P((dev_t, u_long, caddr_t, int, fw_proc *)); 236103285Sikob int (*irx_enable) __P((struct firewire_comm *, int)); 237103285Sikob int (*irx_disable) __P((struct firewire_comm *, int)); 238103285Sikob int (*itx_enable) __P((struct firewire_comm *, int)); 239103285Sikob int (*itx_disable) __P((struct firewire_comm *, int)); 240103285Sikob void (*timeout) __P((void *)); 241103285Sikob void (*poll) __P((struct firewire_comm *, int, int)); 242103285Sikob void (*set_intr) __P((struct firewire_comm *, int)); 243103285Sikob void (*irx_post) __P((struct firewire_comm *, u_int32_t *)); 244103285Sikob void (*itx_post) __P((struct firewire_comm *, u_int32_t *)); 245103285Sikob struct tcode_info *tcode; 246103285Sikob}; 247103285Sikob#define CSRARC(sc, offset) ((sc)->csr_arc[(offset)/4]) 248103285Sikob 249103285Sikob 250103285Sikobstruct fw_xfer{ 251103285Sikob caddr_t sc; 252103285Sikob struct firewire_comm *fc; 253103285Sikob struct fw_xferq *q; 254103285Sikob struct callout_handle ch; 255103285Sikob time_t time; 256103285Sikob struct fw_tlabel *tlabel; 257103285Sikob u_int8_t spd; 258103285Sikob u_int8_t tcode; 259103285Sikob int resp; 260103285Sikob#define FWXF_INIT 0 261103285Sikob#define FWXF_INQ 1 262103285Sikob#define FWXF_START 2 263103285Sikob#define FWXF_SENT 3 264103285Sikob#define FWXF_SENTERR 4 265103285Sikob#define FWXF_BUSY 8 266103285Sikob#define FWXF_RCVD 10 267103285Sikob int state; 268103285Sikob u_int8_t retry; 269103285Sikob u_int8_t tl; 270103285Sikob int sub; 271103285Sikob int32_t dst; 272103285Sikob u_int8_t act_type; 273103285Sikob#define FWACT_NULL 0 274103285Sikob#define FWACT_XFER 2 275103285Sikob#define FWACT_CH 3 276103285Sikob void (*retry_req) __P((struct fw_xfer *)); 277103285Sikob union{ 278103285Sikob void (*hand) __P((struct fw_xfer *)); 279103285Sikob 280103285Sikob } act; 281103285Sikob union{ 282103285Sikob struct { 283103285Sikob struct fw_device *device; 284103285Sikob } req; 285103285Sikob struct { 286103285Sikob struct stch *channel; 287103285Sikob } stream; 288103285Sikob } mode; 289103285Sikob struct { 290103285Sikob u_int16_t len, off; 291103285Sikob caddr_t buf; 292103285Sikob } send, recv; 293103285Sikob struct mbuf *mbuf; 294103285Sikob STAILQ_ENTRY(fw_xfer) link; 295103285Sikob}; 296103285Sikobvoid fw_sidrcv __P((struct firewire_comm *, caddr_t, u_int, u_int)); 297103285Sikobvoid fw_rcv __P((struct firewire_comm *, caddr_t, u_int, u_int, u_int, u_int)); 298103285Sikobvoid fw_xfer_free __P(( struct fw_xfer*)); 299103285Sikobstruct fw_xfer *fw_xfer_alloc __P((void)); 300103285Sikobvoid fw_init __P((struct firewire_comm *)); 301103285Sikobint fw_tbuf_update __P((struct firewire_comm *, int, int)); 302103285Sikobint fw_rbuf_update __P((struct firewire_comm *, int, int)); 303103285Sikobint fw_readreqq __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t *)); 304103285Sikobint fw_writereqb __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t, u_int32_t *)); 305103285Sikobint fw_readresb __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t, u_int32_t*)); 306103285Sikobint fw_writeres __P((struct firewire_comm *, u_int32_t, u_int32_t)); 307103285Sikobu_int32_t getcsrdata __P((struct fw_device *, u_int8_t)); 308103285Sikobvoid fw_asybusy __P((struct fw_xfer *)); 309103285Sikobint fw_bindadd __P((struct firewire_comm *, struct fw_bind *)); 310103285Sikobint fw_bindremove __P((struct firewire_comm *, struct fw_bind *)); 311103285Sikobint fw_asyreq __P((struct firewire_comm *, int, struct fw_xfer*)); 312103285Sikobvoid fw_busreset __P((struct firewire_comm *)); 313103285Sikobu_int16_t fw_crc16 __P((u_int32_t *, u_int32_t)); 314103285Sikobvoid fw_xfer_timeout __P((void *)); 315103285Sikobvoid fw_xfer_done __P((struct fw_xfer *)); 316103285Sikobvoid fw_asy_callback __P((struct fw_xfer *)); 317106810Ssimokawastruct fw_device *fw_noderesolve __P((struct firewire_comm *, struct fw_eui64)); 318106813Ssimokawastruct fw_bind *fw_bindlookup __P((struct firewire_comm *, u_int32_t, u_int32_t)); 319103285Sikob 320106813Ssimokawa 321103285Sikobextern int firewire_debug; 322103285Sikobextern devclass_t firewire_devclass; 323103285Sikob 324103285Sikob#define DV_BROADCAST_ON (1<<30) 325103285Sikob#define IP_CHANNELS 0x0234 326103285Sikob 327103285Sikob#define STATE_CLEAR 0x0000 328103285Sikob#define STATE_SET 0x0004 329103285Sikob#define NODE_IDS 0x0008 330103285Sikob#define RESET_START 0x000c 331103285Sikob#define SPLIT_TIMEOUT_HI 0x0018 332103285Sikob#define SPLIT_TIMEOUT_LO 0x001c 333103285Sikob#define CYCLE_TIME 0x0200 334103285Sikob#define BUS_TIME 0x0210 335103285Sikob#define BUS_MGR_ID 0x021c 336103285Sikob#define BANDWIDTH_AV 0x0220 337103285Sikob#define CHANNELS_AV_HI 0x0224 338103285Sikob#define CHANNELS_AV_LO 0x0228 339103285Sikob 340103285Sikob#define CONF_ROM 0x0400 341103285Sikob 342103285Sikob#define TOPO_MAP 0x1000 343103285Sikob#define SPED_MAP 0x2000 344103285Sikob 345103285Sikob#define oMPR 0x900 346103285Sikob#define oPCR 0x904 347103285Sikob 348103285Sikob#define iMPR 0x980 349103285Sikob#define iPCR 0x984 350103285Sikob 351103285Sikob#define FWPRI ((PZERO+8)|PCATCH) 352103285Sikob 353103285Sikob#ifdef __alpha__ 354103285Sikob#undef vtophys 355103285Sikob#define vtophys(va) alpha_XXX_dmamap((vm_offset_t)(va)) 356103285Sikob#endif /* __alpha__ */ 357