diff options
Diffstat (limited to 'include/linux/pci.h')
| -rw-r--r-- | include/linux/pci.h | 118 | 
1 files changed, 94 insertions, 24 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index 174e5392e51..25813738c71 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -187,6 +187,33 @@ enum pci_bus_flags {  	PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,  }; +/* Based on the PCI Hotplug Spec, but some values are made up by us */ +enum pci_bus_speed { +	PCI_SPEED_33MHz			= 0x00, +	PCI_SPEED_66MHz			= 0x01, +	PCI_SPEED_66MHz_PCIX		= 0x02, +	PCI_SPEED_100MHz_PCIX		= 0x03, +	PCI_SPEED_133MHz_PCIX		= 0x04, +	PCI_SPEED_66MHz_PCIX_ECC	= 0x05, +	PCI_SPEED_100MHz_PCIX_ECC	= 0x06, +	PCI_SPEED_133MHz_PCIX_ECC	= 0x07, +	PCI_SPEED_66MHz_PCIX_266	= 0x09, +	PCI_SPEED_100MHz_PCIX_266	= 0x0a, +	PCI_SPEED_133MHz_PCIX_266	= 0x0b, +	AGP_UNKNOWN			= 0x0c, +	AGP_1X				= 0x0d, +	AGP_2X				= 0x0e, +	AGP_4X				= 0x0f, +	AGP_8X				= 0x10, +	PCI_SPEED_66MHz_PCIX_533	= 0x11, +	PCI_SPEED_100MHz_PCIX_533	= 0x12, +	PCI_SPEED_133MHz_PCIX_533	= 0x13, +	PCIE_SPEED_2_5GT		= 0x14, +	PCIE_SPEED_5_0GT		= 0x15, +	PCIE_SPEED_8_0GT		= 0x16, +	PCI_SPEED_UNKNOWN		= 0xff, +}; +  struct pci_cap_saved_state {  	struct hlist_node next;  	char cap_nr; @@ -239,6 +266,7 @@ struct pci_dev {  					   configuration space */  	unsigned int	pme_support:5;	/* Bitmask of states from which PME#  					   can be generated */ +	unsigned int	pme_interrupt:1;  	unsigned int	d1_support:1;	/* Low power state D1 is supported */  	unsigned int	d2_support:1;	/* Low power state D2 is supported */  	unsigned int	no_d1d2:1;	/* Only allow D0 and D3 */ @@ -275,7 +303,8 @@ struct pci_dev {  	unsigned int	msix_enabled:1;  	unsigned int	ari_enabled:1;	/* ARI forwarding */  	unsigned int	is_managed:1; -	unsigned int	is_pcie:1; +	unsigned int	is_pcie:1;	/* Obsolete. Will be removed. +					   Use pci_is_pcie() instead */  	unsigned int    needs_freset:1; /* Dev requires fundamental reset */  	unsigned int	state_saved:1;  	unsigned int	is_physfn:1; @@ -335,9 +364,26 @@ static inline void pci_add_saved_cap(struct pci_dev *pci_dev,  	hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space);  } -#ifndef PCI_BUS_NUM_RESOURCES -#define PCI_BUS_NUM_RESOURCES	16 -#endif +/* + * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond + * to P2P or CardBus bridge windows) go in a table.  Additional ones (for + * buses below host bridges or subtractive decode bridges) go in the list. + * Use pci_bus_for_each_resource() to iterate through all the resources. + */ + +/* + * PCI_SUBTRACTIVE_DECODE means the bridge forwards the window implicitly + * and there's no way to program the bridge with the details of the window. + * This does not apply to ACPI _CRS windows, even with the _DEC subtractive- + * decode bit set, because they are explicit and can be programmed with _SRS. + */ +#define PCI_SUBTRACTIVE_DECODE	0x1 + +struct pci_bus_resource { +	struct list_head list; +	struct resource *res; +	unsigned int flags; +};  #define PCI_REGION_FLAG_MASK	0x0fU	/* These bits of resource flags tell us the PCI region flags */ @@ -348,8 +394,8 @@ struct pci_bus {  	struct list_head devices;	/* list of devices on this bus */  	struct pci_dev	*self;		/* bridge device as seen by parent */  	struct list_head slots;		/* list of slots on this bus */ -	struct resource	*resource[PCI_BUS_NUM_RESOURCES]; -					/* address space routed to this bus */ +	struct resource *resource[PCI_BRIDGE_RESOURCE_NUM]; +	struct list_head resources;	/* address space routed to this bus */  	struct pci_ops	*ops;		/* configuration access functions */  	void		*sysdata;	/* hook for sys-specific extension */ @@ -359,6 +405,8 @@ struct pci_bus {  	unsigned char	primary;	/* number of primary bridge */  	unsigned char	secondary;	/* number of secondary bridge */  	unsigned char	subordinate;	/* max number of subordinate buses */ +	unsigned char	max_bus_speed;	/* enum pci_bus_speed */ +	unsigned char	cur_bus_speed;	/* enum pci_bus_speed */  	char		name[48]; @@ -563,7 +611,8 @@ int __must_check pcibios_enable_device(struct pci_dev *, int mask);  char *pcibios_setup(char *str);  /* Used only when drivers/pci/setup.c is used */ -void pcibios_align_resource(void *, struct resource *, resource_size_t, +resource_size_t pcibios_align_resource(void *, const struct resource *, +				resource_size_t,  				resource_size_t);  void pcibios_update_irq(struct pci_dev *, int irq); @@ -589,6 +638,7 @@ struct pci_bus *pci_create_bus(struct device *parent, int bus,  			       struct pci_ops *ops, void *sysdata);  struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,  				int busnr); +void pcie_update_link_speed(struct pci_bus *bus, u16 link_status);  struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,  				 const char *name,  				 struct hotplug_slot *hotplug); @@ -615,12 +665,6 @@ extern void pci_sort_breadthfirst(void);  /* Generic PCI functions exported to card drivers */ -#ifdef CONFIG_PCI_LEGACY -struct pci_dev __deprecated *pci_find_device(unsigned int vendor, -					     unsigned int device, -					     struct pci_dev *from); -#endif /* CONFIG_PCI_LEGACY */ -  enum pci_lost_interrupt_reason {  	PCI_LOST_IRQ_NO_INFORMATION = 0,  	PCI_LOST_IRQ_DISABLE_MSI, @@ -750,11 +794,23 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state);  pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);  bool pci_pme_capable(struct pci_dev *dev, pci_power_t state);  void pci_pme_active(struct pci_dev *dev, bool enable); -int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable); +int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, +		      bool runtime, bool enable);  int pci_wake_from_d3(struct pci_dev *dev, bool enable);  pci_power_t pci_target_state(struct pci_dev *dev);  int pci_prepare_to_sleep(struct pci_dev *dev);  int pci_back_from_sleep(struct pci_dev *dev); +bool pci_dev_run_wake(struct pci_dev *dev); + +static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, +				  bool enable) +{ +	return __pci_enable_wake(dev, state, false, enable); +} + +/* For use by arch with custom probe code */ +void set_pcie_port_type(struct pci_dev *pdev); +void set_pcie_hotplug_bridge(struct pci_dev *pdev);  /* Functions for PCI Hotplug drivers to use */  int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap); @@ -772,6 +828,7 @@ void pci_bus_assign_resources(const struct pci_bus *bus);  void pci_bus_size_bridges(struct pci_bus *bus);  int pci_claim_resource(struct pci_dev *, int);  void pci_assign_unassigned_resources(void); +void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge);  void pdev_enable_device(struct pci_dev *);  void pdev_sort_resources(struct pci_dev *, struct resource_list *);  int pci_enable_resources(struct pci_dev *, int mask); @@ -789,12 +846,23 @@ int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *);  void pci_release_selected_regions(struct pci_dev *, int);  /* drivers/pci/bus.c */ +void pci_bus_add_resource(struct pci_bus *bus, struct resource *res, unsigned int flags); +struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n); +void pci_bus_remove_resources(struct pci_bus *bus); + +#define pci_bus_for_each_resource(bus, res, i)				\ +	for (i = 0;							\ +	    (res = pci_bus_resource_n(bus, i)) || i < PCI_BRIDGE_RESOURCE_NUM; \ +	     i++) +  int __must_check pci_bus_alloc_resource(struct pci_bus *bus,  			struct resource *res, resource_size_t size,  			resource_size_t align, resource_size_t min,  			unsigned int type_mask, -			void (*alignf)(void *, struct resource *, -				resource_size_t, resource_size_t), +			resource_size_t (*alignf)(void *, +						  const struct resource *, +						  resource_size_t, +						  resource_size_t),  			void *alignf_data);  void pci_enable_bridges(struct pci_bus *bus); @@ -955,6 +1023,11 @@ static inline int pci_proc_domain(struct pci_bus *bus)  }  #endif /* CONFIG_PCI_DOMAINS */ +/* some architectures require additional setup to direct VGA traffic */ +typedef int (*arch_set_vga_state_t)(struct pci_dev *pdev, bool decode, +		      unsigned int command_bits, bool change_bridge); +extern void pci_register_set_vga_state(arch_set_vga_state_t func); +  #else /* CONFIG_PCI is not enabled */  /* @@ -973,13 +1046,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)  _PCI_NOP_ALL(read, *)  _PCI_NOP_ALL(write,) -static inline struct pci_dev *pci_find_device(unsigned int vendor, -					      unsigned int device, -					      struct pci_dev *from) -{ -	return NULL; -} -  static inline struct pci_dev *pci_get_device(unsigned int vendor,  					     unsigned int device,  					     struct pci_dev *from) @@ -1237,8 +1303,12 @@ enum pci_fixup_pass {  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_suspend,			\  			suspend##vendor##device##hook, vendor, device, hook) - +#ifdef CONFIG_PCI_QUIRKS  void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev); +#else +static inline void pci_fixup_device(enum pci_fixup_pass pass, +				    struct pci_dev *dev) {} +#endif  void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);  void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr);  |