Oliver O'Halloran <ooh...@gmail.com> writes:

> The pnv_phb->initialized flag is an odd beast. It was added back in 2012 in
> commit db1266c85261 ("powerpc/powernv: Skip check on PE if necessary") to
> allow devices to be enabled even if their PE assignments hadn't been
> completed yet. I can't think of any situation where we would (or should)
> have PCI devices being enabled before their PEs are assigned, so I can only
> assume it was a workaround for a bug or some other undesirable behaviour
> from the PCI core.
>
> Since commit dc3d8f85bb57 ("powerpc/powernv/pci: Re-work bus PE
> configuration") the PE setup occurs before the PCI core allows driver to
> attach to the device so the problem should no longer exist. Even it does
> allowing the device to be enabled before we have assigned the device to a
> PE is almost certainly broken and will cause spurious EEH events so we
> should probably just remove it.
>
> It's also worth pointing out that ->initialized flag is set in
> pnv_pci_ioda_create_dbgfs() which has the entire function body wrapped in
> flag.

"body wrapped in flag." ?

I guess you meant:

"wrapped in #ifdef CONFIG_DEBUG_FS" ?

> That has the fun side effect of bypassing any other checks in
> pnv_pci_enable_device_hook() which is probably not what anybody wants.

That would only be true for CONFIG_DEBUG_FS=n builds though.

cheers

> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c 
> b/arch/powerpc/platforms/powernv/pci-ioda.c
> index 023a4f987bb2..6ac3c637b313 100644
> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
> @@ -2410,9 +2410,6 @@ static void pnv_pci_ioda_create_dbgfs(void)
>       list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
>               phb = hose->private_data;
>  
> -             /* Notify initialization of PHB done */
> -             phb->initialized = 1;
> -
>               sprintf(name, "PCI%04x", hose->global_number);
>               phb->dbgfs = debugfs_create_dir(name, powerpc_debugfs_root);
>  
> @@ -2609,17 +2606,8 @@ static resource_size_t pnv_pci_default_alignment(void)
>   */
>  static bool pnv_pci_enable_device_hook(struct pci_dev *dev)
>  {
> -     struct pnv_phb *phb = pci_bus_to_pnvhb(dev->bus);
>       struct pci_dn *pdn;
>  
> -     /* The function is probably called while the PEs have
> -      * not be created yet. For example, resource reassignment
> -      * during PCI probe period. We just skip the check if
> -      * PEs isn't ready.
> -      */
> -     if (!phb->initialized)
> -             return true;
> -
>       pdn = pci_get_pdn(dev);
>       if (!pdn || pdn->pe_number == IODA_INVALID_PE)
>               return false;
> @@ -2629,14 +2617,9 @@ static bool pnv_pci_enable_device_hook(struct pci_dev 
> *dev)
>  
>  static bool pnv_ocapi_enable_device_hook(struct pci_dev *dev)
>  {
> -     struct pci_controller *hose = pci_bus_to_host(dev->bus);
> -     struct pnv_phb *phb = hose->private_data;
>       struct pci_dn *pdn;
>       struct pnv_ioda_pe *pe;
>  
> -     if (!phb->initialized)
> -             return true;
> -
>       pdn = pci_get_pdn(dev);
>       if (!pdn)
>               return false;
> diff --git a/arch/powerpc/platforms/powernv/pci.h 
> b/arch/powerpc/platforms/powernv/pci.h
> index 739a0b3b72e1..36d22920f5a3 100644
> --- a/arch/powerpc/platforms/powernv/pci.h
> +++ b/arch/powerpc/platforms/powernv/pci.h
> @@ -119,7 +119,6 @@ struct pnv_phb {
>       int                     flags;
>       void __iomem            *regs;
>       u64                     regs_phys;
> -     int                     initialized;
>       spinlock_t              lock;
>  
>  #ifdef CONFIG_DEBUG_FS
> -- 
> 2.26.2

Reply via email to