On Thu, Apr 18, 2024 at 9:15 AM Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@xxxxxxxxxxxxxxx> wrote: > > > On 4/15/24 9:32 PM, Kai-Heng Feng wrote: > > In addition to nearest upstream bridge, driver may want to know if the > > entire hierarchy can be powered off to perform different action. > > > > So walk higher up the hierarchy to find out if any device has valid > > _PR3. > > > > The user will be introduced in next patch. > > > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@xxxxxxxxxxxxx> > > --- > > Since it has been a while, I was not sure what this series is about. > > IMO, it is better to include a cover letter with the summary of your > changes. OK, will do in next revision. > > > > v8: > > - No change. > > > > drivers/pci/pci.c | 16 ++++++++++++++++ > > include/linux/pci.h | 2 ++ > > 2 files changed, 18 insertions(+) > > > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > > index e5f243dd4288..7a5662f116b8 100644 > > --- a/drivers/pci/pci.c > > +++ b/drivers/pci/pci.c > > @@ -6225,6 +6225,22 @@ bool pci_pr3_present(struct pci_dev *pdev) > > acpi_has_method(adev->handle, "_PR3"); > > } > > EXPORT_SYMBOL_GPL(pci_pr3_present); > > + > > +bool pci_ancestor_pr3_present(struct pci_dev *pdev) > > +{ > > + struct pci_dev *parent = pdev; > > + > > + if (acpi_disabled) > > + return false; > > + > > + while ((parent = pci_upstream_bridge(parent))) { > > + if (pci_pr3_present(pdev)) > > I think it should be "parent" here? Thanks for catching this. But this patch will be dropped in next version for better simplicity. Kai-Heng > > > + return true; > > + } > > + > > + return false; > > +} > > +EXPORT_SYMBOL_GPL(pci_ancestor_pr3_present); > > #endif > > > > /** > > diff --git a/include/linux/pci.h b/include/linux/pci.h > > index 16493426a04f..cd71ebfd0f89 100644 > > --- a/include/linux/pci.h > > +++ b/include/linux/pci.h > > @@ -2620,10 +2620,12 @@ struct irq_domain *pci_host_bridge_acpi_msi_domain(struct pci_bus *bus); > > void > > pci_msi_register_fwnode_provider(struct fwnode_handle *(*fn)(struct device *)); > > bool pci_pr3_present(struct pci_dev *pdev); > > +bool pci_ancestor_pr3_present(struct pci_dev *pdev); > > #else > > static inline struct irq_domain * > > pci_host_bridge_acpi_msi_domain(struct pci_bus *bus) { return NULL; } > > static inline bool pci_pr3_present(struct pci_dev *pdev) { return false; } > > +static inline bool pci_ancestor_pr3_present(struct pci_dev *pdev) { return false; } > > #endif > > > > #ifdef CONFIG_EEH > > -- > Sathyanarayanan Kuppuswamy > Linux Kernel Developer >