diff options
Diffstat (limited to 'arch/powerpc/include/asm/pci-bridge.h')
| -rw-r--r-- | arch/powerpc/include/asm/pci-bridge.h | 141 | 
1 files changed, 43 insertions, 98 deletions
diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h index 51e9e6f90d1..4ca90a39d6d 100644 --- a/arch/powerpc/include/asm/pci-bridge.h +++ b/arch/powerpc/include/asm/pci-bridge.h @@ -10,58 +10,10 @@  #include <linux/pci.h>  #include <linux/list.h>  #include <linux/ioport.h> +#include <asm-generic/pci-bridge.h>  struct device_node; -enum { -	/* Force re-assigning all resources (ignore firmware -	 * setup completely) -	 */ -	PPC_PCI_REASSIGN_ALL_RSRC	= 0x00000001, - -	/* Re-assign all bus numbers */ -	PPC_PCI_REASSIGN_ALL_BUS	= 0x00000002, - -	/* Do not try to assign, just use existing setup */ -	PPC_PCI_PROBE_ONLY		= 0x00000004, - -	/* Don't bother with ISA alignment unless the bridge has -	 * ISA forwarding enabled -	 */ -	PPC_PCI_CAN_SKIP_ISA_ALIGN	= 0x00000008, - -	/* Enable domain numbers in /proc */ -	PPC_PCI_ENABLE_PROC_DOMAINS	= 0x00000010, -	/* ... except for domain 0 */ -	PPC_PCI_COMPAT_DOMAIN_0		= 0x00000020, -}; -#ifdef CONFIG_PCI -extern unsigned int ppc_pci_flags; - -static inline void ppc_pci_set_flags(int flags) -{ -	ppc_pci_flags = flags; -} - -static inline void ppc_pci_add_flags(int flags) -{ -	ppc_pci_flags |= flags; -} - -static inline int ppc_pci_has_flag(int flag) -{ -	return (ppc_pci_flags & flag); -} -#else -static inline void ppc_pci_set_flags(int flags) { } -static inline void ppc_pci_add_flags(int flags) { } -static inline int ppc_pci_has_flag(int flag) -{ -	return 0; -} -#endif - -  /*   * Structure of a PCI controller (host bridge)   */ @@ -78,6 +30,7 @@ struct pci_controller {  	int first_busno;  	int last_busno;  	int self_busno; +	struct resource busn;  	void __iomem *io_base_virt;  #ifdef CONFIG_PPC64 @@ -86,11 +39,6 @@ struct pci_controller {  	resource_size_t io_base_phys;  	resource_size_t pci_io_size; -	/* Some machines (PReP) have a non 1:1 mapping of -	 * the PCI memory space in the CPU bus space -	 */ -	resource_size_t pci_mem_offset; -  	/* Some machines have a special region to forward the ISA  	 * "memory" cycles such as VGA memory regions. Left to 0  	 * if unsupported @@ -106,7 +54,7 @@ struct pci_controller {  	 * Used for variants of PCI indirect handling and possible quirks:  	 *  SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1  	 *  EXT_REG - provides access to PCI-e extended registers -	 *  SURPRESS_PRIMARY_BUS - we surpress the setting of PCI_PRIMARY_BUS +	 *  SURPRESS_PRIMARY_BUS - we suppress the setting of PCI_PRIMARY_BUS  	 *   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 @@ -117,6 +65,8 @@ struct pci_controller {  	 *  BIG_ENDIAN - cfg_addr is a big endian register  	 *  BROKEN_MRM - the 440EPx/GRx chips have an errata that causes hangs on  	 *   the PLB4.  Effectively disable MRM commands by setting this. +	 *  FSL_CFG_REG_LINK - Freescale controller version in which the PCIe +	 *   link status is in a RC PCIe cfg register (vs being a SoC register)  	 */  #define PPC_INDIRECT_TYPE_SET_CFG_TYPE		0x00000001  #define PPC_INDIRECT_TYPE_EXT_REG		0x00000002 @@ -124,12 +74,14 @@ struct pci_controller {  #define PPC_INDIRECT_TYPE_NO_PCIE_LINK		0x00000008  #define PPC_INDIRECT_TYPE_BIG_ENDIAN		0x00000010  #define PPC_INDIRECT_TYPE_BROKEN_MRM		0x00000020 +#define PPC_INDIRECT_TYPE_FSL_CFG_REG_LINK	0x00000040  	u32 indirect_type;  	/* Currently, we limit ourselves to 1 IO range and 3 mem  	 * ranges since the common pci_bus structure can't handle more  	 */  	struct resource	io_resource;  	struct resource mem_resources[3]; +	resource_size_t mem_offset[3];  	int global_number;		/* PCI domain number */  	resource_size_t dma_window_base_cur; @@ -137,9 +89,9 @@ struct pci_controller {  #ifdef CONFIG_PPC64  	unsigned long buid; +#endif	/* CONFIG_PPC64 */  	void *private_data; -#endif	/* CONFIG_PPC64 */  };  /* These are used for config access before all the PCI probing @@ -164,13 +116,23 @@ extern void setup_indirect_pci(struct pci_controller* hose,  			       resource_size_t cfg_addr,  			       resource_size_t cfg_data, u32 flags); -#ifndef CONFIG_PPC64 +extern int indirect_read_config(struct pci_bus *bus, unsigned int devfn, +				int offset, int len, u32 *val); + +extern int indirect_write_config(struct pci_bus *bus, unsigned int devfn, +				 int offset, int len, u32 val);  static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)  {  	return bus->sysdata;  } +#ifndef CONFIG_PPC64 + +extern int pci_device_from_OF_node(struct device_node *node, +				   u8 *bus, u8 *devfn); +extern void pci_create_OF_bus_map(void); +  static inline int isa_vaddr_is_ioport(void __iomem *address)  {  	/* No specific ISA handling on ppc32 at this stage, it @@ -197,41 +159,24 @@ struct pci_dn {  	int	pci_ext_config_space;	/* for pci devices */ -#ifdef CONFIG_EEH +	bool	force_32bit_msi; +  	struct	pci_dev *pcidev;	/* back-pointer to the pci device */ -	int	class_code;		/* pci device class */ -	int	eeh_mode;		/* See eeh.h for possible EEH_MODEs */ -	int	eeh_config_addr; -	int	eeh_pe_config_addr; /* new-style partition endpoint address */ -	int	eeh_check_count;	/* # times driver ignored error */ -	int	eeh_freeze_count;	/* # times this device froze up. */ -	int	eeh_false_positives;	/* # times this device reported #ff's */ -	u32	config_space[16];	/* saved PCI config space */ +#ifdef CONFIG_EEH +	struct eeh_dev *edev;		/* eeh device */ +#endif +#define IODA_INVALID_PE		(-1) +#ifdef CONFIG_PPC_POWERNV +	int	pe_number;  #endif  };  /* Get the pointer to a device_node's pci_dn */  #define PCI_DN(dn)	((struct pci_dn *) (dn)->data) -extern struct device_node *fetch_dev_dn(struct pci_dev *dev); -extern void * update_dn_pci_info(struct device_node *dn, void *data); - -/* Get a device_node from a pci_dev.  This code must be fast except - * in the case where the sysdata is incorrect and needs to be fixed - * up (this will only happen once). - * In this case the sysdata will have been inherited from a PCI host - * bridge or a PCI-PCI bridge further up the tree, so it will point - * to a valid struct pci_dn, just not the one we want. - */ -static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev) -{ -	struct device_node *dn = dev->sysdata; -	struct pci_dn *pdn = dn->data; +extern struct pci_dn *pci_get_pdn(struct pci_dev *pdev); -	if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number) -		return dn;	/* fast path.  sysdata is good */ -	return fetch_dev_dn(dev); -} +extern void * update_dn_pci_info(struct device_node *dn, void *data);  static inline int pci_device_from_OF_node(struct device_node *np,  					  u8 *bus, u8 *devfn) @@ -243,13 +188,22 @@ static inline int pci_device_from_OF_node(struct device_node *np,  	return 0;  } -static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus) +#if defined(CONFIG_EEH) +static inline struct eeh_dev *of_node_to_eeh_dev(struct device_node *dn)  { -	if (bus->self) -		return pci_device_to_OF_node(bus->self); -	else -		return bus->sysdata; /* Must be root bus (PHB) */ +	/* +	 * For those OF nodes whose parent isn't PCI bridge, they +	 * don't have PCI_DN actually. So we have to skip them for +	 * any EEH operations. +	 */ +	if (!dn || !PCI_DN(dn)) +		return NULL; + +	return PCI_DN(dn)->edev;  } +#else +#define of_node_to_eeh_dev(x) (NULL) +#endif  /** Find the bus corresponding to the indicated device node */  extern struct pci_bus *pcibios_find_pci_bus(struct device_node *dn); @@ -260,14 +214,6 @@ extern void pcibios_remove_pci_devices(struct pci_bus *bus);  /** Discover new pci devices under this bus, and add them */  extern void pcibios_add_pci_devices(struct pci_bus *bus); -static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus) -{ -	struct device_node *busdn = bus->sysdata; - -	BUG_ON(busdn == NULL); -	return PCI_DN(busdn)->phb; -} -  extern void isa_bridge_find_early(struct pci_controller *hose); @@ -300,7 +246,6 @@ extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,  /* Allocate & free a PCI host bridge structure */  extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);  extern void pcibios_free_controller(struct pci_controller *phb); -extern void pcibios_setup_phb_resources(struct pci_controller *hose);  #ifdef CONFIG_PCI  extern int pcibios_vaddr_is_ioport(void __iomem *address);  | 
