Annotation of sys/dev/isa/isavar.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: isavar.h,v 1.52 2007/01/06 20:17:43 miod Exp $ */
! 2: /* $NetBSD: isavar.h,v 1.26 1997/06/06 23:43:57 thorpej Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 1997 The NetBSD Foundation, Inc.
! 6: * All rights reserved.
! 7: *
! 8: * This code is derived from software contributed to The NetBSD Foundation
! 9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
! 10: * NASA Ames Research Center.
! 11: *
! 12: * Redistribution and use in source and binary forms, with or without
! 13: * modification, are permitted provided that the following conditions
! 14: * are met:
! 15: * 1. Redistributions of source code must retain the above copyright
! 16: * notice, this list of conditions and the following disclaimer.
! 17: * 2. Redistributions in binary form must reproduce the above copyright
! 18: * notice, this list of conditions and the following disclaimer in the
! 19: * documentation and/or other materials provided with the distribution.
! 20: * 3. All advertising materials mentioning features or use of this software
! 21: * must display the following acknowledgement:
! 22: * This product includes software developed by the NetBSD
! 23: * Foundation, Inc. and its contributors.
! 24: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 25: * contributors may be used to endorse or promote products derived
! 26: * from this software without specific prior written permission.
! 27: *
! 28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 38: * POSSIBILITY OF SUCH DAMAGE.
! 39: */
! 40:
! 41: /*
! 42: * Copyright (c) 1996 Christos Zoulas. All rights reserved.
! 43: *
! 44: * Redistribution and use in source and binary forms, with or without
! 45: * modification, are permitted provided that the following conditions
! 46: * are met:
! 47: * 1. Redistributions of source code must retain the above copyright
! 48: * notice, this list of conditions and the following disclaimer.
! 49: * 2. Redistributions in binary form must reproduce the above copyright
! 50: * notice, this list of conditions and the following disclaimer in the
! 51: * documentation and/or other materials provided with the distribution.
! 52: * 3. All advertising materials mentioning features or use of this software
! 53: * must display the following acknowledgement:
! 54: * This product includes software developed by Christos Zoulas.
! 55: * 4. The name of the author may not be used to endorse or promote products
! 56: * derived from this software without specific prior written permission.
! 57: *
! 58: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 59: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 60: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 61: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 62: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 63: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 64: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 65: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 66: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 67: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 68: */
! 69:
! 70: /*
! 71: * Copyright (c) 1995 Chris G. Demetriou
! 72: * Copyright (c) 1992 Berkeley Software Design, Inc.
! 73: * All rights reserved.
! 74: *
! 75: * Redistribution and use in source and binary forms, with or without
! 76: * modification, are permitted provided that the following conditions
! 77: * are met:
! 78: * 1. Redistributions of source code must retain the above copyright
! 79: * notice, this list of conditions and the following disclaimer.
! 80: * 2. Redistributions in binary form must reproduce the above copyright
! 81: * notice, this list of conditions and the following disclaimer in the
! 82: * documentation and/or other materials provided with the distribution.
! 83: * 3. All advertising materials mentioning features or use of this software
! 84: * must display the following acknowledgement:
! 85: * This product includes software developed by Berkeley Software
! 86: * Design, Inc.
! 87: * 4. The name of Berkeley Software Design must not be used to endorse
! 88: * or promote products derived from this software without specific
! 89: * prior written permission.
! 90: *
! 91: * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN, INC. ``AS IS'' AND
! 92: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 93: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 94: * ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN, INC. BE LIABLE
! 95: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 96: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 97: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 98: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 99: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 100: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 101: * SUCH DAMAGE.
! 102: *
! 103: * BSDI Id: isavar.h,v 1.5 1992/12/01 18:06:00 karels Exp
! 104: */
! 105:
! 106: #ifndef _DEV_ISA_ISAVAR_H_
! 107: #define _DEV_ISA_ISAVAR_H_
! 108:
! 109: /*
! 110: * Definitions for ISA and ISA PnP autoconfiguration.
! 111: */
! 112:
! 113: #include <sys/queue.h>
! 114: #include <machine/bus.h>
! 115:
! 116: #ifndef NISADMA
! 117: #include "isadma.h"
! 118: #endif
! 119:
! 120: /*
! 121: * Structures and definitions needed by the machine-dependent header.
! 122: */
! 123: struct isabus_attach_args;
! 124:
! 125: #if defined(__alpha__)
! 126: #include <alpha/isa/isa_machdep.h>
! 127: #elif defined(__cats__)
! 128: #include <cats/isa/isa_machdep.h>
! 129: #elif defined(hp300)
! 130: #include <hp300/dev/isa_machdep.h>
! 131: #elif defined(__i386__)
! 132: #include <i386/isa/isa_machdep.h>
! 133: #elif defined(__mvmeppc__)
! 134: #include <mvmeppc/isa/isa_machdep.h>
! 135: #elif defined(__powerpc__)
! 136: #include <powerpc/isa/isa_machdep.h>
! 137: #else
! 138: #include <machine/isa_machdep.h>
! 139: #endif
! 140:
! 141: #include "isapnp.h"
! 142:
! 143: #if NISAPNP > 0
! 144: /*
! 145: * Structures and definitions needed by the machine-dependent header.
! 146: */
! 147: struct isapnp_softc;
! 148:
! 149: #if defined(__alpha__)
! 150: #include <alpha/isa/isapnp_machdep.h>
! 151: #elif defined(__i386__)
! 152: #include <i386/isa/isapnp_machdep.h>
! 153: #else
! 154: #error COMPILING ISAPNP FOR UNSUPPORTED MACHINE.
! 155: #endif
! 156: #endif /* NISAPNP */
! 157:
! 158: # define ISAPNP_WRITE_ADDR(sc, v) \
! 159: bus_space_write_1(sc->sc_iot, sc->sc_addr_ioh, 0, v)
! 160: # define ISAPNP_WRITE_DATA(sc, v) \
! 161: bus_space_write_1(sc->sc_iot, sc->sc_wrdata_ioh, 0, v)
! 162: # define ISAPNP_READ_DATA(sc) \
! 163: bus_space_read_1(sc->sc_iot, sc->sc_read_ioh, 0)
! 164:
! 165: # define ISAPNP_MALLOC(a) malloc(a, M_DEVBUF, M_WAITOK)
! 166: # define ISAPNP_FREE(a) free(a, M_DEVBUF)
! 167: # define ISAPNP_CLONE_SETUP(dest, src) \
! 168: do { \
! 169: bzero((dest), sizeof(*(dest))); \
! 170: (dest)->ia_ic = (src)->ia_ic; \
! 171: } while (0)
! 172:
! 173: #ifndef _DEV_ISA_ISAPNPREG_H_
! 174: /*
! 175: * `reg' defines needed only for these structures.
! 176: */
! 177: #define ISAPNP_MAX_CARDS 8
! 178: #define ISAPNP_MAX_IDENT 32
! 179: #define ISAPNP_MAX_DEVCLASS 16
! 180: #define ISAPNP_SERIAL_SIZE 9
! 181:
! 182: #define ISAPNP_NUM_MEM 4
! 183: #define ISAPNP_NUM_IO 8
! 184: #define ISAPNP_NUM_IRQ 16
! 185: #define ISAPNP_NUM_DRQ 8
! 186: #define ISAPNP_NUM_MEM32 4
! 187: #endif /* _DEV_ISA_ISAPNPREG_H_ */
! 188:
! 189: /*
! 190: * ISA PnP-specific structures.
! 191: */
! 192: struct isapnp_softc {
! 193: struct device sc_dev;
! 194: TAILQ_HEAD(, isadev)
! 195: sc_subdevs; /* list of all children */
! 196:
! 197: bus_space_tag_t sc_iot; /* isa io space tag */
! 198: bus_space_tag_t sc_memt; /* isa mem space tag */
! 199: #if NISADMA > 0
! 200: bus_dma_tag_t sc_dmat; /* isa DMA tag */
! 201: #endif /* NISADMA > 0 */
! 202:
! 203: int sc_read_port;
! 204: bus_space_handle_t sc_addr_ioh;
! 205: bus_space_handle_t sc_wrdata_ioh;
! 206: bus_space_handle_t sc_read_ioh;
! 207: bus_space_handle_t sc_memh;
! 208: u_int8_t sc_ncards;
! 209: u_int8_t sc_id[ISAPNP_MAX_CARDS][ISAPNP_SERIAL_SIZE];
! 210: };
! 211:
! 212: struct isapnp_region {
! 213: bus_space_handle_t h;
! 214: u_int32_t base;
! 215:
! 216: u_int32_t minbase;
! 217: u_int32_t maxbase;
! 218: u_int32_t length;
! 219: u_int32_t align;
! 220: u_int8_t flags;
! 221: };
! 222:
! 223: struct isapnp_pin {
! 224: int16_t num;
! 225: u_int8_t flags:4;
! 226: u_int8_t type:4;
! 227: u_int16_t bits;
! 228: };
! 229:
! 230: struct isapnp_knowndev {
! 231: const char pnpid[8];
! 232: const char driver[5];
! 233: };
! 234:
! 235: /*
! 236: * ISA bus attach arguments
! 237: */
! 238: struct isabus_attach_args {
! 239: char *iba_busname; /* XXX should be common */
! 240: bus_space_tag_t iba_iot; /* isa i/o space tag */
! 241: bus_space_tag_t iba_memt; /* isa mem space tag */
! 242: #if NISADMA > 0
! 243: bus_dma_tag_t iba_dmat; /* isa DMA tag */
! 244: #endif
! 245: isa_chipset_tag_t iba_ic;
! 246: };
! 247:
! 248: /*
! 249: * ISA/ISA PnP shared driver attach arguments
! 250: */
! 251: struct isa_attach_args {
! 252: struct device *ia_isa; /* isa device */
! 253: bus_space_tag_t ia_iot; /* isa i/o space tag */
! 254: bus_space_tag_t ia_memt; /* isa mem space tag */
! 255: #if NISADMA > 0
! 256: bus_dma_tag_t ia_dmat; /* DMA tag */
! 257: #endif
! 258: bus_space_handle_t ia_delaybah; /* i/o handle for `delay port' */
! 259:
! 260: isa_chipset_tag_t ia_ic;
! 261:
! 262: /*
! 263: * ISA PnP configuration support. `ipa_' prefixes are used to denote
! 264: * PnP specific members of this structure.
! 265: */
! 266: struct isa_attach_args *ipa_sibling;
! 267: struct isa_attach_args *ipa_child;
! 268:
! 269: char ipa_devident[ISAPNP_MAX_IDENT];
! 270: char ipa_devlogic[ISAPNP_MAX_DEVCLASS];
! 271: char ipa_devcompat[ISAPNP_MAX_DEVCLASS];
! 272: char ipa_devclass[ISAPNP_MAX_DEVCLASS];
! 273:
! 274: u_char ipa_pref;
! 275: u_char ipa_devnum;
! 276:
! 277: u_char ipa_nio;
! 278: u_char ipa_nirq;
! 279: u_char ipa_ndrq;
! 280: u_char ipa_nmem;
! 281: u_char ipa_nmem32;
! 282:
! 283: struct isapnp_region ipa_io[ISAPNP_NUM_IO];
! 284: struct isapnp_region ipa_mem[ISAPNP_NUM_MEM];
! 285: struct isapnp_region ipa_mem32[ISAPNP_NUM_MEM32];
! 286: struct isapnp_pin ipa_irq[ISAPNP_NUM_IRQ];
! 287: struct isapnp_pin ipa_drq[ISAPNP_NUM_DRQ];
! 288:
! 289: /*
! 290: * Compatibility defines for ISA drivers.
! 291: */
! 292: #define ia_iobase ipa_io[0].base
! 293: #define ia_iosize ipa_io[0].length
! 294: #define ia_ioh ipa_io[0].h
! 295: #define ia_irq ipa_irq[0].num
! 296: #define ia_drq ipa_drq[0].num
! 297: #define ia_drq2 ipa_drq[1].num
! 298: #define ia_maddr ipa_mem[0].base
! 299: #define ia_msize ipa_mem[0].length
! 300: #define ia_memh ipa_mem[0].h
! 301:
! 302: void *ia_aux; /* driver specific */
! 303: };
! 304:
! 305: #define IOBASEUNK -1 /* i/o address is unknown */
! 306: #define IRQUNK -1 /* interrupt request line is unknown */
! 307: #define DRQUNK -1 /* DMA request line is unknown */
! 308: #define MADDRUNK -1 /* shared memory address is unknown */
! 309:
! 310: /*
! 311: * Per-device ISA variables
! 312: */
! 313: struct isadev {
! 314: struct device *id_dev; /* back pointer to generic */
! 315: TAILQ_ENTRY(isadev)
! 316: id_bchain; /* bus chain */
! 317: };
! 318:
! 319: /*
! 320: * ISA master bus
! 321: */
! 322: struct isa_softc {
! 323: struct device sc_dev; /* base device */
! 324: TAILQ_HEAD(, isadev)
! 325: sc_subdevs; /* list of all children */
! 326:
! 327: bus_space_tag_t sc_iot; /* isa io space tag */
! 328: bus_space_tag_t sc_memt; /* isa mem space tag */
! 329: #if NISADMA > 0
! 330: bus_dma_tag_t sc_dmat; /* isa DMA tag */
! 331: #endif /* NISADMA > 0 */
! 332:
! 333: isa_chipset_tag_t sc_ic;
! 334:
! 335: #if NISADMA > 0
! 336: /*
! 337: * Bitmap representing the DRQ channels available
! 338: * for ISA.
! 339: */
! 340: int sc_drqmap;
! 341: #define sc_drq sc_drqmap /* XXX compatibility mode */
! 342:
! 343: bus_space_handle_t sc_dma1h; /* i/o handle for DMA controller #1 */
! 344: bus_space_handle_t sc_dma2h; /* i/o handle for DMA controller #2 */
! 345: bus_space_handle_t sc_dmapgh; /* i/o handle for DMA page registers */
! 346:
! 347: /*
! 348: * DMA maps used for the 8 DMA channels.
! 349: */
! 350: bus_dmamap_t sc_dmamaps[8];
! 351: bus_size_t sc_dmalength[8];
! 352:
! 353: int sc_dmareads; /* state for isa_dmadone() */
! 354: int sc_dmafinished; /* DMA completion state */
! 355: #endif /* NISADMA > 0 */
! 356:
! 357: /*
! 358: * This i/o handle is used to map port 0x84, which is
! 359: * read to provide a 1.25us delay. This access handle
! 360: * is mapped in isaattach(), and exported to drivers
! 361: * via isa_attach_args.
! 362: */
! 363: bus_space_handle_t sc_delaybah;
! 364: };
! 365:
! 366: #define ISA_DRQ_ISFREE(isadev, drq) \
! 367: ((((struct isa_softc *)(isadev))->sc_drqmap & (1 << (drq))) == 0)
! 368:
! 369: #define ISA_DRQ_ALLOC(isadev, drq) \
! 370: ((struct isa_softc *)(isadev))->sc_drqmap |= (1 << (drq))
! 371:
! 372: #define ISA_DRQ_FREE(isadev, drq) \
! 373: ((struct isa_softc *)(isadev))->sc_drqmap &= ~(1 << (drq))
! 374:
! 375: #define cf_iobase cf_loc[0]
! 376: #define cf_iosize cf_loc[1]
! 377: #define cf_maddr cf_loc[2]
! 378: #define cf_msize cf_loc[3]
! 379: #define cf_irq cf_loc[4]
! 380: #define cf_drq cf_loc[5]
! 381: #define cf_drq2 cf_loc[6]
! 382:
! 383: /*
! 384: * ISA interrupt handler manipulation.
! 385: *
! 386: * To establish an ISA interrupt handler, a driver calls isa_intr_establish()
! 387: * with the interrupt number, type, level, function, and function argument of
! 388: * the interrupt it wants to handle. Isa_intr_establish() returns an opaque
! 389: * handle to an event descriptor if it succeeds, and invokes panic() if it
! 390: * fails. (XXX It should return NULL, then drivers should handle that, but
! 391: * what should they do?) Interrupt handlers should return 0 for "interrupt
! 392: * not for me", 1 for "I took care of it", or -1 for "I guess it was mine,
! 393: * but I wasn't expecting it."
! 394: *
! 395: * To remove an interrupt handler, the driver calls isa_intr_disestablish()
! 396: * with the handle returned by isa_intr_establish() for that handler.
! 397: */
! 398:
! 399: /* ISA interrupt sharing types */
! 400: char *isa_intr_typename(int type);
! 401:
! 402: void isascan(struct device *parent, void *match);
! 403: int isaprint(void *, const char *);
! 404:
! 405: /*
! 406: * Some ISA devices (e.g. on a VLB) can perform 32-bit DMA. This
! 407: * flag is passed to bus_dmamap_create() to indicate that fact.
! 408: */
! 409: #define ISABUS_DMA_32BIT BUS_DMA_BUS1
! 410:
! 411: /*
! 412: * ISA PnP prototypes and support macros.
! 413: */
! 414: static __inline void isapnp_write_reg(struct isapnp_softc *, int, u_char);
! 415: static __inline u_char isapnp_read_reg(struct isapnp_softc *, int);
! 416:
! 417: static __inline void
! 418: isapnp_write_reg(sc, r, v)
! 419: struct isapnp_softc *sc;
! 420: int r;
! 421: u_char v;
! 422: {
! 423: ISAPNP_WRITE_ADDR(sc, r);
! 424: ISAPNP_WRITE_DATA(sc, v);
! 425: }
! 426:
! 427: static __inline u_char
! 428: isapnp_read_reg(sc, r)
! 429: struct isapnp_softc *sc;
! 430: int r;
! 431: {
! 432: ISAPNP_WRITE_ADDR(sc, r);
! 433: return ISAPNP_READ_DATA(sc);
! 434: }
! 435:
! 436: struct isa_attach_args *
! 437: isapnp_get_resource(struct isapnp_softc *, int, struct isa_attach_args *);
! 438: char *isapnp_id_to_vendor(char *, const u_char *);
! 439:
! 440: int isapnp_config(bus_space_tag_t, bus_space_tag_t,
! 441: struct isa_attach_args *);
! 442: void isapnp_unconfig(bus_space_tag_t, bus_space_tag_t,
! 443: struct isa_attach_args *);
! 444:
! 445: void isapnp_isa_attach_hook(struct isa_softc *);
! 446: #ifdef DEBUG_ISAPNP
! 447: void isapnp_print_mem(const char *, const struct isapnp_region *);
! 448: void isapnp_print_io(const char *, const struct isapnp_region *);
! 449: void isapnp_print_irq(const char *, const struct isapnp_pin *);
! 450: void isapnp_print_drq(const char *, const struct isapnp_pin *);
! 451: void isapnp_print_dep_start(const char *, const u_char);
! 452: void isapnp_print_attach(const struct isa_attach_args *);
! 453: void isapnp_get_config(struct isapnp_softc *,
! 454: struct isa_attach_args *);
! 455: void isapnp_print_config(const struct isa_attach_args *);
! 456: #endif /* DEBUG_ISAPNP */
! 457: #endif /* _DEV_ISA_ISAVAR_H_ */
CVSweb