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_ */