[PATCHv4 1/2] ppc64: perform proper max_bus_speed detection

Tony Breeds tony at bakeyournoodle.com
Thu Apr 25 09:48:38 EST 2013


On Wed, Apr 24, 2013 at 07:54:49PM -0300, lucaskt at linux.vnet.ibm.com wrote:
> From: Lucas Kannebley Tavares <lucaskt at linux.vnet.ibm.com>
> 
> On pseries machines the detection for max_bus_speed should be done
> through an OpenFirmware property. This patch adds a function to perform
> this detection and a hook to perform dynamic adding of the function only for
> pseries. This is done by overwriting the weak
> pcibios_root_bridge_prepare function which is called by pci_create_root_bus().
> 
> Signed-off-by: Lucas Kannebley Tavares <lucaskt at linux.vnet.ibm.com>
> ---
>  arch/powerpc/include/asm/machdep.h       |  2 ++
>  arch/powerpc/kernel/pci-common.c         |  8 +++++
>  arch/powerpc/platforms/pseries/pci.c     | 51 ++++++++++++++++++++++++++++++++
>  arch/powerpc/platforms/pseries/pseries.h |  4 +++
>  arch/powerpc/platforms/pseries/setup.c   |  2 ++
>  5 files changed, 67 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
> index 3d6b410..8f558bf 100644
> --- a/arch/powerpc/include/asm/machdep.h
> +++ b/arch/powerpc/include/asm/machdep.h
> @@ -107,6 +107,8 @@ struct machdep_calls {
>  	void		(*pcibios_fixup)(void);
>  	int		(*pci_probe_mode)(struct pci_bus *);
>  	void		(*pci_irq_fixup)(struct pci_dev *dev);
> +	int		(*pcibios_root_bridge_prepare)(struct pci_host_bridge
> +				*bridge);
>  
>  	/* To setup PHBs when using automatic OF platform driver for PCI */
>  	int		(*pci_setup_phb)(struct pci_controller *host);
> diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
> index fa12ae4..80986cf 100644
> --- a/arch/powerpc/kernel/pci-common.c
> +++ b/arch/powerpc/kernel/pci-common.c
> @@ -844,6 +844,14 @@ int pci_proc_domain(struct pci_bus *bus)
>  	return 1;
>  }
>  
> +int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
> +{
> +	if (ppc_md.pcibios_root_bridge_prepare)
> +		return ppc_md.pcibios_root_bridge_prepare(bridge);
> +
> +	return 0;
> +}
> +
>  /* This header fixup will do the resource fixup for all devices as they are
>   * probed, but not for bridge ranges
>   */
> diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c
> index 0b580f4..7f9c956 100644
> --- a/arch/powerpc/platforms/pseries/pci.c
> +++ b/arch/powerpc/platforms/pseries/pci.c
> @@ -108,3 +108,54 @@ static void fixup_winbond_82c105(struct pci_dev* dev)
>  }
>  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
>  			 fixup_winbond_82c105);
> +
> +int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
> +{
> +	struct device_node *dn, *pdn;
> +	struct pci_bus *bus;
> +	const uint32_t *pcie_link_speed_stats;
> +
> +	bus = bridge->bus;
> +
> +	dn = pcibios_get_phb_of_node(bus);
> +	if (!dn)
> +		return 0;
> +
> +	for (pdn = dn; pdn != NULL; pdn = pdn->parent) {
> +		pcie_link_speed_stats = (const uint32_t *) of_get_property(dn,
> +			"ibm,pcie-link-speed-stats", NULL);
> +		if (pcie_link_speed_stats)
> +			break;
> +	}

Please use the helpers in include/linux/of.h rather than open coding
this.

Yours Tony
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20130425/73f66f39/attachment.sig>


More information about the Linuxppc-dev mailing list