firewirereg.h revision 106810
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 106810 2002-11-12 13:49:17Z 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; 50103285Sikob u_int32_t spec; 51103285Sikob u_int32_t ver; 52103285Sikob u_int8_t speed; 53103285Sikob u_int8_t maxrec; 54103285Sikob u_int8_t nport; 55103285Sikob u_int8_t power; 56103285Sikob#define CSRROMOFF 0x400 57103285Sikob#define CSRROMSIZE 0x400 58103285Sikob int rommax; /* offset from 0xffff f000 0000 */ 59103285Sikob u_int32_t csrrom[CSRROMSIZE/4]; 60103285Sikob int rcnt; 61106810Ssimokawa struct firewire_comm *fc; 62103285Sikob u_int32_t status; 63103285Sikob#define FWDEVINIT 1 64103285Sikob#define FWDEVATTACHED 2 65103285Sikob#define FWDEVINVAL 3 66103285Sikob TAILQ_ENTRY(fw_device) link; 67106810Ssimokawa#if 0 68103285Sikob LIST_HEAD(, fw_xfer) txqueue; 69103285Sikob LIST_HEAD(, fw_xfer) rxqueue; 70106810Ssimokawa#endif 71103285Sikob}; 72103285Sikobstruct firewire_softc { 73103285Sikob#if __FreeBSD_version >= 500000 74103285Sikob dev_t dev; 75103285Sikob#else 76103285Sikob dev_t dev[FWMAXNDMA+1]; 77103285Sikob#endif 78103285Sikob struct firewire_comm *fc; 79103285Sikob}; 80103285Sikob#define FW_MAX_DMACH 0x20 81103285Sikob#define FW_MAX_DEVCH FW_MAX_DMACH 82103285Sikob#define FW_XFERTIMEOUT 1 83103285Sikobstruct firewire_dev_comm { 84103285Sikob device_t dev; 85103285Sikob struct firewire_comm *fc; 86103285Sikob void (*post_explore) __P((void *)); 87103285Sikob}; 88103285Sikob 89103285Sikobstruct tcode_info { 90103285Sikob u_char hdr_len; /* IEEE1394 header length */ 91103285Sikob u_char flag; 92103285Sikob#define FWTI_REQ (1 << 0) 93103285Sikob#define FWTI_RES (1 << 1) 94103285Sikob#define FWTI_TLABEL (1 << 2) 95103285Sikob#define FWTI_BLOCK_STR (1 << 3) 96103285Sikob#define FWTI_BLOCK_ASY (1 << 4) 97103285Sikob}; 98103285Sikob 99103285Sikobstruct firewire_comm{ 100103285Sikob device_t dev; 101103285Sikob device_t bdev; 102103285Sikob u_int16_t busid:10, 103103285Sikob nodeid:6; 104103285Sikob u_int mode; 105103285Sikob u_int nport; 106103285Sikob u_int speed; 107103285Sikob u_int maxrec; 108103285Sikob u_int irm; 109103285Sikob u_int max_node; 110103285Sikob u_int max_hop; 111103285Sikob u_int max_asyretry; 112103285Sikob#define FWPHYASYST (1 << 0) 113103285Sikob u_int retry_count; 114103285Sikob u_int32_t ongobus:10, 115103285Sikob ongonode:6, 116103285Sikob ongoaddr:16; 117103285Sikob struct fw_device *ongodev; 118103285Sikob struct fw_eui64 ongoeui; 119103285Sikob#define FWMAXCSRDIR 16 120103285Sikob SLIST_HEAD(, csrdir) ongocsr; 121103285Sikob SLIST_HEAD(, csrdir) csrfree; 122103285Sikob struct csrdir{ 123103285Sikob u_int32_t ongoaddr; 124103285Sikob u_int32_t off; 125103285Sikob SLIST_ENTRY(csrdir) link; 126103285Sikob }; 127103285Sikob u_int32_t status; 128103285Sikob#define FWBUSRESET 0 129103285Sikob#define FWBUSINIT 1 130103285Sikob#define FWBUSCYMELECT 2 131103285Sikob#define FWBUSMGRELECT 3 132103285Sikob#define FWBUSMGRDONE 4 133103285Sikob#define FWBUSEXPLORE 5 134103285Sikob#define FWBUSPHYCONF 6 135103285Sikob#define FWBUSEXPDONE 7 136103285Sikob#define FWBUSCOMPLETION 10 137103285Sikob int nisodma; 138103285Sikob u_int8_t eui[8]; 139103285Sikob STAILQ_HEAD(fw_queue, fw_xfer); 140103285Sikob struct fw_xferq { 141103285Sikob int flag; 142103285Sikob#define FWXFERQ_CHTAGMASK 0xff 143103285Sikob#define FWXFERQ_RUNNING (1 << 8) 144103285Sikob#define FWXFERQ_STREAM (1 << 9) 145103285Sikob 146103285Sikob#define FWXFERQ_PACKET (1 << 10) 147103285Sikob#define FWXFERQ_BULK (1 << 11) 148103285Sikob#define FWXFERQ_DV (1 << 12) 149103285Sikob#define FWXFERQ_MODEMASK (7 << 10) 150103285Sikob 151103285Sikob#define FWXFERQ_EXTBUF (1 << 13) 152103285Sikob#define FWXFERQ_OPEN (1 << 14) 153103285Sikob 154103285Sikob#define FWXFERQ_HANDLER (1 << 16) 155103285Sikob#define FWXFERQ_WAKEUP (1 << 17) 156103285Sikob 157103285Sikob void (*start) __P((struct firewire_comm*)); 158103285Sikob void (*drain) __P((struct firewire_comm*, struct fw_xfer*)); 159103285Sikob struct fw_queue q; 160103285Sikob u_int queued; 161103285Sikob u_int maxq; 162103285Sikob u_int psize; 163103285Sikob u_int packets; 164103285Sikob u_int error; 165103285Sikob STAILQ_HEAD(, fw_bind) binds; 166103285Sikob caddr_t buf; 167103285Sikob u_int bnchunk; 168103285Sikob u_int bnpacket; 169103285Sikob u_int btpacket; 170103285Sikob struct fw_bulkxfer *bulkxfer; 171103285Sikob STAILQ_HEAD(, fw_bulkxfer) stvalid; 172103285Sikob STAILQ_HEAD(, fw_bulkxfer) stfree; 173103285Sikob struct fw_bulkxfer *stdma; 174103285Sikob struct fw_bulkxfer *stdma2; 175103285Sikob struct fw_bulkxfer *stproc; 176103285Sikob u_int procptr; 177103285Sikob int dvdbc, dvdiff, dvsync; 178103285Sikob struct fw_dvbuf *dvbuf; 179103285Sikob STAILQ_HEAD(, fw_dvbuf) dvvalid; 180103285Sikob STAILQ_HEAD(, fw_dvbuf) dvfree; 181103285Sikob struct fw_dvbuf *dvdma; 182103285Sikob struct fw_dvbuf *dvproc; 183103285Sikob u_int dvptr; 184103285Sikob u_int dvpacket; 185103285Sikob u_int need_wakeup; 186103285Sikob struct selinfo rsel; 187103285Sikob caddr_t sc; 188103285Sikob void (*hand) __P((struct fw_xferq *)); 189103285Sikob }; 190103285Sikob struct fw_xferq 191103285Sikob *arq, *atq, *ars, *ats, *it[FW_MAX_DMACH],*ir[FW_MAX_DMACH]; 192103285Sikob struct fw_bulkxfer{ 193103285Sikob u_int32_t flag; 194103285Sikob caddr_t buf; 195103285Sikob STAILQ_ENTRY(fw_bulkxfer) link; 196103285Sikob caddr_t start; 197103285Sikob caddr_t end; 198103285Sikob u_int npacket; 199103285Sikob }; 200103285Sikob struct fw_dvbuf{ 201103285Sikob caddr_t buf; 202103285Sikob STAILQ_ENTRY(fw_dvbuf) link; 203103285Sikob }; 204103285Sikob struct tlabel{ 205103285Sikob struct fw_xfer *xfer; 206103285Sikob STAILQ_ENTRY(tlabel) link; 207103285Sikob }; 208103285Sikob STAILQ_HEAD(, tlabel) tlabels[0x40]; 209103285Sikob struct fw_bind{ 210103285Sikob u_int32_t start_hi, start_lo, addrlen; 211103285Sikob struct fw_xfer* xfer; 212103285Sikob STAILQ_ENTRY(fw_bind) fclist; 213103285Sikob STAILQ_ENTRY(fw_bind) chlist; 214103285Sikob }; 215103285Sikob STAILQ_HEAD(, fw_bind) binds; 216103285Sikob TAILQ_HEAD(, fw_device) devices; 217103285Sikob STAILQ_HEAD(, fw_xfer) pending; 218103285Sikob volatile u_int32_t *sid_buf; 219103285Sikob u_int sid_cnt; 220103285Sikob#define CSRSIZE 0x4000 221103285Sikob u_int32_t csr_arc[CSRSIZE/4]; 222103285Sikob#define CROMSIZE 0x400 223103285Sikob u_int32_t *config_rom; 224103285Sikob struct fw_topology_map *topology_map; 225103285Sikob struct fw_speed_map *speed_map; 226103285Sikob struct callout_handle tlhandle; 227103285Sikob struct callout_handle bmrhandle; 228103285Sikob struct callout_handle timeouthandle; 229103285Sikob struct callout_handle retry_probe_handle; 230103285Sikob u_int32_t (*cyctimer) __P((struct firewire_comm *)); 231103285Sikob void (*ibr) __P((struct firewire_comm *)); 232103285Sikob u_int32_t (*set_bmr) __P((struct firewire_comm *, u_int32_t)); 233103285Sikob int (*ioctl) __P((dev_t, u_long, caddr_t, int, fw_proc *)); 234103285Sikob int (*irx_enable) __P((struct firewire_comm *, int)); 235103285Sikob int (*irx_disable) __P((struct firewire_comm *, int)); 236103285Sikob int (*itx_enable) __P((struct firewire_comm *, int)); 237103285Sikob int (*itx_disable) __P((struct firewire_comm *, int)); 238103285Sikob void (*timeout) __P((void *)); 239103285Sikob void (*poll) __P((struct firewire_comm *, int, int)); 240103285Sikob void (*set_intr) __P((struct firewire_comm *, int)); 241103285Sikob void (*irx_post) __P((struct firewire_comm *, u_int32_t *)); 242103285Sikob void (*itx_post) __P((struct firewire_comm *, u_int32_t *)); 243103285Sikob struct tcode_info *tcode; 244103285Sikob}; 245103285Sikob#define CSRARC(sc, offset) ((sc)->csr_arc[(offset)/4]) 246103285Sikob 247103285Sikob 248103285Sikobstruct fw_xfer{ 249103285Sikob caddr_t sc; 250103285Sikob struct firewire_comm *fc; 251103285Sikob struct fw_xferq *q; 252103285Sikob struct callout_handle ch; 253103285Sikob time_t time; 254103285Sikob struct fw_tlabel *tlabel; 255103285Sikob u_int8_t spd; 256103285Sikob u_int8_t tcode; 257103285Sikob int resp; 258103285Sikob#define FWXF_INIT 0 259103285Sikob#define FWXF_INQ 1 260103285Sikob#define FWXF_START 2 261103285Sikob#define FWXF_SENT 3 262103285Sikob#define FWXF_SENTERR 4 263103285Sikob#define FWXF_BUSY 8 264103285Sikob#define FWXF_RCVD 10 265103285Sikob int state; 266103285Sikob u_int8_t retry; 267103285Sikob u_int8_t tl; 268103285Sikob int sub; 269103285Sikob int32_t dst; 270103285Sikob u_int8_t act_type; 271103285Sikob#define FWACT_NULL 0 272103285Sikob#define FWACT_XFER 2 273103285Sikob#define FWACT_CH 3 274103285Sikob void (*retry_req) __P((struct fw_xfer *)); 275103285Sikob union{ 276103285Sikob void (*hand) __P((struct fw_xfer *)); 277103285Sikob 278103285Sikob } act; 279103285Sikob union{ 280103285Sikob struct { 281103285Sikob struct fw_device *device; 282103285Sikob } req; 283103285Sikob struct { 284103285Sikob struct stch *channel; 285103285Sikob } stream; 286103285Sikob } mode; 287103285Sikob struct { 288103285Sikob u_int16_t len, off; 289103285Sikob caddr_t buf; 290103285Sikob } send, recv; 291103285Sikob struct mbuf *mbuf; 292103285Sikob STAILQ_ENTRY(fw_xfer) link; 293103285Sikob}; 294103285Sikobvoid fw_sidrcv __P((struct firewire_comm *, caddr_t, u_int, u_int)); 295103285Sikobvoid fw_rcv __P((struct firewire_comm *, caddr_t, u_int, u_int, u_int, u_int)); 296103285Sikobvoid fw_xfer_free __P(( struct fw_xfer*)); 297103285Sikobstruct fw_xfer *fw_xfer_alloc __P((void)); 298103285Sikobvoid fw_init __P((struct firewire_comm *)); 299103285Sikobint fw_tbuf_update __P((struct firewire_comm *, int, int)); 300103285Sikobint fw_rbuf_update __P((struct firewire_comm *, int, int)); 301103285Sikobint fw_readreqq __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t *)); 302103285Sikobint fw_writereqb __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t, u_int32_t *)); 303103285Sikobint fw_readresb __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t, u_int32_t*)); 304103285Sikobint fw_writeres __P((struct firewire_comm *, u_int32_t, u_int32_t)); 305103285Sikobu_int32_t getcsrdata __P((struct fw_device *, u_int8_t)); 306103285Sikobvoid fw_asybusy __P((struct fw_xfer *)); 307103285Sikobint fw_bindadd __P((struct firewire_comm *, struct fw_bind *)); 308103285Sikobint fw_bindremove __P((struct firewire_comm *, struct fw_bind *)); 309103285Sikobint fw_asyreq __P((struct firewire_comm *, int, struct fw_xfer*)); 310103285Sikobvoid fw_busreset __P((struct firewire_comm *)); 311103285Sikobu_int16_t fw_crc16 __P((u_int32_t *, u_int32_t)); 312103285Sikobvoid fw_xfer_timeout __P((void *)); 313103285Sikobvoid fw_xfer_done __P((struct fw_xfer *)); 314103285Sikobvoid fw_asy_callback __P((struct fw_xfer *)); 315106810Ssimokawastruct fw_device *fw_noderesolve __P((struct firewire_comm *, struct fw_eui64)); 316103285Sikob 317103285Sikobextern int firewire_debug; 318103285Sikobextern devclass_t firewire_devclass; 319103285Sikob 320103285Sikob#define DV_BROADCAST_ON (1<<30) 321103285Sikob#define IP_CHANNELS 0x0234 322103285Sikob 323103285Sikob#define STATE_CLEAR 0x0000 324103285Sikob#define STATE_SET 0x0004 325103285Sikob#define NODE_IDS 0x0008 326103285Sikob#define RESET_START 0x000c 327103285Sikob#define SPLIT_TIMEOUT_HI 0x0018 328103285Sikob#define SPLIT_TIMEOUT_LO 0x001c 329103285Sikob#define CYCLE_TIME 0x0200 330103285Sikob#define BUS_TIME 0x0210 331103285Sikob#define BUS_MGR_ID 0x021c 332103285Sikob#define BANDWIDTH_AV 0x0220 333103285Sikob#define CHANNELS_AV_HI 0x0224 334103285Sikob#define CHANNELS_AV_LO 0x0228 335103285Sikob 336103285Sikob#define CONF_ROM 0x0400 337103285Sikob 338103285Sikob#define TOPO_MAP 0x1000 339103285Sikob#define SPED_MAP 0x2000 340103285Sikob 341103285Sikob#define oMPR 0x900 342103285Sikob#define oPCR 0x904 343103285Sikob 344103285Sikob#define iMPR 0x980 345103285Sikob#define iPCR 0x984 346103285Sikob 347103285Sikob#define FWPRI ((PZERO+8)|PCATCH) 348103285Sikob 349103285Sikob#ifdef __alpha__ 350103285Sikob#undef vtophys 351103285Sikob#define vtophys(va) alpha_XXX_dmamap((vm_offset_t)(va)) 352103285Sikob#endif /* __alpha__ */ 353