head -r317015 (and before) vs. Pine64+ 2GB (an aarch64) and spurious interrupts: Evidence of a source of irq 1023's (with last irq 27)

Mark Millard markmi at dsl-only.net
Tue Apr 25 01:42:28 UTC 2017


Note: The same kernel used below but installed
on a rpi3 (aarch64) does not report such spurious
interrupts. The issue is somehow specific
to the Pine64+'s or at least not general
to all aarch64's. (I've access to a Pine64+
2GB but Tom V. to a Pine64+ 1GB if I understand
right. I do not know about other folks.)


The initial pine64+ 2GB context had a powered hub with
an SSD and had Ethernet plugged in. But unplugging
everything but the serial console and applying power
gets the same sort of thing, other than instead of
107 shown for the first "last irq" a 64 was shown
instead.


I made the following change in order to gather
more evidence for the spurious interrupts that
I and others have seen on Pine64+'s:

FreeBSDx64# svnlite diff /usr/src/sys/arm/arm/gic.c
Index: /usr/src/sys/arm/arm/gic.c
===================================================================
--- /usr/src/sys/arm/arm/gic.c	(revision 317015)
+++ /usr/src/sys/arm/arm/gic.c	(working copy)
@@ -672,9 +672,15 @@
 
 	if (irq >= sc->nirqs) {
 #ifdef GIC_DEBUG_SPURIOUS
+//#define EXPECTED_SPURIOUS_IRQ 1023
+//	    if (irq != EXPECTED_SPURIOUS_IRQ) {
 		device_printf(sc->gic_dev,
-		    "Spurious interrupt detected: last irq: %d on CPU%d\n",
-		    sc->last_irq[PCPU_GET(cpuid)], PCPU_GET(cpuid));
+		    "Spurious interrupt %d detected of %d: last irq: %d on CPU%d\n"
+		    "0,1,2,3: last irqs: %d,%d,%d,%d\n",
+		    irq, sc->nirqs,
+		    sc->last_irq[PCPU_GET(cpuid)], PCPU_GET(cpuid),
+		    sc->last_irq[0],sc->last_irq[1],sc->last_irq[2],sc->last_irq[3]);
+//	    }
 #endif
 		return (FILTER_HANDLED);
 	}
@@ -720,6 +726,18 @@
 	if (irq < sc->nirqs)
 		goto dispatch_irq;
 
+//	if (irq != EXPECTED_SPURIOUS_IRQ) {
+//#undef EXPECTED_SPURIOUS_IRQ
+#ifdef GIC_DEBUG_SPURIOUS
+		device_printf(sc->gic_dev,
+		    "nextirq: Spurious interrupt %d detected of %d: last irq: %d on CPU%d\n"
+		    "0,1,2,3: last irqs: %d,%d,%d,%d\n",
+		    irq, sc->nirqs,
+		    sc->last_irq[PCPU_GET(cpuid)], PCPU_GET(cpuid),
+		    sc->last_irq[0],sc->last_irq[1],sc->last_irq[2],sc->last_irq[3]);
+#endif
+//	}
+
 	return (FILTER_HANDLED);
 }

The second block of code is in the "next_irq:"
part of the code and has a "nextirq:" prefix
text to make its messages unique.

The console result from a boot attempt with this
was as follows but first I will note one line from
it showing the irq 27 binding:

ehci0: <Allwinner Integrated USB 2.0 controller> mem 0x1c1a000-0x1c1a0ff irq 27 on simplebus0

That 27 is involved in what is shown below.

>> FreeBSD EFI boot block
   Loader path: /boot/loader.efi

   Initializing modules: ZFS UFS
   Probing 3 block devices.....* done
    ZFS found no pools
    UFS found 1 partition
Consoles: EFI console  
Command line arguments: loader.efi
Image base: 0xb8dc4000
EFI version: 2.05
EFI Firmware: Das U-boot (rev 0.00)

FreeBSD/arm64 EFI loader, Revision 1.1
EFI boot environment
Loading /boot/defaults/loader.conf
/boot/kernel/kernel text=0x7ba128 data=0x9e6f8+0x39c3fe syms=[0x8+0x103b60+0x8+0xf8a79]
/boot/entropy size=0x1000

Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [/boot/kernel/kernel]...               
Using DTB provided by EFI at 0x49000000.
KDB: debugger backends: ddb
KDB: current backend: ddb
Copyright (c) 1992-2017 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 12.0-CURRENT  r317015M arm64
FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on LLVM 4.0.0)
VT: init without driver.
Starting CPU 1 (1)
Starting CPU 2 (2)
Starting CPU 3 (3)
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
random: unblocking device.
random: entropy device external interface
kbd0 at kbdmux0
ofwbus0: <Open Firmware Device Tree>
aw_ccu0: <Allwinner Clock Control Unit> on ofwbus0
clk_fixed0: <Fixed clock> on aw_ccu0
clk_fixed1: <Fixed clock> on aw_ccu0
aw_pll0: <Allwinner PLL Clock> mem 0x1c20000-0x1c20003 on aw_ccu0
aw_pll1: <Allwinner PLL Clock> mem 0x1c20028-0x1c2002b on aw_ccu0
clk_fixed2: <Fixed factor clock> on aw_ccu0
aw_pll2: <Allwinner PLL Clock> mem 0x1c2002c-0x1c2002f on aw_ccu0
aw_cpuclk0: <Allwinner CPU Clock> mem 0x1c20050-0x1c20053 on aw_ccu0
aw_axiclk0: <Allwinner AXI Clock> mem 0x1c20050-0x1c20053 on aw_ccu0
aw_ahbclk0: <Allwinner AHB Clock> mem 0x1c20054-0x1c20057 on aw_ccu0
aw_ahbclk1: <Allwinner AHB Clock> mem 0x1c2005c-0x1c2005f on aw_ccu0
aw_apbclk0: <Allwinner APB Clock> mem 0x1c20054-0x1c20057 on aw_ccu0
aw_apbclk1: <Allwinner APB Clock> mem 0x1c20058-0x1c2005b on aw_ccu0
aw_gate0: <Allwinner Multi Bus Clock Gates> mem 0x1c20060-0x1c20073 on aw_ccu0
aw_modclk0: <Allwinner Module Clock> mem 0x1c20088-0x1c2008b on aw_ccu0
aw_modclk1: <Allwinner Module Clock> mem 0x1c2008c-0x1c2008f on aw_ccu0
aw_modclk2: <Allwinner Module Clock> mem 0x1c20090-0x1c20093 on aw_ccu0
aw_pll3: <Allwinner PLL Clock> mem 0x1c20044-0x1c20047 on aw_ccu0
aw_usbclk0: <Allwinner USB Clocks> mem 0x1c200cc-0x1c200cf on aw_ccu0
aw_thsclk0: <Allwinner THS Clock> mem 0x1c20074-0x1c20077 on aw_ccu0
simplebus0: <Flattened device tree simple bus> on ofwbus0
aw_reset0: <Allwinner Module Resets> mem 0x1c202c0-0x1c202cb on simplebus0
aw_reset1: <Allwinner Module Resets> mem 0x1c202d0-0x1c202d3 on simplebus0
aw_reset2: <Allwinner Module Resets> mem 0x1c202d8-0x1c202db on simplebus0
regfix0: <Fixed Regulator> on simplebus0
psci0: <ARM Power State Co-ordination Interface Driver> on ofwbus0
aw_sid0: <Allwinner Secure ID Controller> mem 0x1c14000-0x1c143ff on simplebus0
iichb0: <Allwinner RSB> mem 0x1f03400-0x1f037ff irq 24 on simplebus0
iicbus0: <OFW I2C bus> on iichb0
awusbphy0: <Allwinner USB PHY> mem 0x1c19400-0x1c19423,0x1c1a800-0x1c1a803,0x1c1b800-0x1c1b803 on simplebus0
gic0: <ARM Generic Interrupt Controller> mem 0x1c81000-0x1c81fff,0x1c82000-0x1c83fff,0x1c84000-0x1c85fff,0x1c86000-0x1c87fff irq 0 on ofwbus0
gic0: pn 0x2, arch 0x2, rev 0x1, implementer 0x43b irqs 224
gpio0: <Allwinner GPIO/Pinmux controller> mem 0x1c20800-0x1c20bff irq 8,9,10 on simplebus0
gpiobus0: <OFW GPIO bus> on gpio0
aw_nmi0: <Allwinner NMI Controller> mem 0x1f00c0c-0x1f00c43 irq 23 on simplebus0
axp81x_pmu0: <X-Powers AXP81x Power Management Unit> at addr 0x746 irq 30 on iicbus0
gpiobus1: <OFW GPIO bus> on axp81x_pmu0
generic_timer0: <ARMv8 Generic Timer> irq 1,2,3,4 on ofwbus0
Timecounter "ARM MPCore Timecounter" frequency 24000000 Hz quality 1000
Event timer "ARM MPCore Eventtimer" frequency 24000000 Hz quality 1000
rtc0: <Allwinner RTC> mem 0x1f00000-0x1f00053 irq 16,17 on simplebus0
cpulist0: <Open Firmware CPU Group> on ofwbus0
cpu0: <Open Firmware CPU> on cpulist0
cpufreq_dt0: <Generic cpufreq driver> on cpu0
cpu1: <Open Firmware CPU> on cpulist0
cpu2: <Open Firmware CPU> on cpulist0
cpu3: <Open Firmware CPU> on cpulist0
a10_mmc0: <Allwinner Integrated MMC/SD controller> mem 0x1c0f000-0x1c0ffff irq 5 on simplebus0
mmc0: <MMC/SD bus> on a10_mmc0
gpioc0: <GPIO controller> on gpio0
uart0: <16750 or compatible> mem 0x1c28000-0x1c283ff irq 11 on simplebus0
uart0: console (115384,n,8,1)
awg0: <Allwinner Gigabit Ethernet> mem 0x1c30000-0x1c300ff,0x1c00030-0x1c00033 irq 21 on simplebus0
miibus0: <MII bus> on awg0
rgephy0: <RTL8169S/8110S/8211 1000BASE-T media interface> PHY 0 on miibus0
rgephy0:  none, 10baseT, 10baseT-FDX, 10baseT-FDX-flow, 100baseTX, 100baseTX-FDX, 100baseTX-FDX-flow, 1000baseT, 1000baseT-master, 1000baseT-FDX, 1000baseT-FDX-master, 1000baseT-FDX-flow, 1000baseT-FDX-flow-master, auto, auto-flow
rgephy1: <RTL8169S/8110S/8211 1000BASE-T media interface> PHY 1 on miibus0
rgephy1:  none, 10baseT, 10baseT-FDX, 10baseT-FDX-flow, 100baseTX, 100baseTX-FDX, 100baseTX-FDX-flow, 1000baseT, 1000baseT-master, 1000baseT-FDX, 1000baseT-FDX-master, 1000baseT-FDX-flow, 1000baseT-FDX-flow-master, auto, auto-flow
awg0: Ethernet address: 02:ba:58:11:06:4e
aw_wdog0: <Allwinner A31 Watchdog> mem 0x1c20ca0-0x1c20cbf irq 22 on simplebus0
gpioc1: <GPIO controller> on axp81x_pmu0
iic0: <I2C generic I/O> on iicbus0
aw_thermal0: <Allwinner Thermal Sensor Controller> mem 0x1c25000-0x1c253ff irq 25 on simplebus0
ohci0: <Generic OHCI Controller> mem 0x1c1a400-0x1c1a4ff irq 26 on simplebus0
usbus0 on ohci0
ehci0: <Allwinner Integrated USB 2.0 controller> mem 0x1c1a000-0x1c1a0ff irq 27 on simplebus0
usbus1: EHCI version 1.0
usbus1 on ehci0
ohci1: <Generic OHCI Controller> mem 0x1c1b400-0x1c1b4ff irq 28 on simplebus0
usbus2 on ohci1
ehci1: <Allwinner Integrated USB 2.0 controller> mem 0x1c1b000-0x1c1b0ff irq 29 on simplebus0
usbus3: EHCI version 1.0
usbus3 on ehci1
cryptosoft0: <software crypto>
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 107 on CPU0
0,1,2,3: last irqs: 107,0,0,0
Timecounters tick every 1.000 msec
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
gic0: nextirq: Spurious interrupt 1023 detected of 224: last irq: 27 on CPU0
0,1,2,3: last irqs: 27,0,0,0
. . .

The messages just seem to be continuously generated. I ended up unplugging
the Pine64+ 2GB power.

But they were all 27's expect for that first one being a 107 (or 64).

So this starts before any of the other cores are started.


I'll see if I can come up with a test showing later behavior.


===
Mark Millard
markmi at dsl-only.net



More information about the freebsd-hackers mailing list