[PATCH 04/25] [POWERPC] Added indirect quirk to handle PCIe PHB that have issue w/no link

Benjamin Herrenschmidt benh at kernel.crashing.org
Tue Jul 24 11:39:39 EST 2007


On Mon, 2007-07-23 at 15:49 -0500, Kumar Gala wrote:
> Added PPC_INDIRECT_TYPE_NO_PCIE_LINK flag to the indirect pci handling
> code to ensure that we don't talk to any device other than the PHB
> if we don't have PCIe link.  Some controllers will lockup if they try
> to do a config cycle to any device on the bus except the PHB.
> 
> Signed-off-by: Kumar Gala <galak at kernel.crashing.org>

I would name the quirk a bit more generically, something like
"ACCESS_PHB_ONLY" maybe ? If you don't want to change it, that's fair.

Acked-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>

Ben.

>  arch/powerpc/sysdev/indirect_pci.c |   16 +++++++++++++++-
>  include/asm-powerpc/pci-bridge.h   |    5 +++++
>  2 files changed, 20 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/powerpc/sysdev/indirect_pci.c b/arch/powerpc/sysdev/indirect_pci.c
> index c7e6e85..bc5b4e2 100644
> --- a/arch/powerpc/sysdev/indirect_pci.c
> +++ b/arch/powerpc/sysdev/indirect_pci.c
> @@ -35,10 +35,17 @@ indirect_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
>  	u8 cfg_type = 0;
>  	u32 bus_no, reg;
>  
> +	if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) {
> +		if (bus->number != hose->first_busno)
> +			return PCIBIOS_DEVICE_NOT_FOUND;
> +		if (devfn != 0)
> +			return PCIBIOS_DEVICE_NOT_FOUND;
> +	}
> +
>  	if (ppc_md.pci_exclude_device)
>  		if (ppc_md.pci_exclude_device(hose, bus->number, devfn))
>  			return PCIBIOS_DEVICE_NOT_FOUND;
> -	
> +
>  	if (hose->indirect_type & PPC_INDIRECT_TYPE_SET_CFG_TYPE)
>  		if (bus->number != hose->first_busno)
>  			cfg_type = 1;
> @@ -83,6 +90,13 @@ indirect_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
>  	u8 cfg_type = 0;
>  	u32 bus_no, reg;
>  
> +	if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) {
> +		if (bus->number != hose->first_busno)
> +			return PCIBIOS_DEVICE_NOT_FOUND;
> +		if (devfn != 0)
> +			return PCIBIOS_DEVICE_NOT_FOUND;
> +	}
> +
>  	if (ppc_md.pci_exclude_device)
>  		if (ppc_md.pci_exclude_device(hose, bus->number, devfn))
>  			return PCIBIOS_DEVICE_NOT_FOUND;
> diff --git a/include/asm-powerpc/pci-bridge.h b/include/asm-powerpc/pci-bridge.h
> index 7a00b8e..9754357 100644
> --- a/include/asm-powerpc/pci-bridge.h
> +++ b/include/asm-powerpc/pci-bridge.h
> @@ -45,10 +45,15 @@ struct pci_controller {
>  	 *   on Freescale PCI-e controllers since they used the PCI_PRIMARY_BUS
>  	 *   to determine which bus number to match on when generating type0
>  	 *   config cycles
> +	 *  NO_PCIE_LINK - the Freescale PCI-e controllers have issues with
> +	 *   hanging if we don't have link and try to do config cycles to
> +	 *   anything but the PHB.  Only allow talking to the PHB if this is
> +	 *   set.
>  	 */
>  #define PPC_INDIRECT_TYPE_SET_CFG_TYPE		(0x00000001)
>  #define PPC_INDIRECT_TYPE_EXT_REG		(0x00000002)
>  #define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS	(0x00000004)
> +#define PPC_INDIRECT_TYPE_NO_PCIE_LINK		(0x00000008)
>  	u32 indirect_type;
>  
>  	/* Currently, we limit ourselves to 1 IO range and 3 mem




More information about the Linuxppc-dev mailing list