Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/x86/x86 Towards bifurcating XEN and native interrup...
details: https://anonhg.NetBSD.org/src/rev/0dd4b10c39db
branches: trunk
changeset: 995490:0dd4b10c39db
user: cherry <cherry%NetBSD.org@localhost>
date: Mon Dec 24 22:05:45 2018 +0000
description:
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
diffstat:
sys/arch/x86/x86/intr.c | 145 +----------------------------------------
sys/arch/x86/x86/mp.c | 140 +++++++++++++++++++++++++++++++++++++++-
sys/arch/x86/x86/x86_machdep.c | 31 ++++++++-
3 files changed, 169 insertions(+), 147 deletions(-)
diffs (truncated from 407 to 300 lines):
diff -r 5965e178c797 -r 0dd4b10c39db sys/arch/x86/x86/intr.c
--- a/sys/arch/x86/x86/intr.c Mon Dec 24 22:02:32 2018 +0000
+++ b/sys/arch/x86/x86/intr.c Mon Dec 24 22:05:45 2018 +0000
@@ -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 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 @@
}
/*
- * 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 @@
#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)
/*
diff -r 5965e178c797 -r 0dd4b10c39db sys/arch/x86/x86/mp.c
--- a/sys/arch/x86/x86/mp.c Mon Dec 24 22:02:32 2018 +0000
+++ b/sys/arch/x86/x86/mp.c Mon Dec 24 22:05:45 2018 +0000
@@ -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 @@
#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 @@
}
}
#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)
+{
Home |
Main Index |
Thread Index |
Old Index