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 >> >