All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Boyd <swboyd@chromium.org>
To: Maulik Shah <mkshah@codeaurora.org>,
	bjorn.andersson@linaro.org, evgreen@chromium.org,
	linus.walleij@linaro.org, maz@kernel.org, mka@chromium.org
Cc: linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org,
	linux-gpio@vger.kernel.org, agross@kernel.org,
	tglx@linutronix.de, jason@lakedaemon.net, dianders@chromium.org,
	rnayak@codeaurora.org, ilina@codeaurora.org,
	lsrao@codeaurora.org
Subject: Re: [PATCH v2 4/4] irqchip: qcom-pdc: Introduce irq_set_wake call
Date: Fri, 19 Jun 2020 02:26:07 -0700	[thread overview]
Message-ID: <159255876756.62212.4221488367063412094@swboyd.mtv.corp.google.com> (raw)
In-Reply-To: <4e318931-cff0-0d8b-d0a0-9d139533c551@codeaurora.org>

Quoting Maulik Shah (2020-06-18 03:03:03)
> On 6/16/2020 5:27 PM, Stephen Boyd wrote:
> > Quoting Maulik Shah (2020-06-01 04:38:25)
> >> On 5/31/2020 12:56 AM, Stephen Boyd wrote:
> >>> Quoting Maulik Shah (2020-05-29 02:20:32)
> >>>> On 5/27/2020 3:45 PM, Stephen Boyd wrote:
> >>>>> Quoting Maulik Shah (2020-05-23 10:11:13)
> >>>>>> @@ -118,6 +120,7 @@ static void qcom_pdc_gic_unmask(struct irq_data *d)
> >>>>>>            if (d->hwirq == GPIO_NO_WAKE_IRQ)
> >>>>>>                    return;
> >>>>>>     
> >>>>>> +       pdc_enable_intr(d, true);
> >>>>>>            irq_chip_unmask_parent(d);
> >>>>>>     }
> >>>>>>     
> >>>>> I find these two hunks deeply confusing. I'm not sure what the
> >>>>> maintainers think though. I hope it would be simpler to always enable
> >>>>> the hwirqs in the pdc when an irq is requested and only disable it in
> >>>>> the pdc when the system goes to suspend and the pdc pin isn't for an irq
> >>>>> that's marked for wakeup. Does that break somehow?
> >>>> PDC monitors interrupts during CPUidle as well, in cases where deepest
> >>>> low power mode happened from cpuidle where GIC is not active.
> >>>> If we keep PDC IRQ always enabled/unmasked during idle and then
> >>>> disable/mask when entering to suspend, it will break cpuidle.
> >>> How does it break cpuidle? The irqs that would be enabled/unmasked in
> >>> pdc would only be the irqs that the kernel has setup irq handlers for
> >>> (from request_irq() and friends).  We want those irqs to keep working
> >>> during cpuidle and wake the CPU from the deepest idle states.
> >>>> I hope it would be simpler to always enable
> >>>> the hwirqs in the pdc when an irq is requested and only disable it in
> >>>> the pdc when the system goes to suspend and the pdc pin isn't for an irq
> >>>> that's marked for wakeup
> >>>> How does it break cpuidle?
> >> Consider a scenario..
> >> 1. All PDC irqs enabled/unmasked in HW when request_irq() happened/alloc happens
> >> 2. Client driver disable's irq. (lazy disable is there, so in HW its still unmasked) but disabled in SW.
> >> 3. Device enters deep CPUidle low power modes where only PDC monitors IRQ.
> >> 4. This IRQ can still wakeup from CPUidle since it was monitored by PDC.
> >> 5. From handler, it comes to know that IRQ is disabled in SW, so it really invokes irq_mask callback now to disable in HW.
> >> 6. This mask callback doesn't operate on PDC (since in PDC, IRQs gets masked only during suspend, all other times its enabled)
> >> 7. step 3 to 6 repeats, if this IRQ keeps on coming and waking up from deep cpuidle states.
> > Ok so in summary, irq is left unmasked in pdc during deep cpu idle and
> > it keeps waking up the CPU because it isn't masked at the PDC after the
> > first time it interrupts? Is this a power problem?
> yes it can be a power problem.
> >   Because from a
> > correctness standpoint we don't really care. It woke up the CPU because
> > it happened, and the GIC can decide to ignore it or not by masking it at
> > the GIC. I thought that the PDC wouldn't wake up the CPU if we masked
> > the irq at the GIC level. Is that not true?
> 
> once PDC detects IRQ, it directly doesn't wake up CPU. it replays IRQ to 
> GIC.
> 
> since at GIC its masked, GIC doesn't forward to cpu to immediatly wake 
> it up.
> 
> however after PDC detecting IRQ, it exits low power mode and 
> watchdog/timer can wakeup upon expiry.

Ok. So the only problem is some screaming irq that really wants to be
handled but the driver that requested it has disabled it at runtime. The
IRQ keeps kicking the CPUs out of deep idle and then eventually the
timer tick happens and we've run the CPUs in a shallower idle state for
this time? Presumably we'd like to have these irqs be lazily masked at
the PDC so that they can become pending when they first arrive but not
block deep idle states if they're interrupting often while being
handled.

On the other hand, we want irq wake state to be the only factor in irqs
being unmasked at the PDC on the entry to suspend. Purely
masking/unmasking at the PDC when the irq is masked in software doesn't
work because suspend/resume will break for disabled but wake enabled
irqs. But doing that makes idle work easily because we can assume during
idle that leaving it unmasked until it fires and then masking it in the
PDC until it is handled gives us good deep idle states in the face of
screaming irqs.

What are the actual requirements? Here is my attempt to boil this
discussion down into a few bullet points:

 1. During system suspend, wake enabled irqs should be enabled in PDC
 and all other irqs should be disabled in PDC.

 2. During idle, enabled irqs must be enabled in PDC, unless they're
 pending in which case they should be masked in the PDC so as to not
 wake up the CPU from deep idle states

 3. During non-idle, non-suspend, enabled irqs must be enabled in PDC.

Or is #3 actually false and PDC has no bearing on this?

  reply	other threads:[~2020-06-19  9:26 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-23 17:11 [PATCH v2 0/4] irqchip: qcom: pdc: Introduce irq_set_wake call Maulik Shah
2020-05-23 17:11 ` [PATCH v2 1/4] gpio: gpiolib: Allow GPIO IRQs to lazy disable Maulik Shah
2020-05-25 11:55   ` Linus Walleij
2020-05-25 12:22     ` Hans Verkuil
2020-05-26  4:45       ` Maulik Shah
2020-05-27 10:38     ` Hans Verkuil
2020-05-27 13:56       ` Linus Walleij
2020-05-27 14:15         ` Russell King - ARM Linux admin
2020-05-27  9:44   ` Stephen Boyd
2020-05-27 11:26     ` Maulik Shah
2020-05-28  1:08       ` Stephen Boyd
2020-05-28 13:11         ` Maulik Shah
2020-05-28 22:22           ` Stephen Boyd
2020-05-29  9:57             ` Maulik Shah
2020-05-28 21:33   ` Linus Walleij
     [not found]     ` <159070486671.69627.662167272601689396@swboyd.mtv.corp.google.com>
2020-06-03 12:28       ` Linus Walleij
2020-05-23 17:11 ` [PATCH v2 2/4] pinctrl: qcom: Remove irq_disable callback from msmgpio irqchip Maulik Shah
2020-05-23 17:11 ` [PATCH v2 3/4] pinctrl: qcom: Add msmgpio irqchip flags Maulik Shah
2020-05-27  9:47   ` Stephen Boyd
2020-05-27 12:30     ` Maulik Shah
2020-05-23 17:11 ` [PATCH v2 4/4] irqchip: qcom-pdc: Introduce irq_set_wake call Maulik Shah
2020-05-27 10:15   ` Stephen Boyd
2020-05-29  9:20     ` Maulik Shah
2020-05-30 19:26       ` Stephen Boyd
2020-06-01 11:38         ` Maulik Shah
2020-06-16 11:57           ` Stephen Boyd
2020-06-18 10:03             ` Maulik Shah
2020-06-19  9:26               ` Stephen Boyd [this message]
2020-06-22  9:19                 ` Maulik Shah

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=159255876756.62212.4221488367063412094@swboyd.mtv.corp.google.com \
    --to=swboyd@chromium.org \
    --cc=agross@kernel.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=dianders@chromium.org \
    --cc=evgreen@chromium.org \
    --cc=ilina@codeaurora.org \
    --cc=jason@lakedaemon.net \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lsrao@codeaurora.org \
    --cc=maz@kernel.org \
    --cc=mka@chromium.org \
    --cc=mkshah@codeaurora.org \
    --cc=rnayak@codeaurora.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.