From: Adrian Hunter <adrian.hunter@intel.com>
To: Sven van Ashbrook <svenva@chromium.org>,
LKML <linux-kernel@vger.kernel.org>,
ulf.hansson@linaro.org
Cc: jason.lai@genesyslogic.com.tw, skardach@google.com,
Renius Chen <reniuschengl@gmail.com>,
linux-mmc@vger.kernel.org, greg.tu@genesyslogic.com.tw,
jasonlai.genesyslogic@gmail.com, SeanHY.chen@genesyslogic.com.tw,
ben.chuang@genesyslogic.com.tw, victor.shih@genesyslogic.com.tw,
stable@vger.kernel.org
Subject: Re: [PATCH v2] mmc: sdhci-pci-gli: fix LPM negotiation so x86/S0ix SoCs can suspend
Date: Thu, 24 Aug 2023 14:46:55 +0300 [thread overview]
Message-ID: <e22c4a5f-c592-7121-7173-eef669ebdf89@intel.com> (raw)
In-Reply-To: <20230823174134.v2.1.I7ed1ca09797be2dd76ca914c57d88b32d24dac88@changeid>
Hi
Looks OK - a few minor comments below
On 23/08/23 20:41, Sven van Ashbrook wrote:
> To improve the r/w performance of GL9763E, the current driver inhibits LPM
> negotiation while the device is active.
>
> This prevents a large number of SoCs from suspending, notably x86 systems
If possible, can you give example of which SoCs / products
> which use S0ix as the suspend mechanism:
> 1. Userspace initiates s2idle suspend (e.g. via writing to
> /sys/power/state)
> 2. This switches the runtime_pm device state to active, which disables
> LPM negotiation, then calls the "regular" suspend callback
> 3. With LPM negotiation disabled, the bus cannot enter low-power state
> 4. On a large number of SoCs, if the bus not in a low-power state, S0ix
> cannot be entered, which in turn prevents the SoC from entering
> suspend.
>
> Fix by re-enabling LPM negotiation in the device's suspend callback.
>
> Suggested-by: Stanislaw Kardach <skardach@google.com>
> Fixes: f9e5b33934ce ("mmc: host: Improve I/O read/write performance for GL9763E")
> Cc: stable@vger.kernel.org
> Signed-off-by: Sven van Ashbrook <svenva@chromium.org>
> # on gladios device
> # on 15590.0.0 with v5.10 and upstream (v6.4) kernels
>
3 extraneous lines here - please remove
> ---
>
> Changes in v2:
> - improved symmetry and error path in s2idle suspend callback (internal review)
>
> drivers/mmc/host/sdhci-pci-gli.c | 102 +++++++++++++++++++------------
> 1 file changed, 64 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci-pci-gli.c b/drivers/mmc/host/sdhci-pci-gli.c
> index 1792665c9494a..19f577cc8bceb 100644
> --- a/drivers/mmc/host/sdhci-pci-gli.c
> +++ b/drivers/mmc/host/sdhci-pci-gli.c
> @@ -745,42 +745,6 @@ static u32 sdhci_gl9750_readl(struct sdhci_host *host, int reg)
> return value;
> }
>
> -#ifdef CONFIG_PM_SLEEP
> -static int sdhci_pci_gli_resume(struct sdhci_pci_chip *chip)
> -{
> - struct sdhci_pci_slot *slot = chip->slots[0];
> -
> - pci_free_irq_vectors(slot->chip->pdev);
> - gli_pcie_enable_msi(slot);
> -
> - return sdhci_pci_resume_host(chip);
> -}
> -
> -static int sdhci_cqhci_gli_resume(struct sdhci_pci_chip *chip)
> -{
> - struct sdhci_pci_slot *slot = chip->slots[0];
> - int ret;
> -
> - ret = sdhci_pci_gli_resume(chip);
> - if (ret)
> - return ret;
> -
> - return cqhci_resume(slot->host->mmc);
> -}
> -
> -static int sdhci_cqhci_gli_suspend(struct sdhci_pci_chip *chip)
> -{
> - struct sdhci_pci_slot *slot = chip->slots[0];
> - int ret;
> -
> - ret = cqhci_suspend(slot->host->mmc);
> - if (ret)
> - return ret;
> -
> - return sdhci_suspend_host(slot->host);
> -}
> -#endif
> -
> static void gl9763e_hs400_enhanced_strobe(struct mmc_host *mmc,
> struct mmc_ios *ios)
> {
> @@ -1029,6 +993,68 @@ static int gl9763e_runtime_resume(struct sdhci_pci_chip *chip)
> }
> #endif
>
> +#ifdef CONFIG_PM_SLEEP
> +static int sdhci_pci_gli_resume(struct sdhci_pci_chip *chip)
> +{
> + struct sdhci_pci_slot *slot = chip->slots[0];
> +
> + pci_free_irq_vectors(slot->chip->pdev);
> + gli_pcie_enable_msi(slot);
> +
> + return sdhci_pci_resume_host(chip);
> +}
> +
> +static int gl9763e_resume(struct sdhci_pci_chip *chip)
> +{
> + struct sdhci_pci_slot *slot = chip->slots[0];
> + int ret;
> +
> + ret = sdhci_pci_gli_resume(chip);
> + if (ret)
> + return ret;
> +
> + ret = cqhci_resume(slot->host->mmc);
> + if (ret)
> + return ret;
> +
> + /* Disable LPM negotiation to bring device back in sync
> + * with its runtime_pm state.
> + */
I would prefer the comment style:
/*
* Blah, blah ...
* Blah, blah, blah.
*/
> + gl9763e_set_low_power_negotiation(slot, false);
> +
> + return 0;
> +}
> +
> +static int gl9763e_suspend(struct sdhci_pci_chip *chip)
> +{
> + struct sdhci_pci_slot *slot = chip->slots[0];
> + int ret;
> +
> + /* Certain SoCs can suspend only with the bus in low-
Ditto re comment style
> + * power state, notably x86 SoCs when using S0ix.
> + * Re-enable LPM negotiation to allow entering L1 state
> + * and entering system suspend.
> + */
> + gl9763e_set_low_power_negotiation(slot, true);
Couldn't this be at the end of the function, save
an error path
> +
> + ret = cqhci_suspend(slot->host->mmc);
> + if (ret)
> + goto err_suspend;
> +
> + ret = sdhci_suspend_host(slot->host);
> + if (ret)
> + goto err_suspend_host;
> +
> + return 0;
> +
> +err_suspend_host:
> + cqhci_resume(slot->host->mmc);
> +err_suspend:
> + gl9763e_set_low_power_negotiation(slot, false);
> + return ret;
> +}
> +#endif
> +
> static int gli_probe_slot_gl9763e(struct sdhci_pci_slot *slot)
> {
> struct pci_dev *pdev = slot->chip->pdev;
> @@ -1113,8 +1139,8 @@ const struct sdhci_pci_fixes sdhci_gl9763e = {
> .probe_slot = gli_probe_slot_gl9763e,
> .ops = &sdhci_gl9763e_ops,
> #ifdef CONFIG_PM_SLEEP
> - .resume = sdhci_cqhci_gli_resume,
> - .suspend = sdhci_cqhci_gli_suspend,
> + .resume = gl9763e_resume,
> + .suspend = gl9763e_suspend,
> #endif
> #ifdef CONFIG_PM
> .runtime_suspend = gl9763e_runtime_suspend,
next prev parent reply other threads:[~2023-08-24 11:47 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-23 17:41 [PATCH v2] mmc: sdhci-pci-gli: fix LPM negotiation so x86/S0ix SoCs can suspend Sven van Ashbrook
2023-08-24 11:46 ` Adrian Hunter [this message]
[not found] ` <CADj_en4p8MsfSsuzgpNU22FV7W_ME=g04coXfk4+e_-Jk11yrA@mail.gmail.com>
2023-08-24 12:18 ` Adrian Hunter
2023-08-28 10:02 ` Ben Chuang
2023-08-28 10:57 ` Stanisław Kardach
2023-08-28 22:51 ` Sven van Ashbrook
2023-08-29 2:48 ` Ben Chuang
2023-08-29 16:35 ` Sven van Ashbrook
2023-08-30 2:26 ` Ben Chuang
2023-08-30 7:31 ` Stanisław Kardach
2023-08-31 0:19 ` Ben Chuang
2023-08-30 20:13 ` Sven van Ashbrook
2023-08-31 0:33 ` Ben Chuang
2023-08-31 0:42 ` Sven van Ashbrook
2023-08-31 13:02 ` Adrian Hunter
2023-08-31 13:38 ` Sven van Ashbrook
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=e22c4a5f-c592-7121-7173-eef669ebdf89@intel.com \
--to=adrian.hunter@intel.com \
--cc=SeanHY.chen@genesyslogic.com.tw \
--cc=ben.chuang@genesyslogic.com.tw \
--cc=greg.tu@genesyslogic.com.tw \
--cc=jason.lai@genesyslogic.com.tw \
--cc=jasonlai.genesyslogic@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=reniuschengl@gmail.com \
--cc=skardach@google.com \
--cc=stable@vger.kernel.org \
--cc=svenva@chromium.org \
--cc=ulf.hansson@linaro.org \
--cc=victor.shih@genesyslogic.com.tw \
/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.