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)
 

Reply via email to