Module Name: src Committed By: cherry Date: Mon Dec 24 22:05:45 UTC 2018
Modified Files: src/sys/arch/x86/x86: intr.c mp.c x86_machdep.c Log Message: Towards bifurcating XEN and native interrupt related functions, this is a preliminary cleanup sweep. Move functions related to MP bus probe and scanning to x86/mp.c Move generic platform pic search function to x86/x86_machdep.c To generate a diff of this commit: cvs rdiff -u -r1.139 -r1.140 src/sys/arch/x86/x86/intr.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/x86/x86/mp.c cvs rdiff -u -r1.120 -r1.121 src/sys/arch/x86/x86/x86_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/x86/intr.c diff -u src/sys/arch/x86/x86/intr.c:1.139 src/sys/arch/x86/x86/intr.c:1.140 --- src/sys/arch/x86/x86/intr.c:1.139 Mon Dec 24 14:55:41 2018 +++ src/sys/arch/x86/x86/intr.c Mon Dec 24 22:05:45 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: intr.c,v 1.139 2018/12/24 14:55:41 cherry Exp $ */ +/* $NetBSD: intr.c,v 1.140 2018/12/24 22:05:45 cherry Exp $ */ /* * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -133,7 +133,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.139 2018/12/24 14:55:41 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.140 2018/12/24 22:05:45 cherry Exp $"); #include "opt_intrdebug.h" #include "opt_multiprocessor.h" @@ -220,13 +220,6 @@ static SIMPLEQ_HEAD(, intrsource) io_int static kmutex_t intr_distribute_lock; -#if NIOAPIC > 0 || NACPICA > 0 -static int intr_scan_bus(int, int, intr_handle_t *); -#if NPCI > 0 -static int intr_find_pcibridge(int, pcitag_t *, pci_chipset_tag_t *); -#endif -#endif - #if !defined(XEN) static int intr_allocate_slot_cpu(struct cpu_info *, struct pic *, int, int *, struct intrsource *); @@ -374,123 +367,6 @@ intr_calculatemasks(struct cpu_info *ci) } /* - * List to keep track of PCI buses that are probed but not known - * to the firmware. Used to - * - * XXX should maintain one list, not an array and a linked list. - */ -#if (NPCI > 0) && ((NIOAPIC > 0) || NACPICA > 0) -struct intr_extra_bus { - int bus; - pcitag_t *pci_bridge_tag; - pci_chipset_tag_t pci_chipset_tag; - LIST_ENTRY(intr_extra_bus) list; -}; - -LIST_HEAD(, intr_extra_bus) intr_extra_buses = - LIST_HEAD_INITIALIZER(intr_extra_buses); - - -void -intr_add_pcibus(struct pcibus_attach_args *pba) -{ - struct intr_extra_bus *iebp; - - iebp = kmem_alloc(sizeof(*iebp), KM_SLEEP); - iebp->bus = pba->pba_bus; - iebp->pci_chipset_tag = pba->pba_pc; - iebp->pci_bridge_tag = pba->pba_bridgetag; - LIST_INSERT_HEAD(&intr_extra_buses, iebp, list); -} - -static int -intr_find_pcibridge(int bus, pcitag_t *pci_bridge_tag, - pci_chipset_tag_t *pc) -{ - struct intr_extra_bus *iebp; - struct mp_bus *mpb; - - if (bus < 0) - return ENOENT; - - if (bus < mp_nbus) { - mpb = &mp_busses[bus]; - if (mpb->mb_pci_bridge_tag == NULL) - return ENOENT; - *pci_bridge_tag = *mpb->mb_pci_bridge_tag; - *pc = mpb->mb_pci_chipset_tag; - return 0; - } - - LIST_FOREACH(iebp, &intr_extra_buses, list) { - if (iebp->bus == bus) { - if (iebp->pci_bridge_tag == NULL) - return ENOENT; - *pci_bridge_tag = *iebp->pci_bridge_tag; - *pc = iebp->pci_chipset_tag; - return 0; - } - } - return ENOENT; -} -#endif - -#if NIOAPIC > 0 || NACPICA > 0 -/* - * 'pin' argument pci bus_pin encoding of a device/pin combination. - */ -int -intr_find_mpmapping(int bus, int pin, intr_handle_t *handle) -{ - -#if NPCI > 0 - while (intr_scan_bus(bus, pin, handle) != 0) { - int dev, func; - pcitag_t pci_bridge_tag; - pci_chipset_tag_t pc; - - if (intr_find_pcibridge(bus, &pci_bridge_tag, &pc) != 0) - return ENOENT; - dev = pin >> 2; - pin = pin & 3; - pin = PPB_INTERRUPT_SWIZZLE(pin + 1, dev) - 1; - pci_decompose_tag(pc, pci_bridge_tag, &bus, &dev, &func); - pin |= (dev << 2); - } - return 0; -#else - return intr_scan_bus(bus, pin, handle); -#endif -} - -static int -intr_scan_bus(int bus, int pin, intr_handle_t *handle) -{ - struct mp_intr_map *mip, *intrs; - - if (bus < 0 || bus >= mp_nbus) - return ENOENT; - - intrs = mp_busses[bus].mb_intrs; - if (intrs == NULL) - return ENOENT; - - for (mip = intrs; mip != NULL; mip = mip->next) { - if (mip->bus_pin == pin) { -#if NACPICA > 0 - if (mip->linkdev != NULL) - if (mpacpi_findintr_linkdev(mip) != 0) - continue; -#endif - *handle = mip->ioapic_ih; - return 0; - } - } - return ENOENT; -} -#endif - -/* * Create an interrupt id such as "ioapic0 pin 9". This interrupt id is used * by MI code and intrctl(8). */ @@ -852,23 +728,6 @@ intr_biglock_wrapper(void *vp) #endif /* MULTIPROCESSOR */ #endif /* XEN */ -#if defined(DOM0OPS) || !defined(XEN) -struct pic * -intr_findpic(int num) -{ -#if NIOAPIC > 0 - struct ioapic_softc *pic; - - pic = ioapic_find_bybase(num); - if (pic != NULL) - return &pic->sc_pic; -#endif - if (num < NUM_LEGACY_IRQS) - return &i8259_pic; - - return NULL; -} -#endif #if !defined(XEN) /* Index: src/sys/arch/x86/x86/mp.c diff -u src/sys/arch/x86/x86/mp.c:1.3 src/sys/arch/x86/x86/mp.c:1.4 --- src/sys/arch/x86/x86/mp.c:1.3 Fri Jul 1 18:21:31 2011 +++ src/sys/arch/x86/x86/mp.c Mon Dec 24 22:05:45 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mp.c,v 1.3 2011/07/01 18:21:31 dyoung Exp $ */ +/* $NetBSD: mp.c,v 1.4 2018/12/24 22:05:45 cherry Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -36,9 +36,13 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mp.c,v 1.3 2011/07/01 18:21:31 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mp.c,v 1.4 2018/12/24 22:05:45 cherry Exp $"); #include "opt_multiprocessor.h" +#include "opt_acpi.h" + +#include "acpica.h" +#include "ioapic.h" #include "pchb.h" #include <sys/param.h> @@ -59,6 +63,21 @@ __KERNEL_RCSID(0, "$NetBSD: mp.c,v 1.3 2 #include "pci.h" #include "locators.h" +#if NIOAPIC > 0 || NACPICA > 0 +#include <machine/mpacpi.h> +#endif + +#if NPCI > 0 +#include <dev/pci/ppbreg.h> +#endif + +#if NIOAPIC > 0 || NACPICA > 0 +static int intr_scan_bus(int, int, intr_handle_t *); +#if NPCI > 0 +static int intr_find_pcibridge(int, pcitag_t *, pci_chipset_tag_t *); +#endif +#endif + #if NPCI > 0 int mp_pci_scan(device_t self, struct pcibus_attach_args *pba, @@ -97,3 +116,120 @@ mp_pci_childdetached(device_t self, devi } } #endif + +/* + * List to keep track of PCI buses that are probed but not known + * to the firmware. Used to + * + * XXX should maintain one list, not an array and a linked list. + */ +#if (NPCI > 0) && ((NIOAPIC > 0) || NACPICA > 0) +struct intr_extra_bus { + int bus; + pcitag_t *pci_bridge_tag; + pci_chipset_tag_t pci_chipset_tag; + LIST_ENTRY(intr_extra_bus) list; +}; + +LIST_HEAD(, intr_extra_bus) intr_extra_buses = + LIST_HEAD_INITIALIZER(intr_extra_buses); + + +void +intr_add_pcibus(struct pcibus_attach_args *pba) +{ + struct intr_extra_bus *iebp; + + iebp = kmem_alloc(sizeof(*iebp), KM_SLEEP); + iebp->bus = pba->pba_bus; + iebp->pci_chipset_tag = pba->pba_pc; + iebp->pci_bridge_tag = pba->pba_bridgetag; + LIST_INSERT_HEAD(&intr_extra_buses, iebp, list); +} + +static int +intr_find_pcibridge(int bus, pcitag_t *pci_bridge_tag, + pci_chipset_tag_t *pc) +{ + struct intr_extra_bus *iebp; + struct mp_bus *mpb; + + if (bus < 0) + return ENOENT; + + if (bus < mp_nbus) { + mpb = &mp_busses[bus]; + if (mpb->mb_pci_bridge_tag == NULL) + return ENOENT; + *pci_bridge_tag = *mpb->mb_pci_bridge_tag; + *pc = mpb->mb_pci_chipset_tag; + return 0; + } + + LIST_FOREACH(iebp, &intr_extra_buses, list) { + if (iebp->bus == bus) { + if (iebp->pci_bridge_tag == NULL) + return ENOENT; + *pci_bridge_tag = *iebp->pci_bridge_tag; + *pc = iebp->pci_chipset_tag; + return 0; + } + } + return ENOENT; +} +#endif + +#if NIOAPIC > 0 || NACPICA > 0 +/* + * 'pin' argument pci bus_pin encoding of a device/pin combination. + */ +int +intr_find_mpmapping(int bus, int pin, intr_handle_t *handle) +{ + +#if NPCI > 0 + while (intr_scan_bus(bus, pin, handle) != 0) { + int dev, func; + pcitag_t pci_bridge_tag; + pci_chipset_tag_t pc; + + if (intr_find_pcibridge(bus, &pci_bridge_tag, &pc) != 0) + return ENOENT; + dev = pin >> 2; + pin = pin & 3; + pin = PPB_INTERRUPT_SWIZZLE(pin + 1, dev) - 1; + pci_decompose_tag(pc, pci_bridge_tag, &bus, &dev, &func); + pin |= (dev << 2); + } + return 0; +#else + return intr_scan_bus(bus, pin, handle); +#endif +} + +static int +intr_scan_bus(int bus, int pin, intr_handle_t *handle) +{ + struct mp_intr_map *mip, *intrs; + + if (bus < 0 || bus >= mp_nbus) + return ENOENT; + + intrs = mp_busses[bus].mb_intrs; + if (intrs == NULL) + return ENOENT; + + for (mip = intrs; mip != NULL; mip = mip->next) { + if (mip->bus_pin == pin) { +#if NACPICA > 0 + if (mip->linkdev != NULL) + if (mpacpi_findintr_linkdev(mip) != 0) + continue; +#endif + *handle = mip->ioapic_ih; + return 0; + } + } + return ENOENT; +} +#endif Index: src/sys/arch/x86/x86/x86_machdep.c diff -u src/sys/arch/x86/x86/x86_machdep.c:1.120 src/sys/arch/x86/x86/x86_machdep.c:1.121 --- src/sys/arch/x86/x86/x86_machdep.c:1.120 Wed Sep 19 16:23:05 2018 +++ src/sys/arch/x86/x86/x86_machdep.c Mon Dec 24 22:05:45 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: x86_machdep.c,v 1.120 2018/09/19 16:23:05 maxv Exp $ */ +/* $NetBSD: x86_machdep.c,v 1.121 2018/12/24 22:05:45 cherry Exp $ */ /*- * Copyright (c) 2002, 2006, 2007 YAMAMOTO Takashi, @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.120 2018/09/19 16:23:05 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.121 2018/12/24 22:05:45 cherry Exp $"); #include "opt_modular.h" #include "opt_physmem.h" @@ -74,10 +74,17 @@ __KERNEL_RCSID(0, "$NetBSD: x86_machdep. #include "tsc.h" #include "acpica.h" +#include "ioapic.h" +#include "lapic.h" + #if NACPICA > 0 #include <dev/acpi/acpivar.h> #endif +#if NIOAPIC > 0 || NACPICA > 0 +#include <machine/i82093var.h> +#endif + #include "opt_md.h" #if defined(MEMORY_DISK_HOOKS) && defined(MEMORY_DISK_DYNAMIC) #include <dev/md.h> @@ -1298,3 +1305,23 @@ SYSCTL_SETUP(sysctl_machdep_setup, "sysc CPU_BIOSEXTMEM); #endif } + +/* Here for want of a better place */ +#if defined(DOM0OPS) || !defined(XEN) +struct pic * +intr_findpic(int num) +{ +#if NIOAPIC > 0 + struct ioapic_softc *pic; + + pic = ioapic_find_bybase(num); + if (pic != NULL) + return &pic->sc_pic; +#endif + if (num < NUM_LEGACY_IRQS) + return &i8259_pic; + + return NULL; +} +#endif +