[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210727233025.GA756574@bjorn-Precision-5520>
Date: Tue, 27 Jul 2021 18:30:25 -0500
From: Bjorn Helgaas <helgaas@...nel.org>
To: Amey Narkhede <ameynarkhede03@...il.com>
Cc: Bjorn Helgaas <bhelgaas@...gle.com>, alex.williamson@...hat.com,
Raphael Norwitz <raphael.norwitz@...anix.com>,
linux-pci@...r.kernel.org, linux-kernel@...r.kernel.org,
kw@...ux.com, Shanker Donthineni <sdonthineni@...dia.com>,
Sinan Kaya <okaya@...nel.org>, Len Brown <lenb@...nel.org>,
"Rafael J . Wysocki" <rjw@...ysocki.net>
Subject: Re: [PATCH v10 6/8] PCI: Setup ACPI fwnode early and at the same
time with OF
On Fri, Jul 09, 2021 at 06:08:11PM +0530, Amey Narkhede wrote:
> From: Shanker Donthineni <sdonthineni@...dia.com>
>
> The pci_dev objects are created through two mechanisms 1) during PCI
> bus scan and 2) from I/O Virtualization. The fwnode in pci_dev object
> is being set at different places depends on the type of firmware used,
> device creation mechanism, and acpi_pci_bridge_d3() WAR.
WAR?
> The software features which have a dependency on ACPI fwnode properties
> and need to be handled before device_add() will not work. One use case,
> the software has to check the existence of _RST method to support ACPI
> based reset method.
>
> This patch does the two changes in order to provide fwnode consistently.
> - Set ACPI and OF fwnodes from pci_setup_device().
> - Remove pci_set_acpi_fwnode() in acpi_pci_bridge_d3().
>
> After this patch, ACPI/OF firmware properties are visible at the same
> time during the early stage of pci_dev setup. And also call sites should
> be able to use firmware agnostic functions device_property_xxx() for the
> early PCI quirks in the future.
>
> Signed-off-by: Shanker Donthineni <sdonthineni@...dia.com>
> ---
> drivers/pci/pci-acpi.c | 1 -
> drivers/pci/probe.c | 7 ++++---
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
> index eaddbf701..dae021322 100644
> --- a/drivers/pci/pci-acpi.c
> +++ b/drivers/pci/pci-acpi.c
> @@ -952,7 +952,6 @@ static bool acpi_pci_bridge_d3(struct pci_dev *dev)
> return false;
>
> /* Assume D3 support if the bridge is power-manageable by ACPI. */
> - pci_set_acpi_fwnode(dev);
> adev = ACPI_COMPANION(&dev->dev);
>
> if (adev && acpi_device_power_manageable(adev))
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index c272e23db..c911d6a5c 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -1790,6 +1790,9 @@ int pci_setup_device(struct pci_dev *dev)
> dev->error_state = pci_channel_io_normal;
> set_pcie_port_type(dev);
>
> + pci_set_of_node(dev);
> + pci_set_acpi_fwnode(dev);
> +
> pci_dev_assign_slot(dev);
>
> /*
> @@ -1925,6 +1928,7 @@ int pci_setup_device(struct pci_dev *dev)
> default: /* unknown header */
> pci_err(dev, "unknown header type %02x, ignoring device\n",
> dev->hdr_type);
> + pci_release_of_node(dev);
> return -EIO;
>
> bad:
> @@ -2352,10 +2356,7 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
> dev->vendor = l & 0xffff;
> dev->device = (l >> 16) & 0xffff;
>
> - pci_set_of_node(dev);
> -
> if (pci_setup_device(dev)) {
> - pci_release_of_node(dev);
> pci_bus_put(dev->bus);
> kfree(dev);
> return NULL;
> --
> 2.32.0
>
Powered by blists - more mailing lists