All of lore.kernel.org
 help / color / mirror / Atom feed
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
> 

  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.