Annotation of sys/dev/pcmcia/pcmciavar.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: pcmciavar.h,v 1.20 2005/11/23 11:39:37 mickey Exp $ */
! 2: /* $NetBSD: pcmciavar.h,v 1.5 1998/07/19 17:28:17 christos Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1997 Marc Horowitz. All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions
! 9: * are met:
! 10: * 1. Redistributions of source code must retain the above copyright
! 11: * notice, this list of conditions and the following disclaimer.
! 12: * 2. Redistributions in binary form must reproduce the above copyright
! 13: * notice, this list of conditions and the following disclaimer in the
! 14: * documentation and/or other materials provided with the distribution.
! 15: * 3. All advertising materials mentioning features or use of this software
! 16: * must display the following acknowledgement:
! 17: * This product includes software developed by Marc Horowitz.
! 18: * 4. The name of the author may not be used to endorse or promote products
! 19: * derived from this software without specific prior written permission.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 22: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 23: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 24: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 25: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 26: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 27: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 28: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 29: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 30: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 31: */
! 32:
! 33: #include <sys/types.h>
! 34: #include <sys/queue.h>
! 35:
! 36: #include <machine/bus.h>
! 37:
! 38: #include <dev/pcmcia/pcmciachip.h>
! 39:
! 40: extern int pcmcia_verbose;
! 41:
! 42: /*
! 43: * Contains information about mapped/allocated i/o spaces.
! 44: */
! 45: struct pcmcia_io_handle {
! 46: bus_space_tag_t iot; /* bus space tag (from chipset) */
! 47: bus_space_handle_t ioh; /* mapped space handle */
! 48: bus_addr_t addr; /* resulting address in bus space */
! 49: bus_size_t size; /* size of i/o space */
! 50: int flags; /* misc. information */
! 51: };
! 52:
! 53: #define PCMCIA_IO_ALLOCATED 0x01 /* i/o space was allocated */
! 54:
! 55: /*
! 56: * Contains information about allocated memory space.
! 57: */
! 58: struct pcmcia_mem_handle {
! 59: bus_space_tag_t memt; /* bus space tag (from chipset) */
! 60: bus_space_handle_t memh; /* mapped space handle */
! 61: bus_addr_t addr; /* resulting address in bus space */
! 62: bus_size_t size; /* size of mem space */
! 63: pcmcia_mem_handle_t mhandle; /* opaque memory handle */
! 64: bus_size_t realsize; /* how much we really allocated */
! 65: };
! 66:
! 67: /* pcmcia itself */
! 68:
! 69: #define PCMCIA_CFE_MWAIT_REQUIRED 0x0001
! 70: #define PCMCIA_CFE_RDYBSY_ACTIVE 0x0002
! 71: #define PCMCIA_CFE_WP_ACTIVE 0x0004
! 72: #define PCMCIA_CFE_BVD_ACTIVE 0x0008
! 73: #define PCMCIA_CFE_IO8 0x0010
! 74: #define PCMCIA_CFE_IO16 0x0020
! 75: #define PCMCIA_CFE_IRQSHARE 0x0040
! 76: #define PCMCIA_CFE_IRQPULSE 0x0080
! 77: #define PCMCIA_CFE_IRQLEVEL 0x0100
! 78: #define PCMCIA_CFE_POWERDOWN 0x0200
! 79: #define PCMCIA_CFE_READONLY 0x0400
! 80: #define PCMCIA_CFE_AUDIO 0x0800
! 81:
! 82: struct pcmcia_config_entry {
! 83: int number;
! 84: u_int32_t flags;
! 85: int iftype;
! 86: int num_iospace;
! 87:
! 88: /*
! 89: * The card will only decode this mask in any case, so we can
! 90: * do dynamic allocation with this in mind, in case the suggestions
! 91: * below are no good.
! 92: */
! 93: u_long iomask;
! 94: struct {
! 95: u_long length;
! 96: u_long start;
! 97: } iospace[4]; /* XXX this could be as high as 16 */
! 98: u_int16_t irqmask;
! 99: int num_memspace;
! 100: struct {
! 101: u_long length;
! 102: u_long cardaddr;
! 103: u_long hostaddr;
! 104: } memspace[2]; /* XXX this could be as high as 8 */
! 105: int maxtwins;
! 106: SIMPLEQ_ENTRY(pcmcia_config_entry) cfe_list;
! 107: };
! 108:
! 109: struct pcmcia_function {
! 110: /* read off the card */
! 111: int number;
! 112: int function;
! 113: int last_config_index;
! 114: u_long ccr_base;
! 115: u_long ccr_mask;
! 116: SIMPLEQ_HEAD(, pcmcia_config_entry) cfe_head;
! 117: SIMPLEQ_ENTRY(pcmcia_function) pf_list;
! 118: /* run-time state */
! 119: struct pcmcia_softc *sc;
! 120: struct device *child;
! 121: struct pcmcia_config_entry *cfe;
! 122: struct pcmcia_mem_handle pf_pcmh;
! 123: #define pf_ccrt pf_pcmh.memt
! 124: #define pf_ccrh pf_pcmh.memh
! 125: #define pf_ccr_mhandle pf_pcmh.mhandle
! 126: #define pf_ccr_realsize pf_pcmh.realsize
! 127: bus_size_t pf_ccr_offset;
! 128: int pf_ccr_window;
! 129: bus_addr_t pf_mfc_iobase;
! 130: bus_addr_t pf_mfc_iomax;
! 131: int (*ih_fct)(void *);
! 132: void *ih_arg;
! 133: int ih_ipl;
! 134: int pf_flags;
! 135: };
! 136:
! 137: /* pf_flags */
! 138: #define PFF_ENABLED 0x0001 /* function is enabled */
! 139: #define PFF_FAKE 0x0002 /* function is made up (no CIS) */
! 140:
! 141: struct pcmcia_card {
! 142: int cis1_major;
! 143: int cis1_minor;
! 144: /* XXX waste of space? */
! 145: char cis1_info_buf[256];
! 146: char *cis1_info[4];
! 147: u_int16_t manufacturer;
! 148: #define PCMCIA_VENDOR_INVALID 0xffff
! 149: u_int16_t product;
! 150: #define PCMCIA_PRODUCT_INVALID 0xffff
! 151: u_int16_t error;
! 152: #define PCMCIA_CIS_INVALID { NULL, NULL, NULL, NULL }
! 153: SIMPLEQ_HEAD(, pcmcia_function) pf_head;
! 154: };
! 155:
! 156: struct pcmcia_softc {
! 157: struct device dev;
! 158:
! 159: /* this stuff is for the socket */
! 160: pcmcia_chipset_tag_t pct;
! 161: pcmcia_chipset_handle_t pch;
! 162:
! 163: /* this stuff is for the card */
! 164: struct pcmcia_card card;
! 165: void *ih;
! 166: int sc_enabled_count; /* how many functions are
! 167: enabled */
! 168:
! 169: /*
! 170: * These are passed down from the PCMCIA chip, and exist only
! 171: * so that cards with Very Special address allocation needs
! 172: * know what range they should be dealing with.
! 173: */
! 174: bus_addr_t iobase; /* start i/o space allocation here */
! 175: bus_size_t iosize; /* size of the i/o space range */
! 176: };
! 177:
! 178: struct pcmcia_cis_quirk {
! 179: u_int16_t manufacturer;
! 180: u_int16_t product;
! 181: char *cis1_info[4];
! 182: struct pcmcia_function *pf;
! 183: struct pcmcia_config_entry *cfe;
! 184: };
! 185:
! 186: struct pcmcia_attach_args {
! 187: u_int16_t manufacturer;
! 188: u_int16_t product;
! 189: struct pcmcia_card *card;
! 190: struct pcmcia_function *pf;
! 191: };
! 192:
! 193: struct pcmcia_tuple {
! 194: unsigned int code;
! 195: unsigned int length;
! 196: u_long mult;
! 197: bus_size_t ptr;
! 198: bus_space_tag_t memt;
! 199: bus_space_handle_t memh;
! 200: };
! 201:
! 202: void pcmcia_read_cis(struct pcmcia_softc *);
! 203: void pcmcia_check_cis_quirks(struct pcmcia_softc *);
! 204: void pcmcia_print_cis(struct pcmcia_softc *);
! 205: int pcmcia_scan_cis(struct device * dev,
! 206: int (*) (struct pcmcia_tuple *, void *), void *);
! 207:
! 208: #define pcmcia_cis_read_1(tuple, idx0) \
! 209: (bus_space_read_1((tuple)->memt, (tuple)->memh, (tuple)->mult*(idx0)))
! 210:
! 211: #define pcmcia_tuple_read_1(tuple, idx1) \
! 212: (pcmcia_cis_read_1((tuple), ((tuple)->ptr+(2+(idx1)))))
! 213:
! 214: #define pcmcia_tuple_read_2(tuple, idx2) \
! 215: (pcmcia_tuple_read_1((tuple), (idx2)) | \
! 216: (pcmcia_tuple_read_1((tuple), (idx2)+1)<<8))
! 217:
! 218: #define pcmcia_tuple_read_3(tuple, idx3) \
! 219: (pcmcia_tuple_read_1((tuple), (idx3)) | \
! 220: (pcmcia_tuple_read_1((tuple), (idx3)+1)<<8) | \
! 221: (pcmcia_tuple_read_1((tuple), (idx3)+2)<<16))
! 222:
! 223: #define pcmcia_tuple_read_4(tuple, idx4) \
! 224: (pcmcia_tuple_read_1((tuple), (idx4)) | \
! 225: (pcmcia_tuple_read_1((tuple), (idx4)+1)<<8) | \
! 226: (pcmcia_tuple_read_1((tuple), (idx4)+2)<<16) | \
! 227: (pcmcia_tuple_read_1((tuple), (idx4)+3)<<24))
! 228:
! 229: #define pcmcia_tuple_read_n(tuple, n, idxn) \
! 230: (((n)==1)?pcmcia_tuple_read_1((tuple), (idxn)) : \
! 231: (((n)==2)?pcmcia_tuple_read_2((tuple), (idxn)) : \
! 232: (((n)==3)?pcmcia_tuple_read_3((tuple), (idxn)) : \
! 233: /* n == 4 */ pcmcia_tuple_read_4((tuple), (idxn)))))
! 234:
! 235: #define PCMCIA_SPACE_MEMORY 1
! 236: #define PCMCIA_SPACE_IO 2
! 237:
! 238: int pcmcia_ccr_read(struct pcmcia_function *, int);
! 239: void pcmcia_ccr_write(struct pcmcia_function *, int, int);
! 240:
! 241: #define pcmcia_mfc(sc) (SIMPLEQ_FIRST(&(sc)->card.pf_head) && \
! 242: SIMPLEQ_NEXT(SIMPLEQ_FIRST(&(sc)->card.pf_head), pf_list))
! 243:
! 244: void pcmcia_function_init(struct pcmcia_function *,
! 245: struct pcmcia_config_entry *);
! 246: int pcmcia_function_enable(struct pcmcia_function *);
! 247: void pcmcia_function_disable(struct pcmcia_function *);
! 248:
! 249: #define pcmcia_io_alloc(pf, start, size, align, pciop) \
! 250: (pcmcia_chip_io_alloc((pf)->sc->pct, pf->sc->pch, (start), \
! 251: (size), (align), (pciop)))
! 252:
! 253: int pcmcia_io_map(struct pcmcia_function *, int, bus_addr_t,
! 254: bus_size_t, struct pcmcia_io_handle *, int *);
! 255:
! 256: #define pcmcia_io_unmap(pf, window) \
! 257: (pcmcia_chip_io_unmap((pf)->sc->pct, (pf)->sc->pch, (window)))
! 258:
! 259: #define pcmcia_io_free(pf, pciop) \
! 260: (pcmcia_chip_io_free((pf)->sc->pct, (pf)->sc->pch, (pciop)))
! 261:
! 262: #define pcmcia_mem_alloc(pf, size, pcmhp) \
! 263: (pcmcia_chip_mem_alloc((pf)->sc->pct, (pf)->sc->pch, (size), (pcmhp)))
! 264:
! 265: #define pcmcia_mem_free(pf, pcmhp) \
! 266: (pcmcia_chip_mem_free((pf)->sc->pct, (pf)->sc->pch, (pcmhp)))
! 267:
! 268: #define pcmcia_mem_map(pf, kind, card_addr, size, pcmhp, offsetp, windowp) \
! 269: (pcmcia_chip_mem_map((pf)->sc->pct, (pf)->sc->pch, (kind), \
! 270: (card_addr), (size), (pcmhp), (offsetp), (windowp)))
! 271:
! 272: #define pcmcia_mem_unmap(pf, window) \
! 273: (pcmcia_chip_mem_unmap((pf)->sc->pct, (pf)->sc->pch, (window)))
! 274:
! 275: void *pcmcia_intr_establish(struct pcmcia_function *, int,
! 276: int (*) (void *), void *, char *);
! 277: void pcmcia_intr_disestablish(struct pcmcia_function *, void *);
! 278: const char *pcmcia_intr_string(struct pcmcia_function *, void *);
CVSweb