Skip site navigation (1)Skip section navigation (2)
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>