Module Name:    src
Committed By:   jmcneill
Date:           Fri Jul 17 21:59:30 UTC 2020

Modified Files:
        src/sys/arch/mips/cavium: octeon_cpunode.c octeon_intr.c octeonvar.h
        src/sys/arch/mips/cavium/dev: octeon_ciureg.h
        src/sys/arch/mips/mips: cpu_subr.c

Log Message:
Remove 2 CPU limit in OCTEON interrupt controller driver.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/mips/cavium/octeon_cpunode.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/mips/cavium/octeon_intr.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/mips/cavium/octeonvar.h
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/mips/cavium/dev/octeon_ciureg.h
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/mips/mips/cpu_subr.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/mips/cavium/octeon_cpunode.c
diff -u src/sys/arch/mips/cavium/octeon_cpunode.c:1.13 src/sys/arch/mips/cavium/octeon_cpunode.c:1.14
--- src/sys/arch/mips/cavium/octeon_cpunode.c:1.13	Tue Jun 23 05:14:18 2020
+++ src/sys/arch/mips/cavium/octeon_cpunode.c	Fri Jul 17 21:59:30 2020
@@ -29,7 +29,7 @@
 #define __INTR_PRIVATE
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: octeon_cpunode.c,v 1.13 2020/06/23 05:14:18 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: octeon_cpunode.c,v 1.14 2020/07/17 21:59:30 jmcneill Exp $");
 
 #include "locators.h"
 #include "cpunode.h"
@@ -55,6 +55,8 @@ __KERNEL_RCSID(0, "$NetBSD: octeon_cpuno
 #include <mips/cavium/dev/octeon_ciureg.h>
 #include <mips/cavium/dev/octeon_corereg.h>
 
+extern struct cpu_softc octeon_cpu_softc[];
+
 struct cpunode_attach_args {
 	const char *cnaa_name;
 	int cnaa_cpunum;
@@ -291,7 +293,6 @@ cpu_cpunode_attach(device_t parent, devi
 		return;
 	}
 #ifdef MULTIPROCESSOR
-	KASSERTMSG(cpunum == 1, "cpunum %d", cpunum);
 	if (!kcpuset_isset(cpus_booted, cpunum)) {
 		aprint_naive(" disabled\n");
 		aprint_normal(" disabled (unresponsive)\n");
@@ -299,7 +300,7 @@ cpu_cpunode_attach(device_t parent, devi
 	}
 	struct cpu_info * const ci = cpu_info_alloc(NULL, cpunum, 0, cpunum, 0);
 
-	ci->ci_softc = &octeon_cpu1_softc;
+	ci->ci_softc = &octeon_cpu_softc[cpunum];
 	ci->ci_softc->cpu_ci = ci;
 
 	cpu_cpunode_attach_common(self, ci);

Index: src/sys/arch/mips/cavium/octeon_intr.c
diff -u src/sys/arch/mips/cavium/octeon_intr.c:1.17 src/sys/arch/mips/cavium/octeon_intr.c:1.18
--- src/sys/arch/mips/cavium/octeon_intr.c:1.17	Fri Jul 17 19:40:47 2020
+++ src/sys/arch/mips/cavium/octeon_intr.c	Fri Jul 17 21:59:30 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: octeon_intr.c,v 1.17 2020/07/17 19:40:47 jmcneill Exp $	*/
+/*	$NetBSD: octeon_intr.c,v 1.18 2020/07/17 21:59:30 jmcneill Exp $	*/
 /*
  * Copyright 2001, 2002 Wasabi Systems, Inc.
  * All rights reserved.
@@ -44,7 +44,7 @@
 #define __INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: octeon_intr.c,v 1.17 2020/07/17 19:40:47 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: octeon_intr.c,v 1.18 2020/07/17 21:59:30 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -199,158 +199,79 @@ struct octeon_intrhand *octciu_intrs[NIR
 
 kmutex_t octeon_intr_lock;
 
-#define X(a)	MIPS_PHYS_TO_XKPHYS(OCTEON_CCA_NONE, (a))
-
-struct cpu_softc octeon_cpu0_softc = {
-	.cpu_ci = &cpu_info_store,
-	.cpu_int0_sum0 = X(CIU_INT0_SUM0),
-	.cpu_int1_sum0 = X(CIU_INT1_SUM0),
-	.cpu_int2_sum0 = X(CIU_INT4_SUM0),
-
-	.cpu_int_sum1 = X(CIU_INT_SUM1),
-
-	.cpu_int0_en[0] = X(CIU_INT0_EN0),
-	.cpu_int1_en[0] = X(CIU_INT1_EN0),
-	.cpu_int2_en[0] = X(CIU_INT4_EN00),
-
-	.cpu_int0_en[1] = X(CIU_INT0_EN1),
-	.cpu_int1_en[1] = X(CIU_INT1_EN1),
-	.cpu_int2_en[1] = X(CIU_INT4_EN01),
-
-	.cpu_int32_en = X(CIU_INT32_EN0),
-
-	.cpu_wdog = X(CIU_WDOG0),
-	.cpu_pp_poke = X(CIU_PP_POKE0),
-
-#ifdef MULTIPROCESSOR
-	.cpu_mbox_set = X(CIU_MBOX_SET0),
-	.cpu_mbox_clr = X(CIU_MBOX_CLR0),
+#if defined(MULTIPROCESSOR)
+#define	OCTEON_NCPU	MAXCPUS
+#else
+#define	OCTEON_NCPU	1
 #endif
-};
 
-#ifdef MULTIPROCESSOR
-/* XXX limit of two CPUs ... */
-struct cpu_softc octeon_cpu1_softc = {
-	.cpu_int0_sum0 = X(CIU_INT2_SUM0),
-	.cpu_int1_sum0 = X(CIU_INT3_SUM0),
-	.cpu_int2_sum0 = X(CIU_INT4_SUM1),
-
-	.cpu_int_sum1 = X(CIU_INT_SUM1),
-
-	.cpu_int0_en[0] = X(CIU_INT2_EN0),
-	.cpu_int1_en[0] = X(CIU_INT3_EN0),
-	.cpu_int2_en[0] = X(CIU_INT4_EN10),
-
-	.cpu_int0_en[1] = X(CIU_INT2_EN1),
-	.cpu_int1_en[1] = X(CIU_INT3_EN1),
-	.cpu_int2_en[1] = X(CIU_INT4_EN11),
+struct cpu_softc octeon_cpu_softc[OCTEON_NCPU];
 
-	.cpu_int32_en = X(CIU_INT32_EN1),
-
-	.cpu_wdog = X(CIU_WDOG(1)),
-	.cpu_pp_poke = X(CIU_PP_POKE1),
-
-	.cpu_mbox_set = X(CIU_MBOX_SET1),
-	.cpu_mbox_clr = X(CIU_MBOX_CLR1),
-};
-#endif
-
-#ifdef DEBUG
 static void
-octeon_mbox_test(void)
+octeon_intr_setup(void)
 {
-	const uint64_t mbox_clr0 = X(CIU_MBOX_CLR0);
-	const uint64_t mbox_clr1 = X(CIU_MBOX_CLR1);
-	const uint64_t mbox_set0 = X(CIU_MBOX_SET0);
-	const uint64_t mbox_set1 = X(CIU_MBOX_SET1);
-	const uint64_t int_sum0 = X(CIU_INT0_SUM0);
-	const uint64_t int_sum1 = X(CIU_INT2_SUM0);
-	const uint64_t sum_mbox_lo = __BIT(CIU_INT_MBOX_15_0);
-	const uint64_t sum_mbox_hi = __BIT(CIU_INT_MBOX_31_16);
-
-	mips3_sd(mbox_clr0, ~0ULL);
-	mips3_sd(mbox_clr1, ~0ULL);
-
-	uint32_t mbox0 = mips3_ld(mbox_set0);
-	uint32_t mbox1 = mips3_ld(mbox_set1);
-
-	KDASSERTMSG(mbox0 == 0, "mbox0 %#x mbox1 %#x", mbox0, mbox1);
-	KDASSERTMSG(mbox1 == 0, "mbox0 %#x mbox1 %#x", mbox0, mbox1);
-
-	mips3_sd(mbox_set0, __BIT(0));
-
-	mbox0 = mips3_ld(mbox_set0);
-	mbox1 = mips3_ld(mbox_set1);
+	struct cpu_softc *cpu;
+	int cpunum;
 
-	KDASSERTMSG(mbox0 == 1, "mbox0 %#x mbox1 %#x", mbox0, mbox1);
-	KDASSERTMSG(mbox1 == 0, "mbox0 %#x mbox1 %#x", mbox0, mbox1);
-
-	uint64_t sum0 = mips3_ld(int_sum0);
-	uint64_t sum1 = mips3_ld(int_sum1);
-
-	KDASSERTMSG((sum0 & sum_mbox_lo) != 0, "sum0 %#"PRIx64, sum0);
-	KDASSERTMSG((sum0 & sum_mbox_hi) == 0, "sum0 %#"PRIx64, sum0);
-
-	KDASSERTMSG((sum1 & sum_mbox_lo) == 0, "sum1 %#"PRIx64, sum1);
-	KDASSERTMSG((sum1 & sum_mbox_hi) == 0, "sum1 %#"PRIx64, sum1);
+#define X(a)	MIPS_PHYS_TO_XKPHYS(OCTEON_CCA_NONE, (a))
 
-	mips3_sd(mbox_clr0, mbox0);
-	mbox0 = mips3_ld(mbox_set0);
-	KDASSERTMSG(mbox0 == 0, "mbox0 %#x", mbox0);
+	for (cpunum = 0; cpunum < OCTEON_NCPU; cpunum++) {
+		cpu = &octeon_cpu_softc[cpunum];
 
-	mips3_sd(mbox_set0, __BIT(16));
+		cpu->cpu_ip2_sum0 = X(CIU_IP2_SUM0(cpunum));
+		cpu->cpu_ip3_sum0 = X(CIU_IP3_SUM0(cpunum));
+		cpu->cpu_ip4_sum0 = X(CIU_IP4_SUM0(cpunum));
 
-	mbox0 = mips3_ld(mbox_set0);
-	mbox1 = mips3_ld(mbox_set1);
+		cpu->cpu_int_sum1 = X(CIU_INT_SUM1);
 
-	KDASSERTMSG(mbox0 == __BIT(16), "mbox0 %#x", mbox0);
-	KDASSERTMSG(mbox1 == 0, "mbox1 %#x", mbox1);
+		cpu->cpu_ip2_en[0] = X(CIU_IP2_EN0(cpunum));
+		cpu->cpu_ip3_en[0] = X(CIU_IP3_EN0(cpunum));
+		cpu->cpu_ip4_en[0] = X(CIU_IP4_EN0(cpunum));
 
-	sum0 = mips3_ld(int_sum0);
-	sum1 = mips3_ld(int_sum1);
+		cpu->cpu_ip2_en[1] = X(CIU_IP2_EN1(cpunum));
+		cpu->cpu_ip3_en[1] = X(CIU_IP3_EN1(cpunum));
+		cpu->cpu_ip4_en[1] = X(CIU_IP4_EN1(cpunum));
 
-	KDASSERTMSG((sum0 & sum_mbox_lo) == 0, "sum0 %#"PRIx64, sum0);
-	KDASSERTMSG((sum0 & sum_mbox_hi) != 0, "sum0 %#"PRIx64, sum0);
+		cpu->cpu_wdog = X(CIU_WDOG(cpunum));
+		cpu->cpu_pp_poke = X(CIU_PP_POKE(cpunum));
 
-	KDASSERTMSG((sum1 & sum_mbox_lo) == 0, "sum1 %#"PRIx64, sum1);
-	KDASSERTMSG((sum1 & sum_mbox_hi) == 0, "sum1 %#"PRIx64, sum1);
-}
+#ifdef MULTIPROCESSOR
+		cpu->cpu_mbox_set = X(CIU_MBOX_SET(cpunum));
+		cpu->cpu_mbox_clr = X(CIU_MBOX_CLR(cpunum));
 #endif
+	}
 
 #undef X
 
+}
+
 void
 octeon_intr_init(struct cpu_info *ci)
 {
-#ifdef DIAGNOSTIC
 	const int cpunum = cpu_index(ci);
-#endif
+	struct cpu_softc *cpu = &octeon_cpu_softc[cpunum];
 	const char * const xname = cpu_name(ci);
-	struct cpu_softc *cpu = ci->ci_softc;
 	int bank;
 
+	cpu->cpu_ci = ci;
+	ci->ci_softc = cpu;
+
+	KASSERT(cpunum == ci->ci_cpuid);
 
 	if (ci->ci_cpuid == 0) {
-		KASSERT(ci->ci_softc == &octeon_cpu0_softc);
 		ipl_sr_map = octeon_ipl_sr_map;
 		mutex_init(&octeon_intr_lock, MUTEX_DEFAULT, IPL_HIGH);
 #ifdef MULTIPROCESSOR
 		mips_locoresw.lsw_send_ipi = octeon_send_ipi;
 #endif
-#ifdef DEBUG
-		octeon_mbox_test();
-#endif
-	} else {
-		KASSERT(cpunum == 1);
-#ifdef MULTIPROCESSOR
-		KASSERT(ci->ci_softc == &octeon_cpu1_softc);
-#endif
+
+		octeon_intr_setup();
 	}
 
 #ifdef MULTIPROCESSOR
 	// Enable the IPIs
-	cpu->cpu_int1_enable[0] |= __BIT(CIU_INT_MBOX_15_0);
-	cpu->cpu_int2_enable[0] |= __BIT(CIU_INT_MBOX_31_16);
+	cpu->cpu_ip3_enable[0] |= __BIT(CIU_INT_MBOX_15_0);
+	cpu->cpu_ip4_enable[0] |= __BIT(CIU_INT_MBOX_31_16);
 #endif
 
 	if (ci->ci_dev) {
@@ -359,20 +280,18 @@ octeon_intr_init(struct cpu_info *ci)
 			    "enabling intr masks %u "
 			    " %#"PRIx64"/%#"PRIx64"/%#"PRIx64"\n",
 			    bank,
-			    cpu->cpu_int0_enable[0],
-			    cpu->cpu_int1_enable[0],
-			    cpu->cpu_int2_enable[0]);
+			    cpu->cpu_ip2_enable[bank],
+			    cpu->cpu_ip3_enable[bank],
+			    cpu->cpu_ip4_enable[bank]);
 		}
 	}
 
 	for (bank = 0; bank < NBANKS; bank++) {
-		mips3_sd(cpu->cpu_int0_en[bank], cpu->cpu_int0_enable[bank]);
-		mips3_sd(cpu->cpu_int1_en[bank], cpu->cpu_int1_enable[bank]);
-		mips3_sd(cpu->cpu_int2_en[bank], cpu->cpu_int2_enable[bank]);
+		mips3_sd(cpu->cpu_ip2_en[bank], cpu->cpu_ip2_enable[bank]);
+		mips3_sd(cpu->cpu_ip3_en[bank], cpu->cpu_ip3_enable[bank]);
+		mips3_sd(cpu->cpu_ip4_en[bank], cpu->cpu_ip4_enable[bank]);
 	}
 
-	mips3_sd(cpu->cpu_int32_en, 0);
-
 #ifdef MULTIPROCESSOR
 	mips3_sd(cpu->cpu_mbox_clr, __BITS(31,0));
 #endif
@@ -409,6 +328,8 @@ void *
 octeon_intr_establish(int irq, int ipl, int (*func)(void *), void *arg)
 {
 	struct octeon_intrhand *ih;
+	struct cpu_softc *cpu;
+	int cpunum;
 
 	if (irq >= NIRQS)
 		panic("octeon_intr_establish: bogus IRQ %d", irq);
@@ -440,36 +361,33 @@ octeon_intr_establish(int irq, int ipl, 
 	 */
 	const int bank = irq / 64;
 	const uint64_t irq_mask = __BIT(irq % 64);
-	struct cpu_softc * const cpu0 = &octeon_cpu0_softc;
-#if MULTIPROCESSOR
-	struct cpu_softc * const cpu1 = &octeon_cpu1_softc;
-#endif
 
 	switch (ipl) {
 	case IPL_VM:
-		cpu0->cpu_int0_enable[bank] |= irq_mask;
-		mips3_sd(cpu0->cpu_int0_en[bank], cpu0->cpu_int0_enable[bank]);
+		cpu = &octeon_cpu_softc[0];
+		cpu->cpu_ip2_enable[bank] |= irq_mask;
+		mips3_sd(cpu->cpu_ip2_en[bank], cpu->cpu_ip2_enable[bank]);
 		break;
 
 	case IPL_SCHED:
-		cpu0->cpu_int1_enable[bank] |= irq_mask;
-		mips3_sd(cpu0->cpu_int1_en[bank], cpu0->cpu_int1_enable[bank]);
-#ifdef MULTIPROCESSOR
-		cpu1->cpu_int1_enable[bank] = cpu0->cpu_int1_enable[bank];
-		mips3_sd(cpu1->cpu_int1_en[bank], cpu1->cpu_int1_enable[bank]);
-#endif
-
+		for (cpunum = 0; cpunum < OCTEON_NCPU; cpunum++) {
+			cpu = &octeon_cpu_softc[cpunum];
+			if (cpu->cpu_ci == NULL)
+				break;
+			cpu->cpu_ip3_enable[bank] |= irq_mask;
+			mips3_sd(cpu->cpu_ip3_en[bank], cpu->cpu_ip3_enable[bank]);
+		}
 		break;
 
 	case IPL_DDB:
 	case IPL_HIGH:
-		cpu0->cpu_int2_enable[bank] |= irq_mask;
-		mips3_sd(cpu0->cpu_int2_en[bank], cpu0->cpu_int2_enable[bank]);
-#ifdef MULTIPROCESSOR
-		cpu1->cpu_int2_enable[bank] = cpu0->cpu_int2_enable[bank];
-		mips3_sd(cpu1->cpu_int2_en[bank], cpu1->cpu_int2_enable[bank]);
-#endif
-
+		for (cpunum = 0; cpunum < OCTEON_NCPU; cpunum++) {
+			cpu = &octeon_cpu_softc[cpunum];
+			if (cpu->cpu_ci == NULL)
+				break;
+			cpu->cpu_ip4_enable[bank] |= irq_mask;
+			mips3_sd(cpu->cpu_ip4_en[bank], cpu->cpu_ip4_enable[bank]);
+		}
 		break;
 	}
 
@@ -482,8 +400,10 @@ void
 octeon_intr_disestablish(void *cookie)
 {
 	struct octeon_intrhand * const ih = cookie;
+	struct cpu_softc *cpu;
 	const int irq = ih->ih_irq & (NIRQS-1);
 	const int ipl = ih->ih_ipl;
+	int cpunum;
 
 	mutex_enter(&octeon_intr_lock);
 
@@ -492,34 +412,33 @@ octeon_intr_disestablish(void *cookie)
 	 */
 	const int bank = irq / 64;
 	const uint64_t irq_mask = ~__BIT(irq % 64);
-	struct cpu_softc * const cpu0 = &octeon_cpu0_softc;
-#if MULTIPROCESSOR
-	struct cpu_softc * const cpu1 = &octeon_cpu1_softc;
-#endif
 
 	switch (ipl) {
 	case IPL_VM:
-		cpu0->cpu_int0_enable[bank] &= ~irq_mask;
-		mips3_sd(cpu0->cpu_int0_en[bank], cpu0->cpu_int0_enable[bank]);
+		cpu = &octeon_cpu_softc[0];
+		cpu->cpu_ip2_enable[bank] &= ~irq_mask;
+		mips3_sd(cpu->cpu_ip2_en[bank], cpu->cpu_ip2_enable[bank]);
 		break;
 
 	case IPL_SCHED:
-		cpu0->cpu_int1_enable[bank] &= ~irq_mask;
-		mips3_sd(cpu0->cpu_int1_en[bank], cpu0->cpu_int1_enable[bank]);
-#ifdef MULTIPROCESSOR
-		cpu1->cpu_int1_enable[bank] = cpu0->cpu_int1_enable[bank];
-		mips3_sd(cpu1->cpu_int1_en[bank], cpu1->cpu_int1_enable[bank]);
-#endif
+		for (cpunum = 0; cpunum < OCTEON_NCPU; cpunum++) {
+			cpu = &octeon_cpu_softc[cpunum];
+			if (cpu->cpu_ci == NULL)
+				break;
+			cpu->cpu_ip3_enable[bank] &= ~irq_mask;
+			mips3_sd(cpu->cpu_ip3_en[bank], cpu->cpu_ip3_enable[bank]);
+		}
 		break;
 
 	case IPL_DDB:
 	case IPL_HIGH:
-		cpu0->cpu_int2_enable[bank] &= ~irq_mask;
-		mips3_sd(cpu0->cpu_int2_en[bank], cpu0->cpu_int2_enable[bank]);
-#ifdef MULTIPROCESSOR
-		cpu1->cpu_int2_enable[bank] = cpu0->cpu_int2_enable[bank];
-		mips3_sd(cpu1->cpu_int2_en[bank], cpu1->cpu_int2_enable[bank]);
-#endif
+		for (cpunum = 0; cpunum < OCTEON_NCPU; cpunum++) {
+			cpu = &octeon_cpu_softc[cpunum];
+			if (cpu->cpu_ci == NULL)
+				break;
+			cpu->cpu_ip4_enable[bank] &= ~irq_mask;
+			mips3_sd(cpu->cpu_ip4_en[bank], cpu->cpu_ip4_enable[bank]);
+		}
 		break;
 	}
 
@@ -548,17 +467,17 @@ octeon_iointr(int ipl, vaddr_t pc, uint3
 	const uint64_t sum1 = mips3_ld(cpu->cpu_int_sum1);
 
 	if (ipending & MIPS_INT_MASK_2) {
-		hwpend[0] = mips3_ld(cpu->cpu_int2_sum0)
-		    & cpu->cpu_int2_enable[0];
-		hwpend[1] = sum1 & cpu->cpu_int2_enable[1];
+		hwpend[0] = mips3_ld(cpu->cpu_ip4_sum0)
+		    & cpu->cpu_ip4_enable[0];
+		hwpend[1] = sum1 & cpu->cpu_ip4_enable[1];
 	} else if (ipending & MIPS_INT_MASK_1) {
-		hwpend[0] = mips3_ld(cpu->cpu_int1_sum0)
-		    & cpu->cpu_int1_enable[0];
-		hwpend[1] = sum1 & cpu->cpu_int1_enable[1];
+		hwpend[0] = mips3_ld(cpu->cpu_ip3_sum0)
+		    & cpu->cpu_ip3_enable[0];
+		hwpend[1] = sum1 & cpu->cpu_ip3_enable[1];
 	} else if (ipending & MIPS_INT_MASK_0) {
-		hwpend[0] = mips3_ld(cpu->cpu_int0_sum0)
-		    & cpu->cpu_int0_enable[0];
-		hwpend[1] = sum1 & cpu->cpu_int0_enable[1];
+		hwpend[0] = mips3_ld(cpu->cpu_ip2_sum0)
+		    & cpu->cpu_ip2_enable[0];
+		hwpend[1] = sum1 & cpu->cpu_ip2_enable[1];
 	} else {
 		panic("octeon_iointr: unexpected ipending %#x", ipending);
 	}

Index: src/sys/arch/mips/cavium/octeonvar.h
diff -u src/sys/arch/mips/cavium/octeonvar.h:1.15 src/sys/arch/mips/cavium/octeonvar.h:1.16
--- src/sys/arch/mips/cavium/octeonvar.h:1.15	Fri Jul 17 17:57:16 2020
+++ src/sys/arch/mips/cavium/octeonvar.h	Fri Jul 17 21:59:30 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: octeonvar.h,v 1.15 2020/07/17 17:57:16 jmcneill Exp $	*/
+/*	$NetBSD: octeonvar.h,v 1.16 2020/07/17 21:59:30 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -39,6 +39,7 @@
 #include <dev/pci/pcivar.h>
 
 #include <mips/cavium/octeonreg.h>
+#include <mips/cache_octeon.h>
 
 /* XXX elsewhere */
 #define	_ASM_PROLOGUE \
@@ -83,24 +84,22 @@ struct octeon_config {
 struct cpu_softc {
 	struct cpu_info *cpu_ci;
 
-	uint64_t cpu_int0_sum0;
-	uint64_t cpu_int1_sum0;
-	uint64_t cpu_int2_sum0;
+	uint64_t cpu_ip2_sum0;
+	uint64_t cpu_ip3_sum0;
+	uint64_t cpu_ip4_sum0;
 
 	uint64_t cpu_int_sum1;
 
-	uint64_t cpu_int0_en[NBANKS];
-	uint64_t cpu_int1_en[NBANKS];
-	uint64_t cpu_int2_en[NBANKS];
-
-	uint64_t cpu_int32_en;
+	uint64_t cpu_ip2_en[NBANKS];
+	uint64_t cpu_ip3_en[NBANKS];
+	uint64_t cpu_ip4_en[NBANKS];
+
+	uint64_t cpu_ip2_enable[NBANKS];
+	uint64_t cpu_ip3_enable[NBANKS];
+	uint64_t cpu_ip4_enable[NBANKS];
 
 	struct evcnt cpu_intr_evs[NIRQS];
 
-	uint64_t cpu_int0_enable[NBANKS];
-	uint64_t cpu_int1_enable[NBANKS];
-	uint64_t cpu_int2_enable[NBANKS];
-
 	void *cpu_wdog_sih;		// wdog softint handler
 	uint64_t cpu_wdog;
 	uint64_t cpu_pp_poke;
@@ -109,7 +108,7 @@ struct cpu_softc {
 	uint64_t cpu_mbox_set;
 	uint64_t cpu_mbox_clr;
 #endif
-};
+} __aligned(OCTEON_CACHELINE_SIZE);
 
 /*
  * FPA map
@@ -204,7 +203,6 @@ struct octfau_map {
 extern struct octeon_config	octeon_configuration;
 #ifdef MULTIPROCESSOR
 extern kcpuset_t		*cpus_booted;
-extern struct cpu_softc		octeon_cpu1_softc;
 #endif
 
 const char	*octeon_cpu_model(mips_prid_t);

Index: src/sys/arch/mips/cavium/dev/octeon_ciureg.h
diff -u src/sys/arch/mips/cavium/dev/octeon_ciureg.h:1.9 src/sys/arch/mips/cavium/dev/octeon_ciureg.h:1.10
--- src/sys/arch/mips/cavium/dev/octeon_ciureg.h:1.9	Mon Jun 22 12:26:11 2020
+++ src/sys/arch/mips/cavium/dev/octeon_ciureg.h	Fri Jul 17 21:59:30 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: octeon_ciureg.h,v 1.9 2020/06/22 12:26:11 simonb Exp $	*/
+/*	$NetBSD: octeon_ciureg.h,v 1.10 2020/07/17 21:59:30 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 2007 Internet Initiative Japan, Inc.
@@ -39,17 +39,23 @@
 #define	CIU_INT1_SUM0				UINT64_C(0x0001070000000008)
 #define	CIU_INT2_SUM0				UINT64_C(0x0001070000000010)
 #define	CIU_INT3_SUM0				UINT64_C(0x0001070000000018)
+#define	CIU_IP2_SUM0(n)				(CIU_INT0_SUM0 + 0x10 * (n))
+#define	CIU_IP3_SUM0(n)				(CIU_INT1_SUM0 + 0x10 * (n))
 #define	CIU_INT32_SUM0				UINT64_C(0x0001070000000100)
 #define	CIU_INT_SUM1				UINT64_C(0x0001070000000108)
 #define	CIU_INT0_EN0				UINT64_C(0x0001070000000200)
 #define	CIU_INT1_EN0				UINT64_C(0x0001070000000210)
 #define	CIU_INT2_EN0				UINT64_C(0x0001070000000220)
 #define	CIU_INT3_EN0				UINT64_C(0x0001070000000230)
+#define	CIU_IP2_EN0(n)				(CIU_INT0_EN0 + 0x20 * (n))
+#define	CIU_IP3_EN0(n)				(CIU_INT1_EN0 + 0x20 * (n))
 #define	CIU_INT32_EN0				UINT64_C(0x0001070000000400)
 #define	CIU_INT0_EN1				UINT64_C(0x0001070000000208)
 #define	CIU_INT1_EN1				UINT64_C(0x0001070000000218)
 #define	CIU_INT2_EN1				UINT64_C(0x0001070000000228)
 #define	CIU_INT3_EN1				UINT64_C(0x0001070000000238)
+#define	CIU_IP2_EN1(n)				(CIU_INT0_EN1 + 0x20 * (n))
+#define	CIU_IP3_EN1(n)				(CIU_INT1_EN1 + 0x20 * (n))
 #define	CIU_INT32_EN1				UINT64_C(0x0001070000000408)
 #define	CIU_TIM0				UINT64_C(0x0001070000000480)
 #define	CIU_TIM1				UINT64_C(0x0001070000000488)
@@ -59,10 +65,13 @@
 #define	CIU_WDOG(n)				(CIU_WDOG0 + (n) * 8)
 #define	CIU_PP_POKE0				UINT64_C(0x0001070000000580)
 #define	CIU_PP_POKE1				UINT64_C(0x0001070000000588)
+#define	CIU_PP_POKE(n)				(CIU_PP_POKE0 + (n) * 8)
 #define	CIU_MBOX_SET0				UINT64_C(0x0001070000000600)
 #define	CIU_MBOX_SET1				UINT64_C(0x0001070000000608)
+#define	CIU_MBOX_SET(n)				(CIU_MBOX_SET0 + (n) * 8)
 #define	CIU_MBOX_CLR0				UINT64_C(0x0001070000000680)
 #define	CIU_MBOX_CLR1				UINT64_C(0x0001070000000688)
+#define	CIU_MBOX_CLR(n)				(CIU_MBOX_CLR0 + (n) * 8)
 #define	CIU_PP_RST				UINT64_C(0x0001070000000700)
 #define	CIU_PP_DBG				UINT64_C(0x0001070000000708)
 #define	CIU_GSTOP				UINT64_C(0x0001070000000710)
@@ -76,10 +85,13 @@
 #define	CIU_PCI_INTA				UINT64_C(0x0001070000000750)
 #define	CIU_INT4_SUM0				UINT64_C(0x0001070000000c00)
 #define	CIU_INT4_SUM1				UINT64_C(0x0001070000000c08)
+#define	CIU_IP4_SUM0(n)				(CIU_INT4_SUM0 + 0x10 * (n))
 #define	CIU_INT4_EN00				UINT64_C(0x0001070000000c80)
 #define	CIU_INT4_EN01				UINT64_C(0x0001070000000c88)
 #define	CIU_INT4_EN10				UINT64_C(0x0001070000000c90)
 #define	CIU_INT4_EN11				UINT64_C(0x0001070000000c98)
+#define	CIU_IP4_EN0(n)				(CIU_INT4_EN00 + 0x10 * (n))
+#define	CIU_IP4_EN1(n)				(CIU_INT4_EN01 + 0x10 * (n))
 
 #define	CIU_BASE				UINT64_C(0x0001070000000000)
 

Index: src/sys/arch/mips/mips/cpu_subr.c
diff -u src/sys/arch/mips/mips/cpu_subr.c:1.48 src/sys/arch/mips/mips/cpu_subr.c:1.49
--- src/sys/arch/mips/mips/cpu_subr.c:1.48	Sun Jun 14 06:50:31 2020
+++ src/sys/arch/mips/mips/cpu_subr.c	Fri Jul 17 21:59:30 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu_subr.c,v 1.48 2020/06/14 06:50:31 simonb Exp $	*/
+/*	$NetBSD: cpu_subr.c,v 1.49 2020/07/17 21:59:30 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2010, 2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.48 2020/06/14 06:50:31 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.49 2020/07/17 21:59:30 jmcneill Exp $");
 
 #include "opt_cputype.h"
 #include "opt_ddb.h"
@@ -71,7 +71,8 @@ __KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v
 #endif
 
 #ifdef MIPS64_OCTEON
-extern struct cpu_softc octeon_cpu0_softc;
+#include <mips/cavium/octeonvar.h>
+extern struct cpu_softc octeon_cpu_softc[];
 #endif
 
 struct cpu_info cpu_info_store
@@ -93,7 +94,7 @@ struct cpu_info cpu_info_store
 	.ci_flags = CPUF_PRIMARY|CPUF_PRESENT|CPUF_RUNNING,
 #endif
 #ifdef MIPS64_OCTEON
-	.ci_softc = &octeon_cpu0_softc,
+	.ci_softc = &octeon_cpu_softc[0],
 #endif
 };
 

Reply via email to