firewirereg.h revision 106813
1215976Sjmallett/* 2215976Sjmallett * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa 3215976Sjmallett * All rights reserved. 4215976Sjmallett * 5215976Sjmallett * Redistribution and use in source and binary forms, with or without 6215976Sjmallett * modification, are permitted provided that the following conditions 7215976Sjmallett * are met: 8215976Sjmallett * 1. Redistributions of source code must retain the above copyright 9215976Sjmallett * notice, this list of conditions and the following disclaimer. 10215976Sjmallett * 2. Redistributions in binary form must reproduce the above copyright 11215976Sjmallett * notice, this list of conditions and the following disclaimer in the 12215976Sjmallett * documentation and/or other materials provided with the distribution. 13215976Sjmallett * 3. All advertising materials mentioning features or use of this software 14215976Sjmallett * must display the acknowledgement as bellow: 15215976Sjmallett * 16215976Sjmallett * This product includes software developed by K. Kobayashi and H. Shimokawa 17215976Sjmallett * 18215976Sjmallett * 4. The name of the author may not be used to endorse or promote products 19215976Sjmallett * derived from this software without specific prior written permission. 20215976Sjmallett * 21215976Sjmallett * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22215976Sjmallett * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23215976Sjmallett * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24215976Sjmallett * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 25215976Sjmallett * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26215976Sjmallett * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27215976Sjmallett * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28215976Sjmallett * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29215976Sjmallett * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30215976Sjmallett * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31215976Sjmallett * POSSIBILITY OF SUCH DAMAGE. 32215976Sjmallett * 33215976Sjmallett * $FreeBSD: head/sys/dev/firewire/firewirereg.h 106813 2002-11-12 15:22:19Z simokawa $ 34215976Sjmallett * 35215976Sjmallett */ 36215976Sjmallett 37215976Sjmallett#if __FreeBSD_version >= 500000 38215976Sjmalletttypedef struct thread fw_proc; 39215976Sjmallett#include <sys/selinfo.h> 40215976Sjmallett#else 41215976Sjmalletttypedef struct proc fw_proc; 42215976Sjmallett#include <sys/select.h> 43215976Sjmallett#endif 44215976Sjmallett 45215976Sjmallett#define splfw splimp 46215976Sjmallett 47215976Sjmallettstruct fw_device{ 48215976Sjmallett u_int16_t dst; 49215976Sjmallett struct fw_eui64 eui; 50215976Sjmallett u_int32_t spec; 51215976Sjmallett u_int32_t ver; 52215976Sjmallett u_int8_t speed; 53215976Sjmallett u_int8_t maxrec; 54215976Sjmallett u_int8_t nport; 55215976Sjmallett u_int8_t power; 56215976Sjmallett#define CSRROMOFF 0x400 57215976Sjmallett#define CSRROMSIZE 0x400 58215976Sjmallett int rommax; /* offset from 0xffff f000 0000 */ 59215976Sjmallett u_int32_t csrrom[CSRROMSIZE/4]; 60215976Sjmallett int rcnt; 61215976Sjmallett struct firewire_comm *fc; 62215976Sjmallett u_int32_t status; 63215976Sjmallett#define FWDEVINIT 1 64215976Sjmallett#define FWDEVATTACHED 2 65215976Sjmallett#define FWDEVINVAL 3 66215976Sjmallett TAILQ_ENTRY(fw_device) link; 67215976Sjmallett#if 0 68215976Sjmallett LIST_HEAD(, fw_xfer) txqueue; 69215976Sjmallett LIST_HEAD(, fw_xfer) rxqueue; 70215976Sjmallett#endif 71215976Sjmallett}; 72215976Sjmallettstruct firewire_softc { 73215976Sjmallett#if __FreeBSD_version >= 500000 74215976Sjmallett dev_t dev; 75215976Sjmallett#else 76215976Sjmallett dev_t dev[FWMAXNDMA+1]; 77215976Sjmallett#endif 78215976Sjmallett struct firewire_comm *fc; 79215976Sjmallett}; 80215976Sjmallett#define FW_MAX_DMACH 0x20 81215976Sjmallett#define FW_MAX_DEVCH FW_MAX_DMACH 82215976Sjmallett#define FW_XFERTIMEOUT 1 83215976Sjmallettstruct firewire_dev_comm { 84215976Sjmallett device_t dev; 85215976Sjmallett struct firewire_comm *fc; 86215976Sjmallett void (*post_explore) __P((void *)); 87215976Sjmallett}; 88215976Sjmallett 89215976Sjmallettstruct tcode_info { 90215976Sjmallett u_char hdr_len; /* IEEE1394 header length */ 91215976Sjmallett u_char flag; 92215976Sjmallett#define FWTI_REQ (1 << 0) 93215976Sjmallett#define FWTI_RES (1 << 1) 94215976Sjmallett#define FWTI_TLABEL (1 << 2) 95215976Sjmallett#define FWTI_BLOCK_STR (1 << 3) 96215976Sjmallett#define FWTI_BLOCK_ASY (1 << 4) 97215976Sjmallett}; 98215976Sjmallett 99215976Sjmallettstruct firewire_comm{ 100215976Sjmallett device_t dev; 101215976Sjmallett device_t bdev; 102215976Sjmallett u_int16_t busid:10, 103215976Sjmallett nodeid:6; 104215976Sjmallett u_int mode; 105215976Sjmallett u_int nport; 106215976Sjmallett u_int speed; 107215976Sjmallett u_int maxrec; 108215976Sjmallett u_int irm; 109215976Sjmallett u_int max_node; 110215976Sjmallett u_int max_hop; 111215976Sjmallett u_int max_asyretry; 112215976Sjmallett#define FWPHYASYST (1 << 0) 113215976Sjmallett u_int retry_count; 114215976Sjmallett u_int32_t ongobus:10, 115215976Sjmallett ongonode:6, 116215976Sjmallett ongoaddr:16; 117215976Sjmallett struct fw_device *ongodev; 118215976Sjmallett struct fw_eui64 ongoeui; 119215976Sjmallett#define FWMAXCSRDIR 16 120215976Sjmallett SLIST_HEAD(, csrdir) ongocsr; 121215976Sjmallett SLIST_HEAD(, csrdir) csrfree; 122215976Sjmallett struct csrdir{ 123215976Sjmallett u_int32_t ongoaddr; 124215976Sjmallett u_int32_t off; 125215976Sjmallett SLIST_ENTRY(csrdir) link; 126215976Sjmallett }; 127215976Sjmallett u_int32_t status; 128215976Sjmallett#define FWBUSRESET 0 129215976Sjmallett#define FWBUSINIT 1 130215976Sjmallett#define FWBUSCYMELECT 2 131215976Sjmallett#define FWBUSMGRELECT 3 132215976Sjmallett#define FWBUSMGRDONE 4 133215976Sjmallett#define FWBUSEXPLORE 5 134215976Sjmallett#define FWBUSPHYCONF 6 135215976Sjmallett#define FWBUSEXPDONE 7 136215976Sjmallett#define FWBUSCOMPLETION 10 137215976Sjmallett int nisodma; 138215976Sjmallett u_int8_t eui[8]; 139215976Sjmallett STAILQ_HEAD(fw_queue, fw_xfer); 140215976Sjmallett struct fw_xferq { 141215976Sjmallett int flag; 142215976Sjmallett#define FWXFERQ_CHTAGMASK 0xff 143215976Sjmallett#define FWXFERQ_RUNNING (1 << 8) 144215976Sjmallett#define FWXFERQ_STREAM (1 << 9) 145215976Sjmallett 146215976Sjmallett#define FWXFERQ_PACKET (1 << 10) 147215976Sjmallett#define FWXFERQ_BULK (1 << 11) 148215976Sjmallett#define FWXFERQ_DV (1 << 12) 149215976Sjmallett#define FWXFERQ_MODEMASK (7 << 10) 150215976Sjmallett 151215976Sjmallett#define FWXFERQ_EXTBUF (1 << 13) 152215976Sjmallett#define FWXFERQ_OPEN (1 << 14) 153215976Sjmallett 154215976Sjmallett#define FWXFERQ_HANDLER (1 << 16) 155215976Sjmallett#define FWXFERQ_WAKEUP (1 << 17) 156215976Sjmallett 157215976Sjmallett void (*start) __P((struct firewire_comm*)); 158215976Sjmallett void (*drain) __P((struct firewire_comm*, struct fw_xfer*)); 159215976Sjmallett struct fw_queue q; 160215976Sjmallett u_int queued; 161215976Sjmallett u_int maxq; 162215976Sjmallett u_int psize; 163215976Sjmallett u_int packets; 164215976Sjmallett u_int error; 165215976Sjmallett STAILQ_HEAD(, fw_bind) binds; 166215976Sjmallett caddr_t buf; 167215976Sjmallett u_int bnchunk; 168215976Sjmallett u_int bnpacket; 169215976Sjmallett u_int btpacket; 170215976Sjmallett struct fw_bulkxfer *bulkxfer; 171215976Sjmallett STAILQ_HEAD(, fw_bulkxfer) stvalid; 172215976Sjmallett STAILQ_HEAD(, fw_bulkxfer) stfree; 173215976Sjmallett struct fw_bulkxfer *stdma; 174215976Sjmallett struct fw_bulkxfer *stdma2; 175215976Sjmallett struct fw_bulkxfer *stproc; 176215976Sjmallett u_int procptr; 177215976Sjmallett int dvdbc, dvdiff, dvsync; 178215976Sjmallett struct fw_dvbuf *dvbuf; 179215976Sjmallett STAILQ_HEAD(, fw_dvbuf) dvvalid; 180215976Sjmallett STAILQ_HEAD(, fw_dvbuf) dvfree; 181215976Sjmallett struct fw_dvbuf *dvdma; 182215976Sjmallett struct fw_dvbuf *dvproc; 183215976Sjmallett u_int dvptr; 184215976Sjmallett u_int dvpacket; 185215976Sjmallett u_int need_wakeup; 186215976Sjmallett struct selinfo rsel; 187215976Sjmallett caddr_t sc; 188215976Sjmallett void (*hand) __P((struct fw_xferq *)); 189215976Sjmallett }; 190215976Sjmallett struct fw_xferq 191215976Sjmallett *arq, *atq, *ars, *ats, *it[FW_MAX_DMACH],*ir[FW_MAX_DMACH]; 192215976Sjmallett struct fw_bulkxfer{ 193215976Sjmallett u_int32_t flag; 194215976Sjmallett caddr_t buf; 195215976Sjmallett STAILQ_ENTRY(fw_bulkxfer) link; 196215976Sjmallett caddr_t start; 197215976Sjmallett caddr_t end; 198215976Sjmallett u_int npacket; 199215976Sjmallett }; 200215976Sjmallett struct fw_dvbuf{ 201215976Sjmallett caddr_t buf; 202215976Sjmallett STAILQ_ENTRY(fw_dvbuf) link; 203215976Sjmallett }; 204215976Sjmallett struct tlabel{ 205215976Sjmallett struct fw_xfer *xfer; 206215976Sjmallett STAILQ_ENTRY(tlabel) link; 207215976Sjmallett }; 208215976Sjmallett STAILQ_HEAD(, tlabel) tlabels[0x40]; 209215976Sjmallett struct fw_bind{ 210215976Sjmallett u_int32_t start_hi, start_lo, addrlen; 211215976Sjmallett struct fw_xfer* xfer; 212215976Sjmallett STAILQ_ENTRY(fw_bind) fclist; 213215976Sjmallett STAILQ_ENTRY(fw_bind) chlist; 214215976Sjmallett }; 215215976Sjmallett STAILQ_HEAD(, fw_bind) binds; 216215976Sjmallett TAILQ_HEAD(, fw_device) devices; 217215976Sjmallett STAILQ_HEAD(, fw_xfer) pending; 218215976Sjmallett volatile u_int32_t *sid_buf; 219215976Sjmallett u_int sid_cnt; 220215976Sjmallett#define CSRSIZE 0x4000 221215976Sjmallett u_int32_t csr_arc[CSRSIZE/4]; 222215976Sjmallett#define CROMSIZE 0x400 223215976Sjmallett u_int32_t *config_rom; 224215976Sjmallett struct fw_topology_map *topology_map; 225215976Sjmallett struct fw_speed_map *speed_map; 226215976Sjmallett struct callout_handle tlhandle; 227215976Sjmallett struct callout_handle bmrhandle; 228215976Sjmallett struct callout_handle timeouthandle; 229215976Sjmallett struct callout_handle retry_probe_handle; 230215976Sjmallett u_int32_t (*cyctimer) __P((struct firewire_comm *)); 231215976Sjmallett void (*ibr) __P((struct firewire_comm *)); 232215976Sjmallett u_int32_t (*set_bmr) __P((struct firewire_comm *, u_int32_t)); 233215976Sjmallett int (*ioctl) __P((dev_t, u_long, caddr_t, int, fw_proc *)); 234215976Sjmallett int (*irx_enable) __P((struct firewire_comm *, int)); 235215976Sjmallett int (*irx_disable) __P((struct firewire_comm *, int)); 236215976Sjmallett int (*itx_enable) __P((struct firewire_comm *, int)); 237215976Sjmallett int (*itx_disable) __P((struct firewire_comm *, int)); 238215976Sjmallett void (*timeout) __P((void *)); 239215976Sjmallett void (*poll) __P((struct firewire_comm *, int, int)); 240215976Sjmallett void (*set_intr) __P((struct firewire_comm *, int)); 241215976Sjmallett void (*irx_post) __P((struct firewire_comm *, u_int32_t *)); 242215976Sjmallett void (*itx_post) __P((struct firewire_comm *, u_int32_t *)); 243215976Sjmallett struct tcode_info *tcode; 244215976Sjmallett}; 245215976Sjmallett#define CSRARC(sc, offset) ((sc)->csr_arc[(offset)/4]) 246215976Sjmallett 247215976Sjmallett 248215976Sjmallettstruct fw_xfer{ 249215976Sjmallett caddr_t sc; 250215976Sjmallett struct firewire_comm *fc; 251215976Sjmallett struct fw_xferq *q; 252215976Sjmallett struct callout_handle ch; 253215976Sjmallett time_t time; 254215976Sjmallett struct fw_tlabel *tlabel; 255215976Sjmallett u_int8_t spd; 256215976Sjmallett u_int8_t tcode; 257215976Sjmallett int resp; 258215976Sjmallett#define FWXF_INIT 0 259215976Sjmallett#define FWXF_INQ 1 260215976Sjmallett#define FWXF_START 2 261215976Sjmallett#define FWXF_SENT 3 262215976Sjmallett#define FWXF_SENTERR 4 263215976Sjmallett#define FWXF_BUSY 8 264215976Sjmallett#define FWXF_RCVD 10 265215976Sjmallett int state; 266215976Sjmallett u_int8_t retry; 267215976Sjmallett u_int8_t tl; 268215976Sjmallett int sub; 269215976Sjmallett int32_t dst; 270215976Sjmallett u_int8_t act_type; 271215976Sjmallett#define FWACT_NULL 0 272215976Sjmallett#define FWACT_XFER 2 273215976Sjmallett#define FWACT_CH 3 274215976Sjmallett void (*retry_req) __P((struct fw_xfer *)); 275215976Sjmallett union{ 276215976Sjmallett void (*hand) __P((struct fw_xfer *)); 277215976Sjmallett 278215976Sjmallett } act; 279215976Sjmallett union{ 280215976Sjmallett struct { 281215976Sjmallett struct fw_device *device; 282215976Sjmallett } req; 283215976Sjmallett struct { 284215976Sjmallett struct stch *channel; 285215976Sjmallett } stream; 286215976Sjmallett } mode; 287215976Sjmallett struct { 288215976Sjmallett u_int16_t len, off; 289215976Sjmallett caddr_t buf; 290215976Sjmallett } send, recv; 291215976Sjmallett struct mbuf *mbuf; 292215976Sjmallett STAILQ_ENTRY(fw_xfer) link; 293215976Sjmallett}; 294215976Sjmallettvoid fw_sidrcv __P((struct firewire_comm *, caddr_t, u_int, u_int)); 295215976Sjmallettvoid fw_rcv __P((struct firewire_comm *, caddr_t, u_int, u_int, u_int, u_int)); 296215976Sjmallettvoid fw_xfer_free __P(( struct fw_xfer*)); 297215976Sjmallettstruct fw_xfer *fw_xfer_alloc __P((void)); 298215976Sjmallettvoid fw_init __P((struct firewire_comm *)); 299215976Sjmallettint fw_tbuf_update __P((struct firewire_comm *, int, int)); 300215976Sjmallettint fw_rbuf_update __P((struct firewire_comm *, int, int)); 301215976Sjmallettint fw_readreqq __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t *)); 302215976Sjmallettint fw_writereqb __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t, u_int32_t *)); 303215976Sjmallettint fw_readresb __P((struct firewire_comm *, u_int32_t, u_int32_t, u_int32_t, u_int32_t*)); 304215976Sjmallettint fw_writeres __P((struct firewire_comm *, u_int32_t, u_int32_t)); 305215976Sjmallettu_int32_t getcsrdata __P((struct fw_device *, u_int8_t)); 306215976Sjmallettvoid fw_asybusy __P((struct fw_xfer *)); 307215976Sjmallettint fw_bindadd __P((struct firewire_comm *, struct fw_bind *)); 308215976Sjmallettint fw_bindremove __P((struct firewire_comm *, struct fw_bind *)); 309215976Sjmallettint fw_asyreq __P((struct firewire_comm *, int, struct fw_xfer*)); 310215976Sjmallettvoid fw_busreset __P((struct firewire_comm *)); 311215976Sjmallettu_int16_t fw_crc16 __P((u_int32_t *, u_int32_t)); 312215976Sjmallettvoid fw_xfer_timeout __P((void *)); 313215976Sjmallettvoid fw_xfer_done __P((struct fw_xfer *)); 314215976Sjmallettvoid fw_asy_callback __P((struct fw_xfer *)); 315215976Sjmallettstruct fw_device *fw_noderesolve __P((struct firewire_comm *, struct fw_eui64)); 316215976Sjmallettstruct fw_bind *fw_bindlookup __P((struct firewire_comm *, u_int32_t, u_int32_t)); 317215976Sjmallett 318215976Sjmallett 319215976Sjmallettextern int firewire_debug; 320215976Sjmallettextern devclass_t firewire_devclass; 321215976Sjmallett 322215976Sjmallett#define DV_BROADCAST_ON (1<<30) 323215976Sjmallett#define IP_CHANNELS 0x0234 324215976Sjmallett 325215976Sjmallett#define STATE_CLEAR 0x0000 326215976Sjmallett#define STATE_SET 0x0004 327215976Sjmallett#define NODE_IDS 0x0008 328215976Sjmallett#define RESET_START 0x000c 329215976Sjmallett#define SPLIT_TIMEOUT_HI 0x0018 330215976Sjmallett#define SPLIT_TIMEOUT_LO 0x001c 331215976Sjmallett#define CYCLE_TIME 0x0200 332215976Sjmallett#define BUS_TIME 0x0210 333215976Sjmallett#define BUS_MGR_ID 0x021c 334215976Sjmallett#define BANDWIDTH_AV 0x0220 335215976Sjmallett#define CHANNELS_AV_HI 0x0224 336215976Sjmallett#define CHANNELS_AV_LO 0x0228 337215976Sjmallett 338215976Sjmallett#define CONF_ROM 0x0400 339215976Sjmallett 340215976Sjmallett#define TOPO_MAP 0x1000 341215976Sjmallett#define SPED_MAP 0x2000 342215976Sjmallett 343215976Sjmallett#define oMPR 0x900 344215976Sjmallett#define oPCR 0x904 345215976Sjmallett 346215976Sjmallett#define iMPR 0x980 347215976Sjmallett#define iPCR 0x984 348215976Sjmallett 349215976Sjmallett#define FWPRI ((PZERO+8)|PCATCH) 350215976Sjmallett 351215976Sjmallett#ifdef __alpha__ 352215976Sjmallett#undef vtophys 353215976Sjmallett#define vtophys(va) alpha_XXX_dmamap((vm_offset_t)(va)) 354215976Sjmallett#endif /* __alpha__ */ 355215976Sjmallett