diff options
Diffstat (limited to 'include/linux/pci.h')
| -rw-r--r-- | include/linux/pci.h | 61 | 
1 files changed, 57 insertions, 4 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index df364413261..a7fe4bbd7ff 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -52,6 +52,7 @@  #include <asm/atomic.h>  #include <linux/device.h>  #include <linux/io.h> +#include <linux/irqreturn.h>  /* Include the ID list */  #include <linux/pci_ids.h> @@ -93,6 +94,12 @@ enum {  	/* #6: expansion ROM resource */  	PCI_ROM_RESOURCE, +	/* device specific resources */ +#ifdef CONFIG_PCI_IOV +	PCI_IOV_RESOURCES, +	PCI_IOV_RESOURCE_END = PCI_IOV_RESOURCES + PCI_SRIOV_NUM_BARS - 1, +#endif +  	/* resources assigned to buses behind the bridge */  #define PCI_BRIDGE_RESOURCE_NUM 4 @@ -180,6 +187,7 @@ struct pci_cap_saved_state {  struct pcie_link_state;  struct pci_vpd; +struct pci_sriov;  /*   * The pci_dev structure is used to describe PCI devices. @@ -257,6 +265,8 @@ struct pci_dev {  	unsigned int	is_managed:1;  	unsigned int	is_pcie:1;  	unsigned int	state_saved:1; +	unsigned int	is_physfn:1; +	unsigned int	is_virtfn:1;  	pci_dev_flags_t dev_flags;  	atomic_t	enable_cnt;	/* pci_enable_device has been called */ @@ -270,6 +280,12 @@ struct pci_dev {  	struct list_head msi_list;  #endif  	struct pci_vpd *vpd; +#ifdef CONFIG_PCI_IOV +	union { +		struct pci_sriov *sriov;	/* SR-IOV capability related */ +		struct pci_dev *physfn;	/* the PF this VF is associated with */ +	}; +#endif  };  extern struct pci_dev *alloc_pci_dev(void); @@ -341,6 +357,15 @@ struct pci_bus {  #define pci_bus_b(n)	list_entry(n, struct pci_bus, node)  #define to_pci_bus(n)	container_of(n, struct pci_bus, dev) +/* + * Returns true if the pci bus is root (behind host-pci bridge), + * false otherwise + */ +static inline bool pci_is_root_bus(struct pci_bus *pbus) +{ +	return !(pbus->parent); +} +  #ifdef CONFIG_PCI_MSI  static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev)  { @@ -528,7 +553,7 @@ void pcibios_update_irq(struct pci_dev *, int irq);  /* Generic PCI functions used internally */  extern struct pci_bus *pci_find_bus(int domain, int busnr); -void pci_bus_add_devices(struct pci_bus *bus); +void pci_bus_add_devices(const struct pci_bus *bus);  struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,  				      struct pci_ops *ops, void *sysdata);  static inline struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *ops, @@ -702,6 +727,9 @@ int pci_back_from_sleep(struct pci_dev *dev);  /* Functions for PCI Hotplug drivers to use */  int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap); +#ifdef CONFIG_HOTPLUG +unsigned int pci_rescan_bus(struct pci_bus *bus); +#endif  /* Vital product data routines */  ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf); @@ -709,7 +737,7 @@ ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void  int pci_vpd_truncate(struct pci_dev *dev, size_t size);  /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */ -void pci_bus_assign_resources(struct pci_bus *bus); +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); @@ -790,7 +818,7 @@ struct msix_entry {  #ifndef CONFIG_PCI_MSI -static inline int pci_enable_msi(struct pci_dev *dev) +static inline int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec)  {  	return -1;  } @@ -800,6 +828,10 @@ static inline void pci_msi_shutdown(struct pci_dev *dev)  static inline void pci_disable_msi(struct pci_dev *dev)  { } +static inline int pci_msix_table_size(struct pci_dev *dev) +{ +	return 0; +}  static inline int pci_enable_msix(struct pci_dev *dev,  				  struct msix_entry *entries, int nvec)  { @@ -821,9 +853,10 @@ static inline int pci_msi_enabled(void)  	return 0;  }  #else -extern int pci_enable_msi(struct pci_dev *dev); +extern int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec);  extern void pci_msi_shutdown(struct pci_dev *dev);  extern void pci_disable_msi(struct pci_dev *dev); +extern int pci_msix_table_size(struct pci_dev *dev);  extern int pci_enable_msix(struct pci_dev *dev,  	struct msix_entry *entries, int nvec);  extern void pci_msix_shutdown(struct pci_dev *dev); @@ -842,6 +875,8 @@ static inline int pcie_aspm_enabled(void)  extern int pcie_aspm_enabled(void);  #endif +#define pci_enable_msi(pdev)	pci_enable_msi_block(pdev, 1) +  #ifdef CONFIG_HT_IRQ  /* The functions a driver should call */  int  ht_create_irq(struct pci_dev *dev, int idx); @@ -1195,5 +1230,23 @@ int pci_ext_cfg_avail(struct pci_dev *dev);  void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar); +#ifdef CONFIG_PCI_IOV +extern int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); +extern void pci_disable_sriov(struct pci_dev *dev); +extern irqreturn_t pci_sriov_migration(struct pci_dev *dev); +#else +static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn) +{ +	return -ENODEV; +} +static inline void pci_disable_sriov(struct pci_dev *dev) +{ +} +static inline irqreturn_t pci_sriov_migration(struct pci_dev *dev) +{ +	return IRQ_NONE; +} +#endif +  #endif /* __KERNEL__ */  #endif /* LINUX_PCI_H */  |