1*4a5d661aSToomas Soome /* 2*4a5d661aSToomas Soome * Copyright (c) 2007 Hidetoshi Shimokawa 3*4a5d661aSToomas Soome * All rights reserved. 4*4a5d661aSToomas Soome * 5*4a5d661aSToomas Soome * Redistribution and use in source and binary forms, with or without 6*4a5d661aSToomas Soome * modification, are permitted provided that the following conditions 7*4a5d661aSToomas Soome * are met: 8*4a5d661aSToomas Soome * 1. Redistributions of source code must retain the above copyright 9*4a5d661aSToomas Soome * notice, this list of conditions and the following disclaimer. 10*4a5d661aSToomas Soome * 2. Redistributions in binary form must reproduce the above copyright 11*4a5d661aSToomas Soome * notice, this list of conditions and the following disclaimer in the 12*4a5d661aSToomas Soome * documentation and/or other materials provided with the distribution. 13*4a5d661aSToomas Soome * 3. All advertising materials mentioning features or use of this software 14*4a5d661aSToomas Soome * must display the acknowledgement as bellow: 15*4a5d661aSToomas Soome * 16*4a5d661aSToomas Soome * This product includes software developed by K. Kobayashi and H. Shimokawa 17*4a5d661aSToomas Soome * 18*4a5d661aSToomas Soome * 4. The name of the author may not be used to endorse or promote products 19*4a5d661aSToomas Soome * derived from this software without specific prior written permission. 20*4a5d661aSToomas Soome * 21*4a5d661aSToomas Soome * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22*4a5d661aSToomas Soome * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23*4a5d661aSToomas Soome * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24*4a5d661aSToomas Soome * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 25*4a5d661aSToomas Soome * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26*4a5d661aSToomas Soome * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27*4a5d661aSToomas Soome * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28*4a5d661aSToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29*4a5d661aSToomas Soome * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30*4a5d661aSToomas Soome * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31*4a5d661aSToomas Soome * POSSIBILITY OF SUCH DAMAGE. 32*4a5d661aSToomas Soome * 33*4a5d661aSToomas Soome * $FreeBSD$ 34*4a5d661aSToomas Soome * 35*4a5d661aSToomas Soome */ 36*4a5d661aSToomas Soome 37*4a5d661aSToomas Soome #define MAX_OHCI 5 38*4a5d661aSToomas Soome #define CROMSIZE 0x400 39*4a5d661aSToomas Soome 40*4a5d661aSToomas Soome struct fw_eui64 { 41*4a5d661aSToomas Soome uint32_t hi, lo; 42*4a5d661aSToomas Soome }; 43*4a5d661aSToomas Soome 44*4a5d661aSToomas Soome struct fwohci_softc { 45*4a5d661aSToomas Soome uint32_t locator; 46*4a5d661aSToomas Soome uint32_t devid; 47*4a5d661aSToomas Soome uint32_t base_addr; 48*4a5d661aSToomas Soome uint32_t bus_id; 49*4a5d661aSToomas Soome uint32_t handle; 50*4a5d661aSToomas Soome int32_t state; 51*4a5d661aSToomas Soome struct crom_src_buf *crom_src_buf; 52*4a5d661aSToomas Soome struct crom_src *crom_src; 53*4a5d661aSToomas Soome struct crom_chunk *crom_root; 54*4a5d661aSToomas Soome struct fw_eui64 eui; 55*4a5d661aSToomas Soome int speed; 56*4a5d661aSToomas Soome int maxrec; 57*4a5d661aSToomas Soome uint32_t *config_rom; 58*4a5d661aSToomas Soome char config_rom_buf[CROMSIZE*2]; /* double size for alignment */ 59*4a5d661aSToomas Soome }; 60*4a5d661aSToomas Soome 61*4a5d661aSToomas Soome int fwohci_init(struct fwohci_softc *, int); 62*4a5d661aSToomas Soome void fwohci_ibr(struct fwohci_softc *); 63*4a5d661aSToomas Soome void fwohci_poll(struct fwohci_softc *); 64*4a5d661aSToomas Soome 65*4a5d661aSToomas Soome #define FWOHCI_STATE_DEAD (-1) 66*4a5d661aSToomas Soome #define FWOHCI_STATE_INIT 0 67*4a5d661aSToomas Soome #define FWOHCI_STATE_ENABLED 1 68*4a5d661aSToomas Soome #define FWOHCI_STATE_BUSRESET 2 69*4a5d661aSToomas Soome #define FWOHCI_STATE_NORMAL 3 70*4a5d661aSToomas Soome 71*4a5d661aSToomas Soome #define OREAD(f, o) (*(volatile uint32_t *)((f)->handle + (o))) 72*4a5d661aSToomas Soome #define OWRITE(f, o, v) (*(volatile uint32_t *)((f)->handle + (o)) = (v)) 73*4a5d661aSToomas Soome 74*4a5d661aSToomas Soome #define OHCI_VERSION 0x00 75*4a5d661aSToomas Soome #define OHCI_ATRETRY 0x08 76*4a5d661aSToomas Soome #define OHCI_CROMHDR 0x18 77*4a5d661aSToomas Soome #define OHCI_BUS_ID 0x1c 78*4a5d661aSToomas Soome #define OHCI_BUS_OPT 0x20 79*4a5d661aSToomas Soome #define OHCI_BUSIRMC (1U << 31) 80*4a5d661aSToomas Soome #define OHCI_BUSCMC (1 << 30) 81*4a5d661aSToomas Soome #define OHCI_BUSISC (1 << 29) 82*4a5d661aSToomas Soome #define OHCI_BUSBMC (1 << 28) 83*4a5d661aSToomas Soome #define OHCI_BUSPMC (1 << 27) 84*4a5d661aSToomas Soome #define OHCI_BUSFNC OHCI_BUSIRMC | OHCI_BUSCMC | OHCI_BUSISC |\ 85*4a5d661aSToomas Soome OHCI_BUSBMC | OHCI_BUSPMC 86*4a5d661aSToomas Soome 87*4a5d661aSToomas Soome #define OHCI_EUID_HI 0x24 88*4a5d661aSToomas Soome #define OHCI_EUID_LO 0x28 89*4a5d661aSToomas Soome 90*4a5d661aSToomas Soome #define OHCI_CROMPTR 0x34 91*4a5d661aSToomas Soome #define OHCI_HCCCTL 0x50 92*4a5d661aSToomas Soome #define OHCI_HCCCTLCLR 0x54 93*4a5d661aSToomas Soome #define OHCI_AREQHI 0x100 94*4a5d661aSToomas Soome #define OHCI_AREQHICLR 0x104 95*4a5d661aSToomas Soome #define OHCI_AREQLO 0x108 96*4a5d661aSToomas Soome #define OHCI_AREQLOCLR 0x10c 97*4a5d661aSToomas Soome #define OHCI_PREQHI 0x110 98*4a5d661aSToomas Soome #define OHCI_PREQHICLR 0x114 99*4a5d661aSToomas Soome #define OHCI_PREQLO 0x118 100*4a5d661aSToomas Soome #define OHCI_PREQLOCLR 0x11c 101*4a5d661aSToomas Soome #define OHCI_PREQUPPER 0x120 102*4a5d661aSToomas Soome 103*4a5d661aSToomas Soome #define OHCI_SID_BUF 0x64 104*4a5d661aSToomas Soome #define OHCI_SID_CNT 0x68 105*4a5d661aSToomas Soome #define OHCI_SID_ERR (1U << 31) 106*4a5d661aSToomas Soome #define OHCI_SID_CNT_MASK 0xffc 107*4a5d661aSToomas Soome 108*4a5d661aSToomas Soome #define OHCI_IT_STAT 0x90 109*4a5d661aSToomas Soome #define OHCI_IT_STATCLR 0x94 110*4a5d661aSToomas Soome #define OHCI_IT_MASK 0x98 111*4a5d661aSToomas Soome #define OHCI_IT_MASKCLR 0x9c 112*4a5d661aSToomas Soome 113*4a5d661aSToomas Soome #define OHCI_IR_STAT 0xa0 114*4a5d661aSToomas Soome #define OHCI_IR_STATCLR 0xa4 115*4a5d661aSToomas Soome #define OHCI_IR_MASK 0xa8 116*4a5d661aSToomas Soome #define OHCI_IR_MASKCLR 0xac 117*4a5d661aSToomas Soome 118*4a5d661aSToomas Soome #define OHCI_LNKCTL 0xe0 119*4a5d661aSToomas Soome #define OHCI_LNKCTLCLR 0xe4 120*4a5d661aSToomas Soome 121*4a5d661aSToomas Soome #define OHCI_PHYACCESS 0xec 122*4a5d661aSToomas Soome #define OHCI_CYCLETIMER 0xf0 123*4a5d661aSToomas Soome 124*4a5d661aSToomas Soome #define OHCI_DMACTL(off) (off) 125*4a5d661aSToomas Soome #define OHCI_DMACTLCLR(off) (off + 4) 126*4a5d661aSToomas Soome #define OHCI_DMACMD(off) (off + 0xc) 127*4a5d661aSToomas Soome #define OHCI_DMAMATCH(off) (off + 0x10) 128*4a5d661aSToomas Soome 129*4a5d661aSToomas Soome #define OHCI_ATQOFF 0x180 130*4a5d661aSToomas Soome #define OHCI_ATQCTL OHCI_ATQOFF 131*4a5d661aSToomas Soome #define OHCI_ATQCTLCLR (OHCI_ATQOFF + 4) 132*4a5d661aSToomas Soome #define OHCI_ATQCMD (OHCI_ATQOFF + 0xc) 133*4a5d661aSToomas Soome #define OHCI_ATQMATCH (OHCI_ATQOFF + 0x10) 134*4a5d661aSToomas Soome 135*4a5d661aSToomas Soome #define OHCI_ATSOFF 0x1a0 136*4a5d661aSToomas Soome #define OHCI_ATSCTL OHCI_ATSOFF 137*4a5d661aSToomas Soome #define OHCI_ATSCTLCLR (OHCI_ATSOFF + 4) 138*4a5d661aSToomas Soome #define OHCI_ATSCMD (OHCI_ATSOFF + 0xc) 139*4a5d661aSToomas Soome #define OHCI_ATSMATCH (OHCI_ATSOFF + 0x10) 140*4a5d661aSToomas Soome 141*4a5d661aSToomas Soome #define OHCI_ARQOFF 0x1c0 142*4a5d661aSToomas Soome #define OHCI_ARQCTL OHCI_ARQOFF 143*4a5d661aSToomas Soome #define OHCI_ARQCTLCLR (OHCI_ARQOFF + 4) 144*4a5d661aSToomas Soome #define OHCI_ARQCMD (OHCI_ARQOFF + 0xc) 145*4a5d661aSToomas Soome #define OHCI_ARQMATCH (OHCI_ARQOFF + 0x10) 146*4a5d661aSToomas Soome 147*4a5d661aSToomas Soome #define OHCI_ARSOFF 0x1e0 148*4a5d661aSToomas Soome #define OHCI_ARSCTL OHCI_ARSOFF 149*4a5d661aSToomas Soome #define OHCI_ARSCTLCLR (OHCI_ARSOFF + 4) 150*4a5d661aSToomas Soome #define OHCI_ARSCMD (OHCI_ARSOFF + 0xc) 151*4a5d661aSToomas Soome #define OHCI_ARSMATCH (OHCI_ARSOFF + 0x10) 152*4a5d661aSToomas Soome 153*4a5d661aSToomas Soome #define OHCI_ITOFF(CH) (0x200 + 0x10 * (CH)) 154*4a5d661aSToomas Soome #define OHCI_ITCTL(CH) (OHCI_ITOFF(CH)) 155*4a5d661aSToomas Soome #define OHCI_ITCTLCLR(CH) (OHCI_ITOFF(CH) + 4) 156*4a5d661aSToomas Soome #define OHCI_ITCMD(CH) (OHCI_ITOFF(CH) + 0xc) 157*4a5d661aSToomas Soome 158*4a5d661aSToomas Soome #define OHCI_IROFF(CH) (0x400 + 0x20 * (CH)) 159*4a5d661aSToomas Soome #define OHCI_IRCTL(CH) (OHCI_IROFF(CH)) 160*4a5d661aSToomas Soome #define OHCI_IRCTLCLR(CH) (OHCI_IROFF(CH) + 4) 161*4a5d661aSToomas Soome #define OHCI_IRCMD(CH) (OHCI_IROFF(CH) + 0xc) 162*4a5d661aSToomas Soome #define OHCI_IRMATCH(CH) (OHCI_IROFF(CH) + 0x10) 163