Module Name: src
Committed By: thorpej
Date: Sat Sep 26 21:07:48 UTC 2020
Modified Files:
src/sys/arch/alpha/alpha: interrupt.c
src/sys/arch/alpha/include: intr.h pci_machdep.h
src/sys/arch/alpha/pci: pci_6600.c pci_machdep.c
Log Message:
Implement cpu_intr_redistribute() for Tusnami/Titan systems.
To generate a diff of this commit:
cvs rdiff -u -r1.90 -r1.91 src/sys/arch/alpha/alpha/interrupt.c
cvs rdiff -u -r1.81 -r1.82 src/sys/arch/alpha/include/intr.h
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/alpha/include/pci_machdep.h
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/alpha/pci/pci_6600.c
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/alpha/pci/pci_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/alpha/alpha/interrupt.c
diff -u src/sys/arch/alpha/alpha/interrupt.c:1.90 src/sys/arch/alpha/alpha/interrupt.c:1.91
--- src/sys/arch/alpha/alpha/interrupt.c:1.90 Fri Sep 25 03:40:11 2020
+++ src/sys/arch/alpha/alpha/interrupt.c Sat Sep 26 21:07:48 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: interrupt.c,v 1.90 2020/09/25 03:40:11 thorpej Exp $ */
+/* $NetBSD: interrupt.c,v 1.91 2020/09/26 21:07:48 thorpej Exp $ */
/*-
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.90 2020/09/25 03:40:11 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.91 2020/09/26 21:07:48 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -575,6 +575,8 @@ cpu_intr_p(void)
return curcpu()->ci_intrdepth != 0;
}
+void (*alpha_intr_redistribute)(void);
+
/*
* cpu_intr_redistribute:
*
@@ -583,7 +585,8 @@ cpu_intr_p(void)
void
cpu_intr_redistribute(void)
{
- /* XXX Nothing, yet. */
+ if (alpha_intr_redistribute != NULL)
+ (*alpha_intr_redistribute)();
}
/*
Index: src/sys/arch/alpha/include/intr.h
diff -u src/sys/arch/alpha/include/intr.h:1.81 src/sys/arch/alpha/include/intr.h:1.82
--- src/sys/arch/alpha/include/intr.h:1.81 Fri Sep 25 03:40:11 2020
+++ src/sys/arch/alpha/include/intr.h Sat Sep 26 21:07:48 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.81 2020/09/25 03:40:11 thorpej Exp $ */
+/* $NetBSD: intr.h,v 1.82 2020/09/26 21:07:48 thorpej Exp $ */
/*-
* Copyright (c) 2000, 2001, 2002 The NetBSD Foundation, Inc.
@@ -268,6 +268,7 @@ struct evcnt *alpha_shared_intr_evcnt(st
unsigned int);
extern struct scbvec scb_iovectab[];
+extern void (*alpha_intr_redistribute)(void);
void scb_init(void);
void scb_set(u_long, void (*)(void *, u_long), void *);
Index: src/sys/arch/alpha/include/pci_machdep.h
diff -u src/sys/arch/alpha/include/pci_machdep.h:1.20 src/sys/arch/alpha/include/pci_machdep.h:1.21
--- src/sys/arch/alpha/include/pci_machdep.h:1.20 Sat Sep 26 02:46:27 2020
+++ src/sys/arch/alpha/include/pci_machdep.h Sat Sep 26 21:07:48 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_machdep.h,v 1.20 2020/09/26 02:46:27 thorpej Exp $ */
+/* $NetBSD: pci_machdep.h,v 1.21 2020/09/26 21:07:48 thorpej Exp $ */
/*
* Copyright (c) 1996 Carnegie-Mellon University.
@@ -132,6 +132,8 @@ void *alpha_pci_generic_intr_establish(p
void alpha_pci_generic_intr_disestablish(pci_chipset_tag_t, void *);
void alpha_pci_generic_iointr(void *, unsigned long);
+void alpha_pci_generic_intr_redistribute(pci_chipset_tag_t);
+
void alpha_pci_intr_handle_init(pci_intr_handle_t *, u_int, u_int);
void alpha_pci_intr_handle_set_irq(pci_intr_handle_t *, u_int);
u_int alpha_pci_intr_handle_get_irq(const pci_intr_handle_t *);
Index: src/sys/arch/alpha/pci/pci_6600.c
diff -u src/sys/arch/alpha/pci/pci_6600.c:1.28 src/sys/arch/alpha/pci/pci_6600.c:1.29
--- src/sys/arch/alpha/pci/pci_6600.c:1.28 Sat Sep 26 02:50:41 2020
+++ src/sys/arch/alpha/pci/pci_6600.c Sat Sep 26 21:07:48 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_6600.c,v 1.28 2020/09/26 02:50:41 thorpej Exp $ */
+/* $NetBSD: pci_6600.c,v 1.29 2020/09/26 21:07:48 thorpej Exp $ */
/*-
* Copyright (c) 1999 by Ross Harvey. All rights reserved.
@@ -33,7 +33,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_6600.c,v 1.28 2020/09/26 02:50:41 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_6600.c,v 1.29 2020/09/26 21:07:48 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -98,6 +98,8 @@ static void dec_6600_intr_disable(pci_ch
static void dec_6600_intr_set_affinity(pci_chipset_tag_t, int,
struct cpu_info *);
+static void dec_6600_intr_redistribute(void);
+
/*
* We keep 2 software copies of the interrupt enables: one global one,
* and one per-CPU for setting the interrupt affinity.
@@ -132,6 +134,8 @@ pci_6600_pickintr(struct tsp_config *pcp
pc->pc_intr_disable = dec_6600_intr_disable;
pc->pc_intr_set_affinity = dec_6600_intr_set_affinity;
+ alpha_intr_redistribute = dec_6600_intr_redistribute;
+
/* Note eligible CPUs for interrupt routing purposes. */
for (CPU_INFO_FOREACH(cii, ci)) {
KASSERT(ci->ci_cpuid < 4);
@@ -396,6 +400,17 @@ dec_6600_intr_set_affinity(pci_chipset_t
dec_6600_intr_program(pc);
}
+static void
+dec_6600_intr_redistribute(void)
+{
+ KASSERT(sioprimary != NULL);
+
+ pci_chipset_tag_t const pc = &sioprimary->pc_pc;
+
+ /* ISA interrupts always stay on primary. Shuffle PCI interrupts. */
+ alpha_pci_generic_intr_redistribute(pc);
+}
+
static void *
dec_6600_pciide_compat_intr_establish(device_t dev,
const struct pci_attach_args *pa, int chan, int (*func)(void *), void *arg)
Index: src/sys/arch/alpha/pci/pci_machdep.c
diff -u src/sys/arch/alpha/pci/pci_machdep.c:1.27 src/sys/arch/alpha/pci/pci_machdep.c:1.28
--- src/sys/arch/alpha/pci/pci_machdep.c:1.27 Sat Sep 26 02:46:28 2020
+++ src/sys/arch/alpha/pci/pci_machdep.c Sat Sep 26 21:07:48 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_machdep.c,v 1.27 2020/09/26 02:46:28 thorpej Exp $ */
+/* $NetBSD: pci_machdep.c,v 1.28 2020/09/26 21:07:48 thorpej Exp $ */
/*-
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.27 2020/09/26 02:46:28 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.28 2020/09/26 21:07:48 thorpej Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -378,6 +378,45 @@ alpha_pci_generic_iointr(void * const ar
}
}
+void
+alpha_pci_generic_intr_redistribute(pci_chipset_tag_t const pc)
+{
+ struct cpu_info *current_ci, *new_ci;
+ unsigned int irq;
+
+ KASSERT(mutex_owned(&cpu_lock));
+ KASSERT(mp_online);
+
+ /* If we can't set affinity, then there's nothing to do. */
+ if (pc->pc_eligible_cpus == 0 || pc->pc_intr_set_affinity == NULL) {
+ return;
+ }
+
+ /*
+ * Look at each IRQ, and allocate a new CPU for each IRQ
+ * that's being serviced by a now-shielded CPU.
+ */
+ for (irq = 0; irq < pc->pc_nirq; irq++) {
+ current_ci =
+ alpha_shared_intr_get_cpu(pc->pc_shared_intrs, irq);
+ if (current_ci == NULL ||
+ (current_ci->ci_schedstate.spc_flags & SPCF_NOINTR) == 0) {
+ continue;
+ }
+
+ new_ci = alpha_pci_generic_intr_select_cpu(pc, irq, 0);
+ if (new_ci == current_ci) {
+ /* Can't shield this one. */
+ continue;
+ }
+
+ alpha_shared_intr_set_cpu(pc->pc_shared_intrs, irq, new_ci);
+ pc->pc_intr_set_affinity(pc, irq, new_ci);
+ }
+
+ /* XXX should now re-balance */
+}
+
#define ALPHA_PCI_INTR_HANDLE_IRQ __BITS(0,31)
#define ALPHA_PCI_INTR_HANDLE_FLAGS __BITS(32,63)