linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Maulik Shah <mkshah@codeaurora.org>
To: Thomas Gleixner <tglx@linutronix.de>,
	Stephen Boyd <swboyd@chromium.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,
	jason@lakedaemon.net, dianders@chromium.org,
	rnayak@codeaurora.org, ilina@codeaurora.org,
	lsrao@codeaurora.org
Subject: Re: [PATCH v5 3/6] genirq/PM: Introduce IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND flag
Date: Wed, 26 Aug 2020 15:22:51 +0530	[thread overview]
Message-ID: <8763521f-b121-877a-1d59-5f969dd75e51@codeaurora.org> (raw)
In-Reply-To: <874koqxv6t.fsf@nanos.tec.linutronix.de>

Hi,

On 8/26/2020 3:08 AM, Thomas Gleixner wrote:
> On Tue, Aug 25 2020 at 03:12, Stephen Boyd wrote:
>> Quoting Maulik Shah (2020-08-22 09:16:58)
>>> diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c
>>> index c6c7e18..2cc800b 100644
>>> --- a/kernel/irq/pm.c
>>> +++ b/kernel/irq/pm.c
>>> @@ -69,12 +69,17 @@ void irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action)
>>>   
>>>   static bool suspend_device_irq(struct irq_desc *desc)
>>>   {
>>> +       unsigned long chipflags = irq_desc_get_chip(desc)->flags;
>>> +
>>>          if (!desc->action || irq_desc_is_chained(desc) ||
>>>              desc->no_suspend_depth)
>>>                  return false;
>>>   
>>>          if (irqd_is_wakeup_set(&desc->irq_data)) {
>>>                  irqd_set(&desc->irq_data, IRQD_WAKEUP_ARMED);
>>> +
>>> +               if (chipflags & IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND)
>>> +                       irq_enable(desc);
>> Where is the corresponding change to resume_irq()? Don't we need to
>> disable an irq if it was disabled on suspend and forcibly enabled here?
I should have added comment explaining why i did not added.
I thought of having corresponding change to resume_irq() but i did not 
kept intentionally since i didn't
observe any issue in my testing.

Actually the drivers which called (disable_irq() + enable_irq_wake()), 
are invoking enable_irq()
in the resume path everytime. With the driver's call to enable_irq() 
things are restoring back already.

If above is not true in some corner case, then the IRQ handler of driver 
won't get invoked, in such case,
why even to wake up with such IRQs in the first place, right?

However If we don't want to rely on the drivers doing things correctly, 
state can be restored in resume_irq()
I explored this, During suspend,

1. Some IRQs are unmasked/enabled + marked for wakeup
2. Some IRQs are masked/disabled + marked for wakeup

So have to track and restore only IRQs in category (2).
With current patch we don't have way to track IRQ is in (1) or (2).
It may be done with the new IRQD flag saying like 
IRQD_IRQ_ENABLED_ON_SUSPEND

During suspend,
First check if the IRQ was in disabled/masked state to invoke 
irq_enable() only for category (2) and set the new flag.

     if (irqd_irq_disabled(&desc->irq_data) && (chipflags & 
IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND)) {
         irq_enable(desc);
         irq_state_set_enabled_on_suspend(desc); => this will set new 
IRQD_IRQ_ENABLED_ON_SUSPEND
     }

During resume,
Simply calling irq_disable(desc); don't work in resume_irq(), since by 
default this API tries to lazily disable at HW, which won't quite 
restore the state,
So instead of adding below

     if (irqd_irq_disabled(&desc->irq_data) && (chipflags & 
IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND)
     && (irqd_is_enabled_on_suspend(desc)))
     {
         irq_disable(desc);
         irq_state_clear_enabled_on_suspend(desc); => clear flag
     }

we can replicate the irq_disable() with removal of lazy part, something 
like,

     if (irqd_irq_disabled(&desc->irq_data) && (chipflags & 
IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND) &&
     (irqd_is_enabled_on_suspend(desc))) { ==> The new flag used to 
determine if IRQ was enabled during suspend path, then only restore.
         irq_state_set_disabled(desc);
         if (desc->irq_data.chip->irq_disable) {
desc->irq_data.chip->irq_disable(&desc->irq_data);
             irq_state_set_masked(desc);
         } else {
         mask_irq(desc);
     }
     irq_state_clear_enabled_on_suspend(desc);
}

which is matching exactly reverse of what is done in suspend entry.
Let me know if above is good i can include this in v6.

Thanks,
Maulik

> That part was below the POC code I provided in the fine print:
>
>   "plus the counterpart in the resume path. This also ensures that state is
>    consistent."
>
> Who reads the fine print? :)

-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation


  reply	other threads:[~2020-08-26  9:53 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-22 16:16 [PATCH v5 0/6] irqchip: qcom: pdc: Introduce irq_set_wake call Maulik Shah
2020-08-22 16:16 ` [PATCH v5 1/6] pinctrl: qcom: Set IRQCHIP_SET_TYPE_MASKED and IRQCHIP_MASK_ON_SUSPEND flags Maulik Shah
2020-08-31 18:33   ` Bjorn Andersson
2020-08-22 16:16 ` [PATCH v5 2/6] pinctrl: qcom: Use return value from irq_set_wake() call Maulik Shah
2020-08-31 18:19   ` Bjorn Andersson
2020-08-22 16:16 ` [PATCH v5 3/6] genirq/PM: Introduce IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND flag Maulik Shah
2020-08-25 10:12   ` Stephen Boyd
2020-08-25 21:38     ` Thomas Gleixner
2020-08-26  9:52       ` Maulik Shah [this message]
2020-08-26 10:15         ` Thomas Gleixner
2020-08-31 15:12           ` Doug Anderson
2020-09-01  9:51             ` Thomas Gleixner
2020-09-02 20:26               ` Doug Anderson
2020-09-03 12:57                 ` Thomas Gleixner
2020-09-03 23:19                   ` Doug Anderson
2020-09-04  9:54                     ` Thomas Gleixner
2020-09-08 19:05                       ` Doug Anderson
2020-09-10  8:51                         ` Thomas Gleixner
2020-08-22 16:16 ` [PATCH v5 4/6] pinctrl: qcom: Set " Maulik Shah
2020-08-25 10:14   ` Stephen Boyd
2020-08-25 19:58   ` Doug Anderson
2020-08-22 16:17 ` [PATCH v5 5/6] irqchip: qcom-pdc: " Maulik Shah
2020-08-25 10:14   ` Stephen Boyd
2020-08-25 19:59   ` Doug Anderson
2020-08-22 16:17 ` [PATCH v5 6/6] irqchip: qcom-pdc: Reset PDC interrupts during init Maulik Shah
2020-08-25 10:14   ` Stephen Boyd
2020-08-25 20:00   ` Doug Anderson
2020-08-27 22:48 ` [PATCH v5 0/6] irqchip: qcom: pdc: Introduce irq_set_wake call Linus Walleij

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=8763521f-b121-877a-1d59-5f969dd75e51@codeaurora.org \
    --to=mkshah@codeaurora.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=rnayak@codeaurora.org \
    --cc=swboyd@chromium.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).