[PATCH v8 27/45] powerpc/pci: Export pci_add_device_node_info()

Alexey Kardashevskiy aik at ozlabs.ru
Tue Apr 19 15:35:57 AEST 2016


On 02/17/2016 02:44 PM, Gavin Shan wrote:
> This renames update_dn_pci_info() to pci_add_device_node_info()
> with corresponding adjustment on the parameter type and exports it.
> The function is used to create pdn (struct pci_dn) for the indicated
> device node. Another function add_pdn(), almost wrapper of
> pci_add_device_node_info(), to be used in traverse_pci_devices(). No
> logical changes introduced.
>
> Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>



Reviewed-by: Alexey Kardashevskiy <aik at ozlabs.ru>


> ---
>   arch/powerpc/include/asm/pci-bridge.h  |  3 ++-
>   arch/powerpc/kernel/pci_dn.c           | 30 +++++++++++++++++++-----------
>   arch/powerpc/platforms/pseries/setup.c |  2 +-
>   3 files changed, 22 insertions(+), 13 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h
> index 03f4ee7..72a9d4e 100644
> --- a/arch/powerpc/include/asm/pci-bridge.h
> +++ b/arch/powerpc/include/asm/pci-bridge.h
> @@ -238,7 +238,8 @@ extern struct pci_dn *pci_get_pdn_by_devfn(struct pci_bus *bus,
>   extern struct pci_dn *pci_get_pdn(struct pci_dev *pdev);
>   extern struct pci_dn *add_dev_pci_data(struct pci_dev *pdev);
>   extern void remove_dev_pci_data(struct pci_dev *pdev);
> -extern void *update_dn_pci_info(struct device_node *dn, void *data);
> +extern struct pci_dn *pci_add_device_node_info(struct pci_controller *hose,
> +					       struct device_node *dn);
>
>   static inline int pci_device_from_OF_node(struct device_node *np,
>   					  u8 *bus, u8 *devfn)
> diff --git a/arch/powerpc/kernel/pci_dn.c b/arch/powerpc/kernel/pci_dn.c
> index 38102cb..0a249ff 100644
> --- a/arch/powerpc/kernel/pci_dn.c
> +++ b/arch/powerpc/kernel/pci_dn.c
> @@ -282,13 +282,9 @@ void remove_dev_pci_data(struct pci_dev *pdev)
>   #endif /* CONFIG_PCI_IOV */
>   }
>
> -/*
> - * Traverse_func that inits the PCI fields of the device node.
> - * NOTE: this *must* be done before read/write config to the device.
> - */
> -void *update_dn_pci_info(struct device_node *dn, void *data)
> +struct pci_dn *pci_add_device_node_info(struct pci_controller *hose,
> +					struct device_node *dn)
>   {
> -	struct pci_controller *phb = data;
>   	const __be32 *type = of_get_property(dn, "ibm,pci-config-space-type", NULL);
>   	const __be32 *regs;
>   	struct device_node *parent;
> @@ -299,7 +295,7 @@ void *update_dn_pci_info(struct device_node *dn, void *data)
>   		return NULL;
>   	dn->data = pdn;
>   	pdn->node = dn;
> -	pdn->phb = phb;
> +	pdn->phb = hose;
>   #ifdef CONFIG_PPC_POWERNV
>   	pdn->pe_number = IODA_INVALID_PE;
>   #endif
> @@ -331,8 +327,9 @@ void *update_dn_pci_info(struct device_node *dn, void *data)
>   	if (pdn->parent)
>   		list_add_tail(&pdn->list, &pdn->parent->child_list);
>
> -	return NULL;
> +	return pdn;
>   }
> +EXPORT_SYMBOL_GPL(pci_add_device_node_info);
>
>   /*
>    * Traverse a device tree stopping each PCI device in the tree.
> @@ -432,6 +429,18 @@ void *traverse_pci_dn(struct pci_dn *root,
>   	return NULL;
>   }
>
> +static void *add_pdn(struct device_node *dn, void *data)
> +{
> +	struct pci_controller *hose = data;
> +	struct pci_dn *pdn;
> +
> +	pdn = pci_add_device_node_info(hose, dn);
> +	if (!pdn)
> +		return ERR_PTR(-ENOMEM);
> +
> +	return NULL;
> +}
> +
>   /**
>    * pci_devs_phb_init_dynamic - setup pci devices under this PHB
>    * phb: pci-to-host bridge (top-level bridge connecting to cpu)
> @@ -446,8 +455,7 @@ void pci_devs_phb_init_dynamic(struct pci_controller *phb)
>   	struct pci_dn *pdn;
>
>   	/* PHB nodes themselves must not match */
> -	update_dn_pci_info(dn, phb);
> -	pdn = dn->data;
> +	pdn = pci_add_device_node_info(phb, dn);
>   	if (pdn) {
>   		pdn->devfn = pdn->busno = -1;
>   		pdn->vendor_id = pdn->device_id = pdn->class_code = 0;
> @@ -456,7 +464,7 @@ void pci_devs_phb_init_dynamic(struct pci_controller *phb)
>   	}
>
>   	/* Update dn->phb ptrs for new phb and children devices */
> -	traverse_pci_devices(dn, update_dn_pci_info, phb);
> +	traverse_pci_devices(dn, add_pdn, phb);
>   }
>
>   /**
> diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
> index 36df46e..6f8d020 100644
> --- a/arch/powerpc/platforms/pseries/setup.c
> +++ b/arch/powerpc/platforms/pseries/setup.c
> @@ -265,7 +265,7 @@ static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long act
>   		pdn = parent ? PCI_DN(parent) : NULL;
>   		if (pdn) {
>   			/* Create pdn and EEH device */
> -			update_dn_pci_info(np, pdn->phb);
> +			pci_add_device_node_info(pdn->phb, np);
>   			eeh_dev_init(PCI_DN(np), pdn->phb);
>   		}
>
>


-- 
Alexey


More information about the Linuxppc-dev mailing list