Message ID | 20170323124355.npcptv255roleku3@lenoch (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
* Ladislav Michl <ladis@linux-mips.org> [170323 05:46]: > Edge triggered interrupts are lost no matter how fast is its source. > It happens even at 10Hz and patch bellow fixes issue. Of course, > it is just a hack showing where problem is and it will need a bit > more debugging. OK disabling pm_runtime fixes it.. Care to describe which GPIO bank you're testing with? For GPIO bank1, context is never lost so wake-ups work without the wakeirqs handled by pinctrl-single.c. But you should not hit this unless you've configured the system to hit off mode during idle by setting /sys/kernel/debug/pm_debug/enable_off_mode and configuring UART autosuspend. So it seems the runtime_suspend/resume edge configuration for wake-up events causes it? If nothing else helps, I guess one option would be to implement pm_runtime_use_autosuspend() with the timeout configured to 100ms or something similar. But that seems like a workaround and won't fix the real issue. Regards, Tony > diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c > index efc85a279d54..f6398ab7b75a 100644 > --- a/drivers/gpio/gpio-omap.c > +++ b/drivers/gpio/gpio-omap.c > @@ -1273,6 +1273,7 @@ static int omap_gpio_runtime_suspend(struct device *dev) > unsigned long flags; > u32 wake_low, wake_hi; > > + return -EINVAL; > raw_spin_lock_irqsave(&bank->lock, flags); > > /* > @@ -1341,6 +1342,7 @@ static int omap_gpio_runtime_resume(struct device *dev) > unsigned long flags; > int c; > > + return -EINVAL; > raw_spin_lock_irqsave(&bank->lock, flags); > > /* > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 03/23/2017 09:49 AM, Tony Lindgren wrote: > * Ladislav Michl <ladis@linux-mips.org> [170323 05:46]: >> Edge triggered interrupts are lost no matter how fast is its source. >> It happens even at 10Hz and patch bellow fixes issue. Of course, >> it is just a hack showing where problem is and it will need a bit >> more debugging. > > OK disabling pm_runtime fixes it.. Care to describe which GPIO bank > you're testing with? > > For GPIO bank1, context is never lost so wake-ups work without > the wakeirqs handled by pinctrl-single.c. But you should not hit > this unless you've configured the system to hit off mode during > idle by setting /sys/kernel/debug/pm_debug/enable_off_mode and > configuring UART autosuspend. > > So it seems the runtime_suspend/resume edge configuration for > wake-up events causes it? > > If nothing else helps, I guess one option would be to implement > pm_runtime_use_autosuspend() with the timeout configured to > 100ms or something similar. But that seems like a workaround and > won't fix the real issue. This is really strange as PM runtime will be executed only when first gpio is requested - all other time gpio bank should stay active. Only one possibility is deep CPUIdle or Suspend states, but in this case some QoS setup may require to block these states while IR/App is running. > > Regards, > > Tony > >> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c >> index efc85a279d54..f6398ab7b75a 100644 >> --- a/drivers/gpio/gpio-omap.c >> +++ b/drivers/gpio/gpio-omap.c >> @@ -1273,6 +1273,7 @@ static int omap_gpio_runtime_suspend(struct device *dev) >> unsigned long flags; >> u32 wake_low, wake_hi; >> >> + return -EINVAL; >> raw_spin_lock_irqsave(&bank->lock, flags); >> >> /* >> @@ -1341,6 +1342,7 @@ static int omap_gpio_runtime_resume(struct device *dev) >> unsigned long flags; >> int c; >> >> + return -EINVAL; >> raw_spin_lock_irqsave(&bank->lock, flags); >> >> /*
* Grygorii Strashko <grygorii.strashko@ti.com> [170324 10:35]: > > > On 03/23/2017 09:49 AM, Tony Lindgren wrote: > > * Ladislav Michl <ladis@linux-mips.org> [170323 05:46]: > > > Edge triggered interrupts are lost no matter how fast is its source. > > > It happens even at 10Hz and patch bellow fixes issue. Of course, > > > it is just a hack showing where problem is and it will need a bit > > > more debugging. > > > > OK disabling pm_runtime fixes it.. Care to describe which GPIO bank > > you're testing with? > > > > For GPIO bank1, context is never lost so wake-ups work without > > the wakeirqs handled by pinctrl-single.c. But you should not hit > > this unless you've configured the system to hit off mode during > > idle by setting /sys/kernel/debug/pm_debug/enable_off_mode and > > configuring UART autosuspend. > > > > So it seems the runtime_suspend/resume edge configuration for > > wake-up events causes it? > > > > If nothing else helps, I guess one option would be to implement > > pm_runtime_use_autosuspend() with the timeout configured to > > 100ms or something similar. But that seems like a workaround and > > won't fix the real issue. > > This is really strange as PM runtime will be executed only when > first gpio is requested - all other time gpio bank should stay active. > > Only one possibility is deep CPUIdle or Suspend states, but in this case > some QoS setup may require to block these states while IR/App is > running. I think this is triggered when omap3 PM in omap_sram_idle() calls omap2_gpio_prepare_for_idle(). If that's the case, we could fix it with a PM QoS configuration similar to how the audio glitches were fixed in commit 9834ffd1ecc3 ("ASoC: omap-mcbsp: Add PM QoS support for McBSP to prevent glitches"). No idea what should set the latency requirement though. Probably the IR driver when active? That probably still won't help with fact that we can lose events though. Ideally things would just work even without the PM QoS. Regards, Tony -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
hi Ladislav, On 03/24/2017 12:33 PM, Grygorii Strashko wrote: > > > On 03/23/2017 09:49 AM, Tony Lindgren wrote: >> * Ladislav Michl <ladis@linux-mips.org> [170323 05:46]: >>> Edge triggered interrupts are lost no matter how fast is its source. >>> It happens even at 10Hz and patch bellow fixes issue. Of course, >>> it is just a hack showing where problem is and it will need a bit >>> more debugging. >> >> OK disabling pm_runtime fixes it.. Care to describe which GPIO bank >> you're testing with? >> >> For GPIO bank1, context is never lost so wake-ups work without >> the wakeirqs handled by pinctrl-single.c. But you should not hit >> this unless you've configured the system to hit off mode during >> idle by setting /sys/kernel/debug/pm_debug/enable_off_mode and >> configuring UART autosuspend. >> >> So it seems the runtime_suspend/resume edge configuration for >> wake-up events causes it? >> >> If nothing else helps, I guess one option would be to implement >> pm_runtime_use_autosuspend() with the timeout configured to >> 100ms or something similar. But that seems like a workaround and >> won't fix the real issue. > > This is really strange as PM runtime will be executed only when > first gpio is requested - all other time gpio bank should stay active. > > Only one possibility is deep CPUIdle or Suspend states, but in this case > some QoS setup may require to block these states while IR/App is > running. > Do you have any news here? a) will it fix your issue if you just disable cpuidle and auto-suspend? b) will it fix your issue if you disable cpuidle and auto-suspend, and apply fix in omap_gpio_ack_irq()? ...
Hi Grygorii, On Mon, Apr 03, 2017 at 03:20:47PM -0500, Grygorii Strashko wrote: > hi Ladislav, > > On 03/24/2017 12:33 PM, Grygorii Strashko wrote: > > > > > > On 03/23/2017 09:49 AM, Tony Lindgren wrote: > > > * Ladislav Michl <ladis@linux-mips.org> [170323 05:46]: > > > > Edge triggered interrupts are lost no matter how fast is its source. > > > > It happens even at 10Hz and patch bellow fixes issue. Of course, > > > > it is just a hack showing where problem is and it will need a bit > > > > more debugging. > > > > > > OK disabling pm_runtime fixes it.. Care to describe which GPIO bank > > > you're testing with? > > > > > > For GPIO bank1, context is never lost so wake-ups work without > > > the wakeirqs handled by pinctrl-single.c. But you should not hit > > > this unless you've configured the system to hit off mode during > > > idle by setting /sys/kernel/debug/pm_debug/enable_off_mode and > > > configuring UART autosuspend. > > > > > > So it seems the runtime_suspend/resume edge configuration for > > > wake-up events causes it? > > > > > > If nothing else helps, I guess one option would be to implement > > > pm_runtime_use_autosuspend() with the timeout configured to > > > 100ms or something similar. But that seems like a workaround and > > > won't fix the real issue. > > > > This is really strange as PM runtime will be executed only when > > first gpio is requested - all other time gpio bank should stay active. > > > > Only one possibility is deep CPUIdle or Suspend states, but in this case > > some QoS setup may require to block these states while IR/App is > > running. > > > > Do you have any news here? > a) will it fix your issue if you just disable cpuidle and auto-suspend? > b) will it fix your issue if you disable cpuidle and auto-suspend, and > apply fix in omap_gpio_ack_irq()? > ... a) almost fixes issue, rarely interrupt is lost. b) fixes issue (most likely, I'd need to build test equipment to detect interrupt misses and run test over weekend) And as omap_gpio_ack_irq fix is obviously correct, I'm sending it as proper patch. According to Tony, the rest could be optimized somehow :-) ladis -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index efc85a279d54..f6398ab7b75a 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -1273,6 +1273,7 @@ static int omap_gpio_runtime_suspend(struct device *dev) unsigned long flags; u32 wake_low, wake_hi; + return -EINVAL; raw_spin_lock_irqsave(&bank->lock, flags); /* @@ -1341,6 +1342,7 @@ static int omap_gpio_runtime_resume(struct device *dev) unsigned long flags; int c; + return -EINVAL; raw_spin_lock_irqsave(&bank->lock, flags); /*