From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Loic Poulain <loic.poulain@linaro.org>
Cc: hemantk@codeaurora.org, linux-arm-msm@vger.kernel.org
Subject: Re: [PATCH v2 6/6] mhi: pci_generic: Add support for runtime PM
Date: Fri, 5 Mar 2021 23:16:23 +0530 [thread overview]
Message-ID: <20210305174623.GE2553@thinkpad> (raw)
In-Reply-To: <1614948478-2284-6-git-send-email-loic.poulain@linaro.org>
On Fri, Mar 05, 2021 at 01:47:58PM +0100, Loic Poulain wrote:
> When the device is idle it is possible to move it into the lowest MHI
> PM state (M3). In that mode, all MHI operations are suspended and the
> PCI device can be safely put into PCI D3 state.
>
> The device is then resumed from D3/M3 either because of host initiated
> MHI operation (e.g. buffer TX) or because the device (modem) has
> triggered wake-up via PME feature (e.g. on incoming data).
>
> Same procedures can be used for system wide or runtime suspend/resume.
>
> Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
> ---
> v2: replace force_runtime_suspend/resume via local function to ensure
> device is always resumed during system resume whatever its runtime
> pm state.
>
> drivers/bus/mhi/pci_generic.c | 95 +++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 86 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/bus/mhi/pci_generic.c b/drivers/bus/mhi/pci_generic.c
> index 4ab0aa8..e36f5a9 100644
> --- a/drivers/bus/mhi/pci_generic.c
> +++ b/drivers/bus/mhi/pci_generic.c
> @@ -14,6 +14,7 @@
> #include <linux/mhi.h>
> #include <linux/module.h>
> #include <linux/pci.h>
> +#include <linux/pm_runtime.h>
> #include <linux/timer.h>
> #include <linux/workqueue.h>
>
> @@ -274,6 +275,7 @@ MODULE_DEVICE_TABLE(pci, mhi_pci_id_table);
>
> enum mhi_pci_device_status {
> MHI_PCI_DEV_STARTED,
> + MHI_PCI_DEV_SUSPENDED,
> };
>
> struct mhi_pci_device {
> @@ -306,6 +308,11 @@ static void mhi_pci_status_cb(struct mhi_controller *mhi_cntrl,
> case MHI_CB_FATAL_ERROR:
> case MHI_CB_SYS_ERROR:
> dev_warn(&pdev->dev, "firmware crashed (%u)\n", cb);
> + pm_runtime_forbid(&pdev->dev);
> + break;
> + case MHI_CB_EE_MISSION_MODE:
> + pm_runtime_mark_last_busy(&pdev->dev);
Do you really need to update the last_busy time here? You're already updating it
before each runtime_put() call and those will overwrite this value.
> + pm_runtime_allow(&pdev->dev);
> break;
> default:
> break;
> @@ -427,13 +434,19 @@ static int mhi_pci_get_irqs(struct mhi_controller *mhi_cntrl,
[...]
> -static int __maybe_unused mhi_pci_suspend(struct device *dev)
> +static int __maybe_unused mhi_pci_runtime_suspend(struct device *dev)
> {
> struct pci_dev *pdev = to_pci_dev(dev);
> struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev);
> struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl;
> + int err;
> +
> + if (test_and_set_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status))
> + return 0;
>
> del_timer(&mhi_pdev->health_check_timer);
> cancel_work_sync(&mhi_pdev->recovery_work);
>
> + if (!test_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status) ||
> + mhi_cntrl->ee != MHI_EE_AMSS)
> + goto pci_suspend; /* Nothing to do at MHI level */
> +
> /* Transition to M3 state */
> - mhi_pm_suspend(mhi_cntrl);
> + err = mhi_pm_suspend(mhi_cntrl);
> + if (err) {
> + dev_err(&pdev->dev, "failed to suspend device: %d;\n", err);
Remove the semicolon after "%d"
> + clear_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status);
> + return -EBUSY;
> + }
>
> +pci_suspend:
> pci_disable_device(pdev);
> pci_wake_from_d3(pdev, true);
>
> return 0;
> }
>
> -static int __maybe_unused mhi_pci_resume(struct device *dev)
> +static int __maybe_unused mhi_pci_runtime_resume(struct device *dev)
> {
> struct pci_dev *pdev = to_pci_dev(dev);
> struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev);
> struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl;
> int err;
>
> + if (!test_and_clear_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status))
> + return 0;
> +
> err = pci_enable_device(pdev);
> if (err)
> goto err_recovery;
> @@ -740,6 +786,13 @@ static int __maybe_unused mhi_pci_resume(struct device *dev)
> pci_set_master(pdev);
> pci_wake_from_d3(pdev, false);
>
> + /* It can be a remote wakeup (no mhi runtime_get), update access time */
> + pm_runtime_mark_last_busy(dev);
I think this should be moved after mhi_pm_resume().
Thanks,
Mani
next prev parent reply other threads:[~2021-03-05 17:47 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-05 12:47 [PATCH v2 1/6] mhi: pci_generic: Parametrable element count for events Loic Poulain
2021-03-05 12:47 ` [PATCH v2 2/6] mhi: pci_generic: Introduce quectel EM1XXGR-L support Loic Poulain
2021-03-05 12:47 ` [PATCH v2 3/6] mhi: pci_generic: Add SDX24 based modem support Loic Poulain
2021-03-05 12:47 ` [PATCH v2 4/6] mhi: pci_generic: No-Op for device_wake operations Loic Poulain
2021-03-05 14:45 ` Manivannan Sadhasivam
2021-03-10 13:36 ` Manivannan Sadhasivam
2021-03-05 12:47 ` [PATCH v2 5/6] mhi: pci_generic: Use generic PCI power management Loic Poulain
2021-03-05 14:45 ` Manivannan Sadhasivam
2021-03-05 12:47 ` [PATCH v2 6/6] mhi: pci_generic: Add support for runtime PM Loic Poulain
2021-03-05 17:46 ` Manivannan Sadhasivam [this message]
2021-03-05 18:39 ` Loic Poulain
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=20210305174623.GE2553@thinkpad \
--to=manivannan.sadhasivam@linaro.org \
--cc=hemantk@codeaurora.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=loic.poulain@linaro.org \
/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.