Date: Mon, 24 Apr 2017 18:42:24 -0700 From: Mark Millard <markmi@dsl-only.net> To: freebsd-arm <freebsd-arm@freebsd.org>, freebsd-hackers@freebsd.org Cc: Tom Vijlbrief <tvijlbrief@gmail.com> Subject: head -r317015 (and before) vs. Pine64+ 2GB (an aarch64) and spurious interrupts: Evidence of a source of irq 1023's (with last irq 27) Message-ID: <B4FDA80F-1E72-4A2B-BE0C-E6F7BE6CDC5F@dsl-only.net>
next in thread | raw e-mail | index | archive | help
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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /usr/src/sys/arm/arm/gic.c (revision 317015) +++ /usr/src/sys/arm/arm/gic.c (working copy) @@ -672,9 +672,15 @@ =20 if (irq >=3D sc->nirqs) { #ifdef GIC_DEBUG_SPURIOUS +//#define EXPECTED_SPURIOUS_IRQ 1023 +// if (irq !=3D 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; =20 +// if (irq !=3D 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 =20 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=3D0x7ba128 data=3D0x9e6f8+0x39c3fe = syms=3D[0x8+0x103b60+0x8+0xf8a79] /boot/entropy size=3D0x1000 Hit [Enter] to boot immediately, or any other key for command prompt. Booting [/boot/kernel/kernel]... =20 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-0x1c= 87fff 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. =3D=3D=3D Mark Millard markmi at dsl-only.net
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?B4FDA80F-1E72-4A2B-BE0C-E6F7BE6CDC5F>