1 1.17 cherry /* $NetBSD: pciide_machdep.c,v 1.17 2017/11/04 15:24:42 cherry Exp $ */ 2 1.1 fvdl 3 1.1 fvdl /* 4 1.1 fvdl * Copyright (c) 1998 Christopher G. Demetriou. All rights reserved. 5 1.1 fvdl * 6 1.1 fvdl * Redistribution and use in source and binary forms, with or without 7 1.1 fvdl * modification, are permitted provided that the following conditions 8 1.1 fvdl * are met: 9 1.1 fvdl * 1. Redistributions of source code must retain the above copyright 10 1.1 fvdl * notice, this list of conditions and the following disclaimer. 11 1.1 fvdl * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 fvdl * notice, this list of conditions and the following disclaimer in the 13 1.1 fvdl * documentation and/or other materials provided with the distribution. 14 1.1 fvdl * 3. All advertising materials mentioning features or use of this software 15 1.1 fvdl * must display the following acknowledgement: 16 1.1 fvdl * This product includes software developed by Christopher G. Demetriou 17 1.1 fvdl * for the NetBSD Project. 18 1.1 fvdl * 4. The name of the author may not be used to endorse or promote products 19 1.1 fvdl * derived from this software without specific prior written permission 20 1.1 fvdl * 21 1.1 fvdl * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 1.1 fvdl * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 1.1 fvdl * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 1.1 fvdl * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 1.1 fvdl * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 1.1 fvdl * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 1.1 fvdl * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 1.1 fvdl * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 1.1 fvdl * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 1.1 fvdl * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 1.1 fvdl */ 32 1.1 fvdl 33 1.1 fvdl /* 34 1.1 fvdl * PCI IDE controller driver (i386 machine-dependent portion). 35 1.1 fvdl * 36 1.1 fvdl * Author: Christopher G. Demetriou, March 2, 1998 (derived from NetBSD 37 1.1 fvdl * sys/dev/pci/ppb.c, revision 1.16). 38 1.1 fvdl * 39 1.1 fvdl * See "PCI IDE Controller Specification, Revision 1.0 3/4/94" from the 40 1.1 fvdl * PCI SIG. 41 1.1 fvdl */ 42 1.1 fvdl 43 1.1 fvdl #include <sys/cdefs.h> 44 1.17 cherry __KERNEL_RCSID(0, "$NetBSD: pciide_machdep.c,v 1.17 2017/11/04 15:24:42 cherry Exp $"); 45 1.1 fvdl 46 1.1 fvdl #include <sys/param.h> 47 1.1 fvdl #include <sys/systm.h> 48 1.1 fvdl #include <sys/device.h> 49 1.1 fvdl 50 1.1 fvdl #include <dev/pci/pcireg.h> 51 1.1 fvdl #include <dev/pci/pcivar.h> 52 1.1 fvdl #include <dev/pci/pciidereg.h> 53 1.1 fvdl #include <dev/pci/pciidevar.h> 54 1.1 fvdl 55 1.1 fvdl #include <dev/isa/isavar.h> 56 1.1 fvdl 57 1.1 fvdl #include "ioapic.h" 58 1.1 fvdl 59 1.1 fvdl #if NIOAPIC > 0 60 1.1 fvdl #include <machine/i82093var.h> 61 1.1 fvdl #include <machine/mpbiosvar.h> 62 1.1 fvdl #endif 63 1.1 fvdl 64 1.17 cherry #ifdef __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH 65 1.1 fvdl void * 66 1.9 cegger pciide_machdep_compat_intr_establish(device_t dev, 67 1.11 dyoung const struct pci_attach_args *pa, int chan, int (*func)(void *), 68 1.5 christos void *arg) 69 1.1 fvdl { 70 1.1 fvdl int irq; 71 1.1 fvdl void *cookie; 72 1.1 fvdl #if NIOAPIC > 0 73 1.14 knakahar intr_handle_t mpih; 74 1.13 joerg char buf[PCI_INTRSTR_LEN]; 75 1.1 fvdl #endif 76 1.16 jdolecek char intr_xname[64]; 77 1.16 jdolecek 78 1.16 jdolecek snprintf(intr_xname, sizeof(intr_xname), "%s %s", 79 1.16 jdolecek device_xname(dev), PCIIDE_CHANNEL_NAME(chan)); 80 1.1 fvdl 81 1.1 fvdl irq = PCIIDE_COMPAT_IRQ(chan); 82 1.16 jdolecek cookie = isa_intr_establish_xname(NULL, irq, IST_EDGE, IPL_BIO, 83 1.16 jdolecek func, arg, intr_xname); 84 1.1 fvdl if (cookie == NULL) 85 1.9 cegger return NULL; 86 1.1 fvdl #if NIOAPIC > 0 87 1.1 fvdl if (mp_busses != NULL && 88 1.3 fvdl (intr_find_mpmapping(mp_isa_bus, irq, &mpih) == 0 || 89 1.3 fvdl intr_find_mpmapping(mp_eisa_bus, irq, &mpih) == 0)) { 90 1.1 fvdl mpih |= irq; 91 1.8 cegger aprint_normal_dev(dev, "%s channel interrupting at %s\n", 92 1.8 cegger PCIIDE_CHANNEL_NAME(chan), 93 1.12 christos intr_string(mpih, buf, sizeof(buf))); 94 1.1 fvdl } else 95 1.1 fvdl #endif 96 1.8 cegger aprint_normal_dev(dev, "%s channel interrupting at irq %d\n", 97 1.1 fvdl PCIIDE_CHANNEL_NAME(chan), irq); 98 1.9 cegger return cookie; 99 1.1 fvdl } 100 1.17 cherry #endif /* __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH */ 101 1.10 jakllsch 102 1.17 cherry #ifdef __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_DISESTABLISH 103 1.10 jakllsch void 104 1.15 msaitoh pciide_machdep_compat_intr_disestablish(device_t dev, pci_chipset_tag_t pc, 105 1.15 msaitoh int chan, void *cookie) 106 1.10 jakllsch { 107 1.10 jakllsch isa_intr_disestablish(NULL, cookie); 108 1.10 jakllsch return; 109 1.10 jakllsch } 110 1.17 cherry #endif /* __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_DISESTABLISH */ 111