Again, to make things clear:
I have tested two modules: one with RTDM gpio-interrupts and one with
classic linux interrupts.
The one with RTDM gpio-interrupts:
- makes kernel freeze on 4.14.71 and 4.19.82 ipipe-enabled kernels
- works (but with ipipe warnings when interrupt arrives) in 4.4.71 and 4.9.51
The one with classic linux interrupts:
- works in PREEMPT_RT linux (tested on 5.4.5 and 4.19.59 PREEMPT_RT
non-ipipe non-xenomai)
- makes kernel freeze when interrupt arrives on 4.14.71 and 4.19.82
for xenomai ipipe enabled kernels

On 1/28/20, Laurentiu-Cristian Duca <laurentiu.d...@gmail.com> wrote:
> This does not happen with non-ipipe enabled kernels.
> I have tested a classic gpio-interrupt module on PREEMPT_RT and it works,
> but when I tested it on an ipipe-enabled kernel (4.14.71 and 4.19.82)
> got kernel freeze.
>
> On 1/28/20, Greg Gallagher <g...@embeddedgreg.com> wrote:
>> On Tue, Jan 28, 2020 at 7:11 AM Laurentiu-Cristian Duca <
>> laurentiu.d...@gmail.com> wrote:
>>
>>> I forgot to say that I've tested 4.14.71 with xenomai 3.0.9
>>>
>>> On 1/28/20, Laurentiu-Cristian Duca <laurentiu.d...@gmail.com> wrote:
>>> > Hello Jan and friends,
>>> >
>>> > The situation is the following for bbb:
>>> > - 4.14.71 and 4.19.82 xenomai-3 master enabled kernels
>>> > freeze when trying to use gpio-interrupts;
>>> > when interrupt comes the gpioout is toggled but the system
>>> > do not respond anymore to keyboard and nothing more is shown on the
>>> screen
>>> > - note that even if I try a classic (linux only, non-xenomai)
>>
>> This happens even with non-ipipe enables kernels?
>
>>
>>
>>> > gpio interrupt handler in 4.19.82 with xenomai-3
>>> > the system freeze when interrupt comes
>>> > - 4.9.51 and 4.4.71 xenomai 3.0.5 enabled kernels work
>>> > blinking gpioout and do not block,
>>> > but both show warnings when interrupt comes
>>> > which significantly increase interrupt latency.
>>> >
>>> >
>>> > On 1/28/20, Jan Kiszka <jan.kis...@siemens.com> wrote:
>>> >> On 24.01.20 07:24, Greg Gallagher via Xenomai wrote:
>>> >>> I sent a patch offline, if you could try it that would be great.
>>> >>> I'm
>>> >>> having issues getting my board set up.
>>> >>>
>>> >>
>>> >> Do we know by now if this is an I-pipe issue or rather something
>>> >> cobalt-related?
>>> >>
>>> >> Jan
>>> >>
>>> >>> On Thu, Jan 23, 2020 at 1:13 PM Greg Gallagher
>>> >>> <g...@embeddedgreg.com>
>>> >>> wrote:
>>> >>>>
>>> >>>> Hi,
>>> >>>>
>>> >>>> On Thu, Jan 23, 2020 at 12:15 PM Laurentiu-Cristian Duca
>>> >>>> <laurentiu.d...@gmail.com> wrote:
>>> >>>>>
>>> >>>>> Hi, the interrupt comes one per second in my test, so there is no
>>> >>>>> flood.
>>> >>>>> In 4.19 the system it blinks the gpioout but it does not respond
>>> >>>>> to
>>> >>>>> keyboard and does not show anything more on the screen.
>>> >>>>
>>> >>>> Okay, there's a couple things that are different between 4.4 and
>>> >>>> 4.19
>>> >>>> that I'm looking into, which is taking me a little long then I
>>> >>>> thought.  I won't have this patch ready till tomorrow morning.  I
>>> >>>> finally have beaglebone black hardware, I'll make sure the kernel
>>> >>>> boots and then send the patch to you for testing.
>>> >>>>
>>> >>>> -Greg
>>> >>>>
>>> >>>>
>>> >>>>>
>>> >>>>> On Thu, Jan 23, 2020, 19:03 Greg Gallagher <g...@embeddedgreg.com>
>>> >>>>> wrote:
>>> >>>>>>
>>> >>>>>> Hi,
>>> >>>>>>
>>> >>>>>> On Thu, Jan 23, 2020 at 9:21 AM Laurentiu-Cristian Duca via
>>> >>>>>> Xenomai
>>> >>>>>> <xenomai@xenomai.org> wrote:
>>> >>>>>>>
>>> >>>>>>> Hello xenomai community,
>>> >>>>>>>
>>> >>>>>>>      I have successfully tested in xenomai SPI with interrupts
>>> >>>>>>> on
>>> >>>>>>> bbb.
>>> >>>>>>> However, on bbb, if I try to test a basic gpio interrupts
>>> >>>>>>> driver,
>>> >>>>>>> problems appear.
>>> >>>>>>>      Please see details below. I appreciate any idea.
>>> >>>>>>>
>>> >>>>>>> 1. xenomai-3 master linux 4.19.82, default dts
>>> >>>>>>> # insmod xeno_osc-gpio-rtdm.ko
>>> >>>>>>> [  105.582245]  IRQ number 62 !
>>> >>>>>>> [  105.585976] after request irq = 62
>>> >>>>>>> System freeze when first interrupt occurs and I must power off.
>>> >>>>>> Is it possible to use raw_printk and see if the system is still
>>> >>>>>> working but possibly getting flooded by interrupts?  When I
>>> >>>>>> encountered this issue with the BCM2835 port I placed a
>>> >>>>>> raw_printk
>>> in
>>> >>>>>> one of the functions that initially handles the interrupt to see
>>> >>>>>> if
>>> >>>>>> it
>>> >>>>>> was being ack'd.
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> 2. xenomai 3.0.5 linux 4.4.71, default dts
>>> >>>>>>> # insmod xeno_osc-gpio-rtdm.ko
>>> >>>>>>> [   39.901907]  IRQ number 142 !
>>> >>>>>>> [   39.905447] after request irq = 142
>>> >>>>>>>
>>> >>>>>>> When first interrupt occurs:
>>> >>>>>>> [  322.104560] irq 142, desc: df15e500, depth: 1, count: 0,
>>> >>>>>>> unhandled:
>>> >>>>>>> 0
>>> >>>>>>> [  322.111310] ->handle_irq():  c00998b4,
>>> >>>>>>> handle_edge_irq+0x0/0x168
>>> >>>>>>> [  322.117606] ->irq_data.chip(): df156710, 0xdf156710
>>> >>>>>>> [  322.122702] ->action():   (null)
>>> >>>>>>> [  322.126067]    IRQ_NOPROBE set
>>> >>>>>>> [  322.129252] unexpected IRQ trap at vector 8e
>>> >>>>>>> [  322.133706] ------------[ cut here ]------------
>>> >>>>>>> [  322.138530] WARNING: CPU: 0 PID: 0 at kernel/irq/chip.c:843
>>> >>>>>>> __ipipe_ack_bad_irq+0x24/0x3c()
>>> >>>>>>> [  322.147244] Modules linked in: xeno_osc_gpio_rtdm(O)
>>> >>>>>>> [  322.152444] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G
>>> >>>>>>> O
>>> >>>>>>> 4.4.71-ipipe #1
>>> >>>>>>> [  322.160434] Hardware name: Generic AM33XX (Flattened Device
>>> Tree)
>>> >>>>>>> [  322.166791] I-pipe domain: Linux
>>> >>>>>>> [  322.170175] [<c0017bf4>] (unwind_backtrace) from [<c0013d58>]
>>> >>>>>>> (show_stack+0x10/0x14)
>>> >>>>>>> [  322.178273] [<c0013d58>] (show_stack) from [<c0368a0c>]
>>> >>>>>>> (dump_stack+0x9c/0xc4)
>>> >>>>>>> [  322.185829] [<c0368a0c>] (dump_stack) from [<c003d168>]
>>> >>>>>>> (warn_slowpath_common+0x78/0xb4)
>>> >>>>>>> [  322.194280] [<c003d168>] (warn_slowpath_common) from
>>> [<c003d240>]
>>> >>>>>>> (warn_slowpath_null+0x1c/0x24)
>>> >>>>>>> [  322.203455] [<c003d240>] (warn_slowpath_null) from
>>> >>>>>>> [<c00991a8>]
>>> >>>>>>> (__ipipe_ack_bad_irq+0x24/0x3c)
>>> >>>>>>> [  322.212542] [<c00991a8>] (__ipipe_ack_bad_irq) from
>>> >>>>>>> [<c00df9b4>]
>>> >>>>>>> (__ipipe_dispatch_irq+0x78/0x1d8)
>>> >>>>>>> [  322.221903] [<c00df9b4>] (__ipipe_dispatch_irq) from
>>> [<c03a3948>]
>>> >>>>>>> (omap_gpio_irq_handler+0x134/0x1a4)
>>> >>>>>>> [  322.231532] [<c03a3948>] (omap_gpio_irq_handler) from
>>> >>>>>>> [<c0095b1c>]
>>> >>>>>>> (handle_irq_event_percpu+0xa4/0x304)
>>> >>>>>>> [  322.241341] [<c0095b1c>] (handle_irq_event_percpu) from
>>> >>>>>>> [<c0095db4>] (handle_irq_event+0x38/0x5c)
>>> >>>>>>> [  322.250605] [<c0095db4>] (handle_irq_event) from [<c0099858>]
>>> >>>>>>> (handle_level_irq+0x88/0xe4)
>>> >>>>>>> [  322.259235] [<c0099858>] (handle_level_irq) from [<c0095198>]
>>> >>>>>>> (generic_handle_irq+0x20/0x34)
>>> >>>>>>> [  322.268045] [<c0095198>] (generic_handle_irq) from
>>> >>>>>>> [<c009547c>]
>>> >>>>>>> (__handle_domain_irq+0x64/0xd4)
>>> >>>>>>> [  322.277127] [<c009547c>] (__handle_domain_irq) from
>>> >>>>>>> [<c00df228>]
>>> >>>>>>> (__ipipe_do_sync_stage+0x21c/0x25c)
>>> >>>>>>> [  322.286665] [<c00df228>] (__ipipe_do_sync_stage) from
>>> >>>>>>> [<c00093e4>]
>>> >>>>>>> (__ipipe_grab_irq+0x5c/0x7c)
>>> >>>>>>> [  322.295753] [<c00093e4>] (__ipipe_grab_irq) from [<c06462f4>]
>>> >>>>>>> (__irq_svc+0x54/0x60)
>>> >>>>>>> [  322.303745] Exception stack(0xc0937f58 to 0xc0937fa0)
>>> >>>>>>> [  322.309017] 7f40:
>>> >>>>>>>      00000000 df91d240
>>> >>>>>>> [  322.317556] 7f60: 00000000 00000000 c092e240 c0938a24
>>> >>>>>>> 00000000
>>> >>>>>>> c09f4c3c c09389c4 00000001
>>> >>>>>>> [  322.326095] 7f80: c064d88c 00000000 00000000 c0937fa8
>>> >>>>>>> c0080f04
>>> >>>>>>> c00df35c 60000013 ffffffff
>>> >>>>>>> [  322.334634] [<c06462f4>] (__irq_svc) from [<c00df35c>]
>>> >>>>>>> (ipipe_unstall_root+0x38/0x50)
>>> >>>>>>> [  322.342822] [<c00df35c>] (ipipe_unstall_root) from
>>> >>>>>>> [<c0080f04>]
>>> >>>>>>> (cpu_startup_entry+0x68/0x2b8)
>>> >>>>>>> [  322.351826] [<c0080f04>] (cpu_startup_entry) from
>>> >>>>>>> [<c08b0c28>]
>>> >>>>>>> (start_kernel+0x370/0x3e8)
>>> >>>>>>> [  322.360361] ---[ end trace 3de49b4cee31ba0b ]---
>>> >>>>>>>
>>> >>>>>>> When other interrupts occur:
>>> >>>>>>> [  322.365188] irq 142, desc: df15e500, depth: 1, count: 0,
>>> >>>>>>> unhandled:
>>> >>>>>>> 0
>>> >>>>>>> [  322.371908] ->handle_irq():  c00998b4,
>>> >>>>>>> handle_edge_irq+0x0/0x168
>>> >>>>>>> [  322.378183] ->irq_data.chip(): df156710, 0xdf156710
>>> >>>>>>> [  322.383277] ->action():   (null)
>>> >>>>>>> [  322.386641]    IRQ_NOPROBE set
>>> >>>>>>> [  322.389825] unexpected IRQ trap at vector 8e
>>> >>>>>>> [  324.664939] irq 142, desc: df15e500, depth: 1, count: 0,
>>> >>>>>>> unhandled:
>>> >>>>>>> 0
>>> >>>>>>> [  324.671684] ->handle_irq():  c00998b4,
>>> >>>>>>> handle_edge_irq+0x0/0x168
>>> >>>>>>> [  324.677980] ->irq_data.chip(): df156710, 0xdf156710
>>> >>>>>>> [  324.683077] ->action():   (null)
>>> >>>>>>> [  324.686442]    IRQ_NOPROBE set
>>> >>>>>>> ...
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> 3. Source code of the basic gpio interrupt driver:
>>> >>>>>>>
>>> >>>>>>> #include <linux/fs.h>
>>> >>>>>>> #include <linux/gpio.h>
>>> >>>>>>> #include <linux/interrupt.h>
>>> >>>>>>> #include <linux/module.h>
>>> >>>>>>>
>>> >>>>>>> #include <rtdm/driver.h>
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> static unsigned int irq_num;
>>> >>>>>>> // bbb gpios that work on PREEMPT_RT linux 4.19.59 and 5.4.5
>>> >>>>>>> with
>>> >>>>>>> default dts
>>> >>>>>>> static unsigned int gpio_out = 48;
>>> >>>>>>> static unsigned int gpio_in = 115;
>>> >>>>>>> static bool value = false;
>>> >>>>>>> static rtdm_irq_t irq_handle;
>>> >>>>>>> static int num_of_intr = 0;
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> static int gpio_irq_handler(rtdm_irq_t * irq)
>>> >>>>>>> {
>>> >>>>>>>      value = !value;
>>> >>>>>>>      gpio_set_value(gpio_out, value); // toggle the led
>>> >>>>>>> everytime
>>> >>>>>>> irq
>>> >>>>>>> handler is invoked
>>> >>>>>>>      trace_printk("GPIO interrupt \n");
>>> >>>>>>>      num_of_intr++;
>>> >>>>>>>      return RTDM_IRQ_HANDLED;
>>> >>>>>>> }
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> static int __init rtdm_init (void)
>>> >>>>>>> {
>>> >>>>>>>      int err;
>>> >>>>>>>
>>> >>>>>>>      if ((err = gpio_request(gpio_in, THIS_MODULE->name)) != 0)
>>> >>>>>>> {
>>> >>>>>>>          printk(" gpio_request gpio_in failed ! \n");
>>> >>>>>>>          return err;
>>> >>>>>>>      }
>>> >>>>>>>
>>> >>>>>>>      if ((err = gpio_direction_input(gpio_in)) != 0) {
>>> >>>>>>>          printk(" gpio_direction_input gpio_in failed ! \n");
>>> >>>>>>>          gpio_free(gpio_in);
>>> >>>>>>>
>>> >>>>>>>          return err;
>>> >>>>>>>      }
>>> >>>>>>>
>>> >>>>>>>      irq_num = gpio_to_irq(gpio_in);
>>> >>>>>>>
>>> >>>>>>>      printk(" IRQ number %d !  \n",irq_num);
>>> >>>>>>>
>>> >>>>>>>      if ((err = gpio_request(gpio_out, THIS_MODULE->name)) != 0)
>>> >>>>>>> {
>>> >>>>>>>          printk(" gpio_request gpio_out failed ! \n");
>>> >>>>>>>          gpio_free(gpio_in);
>>> >>>>>>>          return err;
>>> >>>>>>>      }
>>> >>>>>>>
>>> >>>>>>>      if ((err = gpio_direction_output(gpio_out, 0)) != 0) {
>>> >>>>>>>          printk(" gpio_direction_input gpio_out failed ! \n");
>>> >>>>>>>          gpio_free(gpio_out);
>>> >>>>>>>          gpio_free(gpio_in);
>>> >>>>>>>          return err;
>>> >>>>>>>      }
>>> >>>>>>>
>>> >>>>>>>      err = irq_set_irq_type(irq_num,  IRQF_TRIGGER_RISING);
>>> >>>>>>>
>>> >>>>>>>      if(err) {
>>> >>>>>>>          gpio_free(gpio_out);
>>> >>>>>>>          gpio_free(gpio_in);
>>> >>>>>>>          printk(" irq_set_irq_type failed ! \n");
>>> >>>>>>>          return err;
>>> >>>>>>>      }
>>> >>>>>>>
>>> >>>>>>>      err =
>>> >>>>>>>
>>> rtdm_irq_request(&irq_handle,irq_num,(rtdm_irq_handler_t)gpio_irq_handler,
>>> >>>>>>>                  RTDM_IRQTYPE_EDGE,THIS_MODULE->name, NULL);
>>> >>>>>>>
>>> >>>>>>>      printk("after request irq = %d \n",irq_handle.irq);
>>> >>>>>>>
>>> >>>>>>>      if(err) {
>>> >>>>>>>          gpio_free(gpio_out);
>>> >>>>>>>          gpio_free(gpio_in);
>>> >>>>>>>          printk(" rtdm_irq_request failed ! \n");
>>> >>>>>>>          return err;
>>> >>>>>>>      }
>>> >>>>>>>
>>> >>>>>>>      err = rtdm_irq_enable(&irq_handle);
>>> >>>>>>>
>>> >>>>>>>      if (err < 0) {
>>> >>>>>>>          printk("rtdm_irq_enable failed \n");
>>> >>>>>>>          return err;
>>> >>>>>>>      }
>>> >>>>>>>      return 0;
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> }
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> static void __exit rtdm_exit (void)
>>> >>>>>>> {
>>> >>>>>>>      rtdm_irq_free(&irq_handle);
>>> >>>>>>>      gpio_free(gpio_out);
>>> >>>>>>>      gpio_free(gpio_in);
>>> >>>>>>>
>>> >>>>>>>      printk("The number of intr is %d \n",num_of_intr);
>>> >>>>>>> }
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> module_init(rtdm_init);
>>> >>>>>>> module_exit(rtdm_exit);
>>> >>>>>>> MODULE_LICENSE("GPL");
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> Thank you,
>>> >>>>>>> L-C Duca
>>> >>>>>>>
>>> >>>>>> My above comments would be good to start debugging the issue.
>>> >>>>>> Looking
>>> >>>>>> at the ipipe trees I think we are missing some ipipe things in
>>> >>>>>> the
>>> >>>>>> GPIO driver from 4.4 to 4.19.  When I diff the files it looks
>>> >>>>>> like
>>> >>>>>> there are some things missing in 4.19.  I can make a patch for
>>> >>>>>> you
>>> to
>>> >>>>>> try, I'll have it ready shortly.
>>> >>>>>>
>>> >>>>>> -Greg
>>> >>>
>>> >>
>>> >> --
>>> >> Siemens AG, Corporate Technology, CT RDA IOT SES-DE
>>> >> Corporate Competence Center Embedded Linux
>>> >>
>>> >
>>>
>> I think this is an ipipe issue, I am able to reproduce but I’ll need a
>> little more time to confirm my findings, printascii is not working for me
>> on this SOC.
>>
>> Greg
>>
>

Reply via email to