Date: Mon, 6 Jul 2020 10:44:36 +0300 From: Daniel Braniss <danny@cs.huji.ac.il> To: Emmanuel Vadot <manu@bidouilliste.com> Cc: "freebsd-arm@freebsd.org" <arm@freebsd.org> Subject: Re: allwinner/i2c interrupt storm detected Message-ID: <3C934887-775C-4A73-A510-D74C8786DF04@cs.huji.ac.il> In-Reply-To: <6CEF2B3D-FDC1-4EBC-80A8-42C5E9A356FC@cs.huji.ac.il> References: <10ACCB56-E18D-4102-B4E2-094157854AB7@cs.huji.ac.il> <20200704122944.64723bbb606d6e73128d2568@freenet.de> <E315DAED-3BDB-44CB-83D8-B8400BD4951F@cs.huji.ac.il> <20200705191435.c9c65caf64026ee881020f3a@bidouilliste.com> <6CEF2B3D-FDC1-4EBC-80A8-42C5E9A356FC@cs.huji.ac.il>
next in thread | previous in thread | raw e-mail | index | archive | help
> On 6 Jul 2020, at 08:51, Daniel Braniss <danny@cs.huji.ac.il> wrote: >=20 >=20 >=20 >> On 5 Jul 2020, at 20:14, Emmanuel Vadot <manu@bidouilliste.com> = wrote: >>=20 >>=20 >> Hi Daniel, Manuel, >>=20 >> On Sat, 4 Jul 2020 13:45:50 +0300 >> Daniel Braniss <danny@cs.huji.ac.il <mailto:danny@cs.huji.ac.il>> = wrote: >>=20 >>>=20 >>>=20 >>>> On 4 Jul 2020, at 13:29, Manuel St=C3=BChn = <freebsdnewbie@freenet.de> wrote: >>>>=20 >>>> On Tue, 30 Jun 2020 16:01:41 +0300 >>>> Daniel Braniss <danny@cs.huji.ac.il <mailto:danny@cs.huji.ac.il>> = wrote: >>>>=20 >>>>> Hi, >>>>>=20 >>>>> after a long time I decided to try and upgrade to stable 12.1 = r362793 since I saw some changes where done=20 >>>>> with respect to the DTS and twsi.c,=20 >>>>>=20 >>>>> if nothing is connected to the i2c, i2c -s just hangs, >>>>>=20 >>>>> if something is connected this is what i get on the console after = typing ?i2c -s? >>>>>=20 >>>>>=20 >>>>> Hardware may not support START/STOP scanning; trinterrupt storm = detected on "gic0,s6:"; throttling interrupt source >>>>> ying less-reliable read method. >>>>> interrupt storm detected on "gic0,s6:"; throttling interrupt = source >>>>> interrupt storm detected on "gic0,s6:"; throttling interrupt = source >>>>> ? >>>>>=20 >>>>> and >>>>> neo-04> vmstat -i >>>>> interrupt total = rate >>>>> gic0,p13:-ic_timer0 16052 = 164 >>>>> gic0,s0: uart2 318 = 3 >>>>> gic0,s6: iichb0 13034 = 133 >>>>> gic0,s60: aw_mmc0 1293 = 13 >>>>> gic0,s82: awg0 334 = 3 >>>>> gic0,s120: pmu0 49725 = 509 >>>>> cpu0:rendezvous 18 = 0 >>>>> cpu1:rendezvous 50 = 1 >>>>> cpu2:rendezvous 51 = 1 >>>>> cpu3:rendezvous 40 = 0 >>>>> cpu0:preempt 2691 = 28 >>>>> cpu1:preempt 3165 = 32 >>>>> cpu2:preempt 2778 = 28 >>>>> cpu3:preempt 2986 = 31 >>>>> cpu0:hardclock 15 = 0 >>>>> Total 92550 = 946 >>>>>=20 >>>>>=20 >>>>> the hardware is an NanoPi Neo >>>>> ---<<BOOT>>--- >>>>> KDB: debugger backends: ddb >>>>> KDB: current backend: ddb >>>>> Copyright (c) 1992-2020 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.1-STABLE #0 r362793M: Tue Jun 30 11:39:11 IDT 2020 >>>>> = danny@nrnd:/home/obj/nrnd/arm/neo/vol/rnd/stable/12/arm.armv7/sys/AWGEN = arm >>>>> FreeBSD clang version 10.0.0 (git@github.com = <mailto:git@github.com>:llvm/llvm-project.git = llvmorg-10.0.0-0-gd32170dbd5b) >>>>> VT: init without driver. >>>>> No PSCI/SMCCC call function found >>>>> CPU: ARM Cortex-A7 r0p5 (ECO: 0x00000000) >>>>> ? >>>>>=20 >>>>=20 >>>> I do not have a IRQ-Storm on my NanoPI NEO2, but a "i2s -s" does = never return. Commit v356609 broke i2c-support on my hardware (reverting = this single commit fixed it, bugreport filed: = https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D247576 = <https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D247576>). >>>>=20 >>>> Perhaps it is worth a try for you also to revert this commit and = test again... >>>>=20 >>>=20 >>> before the latest changes it works fine, and if you add my patch to = it, i2s -s will not hang: >>>=20 >>>> -- twsi.c (revision 346538) >>>> +++ twsi.c (working copy) >>>> @@ -458,8 +458,15 @@ >>>> if (sc->msg->len =3D=3D 1) >>>> sc->control_val &=3D ~TWSI_CONTROL_ACK; >>>> TWSI_WRITE(sc, sc->reg_control, sc->control_val | = TWSI_CONTROL_START); >>>> - while (sc->error =3D=3D 0 && sc->transfer !=3D 0) { >>>> - pause_sbt("twsi", SBT_1MS * 30, SBT_1MS, 0); >>>> + { >>>> + int count =3D 10; >>>> + while (sc->error =3D=3D 0 && sc->transfer !=3D = 0) { >>>> + pause_sbt("twsi", SBT_1MS * 30, = SBT_1MS, 0); >>>> + if(count-- =3D=3D 0) { >>>> + sc->error =3D EDEADLK; >>>> + break; >>>> + } >>>> + } >>>> } >>>>=20 >>>> debugf(dev, "Done with msg[%d]\n", i); >>>=20 >>>=20 >>> cheers, >>> danny >>>=20 >>>>=20 >>>> BR >>>> Manuel >>=20 >> Could you test the patch I've just attached to >> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D247576 = <https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D247576> please ? >>=20 >> It doesn't fix everything and I'm still working on doing test on a = lot >> of different boards but this is clearly needed. >>=20 >> --=20 >> Emmanuel Vadot <manu@bidouilliste.com <mailto:manu@bidouilliste.com>> = <manu@freebsd.org <mailto:manu@freebsd.org>> >=20 >=20 > short version: it works! >=20 > longer version: > first tried with debugging on - worked > next tried with no debugging- worked >=20 > the next test will take some time, trying my app. > if I feel up to it, i can try on a neopi neo2 - but that will take = longer. >=20 > thanks Manu!!!! >=20 not out of the woods yet :-( my app hangs the kernel. it=E2=80=99s now stuck in what seems waiting for an interrupt that never = comes =E2=80=A6 this is the debug: neo-001# iichb0: twsi_calc_baud_rate: Bus clock is at 24000000 iichb0: twsi_reset: Using clock param=3D59 iichb0: TWSI_WRITE: Writing 0 to 18 iichb0: TWSI_WRITE: Writing 59 to 14 iichb0: TWSI_WRITE: Writing 40 to c iichb0: twsi_calc_baud_rate: Bus clock is at 24000000 iichb0: twsi_reset: Using clock param=3D59 iichb0: TWSI_WRITE: Writing 0 to 18 iichb0: TWSI_WRITE: Writing 59 to 14 iichb0: TWSI_WRITE: Writing 40 to c iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_transfer: transmitting 2 messages iichb0: TWSI_READ: read f8 from 10 iichb0: twsi_transfer: status=3Df8 iichb0: TWSI_WRITE: Writing e4 to c iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 8 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Send the address(48) iichb0: TWSI_WRITE: Writing 48 to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 18 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting the address (write) iichb0: twsi_intr: Sending byte 0 =3D 0 iichb0: TWSI_WRITE: Writing 0 to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Sending byte 1 =3D 0 iichb0: TWSI_WRITE: Writing 0 to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Sending byte 2 =3D ff iichb0: TWSI_WRITE: Writing ff to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Sending byte 3 =3D 2 iichb0: TWSI_WRITE: Writing 2 to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Sending byte 4 =3D fe iichb0: TWSI_WRITE: Writing fe to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Sending byte 5 =3D d4 iichb0: TWSI_WRITE: Writing d4 to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Sending byte 6 =3D 2 iichb0: TWSI_WRITE: Writing 2 to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Sending byte 7 =3D 2a iichb0: TWSI_WRITE: Writing 2a to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Sending byte 8 =3D 0 iichb0: TWSI_WRITE: Writing 0 to 8 iichb0: TWSI_WRITE: Writing c4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts iichb0: twsi_intr: Got interrupt Current msg=3D0 iichb0: TWSI_READ: read 28 from 10 iichb0: TWSI_READ: read cc from c iichb0: twsi_intr: reg control=3Dcc iichb0: twsi_intr: Ack received after transmitting data iichb0: twsi_intr: Done sending all the bytes for msg 0 iichb0: twsi_intr: Done TX data, send stop iichb0: TWSI_WRITE: Writing d4 to c iichb0: twsi_intr: Refresh reg_control iichb0: TWSI_WRITE: Writing cc to c iichb0: twsi_intr: Done with interrupts and here it hangs. reboot is necessary. > danny >=20 >=20 > _______________________________________________ > freebsd-arm@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-arm > To unsubscribe, send any mail to "freebsd-arm-unsubscribe@freebsd.org"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3C934887-775C-4A73-A510-D74C8786DF04>