From: Alex Williamson <alex.williamson@redhat.com>
To: Shanker Donthineni <sdonthineni@nvidia.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>, <linux-pci@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, Sinan Kaya <okaya@kernel.org>,
Vikram Sethi <vsethi@nvidia.com>,
Amey Narkhede <ameynarkhede03@gmail.com>
Subject: Re: [PATCH v4 1/2] PCI: Add support for a function level reset based on _RST method
Date: Fri, 30 Apr 2021 12:39:45 -0600 [thread overview]
Message-ID: <20210430123945.54dd479c@redhat.com> (raw)
In-Reply-To: <20210429004907.29044-1-sdonthineni@nvidia.com>
On Wed, 28 Apr 2021 19:49:06 -0500
Shanker Donthineni <sdonthineni@nvidia.com> wrote:
> The _RST is a standard method specified in the ACPI specification. It
> provides a function level reset when it is described in the acpi_device
> context associated with PCI-device.
>
> Implement a new reset function pci_dev_acpi_reset() for probing RST
> method and execute if it is defined in the firmware. The ACPI binding
> information is available only after calling device_add(), so move
> pci_init_reset_methods() to end of the pci_device_add().
>
> The default priority of the acpi reset is set to below device-specific
> and above hardware resets.
>
> Signed-off-by: Shanker Donthineni <sdonthineni@nvidia.com>
> ---
> changes since v2:
> - fix typo in the commit text
> changes since v2:
> - rebase patch on top of https://lore.kernel.org/linux-pci/20210409192324.30080-1-ameynarkhede03@gmail.com/
>
> drivers/pci/pci.c | 30 ++++++++++++++++++++++++++++++
> drivers/pci/probe.c | 2 +-
> include/linux/pci.h | 2 +-
> 3 files changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index 664cf2d358d6..510f9224a3b0 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -5076,6 +5076,35 @@ static void pci_dev_restore(struct pci_dev *dev)
> err_handler->reset_done(dev);
> }
>
> +/**
> + * pci_dev_acpi_reset - do a function level reset using _RST method
> + * @dev: device to reset
> + * @probe: check if _RST method is included in the acpi_device context.
> + */
> +static int pci_dev_acpi_reset(struct pci_dev *dev, int probe)
> +{
> +#ifdef CONFIG_ACPI
> + acpi_handle handle = ACPI_HANDLE(&dev->dev);
> +
> + /* Return -ENOTTY if _RST method is not included in the dev context */
> + if (!handle || !acpi_has_method(handle, "_RST"))
> + return -ENOTTY;
> +
> + /* Return 0 for probe phase indicating that we can reset this device */
> + if (probe)
> + return 0;
> +
> + /* Invoke _RST() method to perform a function level reset */
> + if (ACPI_FAILURE(acpi_evaluate_object(handle, "_RST", NULL, NULL))) {
> + pci_warn(dev, "Failed to reset the device\n");
> + return -EINVAL;
> + }
> + return 0;
> +#else
> + return -ENOTTY;
> +#endif
> +}
> +
> /*
> * The ordering for functions in pci_reset_fn_methods
> * is required for reset_methods byte array defined
> @@ -5083,6 +5112,7 @@ static void pci_dev_restore(struct pci_dev *dev)
> */
> const struct pci_reset_fn_method pci_reset_fn_methods[] = {
> { .reset_fn = &pci_dev_specific_reset, .name = "device_specific" },
> + { .reset_fn = &pci_dev_acpi_reset, .name = "acpi_reset" },
Would it make sense to name this "acpi_rst" after the method name?
Otherwise "_reset" is a bit redundant to the sysfs attribute, we could
simply name it "acpi" to indicate an ACPI based reset. Thanks,
Alex
> { .reset_fn = &pcie_reset_flr, .name = "flr" },
> { .reset_fn = &pci_af_flr, .name = "af_flr" },
> { .reset_fn = &pci_pm_reset, .name = "pm" },
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 4764e031a44b..d4becd6ffb52 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -2403,7 +2403,6 @@ static void pci_init_capabilities(struct pci_dev *dev)
> pci_rcec_init(dev); /* Root Complex Event Collector */
>
> pcie_report_downtraining(dev);
> - pci_init_reset_methods(dev);
> }
>
> /*
> @@ -2494,6 +2493,7 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
> dev->match_driver = false;
> ret = device_add(&dev->dev);
> WARN_ON(ret < 0);
> + pci_init_reset_methods(dev);
> }
>
> struct pci_dev *pci_scan_single_device(struct pci_bus *bus, int devfn)
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 9f8347799634..b4a5d2146542 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -49,7 +49,7 @@
> PCI_STATUS_SIG_TARGET_ABORT | \
> PCI_STATUS_PARITY)
>
> -#define PCI_RESET_FN_METHODS 5
> +#define PCI_RESET_FN_METHODS 6
>
> /*
> * The PCI interface treats multi-function devices as independent
next prev parent reply other threads:[~2021-04-30 18:39 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-29 0:49 [PATCH v4 1/2] PCI: Add support for a function level reset based on _RST method Shanker Donthineni
2021-04-29 0:49 ` [PATCH v4 2/2] PCI: Enable NO_BUS_RESET quirk for Nvidia GPUs Shanker Donthineni
2021-04-30 17:01 ` Bjorn Helgaas
2021-04-30 22:11 ` Shanker R Donthineni
2021-05-03 22:42 ` Bjorn Helgaas
2021-05-04 2:07 ` Shanker R Donthineni
2021-05-05 2:12 ` Bjorn Helgaas
2021-05-05 3:51 ` Shanker R Donthineni
2021-05-05 3:56 ` Oliver O'Halloran
2021-05-05 17:40 ` Amey Narkhede
2021-05-05 19:13 ` Alex Williamson
2021-05-05 20:04 ` Shanker R Donthineni
2021-05-05 20:40 ` Bjorn Helgaas
2021-05-05 12:15 ` Pali Rohár
2021-05-05 15:35 ` Shanker R Donthineni
2021-04-30 18:39 ` Alex Williamson [this message]
2021-04-30 19:05 ` [PATCH v4 1/2] PCI: Add support for a function level reset based on _RST method Shanker R Donthineni
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=20210430123945.54dd479c@redhat.com \
--to=alex.williamson@redhat.com \
--cc=ameynarkhede03@gmail.com \
--cc=bhelgaas@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=okaya@kernel.org \
--cc=sdonthineni@nvidia.com \
--cc=vsethi@nvidia.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.