1 1.140 thorpej /* $NetBSD: isa.c,v 1.140 2021/08/07 16:19:12 thorpej Exp $ */ 2 1.58 cgd 3 1.1 cgd /*- 4 1.133 ad * Copyright (c) 1998, 2001, 2008 The NetBSD Foundation, Inc. 5 1.105 mycroft * All rights reserved. 6 1.105 mycroft * 7 1.105 mycroft * This code is derived from software contributed to The NetBSD Foundation 8 1.110 thorpej * by Charles M. Hannum; by Jason R. Thorpe of Wasabi Systems, Inc. 9 1.1 cgd * 10 1.1 cgd * Redistribution and use in source and binary forms, with or without 11 1.1 cgd * modification, are permitted provided that the following conditions 12 1.1 cgd * are met: 13 1.1 cgd * 1. Redistributions of source code must retain the above copyright 14 1.1 cgd * notice, this list of conditions and the following disclaimer. 15 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 cgd * notice, this list of conditions and the following disclaimer in the 17 1.1 cgd * documentation and/or other materials provided with the distribution. 18 1.1 cgd * 19 1.105 mycroft * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.105 mycroft * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.105 mycroft * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.105 mycroft * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.105 mycroft * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.105 mycroft * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.105 mycroft * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.105 mycroft * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.105 mycroft * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.105 mycroft * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.105 mycroft * POSSIBILITY OF SUCH DAMAGE. 30 1.1 cgd */ 31 1.109 lukem 32 1.109 lukem #include <sys/cdefs.h> 33 1.140 thorpej __KERNEL_RCSID(0, "$NetBSD: isa.c,v 1.140 2021/08/07 16:19:12 thorpej Exp $"); 34 1.1 cgd 35 1.31 mycroft #include <sys/param.h> 36 1.31 mycroft #include <sys/systm.h> 37 1.40 mycroft #include <sys/kernel.h> 38 1.31 mycroft #include <sys/malloc.h> 39 1.46 mycroft #include <sys/device.h> 40 1.85 thorpej 41 1.129 ad #include <sys/intr.h> 42 1.31 mycroft 43 1.72 cgd #include <dev/isa/isareg.h> 44 1.72 cgd #include <dev/isa/isavar.h> 45 1.95 thorpej #include <dev/isa/isadmareg.h> 46 1.77 cgd 47 1.102 leo #include "isadma.h" 48 1.102 leo 49 1.103 christos #include "isapnp.h" 50 1.108 fvdl #if NISAPNP > 0 51 1.103 christos #include <dev/isapnp/isapnpreg.h> 52 1.103 christos #include <dev/isapnp/isapnpvar.h> 53 1.103 christos #endif 54 1.103 christos 55 1.119 drochner #include "locators.h" 56 1.119 drochner 57 1.132 cube int isamatch(device_t, cfdata_t, void *); 58 1.132 cube void isaattach(device_t, device_t, void *); 59 1.136 dyoung int isadetach(device_t, int); 60 1.132 cube int isarescan(device_t, const char *, const int *); 61 1.132 cube void isachilddetached(device_t, device_t); 62 1.110 thorpej int isaprint(void *, const char *); 63 1.77 cgd 64 1.132 cube CFATTACH_DECL2_NEW(isa, sizeof(struct isa_softc), 65 1.136 dyoung isamatch, isaattach, isadetach, NULL, isarescan, isachilddetached); 66 1.79 thorpej 67 1.110 thorpej void isa_attach_knowndevs(struct isa_softc *); 68 1.110 thorpej void isa_free_knowndevs(struct isa_softc *); 69 1.110 thorpej 70 1.132 cube int isasubmatch(device_t, cfdata_t, const int *, void *); 71 1.132 cube int isasearch(device_t, cfdata_t, const int *, void *); 72 1.91 cgd 73 1.133 ad static int isa_slotcount = -1; /* -1 == don't know how many */ 74 1.133 ad 75 1.77 cgd int 76 1.132 cube isamatch(device_t parent, cfdata_t cf, void *aux) 77 1.77 cgd { 78 1.77 cgd /* XXX check other indicators */ 79 1.77 cgd 80 1.128 isaki return (1); 81 1.77 cgd } 82 1.77 cgd 83 1.77 cgd void 84 1.132 cube isaattach(device_t parent, device_t self, void *aux) 85 1.77 cgd { 86 1.132 cube struct isa_softc *sc = device_private(self); 87 1.77 cgd struct isabus_attach_args *iba = aux; 88 1.122 drochner static const int wildcard[ISACF_NLOCS] = { 89 1.139 thorpej [ISACF_PORT] = ISACF_PORT_DEFAULT, 90 1.139 thorpej [ISACF_SIZE] = ISACF_SIZE_DEFAULT, 91 1.139 thorpej [ISACF_IOMEM] = ISACF_IOMEM_DEFAULT, 92 1.139 thorpej [ISACF_IOSIZ] = ISACF_IOSIZ_DEFAULT, 93 1.139 thorpej [ISACF_IRQ] = ISACF_IRQ_DEFAULT, 94 1.139 thorpej [ISACF_DRQ] = ISACF_DRQ_DEFAULT, 95 1.139 thorpej [ISACF_DRQ2] = ISACF_DRQ2_DEFAULT, 96 1.117 drochner }; 97 1.98 thorpej 98 1.110 thorpej TAILQ_INIT(&sc->sc_knowndevs); 99 1.110 thorpej sc->sc_dynamicdevs = 0; 100 1.110 thorpej 101 1.132 cube sc->sc_dev = self; 102 1.132 cube 103 1.80 cgd isa_attach_hook(parent, self, iba); 104 1.130 jmcneill aprint_naive("\n"); 105 1.130 jmcneill aprint_normal("\n"); 106 1.77 cgd 107 1.110 thorpej /* XXX Add code to fetch known-devices. */ 108 1.110 thorpej 109 1.89 thorpej sc->sc_iot = iba->iba_iot; 110 1.89 thorpej sc->sc_memt = iba->iba_memt; 111 1.95 thorpej sc->sc_dmat = iba->iba_dmat; 112 1.80 cgd sc->sc_ic = iba->iba_ic; 113 1.103 christos 114 1.103 christos #if NISAPNP > 0 115 1.103 christos /* 116 1.103 christos * Reset isapnp cards that the bios configured for us 117 1.103 christos */ 118 1.103 christos isapnp_isa_attach_hook(sc); 119 1.103 christos #endif 120 1.78 cgd 121 1.102 leo #if NISADMA > 0 122 1.82 thorpej /* 123 1.101 thorpej * Initialize our DMA state. 124 1.95 thorpej */ 125 1.101 thorpej isa_dmainit(sc->sc_ic, sc->sc_iot, sc->sc_dmat, self); 126 1.102 leo #endif 127 1.100 drochner 128 1.110 thorpej /* Attach all direct-config children. */ 129 1.110 thorpej isa_attach_knowndevs(sc); 130 1.110 thorpej 131 1.110 thorpej /* 132 1.110 thorpej * If we don't support dynamic hello/goodbye of devices, 133 1.110 thorpej * then free the knowndevs info now. 134 1.110 thorpej */ 135 1.110 thorpej if (sc->sc_dynamicdevs == 0) 136 1.110 thorpej isa_free_knowndevs(sc); 137 1.110 thorpej 138 1.135 dyoung /* Attach all indirect-config children. */ 139 1.139 thorpej isarescan(self, NULL, wildcard); 140 1.131 jmcneill 141 1.131 jmcneill if (!pmf_device_register(self, NULL, NULL)) 142 1.131 jmcneill aprint_error_dev(self, "couldn't establish power handler\n"); 143 1.117 drochner } 144 1.117 drochner 145 1.117 drochner int 146 1.136 dyoung isadetach(device_t self, int flags) 147 1.136 dyoung { 148 1.136 dyoung struct isa_softc *sc = device_private(self); 149 1.136 dyoung int rc; 150 1.136 dyoung 151 1.136 dyoung if ((rc = config_detach_children(self, flags)) != 0) 152 1.136 dyoung return rc; 153 1.136 dyoung 154 1.136 dyoung pmf_device_deregister(self); 155 1.136 dyoung 156 1.136 dyoung isa_free_knowndevs(sc); 157 1.136 dyoung 158 1.136 dyoung #if NISADMA > 0 159 1.136 dyoung isa_dmadestroy(sc->sc_ic); 160 1.136 dyoung #endif 161 1.137 cegger isa_detach_hook(sc->sc_ic, self); 162 1.136 dyoung 163 1.136 dyoung return 0; 164 1.136 dyoung } 165 1.136 dyoung 166 1.136 dyoung int 167 1.132 cube isarescan(device_t self, const char *ifattr, const int *locators) 168 1.117 drochner { 169 1.138 jmcneill prop_dictionary_t dict; 170 1.121 drochner int locs[ISACF_NLOCS]; 171 1.138 jmcneill bool no_legacy_devices = false; 172 1.138 jmcneill 173 1.138 jmcneill dict = device_properties(self); 174 1.138 jmcneill if (prop_dictionary_get_bool(dict, "no-legacy-devices", 175 1.138 jmcneill &no_legacy_devices) == true) { 176 1.138 jmcneill aprint_debug_dev(self, "platform reports no legacy devices\n"); 177 1.138 jmcneill return 0; 178 1.138 jmcneill } 179 1.117 drochner 180 1.121 drochner memcpy(locs, locators, sizeof(locs)); 181 1.117 drochner 182 1.117 drochner /* 183 1.127 wiz * XXX Bus independent code calling this function does not 184 1.117 drochner * know the locator default values. It assumes "-1" for now. 185 1.117 drochner * (should be made available by "config" one day) 186 1.117 drochner * So fixup where the "-1" is not correct. 187 1.117 drochner */ 188 1.121 drochner if (locs[ISACF_SIZE] == -1) 189 1.121 drochner locs[ISACF_SIZE] = ISACF_SIZE_DEFAULT; 190 1.121 drochner if (locs[ISACF_IOSIZ] == -1) 191 1.121 drochner locs[ISACF_IOSIZ] = ISACF_IOSIZ_DEFAULT; 192 1.117 drochner 193 1.139 thorpej config_search(self, NULL, 194 1.140 thorpej CFARGS(.search = isasearch, 195 1.140 thorpej .locators = locs)); 196 1.117 drochner return (0); 197 1.117 drochner } 198 1.117 drochner 199 1.117 drochner void 200 1.132 cube isachilddetached(device_t self, device_t child) 201 1.117 drochner { 202 1.136 dyoung struct isa_knowndev *ik; 203 1.136 dyoung struct isa_softc *sc = device_private(self); 204 1.136 dyoung 205 1.136 dyoung TAILQ_FOREACH(ik, &sc->sc_knowndevs, ik_list) { 206 1.136 dyoung if (ik->ik_claimed == child) 207 1.136 dyoung ik->ik_claimed = NULL; 208 1.136 dyoung } 209 1.77 cgd } 210 1.1 cgd 211 1.110 thorpej void 212 1.110 thorpej isa_attach_knowndevs(struct isa_softc *sc) 213 1.110 thorpej { 214 1.110 thorpej struct isa_attach_args ia; 215 1.110 thorpej struct isa_knowndev *ik; 216 1.110 thorpej 217 1.110 thorpej if (TAILQ_EMPTY(&sc->sc_knowndevs)) 218 1.110 thorpej return; 219 1.110 thorpej 220 1.110 thorpej TAILQ_FOREACH(ik, &sc->sc_knowndevs, ik_list) { 221 1.110 thorpej if (ik->ik_claimed != NULL) 222 1.110 thorpej continue; 223 1.110 thorpej 224 1.110 thorpej ia.ia_iot = sc->sc_iot; 225 1.110 thorpej ia.ia_memt = sc->sc_memt; 226 1.110 thorpej ia.ia_dmat = sc->sc_dmat; 227 1.110 thorpej ia.ia_ic = sc->sc_ic; 228 1.110 thorpej 229 1.110 thorpej ia.ia_pnpname = ik->ik_pnpname; 230 1.110 thorpej ia.ia_pnpcompatnames = ik->ik_pnpcompatnames; 231 1.110 thorpej 232 1.110 thorpej ia.ia_io = ik->ik_io; 233 1.110 thorpej ia.ia_nio = ik->ik_nio; 234 1.110 thorpej 235 1.110 thorpej ia.ia_iomem = ik->ik_iomem; 236 1.110 thorpej ia.ia_niomem = ik->ik_niomem; 237 1.110 thorpej 238 1.110 thorpej ia.ia_irq = ik->ik_irq; 239 1.110 thorpej ia.ia_nirq = ik->ik_nirq; 240 1.110 thorpej 241 1.110 thorpej ia.ia_drq = ik->ik_drq; 242 1.110 thorpej ia.ia_ndrq = ik->ik_ndrq; 243 1.110 thorpej 244 1.110 thorpej ia.ia_aux = NULL; 245 1.110 thorpej 246 1.117 drochner /* XXX should setup locator array */ 247 1.117 drochner 248 1.139 thorpej ik->ik_claimed = config_found(sc->sc_dev, &ia, isaprint, 249 1.140 thorpej CFARGS(.submatch = isasubmatch)); 250 1.110 thorpej } 251 1.110 thorpej } 252 1.110 thorpej 253 1.110 thorpej void 254 1.110 thorpej isa_free_knowndevs(struct isa_softc *sc) 255 1.110 thorpej { 256 1.110 thorpej struct isa_knowndev *ik; 257 1.110 thorpej struct isa_pnpname *ipn; 258 1.110 thorpej 259 1.110 thorpej #define FREEIT(x) if (x != NULL) free(x, M_DEVBUF) 260 1.110 thorpej 261 1.110 thorpej while ((ik = TAILQ_FIRST(&sc->sc_knowndevs)) != NULL) { 262 1.110 thorpej TAILQ_REMOVE(&sc->sc_knowndevs, ik, ik_list); 263 1.110 thorpej FREEIT(ik->ik_pnpname); 264 1.110 thorpej while ((ipn = ik->ik_pnpcompatnames) != NULL) { 265 1.110 thorpej ik->ik_pnpcompatnames = ipn->ipn_next; 266 1.110 thorpej free(ipn->ipn_name, M_DEVBUF); 267 1.110 thorpej free(ipn, M_DEVBUF); 268 1.110 thorpej } 269 1.110 thorpej FREEIT(ik->ik_io); 270 1.110 thorpej FREEIT(ik->ik_iomem); 271 1.110 thorpej FREEIT(ik->ik_irq); 272 1.110 thorpej FREEIT(ik->ik_drq); 273 1.110 thorpej free(ik, M_DEVBUF); 274 1.110 thorpej } 275 1.110 thorpej 276 1.110 thorpej #undef FREEIT 277 1.110 thorpej } 278 1.110 thorpej 279 1.117 drochner static int 280 1.117 drochner checkattachargs(struct isa_attach_args *ia, const int *loc) 281 1.110 thorpej { 282 1.110 thorpej int i; 283 1.110 thorpej 284 1.110 thorpej if (ia->ia_nio == 0) { 285 1.117 drochner if (loc[ISACF_PORT] != ISACF_PORT_DEFAULT) 286 1.110 thorpej return (0); 287 1.110 thorpej } else { 288 1.117 drochner if (loc[ISACF_PORT] != ISACF_PORT_DEFAULT && 289 1.117 drochner loc[ISACF_PORT] != ia->ia_io[0].ir_addr) 290 1.110 thorpej return (0); 291 1.110 thorpej } 292 1.110 thorpej 293 1.110 thorpej if (ia->ia_niomem == 0) { 294 1.117 drochner if (loc[ISACF_IOMEM] != ISACF_IOMEM_DEFAULT) 295 1.110 thorpej return (0); 296 1.110 thorpej } else { 297 1.117 drochner if (loc[ISACF_IOMEM] != ISACF_IOMEM_DEFAULT && 298 1.117 drochner loc[ISACF_IOMEM] != ia->ia_iomem[0].ir_addr) 299 1.110 thorpej return (0); 300 1.110 thorpej } 301 1.110 thorpej 302 1.110 thorpej if (ia->ia_nirq == 0) { 303 1.117 drochner if (loc[ISACF_IRQ] != ISACF_IRQ_DEFAULT) 304 1.110 thorpej return (0); 305 1.110 thorpej } else { 306 1.117 drochner if (loc[ISACF_IRQ] != ISACF_IRQ_DEFAULT && 307 1.117 drochner loc[ISACF_IRQ] != ia->ia_irq[0].ir_irq) 308 1.110 thorpej return (0); 309 1.110 thorpej } 310 1.110 thorpej 311 1.110 thorpej if (ia->ia_ndrq == 0) { 312 1.117 drochner if (loc[ISACF_DRQ] != ISACF_DRQ_DEFAULT) 313 1.110 thorpej return (0); 314 1.117 drochner if (loc[ISACF_DRQ2] != ISACF_DRQ2_DEFAULT) 315 1.110 thorpej return (0); 316 1.110 thorpej } else { 317 1.110 thorpej for (i = 0; i < 2; i++) { 318 1.110 thorpej if (i == ia->ia_ndrq) 319 1.110 thorpej break; 320 1.117 drochner if (loc[ISACF_DRQ + i] != ISACF_DRQ_DEFAULT && 321 1.117 drochner loc[ISACF_DRQ + i] != ia->ia_drq[i].ir_drq) 322 1.110 thorpej return (0); 323 1.110 thorpej } 324 1.110 thorpej for (; i < 2; i++) { 325 1.117 drochner if (loc[ISACF_DRQ + i] != ISACF_DRQ_DEFAULT) 326 1.110 thorpej return (0); 327 1.110 thorpej } 328 1.110 thorpej } 329 1.110 thorpej 330 1.117 drochner return (1); 331 1.117 drochner } 332 1.117 drochner 333 1.117 drochner int 334 1.132 cube isasubmatch(device_t parent, cfdata_t cf, const int *ldesc, void *aux) 335 1.117 drochner { 336 1.117 drochner struct isa_attach_args *ia = aux; 337 1.117 drochner 338 1.117 drochner if (!checkattachargs(ia, cf->cf_loc)) 339 1.117 drochner return (0); 340 1.117 drochner 341 1.112 thorpej return (config_match(parent, cf, aux)); 342 1.110 thorpej } 343 1.110 thorpej 344 1.46 mycroft int 345 1.110 thorpej isaprint(void *aux, const char *isa) 346 1.46 mycroft { 347 1.46 mycroft struct isa_attach_args *ia = aux; 348 1.110 thorpej const char *sep; 349 1.110 thorpej int i; 350 1.110 thorpej 351 1.110 thorpej /* 352 1.110 thorpej * This block of code only fires if we have a direct-config'd 353 1.110 thorpej * device for which there is no driver match. 354 1.110 thorpej */ 355 1.110 thorpej if (isa != NULL) { 356 1.110 thorpej struct isa_pnpname *ipn; 357 1.110 thorpej 358 1.110 thorpej if (ia->ia_pnpname != NULL) 359 1.116 thorpej aprint_normal("%s", ia->ia_pnpname); 360 1.110 thorpej if ((ipn = ia->ia_pnpcompatnames) != NULL) { 361 1.116 thorpej aprint_normal(" ("); /* ) */ 362 1.110 thorpej for (sep = ""; ipn != NULL; 363 1.110 thorpej ipn = ipn->ipn_next, sep = " ") { 364 1.116 thorpej aprint_normal("%s%s", sep, ipn->ipn_name); 365 1.110 thorpej } 366 1.116 thorpej /* ( */ aprint_normal(")"); 367 1.110 thorpej } 368 1.116 thorpej aprint_normal(" at %s", isa); 369 1.110 thorpej } 370 1.110 thorpej 371 1.110 thorpej if (ia->ia_nio) { 372 1.110 thorpej sep = ""; 373 1.116 thorpej aprint_normal(" port "); 374 1.110 thorpej for (i = 0; i < ia->ia_nio; i++) { 375 1.110 thorpej if (ia->ia_io[i].ir_size == 0) 376 1.110 thorpej continue; 377 1.116 thorpej aprint_normal("%s0x%x", sep, ia->ia_io[i].ir_addr); 378 1.110 thorpej if (ia->ia_io[i].ir_size > 1) 379 1.116 thorpej aprint_normal("-0x%x", ia->ia_io[i].ir_addr + 380 1.110 thorpej ia->ia_io[i].ir_size - 1); 381 1.110 thorpej sep = ","; 382 1.110 thorpej } 383 1.110 thorpej } 384 1.110 thorpej 385 1.110 thorpej if (ia->ia_niomem) { 386 1.110 thorpej sep = ""; 387 1.116 thorpej aprint_normal(" iomem "); 388 1.110 thorpej for (i = 0; i < ia->ia_niomem; i++) { 389 1.110 thorpej if (ia->ia_iomem[i].ir_size == 0) 390 1.110 thorpej continue; 391 1.116 thorpej aprint_normal("%s0x%x", sep, ia->ia_iomem[i].ir_addr); 392 1.110 thorpej if (ia->ia_iomem[i].ir_size > 1) 393 1.116 thorpej aprint_normal("-0x%x", ia->ia_iomem[i].ir_addr + 394 1.110 thorpej ia->ia_iomem[i].ir_size - 1); 395 1.110 thorpej sep = ","; 396 1.110 thorpej } 397 1.110 thorpej } 398 1.110 thorpej 399 1.110 thorpej if (ia->ia_nirq) { 400 1.110 thorpej sep = ""; 401 1.116 thorpej aprint_normal(" irq "); 402 1.110 thorpej for (i = 0; i < ia->ia_nirq; i++) { 403 1.110 thorpej if (ia->ia_irq[i].ir_irq == ISACF_IRQ_DEFAULT) 404 1.110 thorpej continue; 405 1.116 thorpej aprint_normal("%s%d", sep, ia->ia_irq[i].ir_irq); 406 1.110 thorpej sep = ","; 407 1.110 thorpej } 408 1.110 thorpej } 409 1.110 thorpej 410 1.110 thorpej if (ia->ia_ndrq) { 411 1.110 thorpej sep = ""; 412 1.116 thorpej aprint_normal(" drq "); 413 1.110 thorpej for (i = 0; i < ia->ia_ndrq; i++) { 414 1.110 thorpej if (ia->ia_drq[i].ir_drq == ISACF_DRQ_DEFAULT) 415 1.110 thorpej continue; 416 1.116 thorpej aprint_normal("%s%d", sep, ia->ia_drq[i].ir_drq); 417 1.110 thorpej sep = ","; 418 1.110 thorpej } 419 1.110 thorpej } 420 1.46 mycroft 421 1.71 mycroft return (UNCONF); 422 1.46 mycroft } 423 1.46 mycroft 424 1.94 cgd int 425 1.132 cube isasearch(device_t parent, cfdata_t cf, const int *slocs, void *aux) 426 1.94 cgd { 427 1.110 thorpej struct isa_io res_io[1]; 428 1.110 thorpej struct isa_iomem res_mem[1]; 429 1.110 thorpej struct isa_irq res_irq[1]; 430 1.110 thorpej struct isa_drq res_drq[2]; 431 1.132 cube struct isa_softc *sc = device_private(parent); 432 1.94 cgd struct isa_attach_args ia; 433 1.122 drochner int flocs[ISACF_NLOCS]; 434 1.94 cgd int tryagain; 435 1.94 cgd 436 1.94 cgd do { 437 1.110 thorpej ia.ia_pnpname = NULL; 438 1.110 thorpej ia.ia_pnpcompatnames = NULL; 439 1.110 thorpej 440 1.110 thorpej res_io[0].ir_addr = cf->cf_loc[ISACF_PORT]; 441 1.110 thorpej res_io[0].ir_size = 0; 442 1.110 thorpej 443 1.110 thorpej res_mem[0].ir_addr = cf->cf_loc[ISACF_IOMEM]; 444 1.110 thorpej res_mem[0].ir_size = cf->cf_loc[ISACF_IOSIZ]; 445 1.110 thorpej 446 1.110 thorpej res_irq[0].ir_irq = 447 1.110 thorpej cf->cf_loc[ISACF_IRQ] == 2 ? 9 : cf->cf_loc[ISACF_IRQ]; 448 1.110 thorpej 449 1.110 thorpej res_drq[0].ir_drq = cf->cf_loc[ISACF_DRQ]; 450 1.110 thorpej res_drq[1].ir_drq = cf->cf_loc[ISACF_DRQ2]; 451 1.110 thorpej 452 1.94 cgd ia.ia_iot = sc->sc_iot; 453 1.94 cgd ia.ia_memt = sc->sc_memt; 454 1.95 thorpej ia.ia_dmat = sc->sc_dmat; 455 1.94 cgd ia.ia_ic = sc->sc_ic; 456 1.110 thorpej 457 1.110 thorpej ia.ia_io = res_io; 458 1.110 thorpej ia.ia_nio = 1; 459 1.110 thorpej 460 1.110 thorpej ia.ia_iomem = res_mem; 461 1.110 thorpej ia.ia_niomem = 1; 462 1.110 thorpej 463 1.110 thorpej ia.ia_irq = res_irq; 464 1.110 thorpej ia.ia_nirq = 1; 465 1.110 thorpej 466 1.110 thorpej ia.ia_drq = res_drq; 467 1.110 thorpej ia.ia_ndrq = 2; 468 1.94 cgd 469 1.122 drochner if (!checkattachargs(&ia, slocs)) 470 1.117 drochner return (0); 471 1.117 drochner 472 1.94 cgd tryagain = 0; 473 1.139 thorpej if (config_probe(parent, cf, &ia)) { 474 1.117 drochner /* 475 1.117 drochner * This is not necessary for detach, but might 476 1.117 drochner * still be useful to collect device information. 477 1.117 drochner */ 478 1.122 drochner flocs[ISACF_PORT] = ia.ia_io[0].ir_addr; 479 1.122 drochner flocs[ISACF_SIZE] = ia.ia_io[0].ir_size; 480 1.122 drochner flocs[ISACF_IOMEM] = ia.ia_iomem[0].ir_addr; 481 1.122 drochner flocs[ISACF_IOSIZ] = ia.ia_iomem[0].ir_size; 482 1.122 drochner flocs[ISACF_IRQ] = ia.ia_irq[0].ir_irq; 483 1.122 drochner flocs[ISACF_DRQ] = ia.ia_drq[0].ir_drq; 484 1.122 drochner flocs[ISACF_DRQ2] = ia.ia_drq[1].ir_drq; 485 1.139 thorpej config_attach(parent, cf, &ia, isaprint, 486 1.140 thorpej CFARGS(.locators = flocs)); 487 1.94 cgd tryagain = (cf->cf_fstate == FSTATE_STAR); 488 1.94 cgd } 489 1.94 cgd } while (tryagain); 490 1.94 cgd 491 1.91 cgd return (0); 492 1.72 cgd } 493 1.72 cgd 494 1.120 christos const char * 495 1.110 thorpej isa_intr_typename(int type) 496 1.72 cgd { 497 1.72 cgd 498 1.72 cgd switch (type) { 499 1.128 isaki case IST_NONE: 500 1.72 cgd return ("none"); 501 1.128 isaki case IST_PULSE: 502 1.72 cgd return ("pulsed"); 503 1.128 isaki case IST_EDGE: 504 1.72 cgd return ("edge-triggered"); 505 1.128 isaki case IST_LEVEL: 506 1.72 cgd return ("level-triggered"); 507 1.72 cgd default: 508 1.72 cgd panic("isa_intr_typename: invalid type %d", type); 509 1.72 cgd } 510 1.1 cgd } 511 1.133 ad 512 1.133 ad int 513 1.133 ad isa_get_slotcount(void) 514 1.133 ad { 515 1.133 ad 516 1.133 ad return isa_slotcount; 517 1.133 ad } 518 1.133 ad 519 1.133 ad void 520 1.133 ad isa_set_slotcount(int arg) 521 1.133 ad { 522 1.133 ad 523 1.133 ad isa_slotcount = arg; 524 1.133 ad } 525