Message ID | 20210709123813.8700-7-ameynarkhede03@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | Expose and manage PCI device reset | expand |
On Fri, 9 Jul 2021 18:08:11 +0530 Amey Narkhede <ameynarkhede03@gmail.com> wrote: > From: Shanker Donthineni <sdonthineni@nvidia.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. > > 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@nvidia.com> > --- > drivers/pci/pci-acpi.c | 1 - > drivers/pci/probe.c | 7 ++++--- > 2 files changed, 4 insertions(+), 4 deletions(-) Looks ok to me. Reviewed-by: Alex Williamson <alex.williamson@redhat.com>
On Fri, Jul 09, 2021 at 06:08:11PM +0530, Amey Narkhede wrote: > From: Shanker Donthineni <sdonthineni@nvidia.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@nvidia.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 >
Hi Bjorn On 7/27/21 6:30 PM, Bjorn Helgaas wrote: >> From: Shanker Donthineni <sdonthineni@nvidia.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? > Thanks for catching a mistake, will remove it in the next patch. -Shanker
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;