Module Name: src Committed By: cherry Date: Sun Jul 16 06:14:24 UTC 2017
Modified Files: src/sys/arch/x86/isa: isa_machdep.c src/sys/arch/xen/include: intr.h pci_machdep.h src/sys/arch/xen/x86: intr.c src/sys/arch/xen/xen: isa_machdep.c pci_intr_machdep.c pciback.c pciide_machdep.c Log Message: Remove the xen specific interrupt type for the x86 intr_handle_t For this to work, we use the evtchn.c:get_pirq_to_evtchn() glue function to make things easier. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/sys/arch/x86/isa/isa_machdep.c cvs rdiff -u -r1.40 -r1.41 src/sys/arch/xen/include/intr.h cvs rdiff -u -r1.18 -r1.19 src/sys/arch/xen/include/pci_machdep.h cvs rdiff -u -r1.31 -r1.32 src/sys/arch/xen/x86/intr.c cvs rdiff -u -r1.26 -r1.27 src/sys/arch/xen/xen/isa_machdep.c cvs rdiff -u -r1.17 -r1.18 src/sys/arch/xen/xen/pci_intr_machdep.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/xen/xen/pciback.c cvs rdiff -u -r1.18 -r1.19 src/sys/arch/xen/xen/pciide_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x86/isa/isa_machdep.c diff -u src/sys/arch/x86/isa/isa_machdep.c:1.34 src/sys/arch/x86/isa/isa_machdep.c:1.35 --- src/sys/arch/x86/isa/isa_machdep.c:1.34 Sat Oct 15 16:46:14 2016 +++ src/sys/arch/x86/isa/isa_machdep.c Sun Jul 16 06:14:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: isa_machdep.c,v 1.34 2016/10/15 16:46:14 jdolecek Exp $ */ +/* $NetBSD: isa_machdep.c,v 1.35 2017/07/16 06:14:23 cherry Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isa_machdep.c,v 1.34 2016/10/15 16:46:14 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: isa_machdep.c,v 1.35 2017/07/16 06:14:23 cherry Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -212,7 +212,7 @@ isa_intr_establish_xname(isa_chipset_tag int pin; #if NIOAPIC > 0 intr_handle_t mpih; - struct ioapic_softc *ioapic; + struct ioapic_softc *ioapic = NULL; #endif pin = irq; @@ -237,20 +237,48 @@ isa_intr_establish_xname(isa_chipset_tag printf("isa_intr_establish: no MP mapping found\n"); } #endif +#if defined(XEN) + KASSERT(APIC_IRQ_ISLEGACY(irq)); + + int evtch; + char evname[16]; + + mpih |= APIC_IRQ_LEGACY_IRQ(irq); + + evtch = xen_intr_map((int *)&mpih, type); /* XXX: legacy - xen just tosses irq back at us */ + if (evtch == -1) + return NULL; +#if NIOAPIC > 0 + if (ioapic) + snprintf(evname, sizeof(evname), "%s pin %d", + device_xname(ioapic->sc_dev), pin); + else +#endif + snprintf(evname, sizeof(evname), "irq%d", irq); + + aprint_debug("irq: %d requested on pic: %s.\n", irq, pic->pic_name); + + return (void *)pirq_establish(irq, evtch, ih_fun, ih_arg, level, + evname); +#else /* defined(XEN) */ return intr_establish_xname(irq, pic, pin, type, level, ih_fun, ih_arg, false, xname); +#endif + } /* Deregister an interrupt handler. */ void isa_intr_disestablish(isa_chipset_tag_t ic, void *arg) { +#if !defined(XEN) struct intrhand *ih = arg; if (!LEGAL_IRQ(ih->ih_pin)) panic("intr_disestablish: bogus irq"); intr_disestablish(ih); +#endif } void Index: src/sys/arch/xen/include/intr.h diff -u src/sys/arch/xen/include/intr.h:1.40 src/sys/arch/xen/include/intr.h:1.41 --- src/sys/arch/xen/include/intr.h:1.40 Tue May 23 08:54:39 2017 +++ src/sys/arch/xen/include/intr.h Sun Jul 16 06:14:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: intr.h,v 1.40 2017/05/23 08:54:39 nonaka Exp $ */ +/* $NetBSD: intr.h,v 1.41 2017/07/16 06:14:24 cherry Exp $ */ /* NetBSD intr.h,v 1.15 2004/10/31 10:39:34 yamt Exp */ /*- @@ -175,7 +175,7 @@ int xen_intr_map(int *, int); #ifdef INTRDEBUG void intr_printconfig(void); #endif -int intr_find_mpmapping(int, int, struct xen_intr_handle *); +int intr_find_mpmapping(int, int, intr_handle_t *); struct pic *intr_findpic(int); void intr_add_pcibus(struct pcibus_attach_args *); Index: src/sys/arch/xen/include/pci_machdep.h diff -u src/sys/arch/xen/include/pci_machdep.h:1.18 src/sys/arch/xen/include/pci_machdep.h:1.19 --- src/sys/arch/xen/include/pci_machdep.h:1.18 Mon Apr 4 20:37:55 2011 +++ src/sys/arch/xen/include/pci_machdep.h Sun Jul 16 06:14:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.h,v 1.18 2011/04/04 20:37:55 dyoung Exp $ */ +/* $NetBSD: pci_machdep.h,v 1.19 2017/07/16 06:14:24 cherry Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -60,7 +60,7 @@ /* * Types provided to machine-independent PCI code */ -typedef struct xen_intr_handle pci_intr_handle_t; +typedef intr_handle_t pci_intr_handle_t; #include <x86/pci_machdep_common.h> Index: src/sys/arch/xen/x86/intr.c diff -u src/sys/arch/xen/x86/intr.c:1.31 src/sys/arch/xen/x86/intr.c:1.32 --- src/sys/arch/xen/x86/intr.c:1.31 Tue May 23 08:54:39 2017 +++ src/sys/arch/xen/x86/intr.c Sun Jul 16 06:14:24 2017 @@ -103,7 +103,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.31 2017/05/23 08:54:39 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.32 2017/07/16 06:14:24 cherry Exp $"); #include "opt_multiprocessor.h" #include "opt_xen.h" @@ -125,6 +125,7 @@ __KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.3 #include <machine/i8259.h> #include <machine/pio.h> #include <xen/evtchn.h> +#include <xen/intr.h> #include "acpica.h" #include "ioapic.h" @@ -319,7 +320,9 @@ struct intr_extra_bus { LIST_HEAD(, intr_extra_bus) intr_extra_buses = LIST_HEAD_INITIALIZER(intr_extra_buses); -static int intr_scan_bus(int, int, struct xen_intr_handle *); +#if NPCI > 0 +static int intr_scan_bus(int, int, intr_handle_t *); +#endif void intr_add_pcibus(struct pcibus_attach_args *pba) @@ -364,8 +367,9 @@ intr_find_pcibridge(int bus, pcitag_t *p return ENOENT; } +/* XXX: Unify with x86/intr.c */ int -intr_find_mpmapping(int bus, int pin, struct xen_intr_handle *handle) +intr_find_mpmapping(int bus, int pin, intr_handle_t *handle) { #if NPCI > 0 int dev, func; @@ -391,8 +395,9 @@ intr_find_mpmapping(int bus, int pin, st #endif } +#if NPCI > 0 static int -intr_scan_bus(int bus, int pin, struct xen_intr_handle *handle) +intr_scan_bus(int bus, int pin, intr_handle_t *handle) { struct mp_intr_map *mip, *intrs; @@ -410,12 +415,13 @@ intr_scan_bus(int bus, int pin, struct x if (mpacpi_findintr_linkdev(mip) != 0) continue; #endif - handle->pirq = mip->ioapic_ih; + *handle = mip->ioapic_ih; return 0; } } return ENOENT; } +#endif /* NPCI > 0 */ #endif /* NIOAPIC > 0 || NACPICA > 0 */ #endif /* NPCI > 0 || NISA > 0 */ Index: src/sys/arch/xen/xen/isa_machdep.c diff -u src/sys/arch/xen/xen/isa_machdep.c:1.26 src/sys/arch/xen/xen/isa_machdep.c:1.27 --- src/sys/arch/xen/xen/isa_machdep.c:1.26 Thu Sep 1 15:10:31 2011 +++ src/sys/arch/xen/xen/isa_machdep.c Sun Jul 16 06:14:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: isa_machdep.c,v 1.26 2011/09/01 15:10:31 christos Exp $ */ +/* $NetBSD: isa_machdep.c,v 1.27 2017/07/16 06:14:24 cherry Exp $ */ /* NetBSD isa_machdep.c,v 1.11 2004/06/20 18:04:08 thorpej Exp */ /*- @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isa_machdep.c,v 1.26 2011/09/01 15:10:31 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: isa_machdep.c,v 1.27 2017/07/16 06:14:24 cherry Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -131,23 +131,23 @@ isa_intr_establish(isa_chipset_tag_t ic, { int evtch; char evname[16]; - struct xen_intr_handle ih; + intr_handle_t ih; #if NIOAPIC > 0 struct ioapic_softc *pic = NULL; #endif - ih.pirq = 0; + ih = 0; #if NIOAPIC > 0 if (mp_busses != NULL) { if (intr_find_mpmapping(mp_isa_bus, irq, &ih) == 0 || intr_find_mpmapping(mp_eisa_bus, irq, &ih) == 0) { - if (!APIC_IRQ_ISLEGACY(ih.pirq)) { - pic = ioapic_find(APIC_IRQ_APIC(ih.pirq)); + if (!APIC_IRQ_ISLEGACY(ih)) { + pic = ioapic_find(APIC_IRQ_APIC(ih)); if (pic == NULL) { printf("isa_intr_establish: " "unknown apic %d\n", - APIC_IRQ_APIC(ih.pirq)); + APIC_IRQ_APIC(ih)); return NULL; } } @@ -155,15 +155,15 @@ isa_intr_establish(isa_chipset_tag_t ic, printf("isa_intr_establish: no MP mapping found\n"); } #endif - ih.pirq |= (irq & 0xff); + ih |= (irq & 0xff); - evtch = xen_intr_map(&ih.pirq, type); + evtch = xen_intr_map((int *)&ih, type); if (evtch == -1) return NULL; #if NIOAPIC > 0 if (pic) snprintf(evname, sizeof(evname), "%s pin %d", - device_xname(pic->sc_dev), APIC_IRQ_PIN(ih.pirq)); + device_xname(pic->sc_dev), APIC_IRQ_PIN(ih)); else #endif snprintf(evname, sizeof(evname), "irq%d", irq); Index: src/sys/arch/xen/xen/pci_intr_machdep.c diff -u src/sys/arch/xen/xen/pci_intr_machdep.c:1.17 src/sys/arch/xen/xen/pci_intr_machdep.c:1.18 --- src/sys/arch/xen/xen/pci_intr_machdep.c:1.17 Sat Mar 14 10:49:36 2015 +++ src/sys/arch/xen/xen/pci_intr_machdep.c Sun Jul 16 06:14:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_intr_machdep.c,v 1.17 2015/03/14 10:49:36 bouyer Exp $ */ +/* $NetBSD: pci_intr_machdep.c,v 1.18 2017/07/16 06:14:24 cherry Exp $ */ /* * Copyright (c) 2005 Manuel Bouyer. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci_intr_machdep.c,v 1.17 2015/03/14 10:49:36 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_intr_machdep.c,v 1.18 2017/07/16 06:14:24 cherry Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -66,6 +66,7 @@ pci_intr_map(const struct pci_attach_arg { int pin; int line; + int evtch; #if NIOAPIC > 0 int rawpin = pa->pa_rawintrpin; @@ -85,17 +86,17 @@ pci_intr_map(const struct pci_attach_arg printf("pci_intr_map: bad interrupt pin %d\n", pin); goto bad; } - ihp->pirq = 0; + *ihp = 0; #if NIOAPIC > 0 pci_decompose_tag(pc, pa->pa_tag, &bus, &dev, &func); if (mp_busses != NULL) { if (intr_find_mpmapping(bus, (dev<<2)|(rawpin-1), ihp) == 0) { - if (ihp->pirq & APIC_INT_VIA_APIC) { + if (*ihp & APIC_INT_VIA_APIC) { /* make sure a new IRQ will be allocated */ - ihp->pirq &= ~0xff; + *ihp &= ~0xff; } else { - ihp->pirq |= line; + *ihp |= line; } goto end; } @@ -124,8 +125,8 @@ pci_intr_map(const struct pci_attach_arg #if NIOAPIC > 0 if (mp_busses != NULL) { if (intr_find_mpmapping(mp_isa_bus, line, ihp) == 0) { - if ((ihp->pirq & 0xff) == 0) - ihp->pirq |= line; + if ((*ihp & 0xff) == 0) + *ihp |= line; goto end; } printf("pci_intr_map: bus %d dev %d func %d pin %d; line %d\n", @@ -134,20 +135,19 @@ pci_intr_map(const struct pci_attach_arg } #endif /* NIOAPIC */ - ihp->pirq = line; + *ihp = line; #if NIOAPIC > 0 end: #endif - ihp->evtch = xen_intr_map(&ihp->pirq, IST_LEVEL); - if (ihp->evtch == -1) + evtch = xen_intr_map((int *)ihp, IST_LEVEL); + if (evtch == -1) goto bad; return 0; bad: - ihp->pirq = -1; - ihp->evtch = -1; + *ihp = -1; return 1; } @@ -155,23 +155,26 @@ const char * pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih, char *buf, size_t len) { + int evtch; + + evtch = get_pirq_to_evtch(APIC_IRQ_LEGACY_IRQ(ih)); #if NIOAPIC > 0 struct ioapic_softc *pic; - if (ih.pirq & APIC_INT_VIA_APIC) { - pic = ioapic_find(APIC_IRQ_APIC(ih.pirq)); + if (ih & APIC_INT_VIA_APIC) { + pic = ioapic_find(APIC_IRQ_APIC(ih)); if (pic == NULL) { printf("%s: bad ioapic %d\n", __func__, - APIC_IRQ_APIC(ih.pirq)); + APIC_IRQ_APIC(ih)); return NULL; } snprintf(buf, len, "%s pin %d, event channel %d", - device_xname(pic->sc_dev), APIC_IRQ_PIN(ih.pirq), - ih.evtch); + device_xname(pic->sc_dev), APIC_IRQ_PIN(ih), + evtch); return buf; } #endif snprintf(buf, len, "irq %d, event channel %d", - ih.pirq, ih.evtch); + ih, evtch); return buf; } @@ -201,21 +204,21 @@ pci_intr_establish(pci_chipset_tag_t pci char evname[16]; #if NIOAPIC > 0 struct ioapic_softc *pic; - if (intrh.pirq & APIC_INT_VIA_APIC) { - pic = ioapic_find(APIC_IRQ_APIC(intrh.pirq)); + if (intrh & APIC_INT_VIA_APIC) { + pic = ioapic_find(APIC_IRQ_APIC(intrh)); if (pic == NULL) { printf("pci_intr_establish: bad ioapic %d\n", - APIC_IRQ_APIC(intrh.pirq)); + APIC_IRQ_APIC(intrh)); return NULL; } snprintf(evname, sizeof(evname), "%s pin %d", - device_xname(pic->sc_dev), APIC_IRQ_PIN(intrh.pirq)); + device_xname(pic->sc_dev), APIC_IRQ_PIN(intrh)); } else #endif - snprintf(evname, sizeof(evname), "irq%d", intrh.pirq); + snprintf(evname, sizeof(evname), "irq%d", intrh); - return (void *)pirq_establish(intrh.pirq & 0xff, - intrh.evtch, func, arg, level, evname); + return (void *)pirq_establish(APIC_IRQ_LEGACY_IRQ(intrh), + get_pirq_to_evtch(APIC_IRQ_LEGACY_IRQ(intrh)), func, arg, level, evname); } void Index: src/sys/arch/xen/xen/pciback.c diff -u src/sys/arch/xen/xen/pciback.c:1.11 src/sys/arch/xen/xen/pciback.c:1.12 --- src/sys/arch/xen/xen/pciback.c:1.11 Thu Jul 7 06:55:40 2016 +++ src/sys/arch/xen/xen/pciback.c Sun Jul 16 06:14:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pciback.c,v 1.11 2016/07/07 06:55:40 msaitoh Exp $ */ +/* $NetBSD: pciback.c,v 1.12 2017/07/16 06:14:24 cherry Exp $ */ /* * Copyright (c) 2009 Manuel Bouyer. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.11 2016/07/07 06:55:40 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.12 2017/07/16 06:14:24 cherry Exp $"); #include "opt_xen.h" @@ -269,8 +269,8 @@ pciback_pci_attach(device_t parent, devi buf, sizeof(buf)); aprint_normal_dev(self, "interrupting at %s\n", intrstr); } - unbind_pirq_from_evtch(APIC_IRQ_LEGACY_IRQ(sc->sc_intrhandle.pirq)); - sc->sc_irq = APIC_IRQ_LEGACY_IRQ(sc->sc_intrhandle.pirq); + unbind_pirq_from_evtch(APIC_IRQ_LEGACY_IRQ(sc->sc_intrhandle)); + sc->sc_irq = APIC_IRQ_LEGACY_IRQ(sc->sc_intrhandle); /* XXX should be done elsewhere ? */ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_INTERRUPT_REG); reg &= ~ (PCI_INTERRUPT_LINE_MASK << PCI_INTERRUPT_LINE_SHIFT); Index: src/sys/arch/xen/xen/pciide_machdep.c diff -u src/sys/arch/xen/xen/pciide_machdep.c:1.18 src/sys/arch/xen/xen/pciide_machdep.c:1.19 --- src/sys/arch/xen/xen/pciide_machdep.c:1.18 Mon Apr 4 20:37:55 2011 +++ src/sys/arch/xen/xen/pciide_machdep.c Sun Jul 16 06:14:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pciide_machdep.c,v 1.18 2011/04/04 20:37:55 dyoung Exp $ */ +/* $NetBSD: pciide_machdep.c,v 1.19 2017/07/16 06:14:24 cherry Exp $ */ /* * Copyright (c) 1998 Christopher G. Demetriou. All rights reserved. @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pciide_machdep.c,v 1.18 2011/04/04 20:37:55 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pciide_machdep.c,v 1.19 2017/07/16 06:14:24 cherry Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -68,25 +68,25 @@ pciide_machdep_compat_intr_establish(dev { struct pintrhand *ih; char evname[16]; - struct xen_intr_handle xenih; + intr_handle_t xenih; #if NIOAPIC > 0 struct ioapic_softc *pic = NULL; #endif int evtch; - xenih.pirq = PCIIDE_COMPAT_IRQ(chan); - xenih.pirq = 0; + xenih = PCIIDE_COMPAT_IRQ(chan); + xenih = 0; #if NIOAPIC > 0 if (mp_busses != NULL) { int irq = PCIIDE_COMPAT_IRQ(chan); if (intr_find_mpmapping(mp_isa_bus, irq, &xenih) == 0 || intr_find_mpmapping(mp_eisa_bus, irq, &xenih) == 0) { - if (!APIC_IRQ_ISLEGACY(xenih.pirq)) { - pic = ioapic_find(APIC_IRQ_APIC(xenih.pirq)); + if (!APIC_IRQ_ISLEGACY(xenih)) { + pic = ioapic_find(APIC_IRQ_APIC(xenih)); if (pic == NULL) { printf("pciide_machdep_compat_intr_establish: " "unknown apic %d\n", - APIC_IRQ_APIC(xenih.pirq)); + APIC_IRQ_APIC(xenih)); return NULL; } } @@ -95,14 +95,14 @@ pciide_machdep_compat_intr_establish(dev "no MP mapping found\n"); } #endif - xenih.pirq |= PCIIDE_COMPAT_IRQ(chan); - evtch = xen_intr_map(&xenih.pirq, IST_EDGE); + xenih |= PCIIDE_COMPAT_IRQ(chan); + evtch = xen_intr_map((int *)&xenih, IST_EDGE); if (evtch == -1) return NULL; #if NIOAPIC > 0 if (pic) snprintf(evname, sizeof(evname), "%s pin %d", - device_xname(pic->sc_dev), APIC_IRQ_PIN(xenih.pirq)); + device_xname(pic->sc_dev), APIC_IRQ_PIN(xenih)); else #endif snprintf(evname, sizeof(evname), "irq%d", @@ -118,7 +118,7 @@ pciide_machdep_compat_intr_establish(dev #if NIOAPIC > 0 if (pic) printf("%s pin %d", device_xname(pic->sc_dev), - APIC_IRQ_PIN(xenih.pirq)); + APIC_IRQ_PIN(xenih)); else #endif printf("irq %d", ih->pirq);