Hi Alex,

yes, you are right -- seems interrupt 27 is the virtual timer based on
GIC 400 specification.
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0471b/DDI0471B_gic400_r0p1_trm.pdf

May I will try to loop through all interrupts > 31 (after the PPI's)..

Thanks!
- Wladi

2017-02-26 12:58 GMT+01:00  <alexander.k...@data61.csiro.au>:
> Hi Wladi,
>
>  I am sorry to say that IRQ 27 might be the IRQ of the preemption timer
> that the kernel uses. If not, it should at least be the IRQ of the ARM
> private timers rather than a third-party peripheral.
>
> That being said, some vendors don't like to follow standards.
>
> Do you receive the 'Tick' even if you don't set the enable bit on your
> timer?
> Have you checked that the timer status bit is actually being asserted?
>
>  - Alex
>
> On Sun, 2017-02-26 at 11:58 +0100, Wladislav Wiebe wrote:
>> 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