Hi Alex,

I've found the magic IRQ number -> 27.

Starting test suite sel4test
Starting test 0: TEST_INTERRUPT0001
  TEST_INTERRUPT0001
Running test INTERRUPT0001 (Test interrupts with timer)
Tick
Tick
Tick
Test INTERRUPT0001 passed
Starting test 1: TEST_INTERRUPT00012
  TEST_INTERRUPT0001
Running test INTERRUPT0001 (Test interrupts with timer)
Tick
Tick
Tick
Test INTERRUPT0001 passed
Test suite passed. 2 tests passed.

2/2 tests passed.
All is well in the universe.


Special thanks again for the great support!

- Wladi





2017-02-24 11:50 GMT+01:00 Wladislav Wiebe <wladislav...@gmail.com>:
> Hi Alex,
>
> really great catch! When I am disabling interrupt 27 and 57 in maskInterrupt
> and keeping everything else enabled, like:
> switch (irq) {
> case 27: dist_enable_clr(irq); break;
> case 57: dist_enable_clr(irq); break;
> default: dist_enable_set(irq); break;
> }
>
> I can see spurious interrupts from interrupt number 48
> each second (depends on timer_periodic(env->timer->timer, 1 *
> NS_IN_S);) setting.
>
> ..
> Starting test suite sel4test
> Starting test 0: TEST_INTERRUPT0001
>   TEST_INTERRUPT0001
> Timer initialised
> Running test INTERRUPT0001 (Test interrupts with timer)
> <<seL4(CPU 0) [handleInterruptEntry/48 T0xffdfaf00 "" @e001086c]:
> Spurious interrupt!>>
> <<seL4(CPU 0) [handleInterruptEntry/48 T0xffdfaf00 "" @e001086c]:
> Spurious interrupt!>>
> <<seL4(CPU 0) [handleInterruptEntry/48 T0xffdfaf00 "" @e001086c]:
> Spurious interrupt!>>
> ..
>
> But for some reason, even when configuring the timer interrupt to nr. 48,
> (in the kernel machine.h and userspace timer)
> the interrupt handler doesn't get called and keeps firing spurious interrupts.
>
> Let me know if you have an idea for this as well :-)
>
> Thanks a lot!
> - Wladi
>
> 2017-02-24 0:21 GMT+01:00  <alexander.k...@data61.csiro.au>:
>> Hi Wladi,
>>
>>  Another problem could be that you are using the wrong IRQ number. The
>> GIC handles two classes of IRQ: PPI and SPI. There are 32 PPIs. To
>> ensure that each IRQ number is unique we offset each SPI by 32.
>>
>> The reported SPI IRQ number in technical manuals is not always
>> consistent. Sometimes the SPI IRQ number is reported, sometimes this
>> offset in included, and sometimes both IRQ numbering systems are
>> reported.
>>
>> As a catch all, you could prevent seL4 from disabling some (or all) IRQs
>> by modifying this function:
>> https://github.com/seL4/seL4/blob/master/include/arch/arm/arch/machine/gic_pl390.h#L191
>>
>> The catch is that this might trigger other IRQs that you aren't
>> expecting, so watch out for false positives.
>>
>>  - Alex
>>
>>
>> On Wed, 2017-02-22 at 16:13 +0100, Wladislav Wiebe wrote:
>>> Hi Anna and Alex,
>>>
>>> thanks a lot for your inputs --
>>>
>>> Anna,
>>> > you can put a printf in handleInterrupt in the kernel
>>> I added it there and it seems there no interrupt executed at all.
>>>
>>> Alex,
>>> > 1) ARM devices tend to only support 32bit read/write
>>> > 2) Check that the interrupt enable flag is set before returning from
>>> > your timer set up code.
>>>
>>> it's done here:
>>> https://github.com/wwladikw/devel/blob/master/timer.c#L87
>>> which is called in driver init, before timer gets configured:
>>> https://github.com/wwladikw/devel/blob/master/timer.c#L220
>>>
>>> > 3) The status bits must be written as 1 to clear. If interrupts are edge
>>> > triggered, failing to clear this bit (by writing a 1 to it) will stop
>>> > interrupts from coming in.
>>>
>>> yes, the interrupts are edge triggered for my understanding.
>>>
>>> > 4) Check that your code that clears the interrupt status bit does not
>>> > clear the enable bit.
>>>
>>> it's done when configuring the timer
>>> https://github.com/wwladikw/devel/blob/master/timer.c#L138
>>> and in the IRQ handler
>>> https://github.com/wwladikw/devel/blob/master/timer.c#L173
>>> where INTCTLSTAT_ACK_MASK is 0x03 which keeps the interrupts enabled
>>> and clears the status bit.
>>>
>>> I've also extended the driver and the testcase with some debug prints to
>>> track the status info for the intctlstat register - like:
>>> ------
>>> timer_start(env->timer->timer);
>>> timer_periodic(env->timer->timer, 100 * NS_IN_MS);
>>> while (timeout > 0) {
>>>                 printf("tick .. %llu ns \n", 
>>> timer_get_time(env->timer->timer));
>>>                 if (timeout == 45)
>>>                                sel4_timer_handle_single_irq(env->timer);
>>>                 timeout--;
>>> }
>>> for (int i = 0; i < 3; i++) {
>>>                 wait_for_timer_interrupt(env);
>>>                 printf("Tick\n");
>>> }
>>> ----
>>>
>>> output:  (XXXX comes from the driver)
>>> -------
>>> Starting test suite sel4test
>>> Starting test 0: TEST_INTERRUPT0001
>>>   TEST_INTERRUPT0001
>>> XXXX keystone_timer_reset: 73: kt->hw->intctlstat init    0x0
>>> XXXX keystone_timer_reset: 88: kt->hw->intctlstat done 0x1
>>> Running test INTERRUPT0001 (Test interrupts with timer)
>>> timer_start ..
>>> timer_start done ..
>>> set timer_periodic ..
>>> XXXX keystone_set_timeo: 138: kt->hw->intctlstat 0x3
>>> XXXX keystone_set_timeo: 141: kt->hw->intctlstat 0x1
>>> XXXX keystone_set_timeo: 142: enable timer
>>> set timer_periodic done ..
>>> XXXX keystone_get_time: 168: kt->hw->intctlstat 0x1
>>> tick .. 1367513 ns
>>> XXXX keystone_get_time: 168: kt->hw->intctlstat 0x1
>>> tick .. 743185 ns
>>> XXXX keystone_get_time: 168: kt->hw->intctlstat 0x3
>>> ..
>>> XXXX keystone_handle_irq: 177: kt->hw->intctlstat current status  0x3
>>>   (called manually by sel4_timer_handle_single_irq)
>>> XXXX keystone_handle_irq: 179: kt->hw->intctlstat clear         0x1
>>> XXXX keystone_get_time: 168: kt->hw->intctlstat 0x1
>>> tick .. 17540752 ns
>>> XXXX keystone_get_time: 168: kt->hw->intctlstat 0x1
>>> ..
>>> XXXX keystone_get_time: 168: kt->hw->intctlstat 0x3
>>> tick .. 1056723 ns
>>> XXXX keystone_get_time: 168: kt->hw->intctlstat 0x3
>>> tick .. 2371025 ns
>>> XXXX keystone_get_time: 168: kt->hw->intctlstat 0x3
>>> tick .. 3685205 ns
>>> ----------
>>> and stays forever in wait_for_timer_interrupt.
>>>
>>> I also wonder about a short flood of messages before the testsuite starts:
>>> ---
>>> _allocman_utspace_alloc@allocman.c:301 Regular utspace alloc failed
>>> and not watermark for size 13 type 0
>>> vka_alloc_object_at@object.h:57 Failed to allocate object of size 8192, 
>>> error 1
>>> ---
>>> But I guess this shouldn't have impact to the interrupts, right?
>>>
>>>
>>> Thanks in advance!
>>> - Wladi
>>>
>>> 2017-02-22 1:32 GMT+01:00  <alexander.k...@data61.csiro.au>:
>>> > Hi Wladi,
>>> >
>>> > If the problem is with your driver, the problem could be in your
>>> > management of the INTCTLSTAT register (Chapter 5.10).
>>> >
>>> > 1) ARM devices tend to only support 32bit read/write
>>> > 2) Check that the interrupt enable flag is set before returning from
>>> > your timer set up code.
>>> > 3) The status bits must be written as 1 to clear. If interrupts are edge
>>> > triggered, failing to clear this bit (by writing a 1 to it) will stop
>>> > interrupts from coming in.
>>> > 4) Check that your code that clears the interrupt status bit does not
>>> > clear the enable bit.
>>> >
>>> >  - Alex Kroh
>>> >
>>> >
>>> > On Tue, 2017-02-21 at 23:17 +0000, anna.ly...@data61.csiro.au wrote:
>>> >> Hey,
>>> >>
>>> >> First I'd check if the kernel is getting the interrupts in the kernel 
>>> >> from this timer - you can put a printf in handleInterrupt in the kernel 
>>> >> to see if this is the case and see if the correct interrupt number comes 
>>> >> in.
>>> >>
>>> >> If so,  then check if those irqs are being sent to the signal handler 
>>> >> and not reserved (again by printing / asserting in handle interrupt).
>>> >>
>>> >> If not, this points to a problem with your driver.
>>> >>
>>> >> Hope this pushes you in the right direction,
>>> >> Anna.
>>> >>
>>> >> -----Original Message-----
>>> >> From: Devel [mailto:devel-bounces@sel4.systems] On Behalf Of Wladislav 
>>> >> Wiebe
>>> >> Sent: Wednesday, 22 February 2017 10:05 AM
>>> >> To: devel@sel4.systems
>>> >> Subject: [seL4] ARM timer driver and interrupts
>>> >>
>>> >> Hello,
>>> >>
>>> >> I wrote a new timer driver for this timer device:
>>> >> http://www.ti.com/lit/ug/sprugv5a/sprugv5a.pdf
>>> >>
>>> >> I am already able to run the seL4 testsuite successfully, except the 
>>> >> interrupt/timer tests.
>>> >> It waits forever @ wait_for_timer_interrupt(env);
>>> >>
>>> >> I've uploaded the driver temporary to:
>>> >> https://github.com/wwladikw/devel/blob/master/timer.c
>>> >>
>>> >> Any idea what could be wrong?
>>> >> I am able to run the timer periodically or as oneshot.
>>> >> The gic_390 interrupt driver in the kernel should also be compatible 
>>> >> with the gic_400, for my understanding, right?
>>> >> The SoC I am using contains a Coretex A15.
>>> >>
>>> >> Thanks a lot in advance!
>>> >> Wladislav Wiebe
>>> >>
>>> >> _______________________________________________
>>> >> Devel mailing list
>>> >> Devel@sel4.systems
>>> >> https://sel4.systems/lists/listinfo/devel
>>> >>
>>> >> _______________________________________________
>>> >> Devel mailing list
>>> >> Devel@sel4.systems
>>> >> https://sel4.systems/lists/listinfo/devel
>>> >
>>>
>>>
>>>
>>
>
>
>
> --
> WBR, Wladislav WIebe



-- 
WBR, Wladislav WIebe

_______________________________________________
Devel mailing list
Devel@sel4.systems
https://sel4.systems/lists/listinfo/devel

Reply via email to