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)