From: Bjorn Helgaas <helgaas@kernel.org>
To: David Airlie <airlied@linux.ie>,
"Rafael J . Wysocki" <rafael@kernel.org>
Cc: Vaibhav Gupta <vaibhav.varodek@gmail.com>,
Vaibhav Gupta <vaibhavgupta40@gmail.com>,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
Bjorn Helgaas <bhelgaas@google.com>
Subject: Re: [PATCH v2 1/3] amd64-agp: convert to generic power management
Date: Thu, 2 Dec 2021 11:43:48 -0600 [thread overview]
Message-ID: <20211202174348.GA2899481@bhelgaas> (raw)
In-Reply-To: <20211201025419.2797624-2-helgaas@kernel.org>
[cc->to: Rafael: help :)]
On Tue, Nov 30, 2021 at 08:54:17PM -0600, Bjorn Helgaas wrote:
> From: Vaibhav Gupta <vaibhavgupta40@gmail.com>
>
> Convert amd64-agp from legacy PCI power management to the generic power
> management framework.
>
> Previously, amd64-agp used legacy PCI power management.
> agp_amd64_suspend() looked like this:
>
> agp_amd64_suspend
> pci_save_state(pdev)
> pci_set_power_state(pdev, pci_choose_state(pdev, state))
>
> With generic power management, these are both done by the PCI core in
> pci_pm_runtime_suspend(), so drop agp_amd64_suspend() completely.
I think the *patch* is correct, but my explanation is wrong. Would
appreciate any corrections!
Prior to this patch, agp_amd64_suspend() is a pci_driver.suspend()
method and is called in this path:
pci_pm_suspend
pci_legacy_suspend
drv->suspend
After this patch, agp_amd64_suspend() is not implemented at all, and
we do the pci_save_state() and pci_set_power_state() in PCI generic
code.
But I think those actually happen in pci_pm_suspend_noirq(), not in
pci_pm_runtime_suspend(), i.e., in this path:
suspend_devices_and_enter
dpm_suspend_start(PMSG_SUSPEND)
dpm_suspend(PMSG_SUSPEND)
device_suspend
__device_suspend
callback = pm_op(dev->bus->pm, state)
dpm_run_callback(callback)
pci_pm_suspend # PCI bus method
dev->driver->pm->suspend
agp_amd64_suspend # <-- no longer needed
suspend_enter
dpm_suspend_noirq(PMSG_SUSPEND)
dpm_noirq_suspend_devices(PMSG_SUSPEND)
device_suspend_noirq
__device_suspend_noirq
callback = pm_noirq_op(dev->bus->pm, state)
dpm_run_callback(callback)
pci_pm_suspend_noirq # PCI bus method
pci_save_state # <-- now done here
pci_prepare_to_sleep
pci_set_power_state # <-- and here
I got confused because I couldn't find the call chain leading to
pci_pm_suspend_noirq(). pm_op() and dpm_run_callback() essentially
break the call chain, which makes it a little hard to follow.
> agp_amd64_resume() looked like this:
>
> agp_amd64_resume
> pci_set_power_state(pdev, PCI_D0)
> pci_restore_state(pdev)
> ...
>
> With generic power management, the PCI parts are done by
> pci_pm_runtime_resume(), so drop those from agp_amd64_resume().
>
> [bhelgaas: commit log]
> Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/char/agp/amd64-agp.c | 24 ++++++------------------
> 1 file changed, 6 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
> index b40edae32817..dc78a4fb879e 100644
> --- a/drivers/char/agp/amd64-agp.c
> +++ b/drivers/char/agp/amd64-agp.c
> @@ -588,20 +588,11 @@ static void agp_amd64_remove(struct pci_dev *pdev)
> agp_bridges_found--;
> }
>
> -#ifdef CONFIG_PM
> +#define agp_amd64_suspend NULL
>
> -static int agp_amd64_suspend(struct pci_dev *pdev, pm_message_t state)
> +static int __maybe_unused agp_amd64_resume(struct device *dev)
> {
> - pci_save_state(pdev);
> - pci_set_power_state(pdev, pci_choose_state(pdev, state));
> -
> - return 0;
> -}
> -
> -static int agp_amd64_resume(struct pci_dev *pdev)
> -{
> - pci_set_power_state(pdev, PCI_D0);
> - pci_restore_state(pdev);
> + struct pci_dev *pdev = to_pci_dev(dev);
>
> if (pdev->vendor == PCI_VENDOR_ID_NVIDIA)
> nforce3_agp_init(pdev);
> @@ -609,8 +600,6 @@ static int agp_amd64_resume(struct pci_dev *pdev)
> return amd_8151_configure();
> }
>
> -#endif /* CONFIG_PM */
> -
> static const struct pci_device_id agp_amd64_pci_table[] = {
> {
> .class = (PCI_CLASS_BRIDGE_HOST << 8),
> @@ -738,15 +727,14 @@ static const struct pci_device_id agp_amd64_pci_promisc_table[] = {
> { }
> };
>
> +static SIMPLE_DEV_PM_OPS(agp_amd64_pm_ops, agp_amd64_suspend, agp_amd64_resume);
> +
> static struct pci_driver agp_amd64_pci_driver = {
> .name = "agpgart-amd64",
> .id_table = agp_amd64_pci_table,
> .probe = agp_amd64_probe,
> .remove = agp_amd64_remove,
> -#ifdef CONFIG_PM
> - .suspend = agp_amd64_suspend,
> - .resume = agp_amd64_resume,
> -#endif
> + .driver.pm = &agp_amd64_pm_ops,
> };
>
>
> --
> 2.25.1
>
next prev parent reply other threads:[~2021-12-02 17:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-01 2:54 [PATCH v2 RESEND 0/3] agp: convert to generic power management Bjorn Helgaas
2021-12-01 2:54 ` [PATCH v2 1/3] amd64-agp: " Bjorn Helgaas
2021-12-02 17:43 ` Bjorn Helgaas [this message]
2021-12-01 2:54 ` [PATCH v2 2/3] sis-agp: " Bjorn Helgaas
2021-12-01 2:54 ` [PATCH v2 3/3] via-agp: " Bjorn Helgaas
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=20211202174348.GA2899481@bhelgaas \
--to=helgaas@kernel.org \
--cc=airlied@linux.ie \
--cc=bhelgaas@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=vaibhav.varodek@gmail.com \
--cc=vaibhavgupta40@gmail.com \
/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.