[BACK]Return to tcic2var.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/tcic2var.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: tcic2var.h,v 1.4 2005/11/23 11:39:37 mickey Exp $     */
                      2: /*     $NetBSD: tcic2var.h,v 1.1 1999/03/23 20:04:14 bad Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1998, 1999 Christoph Badura.  All rights reserved.
                      6:  * Copyright (c) 1997 Marc Horowitz.  All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. All advertising materials mentioning features or use of this software
                     17:  *    must display the following acknowledgement:
                     18:  *     This product includes software developed by Marc Horowitz.
                     19:  * 4. The name of the author may not be used to endorse or promote products
                     20:  *    derived from this software without specific prior written permission.
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     32:  */
                     33:
                     34: #ifndef _TCIC2VAR_H
                     35: #define _TCIC2VAR_H
                     36:
                     37: #include <sys/device.h>
                     38:
                     39: #include <dev/pcmcia/pcmciareg.h>
                     40: #include <dev/pcmcia/pcmciachip.h>
                     41:
                     42: #include <dev/ic/tcic2reg.h>
                     43:
                     44: struct proc;
                     45:
                     46: struct tcic_event {
                     47:        SIMPLEQ_ENTRY(tcic_event) pe_q;
                     48:        int pe_type;
                     49: };
                     50:
                     51: /* pe_type */
                     52: #define        TCIC_EVENT_INSERTION    0
                     53: #define        TCIC_EVENT_REMOVAL      1
                     54:
                     55:
                     56: struct tcic_handle {
                     57:        struct tcic_softc *sc;
                     58:        int     sock;                           /* socket number */
                     59:        int     flags;
                     60:        int     sstat;                          /* last value of R_SSTAT */
                     61:        int     memalloc;
                     62:        int     memwins;
                     63:        struct {
                     64:                bus_addr_t      addr;
                     65:                bus_size_t      size;
                     66:                int             size2;          /* size as 2^n scaled by 4K */
                     67:                long            offset;
                     68:                int             speed;          /* in ns */
                     69:                int             kind;
                     70:        } mem[TCIC_MAX_MEM_WINS];
                     71:        int     ioalloc;
                     72:        struct {
                     73:                bus_addr_t      addr;
                     74:                bus_size_t      size;
                     75:                int             width;
                     76:                int             speed;          /* in ns */
                     77:        } io[TCIC_IO_WINS];
                     78:        int     ih_irq;
                     79:        struct device *pcmcia;
                     80:
                     81:        int shutdown;
                     82:        struct proc *event_thread;
                     83:        SIMPLEQ_HEAD(, tcic_event) events;
                     84: };
                     85:
                     86: #define        TCIC_FLAG_SOCKETP       0x0001
                     87: #define        TCIC_FLAG_CARDP         0x0002
                     88:
                     89: /*
                     90:  * This is sort of arbitrary.  It merely needs to be "enough". It can be
                     91:  * overridden in the conf file, anyway.
                     92:  */
                     93:
                     94: #define        TCIC_MEM_PAGES  4
                     95: #define        TCIC_MEMSIZE    TCIC_MEM_PAGES*TCIC_MEM_PAGESIZE
                     96:
                     97: #define        TCIC_NSLOTS     2
                     98:
                     99: struct tcic_softc {
                    100:        struct device dev;
                    101:
                    102:        bus_space_tag_t memt;
                    103:        bus_space_handle_t memh;
                    104:        bus_space_tag_t iot;
                    105:        bus_space_handle_t ioh;
                    106:
                    107:        int     chipid;
                    108:        int     validirqs;
                    109:        int     pwrena;         /* holds TCIC_PWR_ENA on'084 and successors */
                    110:
                    111:        /* XXX isa_chipset_tag_t, pci_chipset_tag_t, etc. */
                    112:        void    *intr_est;
                    113:
                    114:        pcmcia_chipset_tag_t pct;
                    115:
                    116:        /* this needs to be large enough to hold TCIC_MEM_PAGES bits */
                    117:        int     subregionmask;
                    118:
                    119:        /* used by memory window mapping functions */
                    120:        bus_addr_t membase;
                    121:        int     memsize2;               /* int(log2(memsize)) */
                    122:
                    123:        /*
                    124:         * used by io window mapping functions.  These can actually overlap
                    125:         * with another tcic, since the underlying extent mapper will deal
                    126:         * with individual allocations.  This is here to deal with the fact
                    127:         * that different busses have different real widths (different pc
                    128:         * hardware seems to use 10 or 12 bits for the I/O bus).
                    129:         */
                    130:        bus_addr_t iobase;
                    131:        bus_size_t iosize;
                    132:
                    133:        int     irq;
                    134:        void    *ih;
                    135:
                    136:        struct tcic_handle handle[TCIC_NSLOTS];
                    137: };
                    138:
                    139: int    tcic_log2(u_int);
                    140: int    tcic_ns2wscnt(int);
                    141:
                    142: int    tcic_check_reserved_bits(bus_space_tag_t, bus_space_handle_t);
                    143: int    tcic_chipid(bus_space_tag_t, bus_space_handle_t);
                    144: int    tcic_chipid_known(int);
                    145: char   *tcic_chipid_to_string(int);
                    146: int    tcic_validirqs(int);
                    147:
                    148: void   tcic_attach(struct tcic_softc *);
                    149: void   tcic_attach_sockets(struct tcic_softc *);
                    150: int    tcic_intr(void *arg);
                    151:
                    152: static __inline__ int tcic_read_1(struct tcic_handle *, int);
                    153: static __inline__ int tcic_read_2(struct tcic_handle *, int);
                    154: static __inline__ int tcic_read_4(struct tcic_handle *, int);
                    155: static __inline__ void tcic_write_1(struct tcic_handle *, int, int);
                    156: static __inline__ void tcic_write_2(struct tcic_handle *, int, int);
                    157: static __inline__ void tcic_write_4(struct tcic_handle *, int, int);
                    158: static __inline__ int tcic_read_ind_2(struct tcic_handle *, int);
                    159: static __inline__ void tcic_write_ind_2(struct tcic_handle *, int, int);
                    160: static __inline__ void tcic_sel_sock(struct tcic_handle *);
                    161: static __inline__ void tcic_wait_ready(struct tcic_handle *);
                    162: static __inline__ int tcic_read_aux_1(bus_space_tag_t, bus_space_handle_t, int, int);
                    163: static __inline__ int tcic_read_aux_2(bus_space_tag_t, bus_space_handle_t, int);
                    164: static __inline__ void tcic_write_aux_1(bus_space_tag_t, bus_space_handle_t, int, int, int);
                    165: static __inline__ void tcic_write_aux_2(bus_space_tag_t, bus_space_handle_t, int, int);
                    166:
                    167: int    tcic_chip_mem_alloc(pcmcia_chipset_handle_t, bus_size_t,
                    168:            struct pcmcia_mem_handle *);
                    169: void   tcic_chip_mem_free(pcmcia_chipset_handle_t,
                    170:            struct pcmcia_mem_handle *);
                    171: int    tcic_chip_mem_map(pcmcia_chipset_handle_t, int, bus_addr_t,
                    172:            bus_size_t, struct pcmcia_mem_handle *, bus_size_t *, int *);
                    173: void   tcic_chip_mem_unmap(pcmcia_chipset_handle_t, int);
                    174:
                    175: int    tcic_chip_io_alloc(pcmcia_chipset_handle_t, bus_addr_t,
                    176:            bus_size_t, bus_size_t, struct pcmcia_io_handle *);
                    177: void   tcic_chip_io_free(pcmcia_chipset_handle_t,
                    178:            struct pcmcia_io_handle *);
                    179: int    tcic_chip_io_map(pcmcia_chipset_handle_t, int, bus_addr_t,
                    180:            bus_size_t, struct pcmcia_io_handle *, int *);
                    181: void   tcic_chip_io_unmap(pcmcia_chipset_handle_t, int);
                    182:
                    183: void   tcic_chip_socket_enable(pcmcia_chipset_handle_t);
                    184: void   tcic_chip_socket_disable(pcmcia_chipset_handle_t);
                    185:
                    186: static __inline__ int tcic_read_1(struct tcic_handle *, int);
                    187: static __inline__ int
                    188: tcic_read_1(h, reg)
                    189:        struct tcic_handle *h;
                    190:        int reg;
                    191: {
                    192:        return (bus_space_read_1(h->sc->iot, h->sc->ioh, reg));
                    193: }
                    194:
                    195: static __inline__ int tcic_read_2(struct tcic_handle *, int);
                    196: static __inline__ int
                    197: tcic_read_2(h, reg)
                    198:        struct tcic_handle *h;
                    199:        int reg;
                    200: {
                    201:        return (bus_space_read_2(h->sc->iot, h->sc->ioh, reg));
                    202: }
                    203:
                    204: static __inline__ int tcic_read_4(struct tcic_handle *, int);
                    205: static __inline__ int
                    206: tcic_read_4(h, reg)
                    207:        struct tcic_handle *h;
                    208:        int reg;
                    209: {
                    210:        int val;
                    211:        val = bus_space_read_2(h->sc->iot, h->sc->ioh, reg);
                    212:        val |= bus_space_read_2(h->sc->iot, h->sc->ioh, reg+2) << 16;
                    213:        return val;
                    214: }
                    215:
                    216: static __inline__ void tcic_write_1(struct tcic_handle *, int, int);
                    217: static __inline__ void
                    218: tcic_write_1(h, reg, data)
                    219:        struct tcic_handle *h;
                    220:        int reg;
                    221:        int data;
                    222: {
                    223:        bus_space_write_1(h->sc->iot, h->sc->ioh, reg, (data));
                    224: }
                    225:
                    226: static __inline__ void tcic_write_2(struct tcic_handle *, int, int);
                    227: static __inline__ void
                    228: tcic_write_2(h, reg, data)
                    229:        struct tcic_handle *h;
                    230:        int reg;
                    231:        int data;
                    232: {
                    233:        bus_space_write_2(h->sc->iot, h->sc->ioh, reg, (data));
                    234: }
                    235:
                    236: static __inline__ void tcic_write_4(struct tcic_handle *, int, int);
                    237: static __inline__ void
                    238: tcic_write_4(h, reg, data)
                    239:        struct tcic_handle *h;
                    240:        int reg;
                    241:        int data;
                    242: {
                    243:        bus_space_write_2(h->sc->iot, h->sc->ioh, reg, (data));
                    244:        bus_space_write_2(h->sc->iot, h->sc->ioh, reg+2, (data)>>16);
                    245: }
                    246:
                    247: static __inline__ int tcic_read_ind_2(struct tcic_handle *, int);
                    248: static __inline__ int
                    249: tcic_read_ind_2(h, reg)
                    250:        struct tcic_handle *h;
                    251:        int reg;
                    252: {
                    253:        int r_addr, val;
                    254:        r_addr = tcic_read_4(h, TCIC_R_ADDR);
                    255:        tcic_write_4(h, TCIC_R_ADDR, reg|TCIC_ADDR_INDREG);
                    256:        val = bus_space_read_2(h->sc->iot, h->sc->ioh, TCIC_R_DATA);
                    257:        tcic_write_4(h, TCIC_R_ADDR, r_addr);
                    258:        return val;
                    259: }
                    260:
                    261: static __inline__ void tcic_write_ind_2(struct tcic_handle *, int, int);
                    262: static __inline__ void
                    263: tcic_write_ind_2(h, reg, data)
                    264:        struct tcic_handle *h;
                    265:        int reg;
                    266:        int data;
                    267: {
                    268:        int r_addr;
                    269:        r_addr = tcic_read_4(h, TCIC_R_ADDR);
                    270:        tcic_write_4(h, TCIC_R_ADDR, reg|TCIC_ADDR_INDREG);
                    271:        bus_space_write_2(h->sc->iot, h->sc->ioh, TCIC_R_DATA, (data));
                    272:        tcic_write_4(h, TCIC_R_ADDR, r_addr);
                    273: }
                    274:
                    275: static __inline__ void tcic_sel_sock(struct tcic_handle *);
                    276: static __inline__ void
                    277: tcic_sel_sock(h)
                    278:        struct tcic_handle *h;
                    279: {
                    280:        int r_addr;
                    281:        r_addr = tcic_read_2(h, TCIC_R_ADDR2);
                    282:        tcic_write_2(h, TCIC_R_ADDR2,
                    283:            (h->sock<<TCIC_ADDR2_SS_SHFT)|(r_addr & ~TCIC_ADDR2_SS_MASK));
                    284: }
                    285:
                    286: static __inline__ void tcic_wait_ready(struct tcic_handle *);
                    287: static __inline__ void
                    288: tcic_wait_ready(h)
                    289:        struct tcic_handle *h;
                    290: {
                    291:        int i;
                    292:
                    293:        /* XXX appropriate socket must have been selected already. */
                    294:        for (i = 0; i < 10000; i++) {
                    295:                if (tcic_read_1(h, TCIC_R_SSTAT) & TCIC_SSTAT_RDY)
                    296:                        return;
                    297:                delay(500);
                    298:        }
                    299:
                    300: #ifdef DIAGNOSTIC
                    301:        printf("tcic_wait_ready ready never happened\n");
                    302: #endif
                    303: }
                    304:
                    305: static __inline__ int tcic_read_aux_1(bus_space_tag_t, bus_space_handle_t, int, int);
                    306: static __inline__ int
                    307: tcic_read_aux_1(iot, ioh, auxreg, reg)
                    308:        bus_space_tag_t iot;
                    309:        bus_space_handle_t ioh;
                    310:        int auxreg, reg;
                    311: {
                    312:        int mode, val;
                    313:        mode = bus_space_read_1(iot, ioh, TCIC_R_MODE);
                    314:        bus_space_write_1(iot, ioh, TCIC_R_MODE, (mode & ~TCIC_AR_MASK)|auxreg);
                    315:        val = bus_space_read_1(iot, ioh, reg);
                    316:        return val;
                    317: }
                    318:
                    319: static __inline__ int tcic_read_aux_2(bus_space_tag_t, bus_space_handle_t, int);
                    320: static __inline__ int
                    321: tcic_read_aux_2(iot, ioh, auxreg)
                    322:        bus_space_tag_t iot;
                    323:        bus_space_handle_t ioh;
                    324:        int auxreg;
                    325: {
                    326:        int mode, val;
                    327:        mode = bus_space_read_1(iot, ioh, TCIC_R_MODE);
                    328:        bus_space_write_1(iot, ioh, TCIC_R_MODE, (mode & ~TCIC_AR_MASK)|auxreg);
                    329:        val = bus_space_read_2(iot, ioh, TCIC_R_AUX);
                    330:        return val;
                    331: }
                    332:
                    333: static __inline__ void tcic_write_aux_1(bus_space_tag_t, bus_space_handle_t, int, int, int);
                    334: static __inline__ void
                    335: tcic_write_aux_1(iot, ioh, auxreg, reg, val)
                    336:        bus_space_tag_t iot;
                    337:        bus_space_handle_t ioh;
                    338:        int auxreg, reg, val;
                    339: {
                    340:        int mode;
                    341:        mode = bus_space_read_1(iot, ioh, TCIC_R_MODE);
                    342:        bus_space_write_1(iot, ioh, TCIC_R_MODE, (mode & ~TCIC_AR_MASK)|auxreg);
                    343:        bus_space_write_1(iot, ioh, reg, val);
                    344: }
                    345:
                    346: static __inline__ void tcic_write_aux_2(bus_space_tag_t, bus_space_handle_t, int, int);
                    347: static __inline__ void
                    348: tcic_write_aux_2(iot, ioh, auxreg, val)
                    349:        bus_space_tag_t iot;
                    350:        bus_space_handle_t ioh;
                    351:        int auxreg, val;
                    352: {
                    353:        int mode;
                    354:        mode = bus_space_read_1(iot, ioh, TCIC_R_MODE);
                    355:        bus_space_write_1(iot, ioh, TCIC_R_MODE, (mode & ~TCIC_AR_MASK)|auxreg);
                    356:        bus_space_write_2(iot, ioh, TCIC_R_AUX, val);
                    357: }
                    358:
                    359: #endif /* _TCIC2VAR_H */

CVSweb