diff options
Diffstat (limited to 'drivers/pci/pci.h')
| -rw-r--r-- | drivers/pci/pci.h | 209 | 
1 files changed, 88 insertions, 121 deletions
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index f5c7c382765..0601890db22 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -1,29 +1,32 @@  #ifndef DRIVERS_PCI_H  #define DRIVERS_PCI_H -#include <linux/workqueue.h> -  #define PCI_CFG_SPACE_SIZE	256  #define PCI_CFG_SPACE_EXP_SIZE	4096 +extern const unsigned char pcie_link_speed[]; +  /* Functions internal to the PCI core code */ -extern int pci_uevent(struct device *dev, struct kobj_uevent_env *env); -extern int pci_create_sysfs_dev_files(struct pci_dev *pdev); -extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev); -#ifndef CONFIG_DMI +int pci_create_sysfs_dev_files(struct pci_dev *pdev); +void pci_remove_sysfs_dev_files(struct pci_dev *pdev); +#if !defined(CONFIG_DMI) && !defined(CONFIG_ACPI)  static inline void pci_create_firmware_label_files(struct pci_dev *pdev)  { return; }  static inline void pci_remove_firmware_label_files(struct pci_dev *pdev)  { return; }  #else -extern void pci_create_firmware_label_files(struct pci_dev *pdev); -extern void pci_remove_firmware_label_files(struct pci_dev *pdev); +void pci_create_firmware_label_files(struct pci_dev *pdev); +void pci_remove_firmware_label_files(struct pci_dev *pdev);  #endif -extern void pci_cleanup_rom(struct pci_dev *dev); +void pci_cleanup_rom(struct pci_dev *dev);  #ifdef HAVE_PCI_MMAP -extern int pci_mmap_fits(struct pci_dev *pdev, int resno, -			 struct vm_area_struct *vma); +enum pci_mmap_api { +	PCI_MMAP_SYSFS,	/* mmap on /sys/bus/pci/devices/<BDF>/resource<N> */ +	PCI_MMAP_PROCFS	/* mmap on /proc/bus/pci/<BDF> */ +}; +int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vmai, +		  enum pci_mmap_api mmap_api);  #endif  int pci_probe_reset_function(struct pci_dev *dev); @@ -39,9 +42,6 @@ int pci_probe_reset_function(struct pci_dev *dev);   *                platform; to be used during system-wide transitions from a   *                sleeping state to the working state and vice versa   * - * @can_wakeup: returns 'true' if given device is capable of waking up the - *              system from a sleeping state - *   * @sleep_wake: enables/disables the system wake up capability of given device   *   * @run_wake: enables/disables the platform to generate run-time wake-up events @@ -55,32 +55,33 @@ struct pci_platform_pm_ops {  	bool (*is_manageable)(struct pci_dev *dev);  	int (*set_state)(struct pci_dev *dev, pci_power_t state);  	pci_power_t (*choose_state)(struct pci_dev *dev); -	bool (*can_wakeup)(struct pci_dev *dev);  	int (*sleep_wake)(struct pci_dev *dev, bool enable);  	int (*run_wake)(struct pci_dev *dev, bool enable);  }; -extern int pci_set_platform_pm(struct pci_platform_pm_ops *ops); -extern void pci_update_current_state(struct pci_dev *dev, pci_power_t state); -extern void pci_disable_enabled_device(struct pci_dev *dev); -extern int pci_finish_runtime_suspend(struct pci_dev *dev); -extern int __pci_pme_wakeup(struct pci_dev *dev, void *ign); -extern void pci_pm_init(struct pci_dev *dev); -extern void platform_pci_wakeup_init(struct pci_dev *dev); -extern void pci_allocate_cap_save_buffers(struct pci_dev *dev); +int pci_set_platform_pm(struct pci_platform_pm_ops *ops); +void pci_update_current_state(struct pci_dev *dev, pci_power_t state); +void pci_power_up(struct pci_dev *dev); +void pci_disable_enabled_device(struct pci_dev *dev); +int pci_finish_runtime_suspend(struct pci_dev *dev); +int __pci_pme_wakeup(struct pci_dev *dev, void *ign); +void pci_config_pm_runtime_get(struct pci_dev *dev); +void pci_config_pm_runtime_put(struct pci_dev *dev); +void pci_pm_init(struct pci_dev *dev); +void pci_allocate_cap_save_buffers(struct pci_dev *dev); +void pci_free_cap_save_buffers(struct pci_dev *dev); + +static inline void pci_wakeup_event(struct pci_dev *dev) +{ +	/* Wait 100 ms before the system can be put into a sleep state. */ +	pm_wakeup_event(&dev->dev, 100); +} -static inline bool pci_is_bridge(struct pci_dev *pci_dev) +static inline bool pci_has_subordinate(struct pci_dev *pci_dev)  {  	return !!(pci_dev->subordinate);  } -extern int pci_user_read_config_byte(struct pci_dev *dev, int where, u8 *val); -extern int pci_user_read_config_word(struct pci_dev *dev, int where, u16 *val); -extern int pci_user_read_config_dword(struct pci_dev *dev, int where, u32 *val); -extern int pci_user_write_config_byte(struct pci_dev *dev, int where, u8 val); -extern int pci_user_write_config_word(struct pci_dev *dev, int where, u16 val); -extern int pci_user_write_config_dword(struct pci_dev *dev, int where, u32 val); -  struct pci_vpd_ops {  	ssize_t (*read)(struct pci_dev *dev, loff_t pos, size_t count, void *buf);  	ssize_t (*write)(struct pci_dev *dev, loff_t pos, size_t count, const void *buf); @@ -93,7 +94,7 @@ struct pci_vpd {  	struct bin_attribute *attr; /* descriptor for sysfs VPD entry */  }; -extern int pci_vpd_pci22_init(struct pci_dev *dev); +int pci_vpd_pci22_init(struct pci_dev *dev);  static inline void pci_vpd_release(struct pci_dev *dev)  {  	if (dev->vpd) @@ -102,9 +103,9 @@ static inline void pci_vpd_release(struct pci_dev *dev)  /* PCI /proc functions */  #ifdef CONFIG_PROC_FS -extern int pci_proc_attach_device(struct pci_dev *dev); -extern int pci_proc_detach_device(struct pci_dev *dev); -extern int pci_proc_detach_bus(struct pci_bus *bus); +int pci_proc_attach_device(struct pci_dev *dev); +int pci_proc_detach_device(struct pci_dev *dev); +int pci_proc_detach_bus(struct pci_bus *bus);  #else  static inline int pci_proc_attach_device(struct pci_dev *dev) { return 0; }  static inline int pci_proc_detach_device(struct pci_dev *dev) { return 0; } @@ -112,11 +113,11 @@ static inline int pci_proc_detach_bus(struct pci_bus *bus) { return 0; }  #endif  /* Functions for PCI Hotplug drivers to use */ -extern unsigned int pci_do_scan_bus(struct pci_bus *bus); +int pci_hp_add_bridge(struct pci_dev *dev);  #ifdef HAVE_PCI_LEGACY -extern void pci_create_legacy_files(struct pci_bus *bus); -extern void pci_remove_legacy_files(struct pci_bus *bus); +void pci_create_legacy_files(struct pci_bus *bus); +void pci_remove_legacy_files(struct pci_bus *bus);  #else  static inline void pci_create_legacy_files(struct pci_bus *bus) { return; }  static inline void pci_remove_legacy_files(struct pci_bus *bus) { return; } @@ -125,23 +126,19 @@ static inline void pci_remove_legacy_files(struct pci_bus *bus) { return; }  /* Lock for read/write access to pci device and bus lists */  extern struct rw_semaphore pci_bus_sem; +extern raw_spinlock_t pci_lock; +  extern unsigned int pci_pm_d3_delay;  #ifdef CONFIG_PCI_MSI  void pci_no_msi(void); -extern void pci_msi_init_pci_dev(struct pci_dev *dev); +void pci_msi_init_pci_dev(struct pci_dev *dev);  #else  static inline void pci_no_msi(void) { }  static inline void pci_msi_init_pci_dev(struct pci_dev *dev) { }  #endif -#ifdef CONFIG_PCIEAER -void pci_no_aer(void); -bool pci_aer_available(void); -#else -static inline void pci_no_aer(void) { } -static inline bool pci_aer_available(void) { return false; } -#endif +void pci_realloc_get_opt(char *);  static inline int pci_no_d1d2(struct pci_dev *dev)  { @@ -152,14 +149,10 @@ static inline int pci_no_d1d2(struct pci_dev *dev)  	return (dev->no_d1d2 || parent_dstates);  } -extern struct device_attribute pci_dev_attrs[]; -extern struct device_attribute dev_attr_cpuaffinity; -extern struct device_attribute dev_attr_cpulistaffinity; -#ifdef CONFIG_HOTPLUG -extern struct bus_attribute pci_bus_attrs[]; -#else -#define pci_bus_attrs	NULL -#endif +extern const struct attribute_group *pci_dev_groups[]; +extern const struct attribute_group *pcibus_groups[]; +extern struct device_type pci_dev_type; +extern const struct attribute_group *pci_bus_groups[];  /** @@ -182,8 +175,6 @@ pci_match_one_device(const struct pci_device_id *id, const struct pci_dev *dev)  	return NULL;  } -struct pci_dev *pci_find_upstream_pcie_bridge(struct pci_dev *pdev); -  /* PCI slot sysfs helper code */  #define to_pci_slot(s) container_of(s, struct pci_slot, kobj) @@ -203,13 +194,19 @@ enum pci_bar_type {  	pci_bar_mem64,		/* A 64-bit memory BAR */  }; -extern int pci_setup_device(struct pci_dev *dev); -extern int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, -				struct resource *res, unsigned int reg); -extern int pci_resource_bar(struct pci_dev *dev, int resno, -			    enum pci_bar_type *type); -extern int pci_bus_add_child(struct pci_bus *bus); -extern void pci_enable_ari(struct pci_dev *dev); +bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *pl, +				int crs_timeout); +int pci_setup_device(struct pci_dev *dev); +int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, +		    struct resource *res, unsigned int reg); +int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type); +void pci_configure_ari(struct pci_dev *dev); +void __pci_bus_size_bridges(struct pci_bus *bus, +			struct list_head *realloc_head); +void __pci_bus_assign_resources(const struct pci_bus *bus, +				struct list_head *realloc_head, +				struct list_head *fail_head); +  /**   * pci_ari_enabled - query ARI forwarding status   * @bus: the PCI bus @@ -221,11 +218,8 @@ static inline int pci_ari_enabled(struct pci_bus *bus)  	return bus->self && bus->self->ari_enabled;  } -#ifdef CONFIG_PCI_QUIRKS -extern int pci_is_reassigndev(struct pci_dev *dev); -resource_size_t pci_specified_resource_alignment(struct pci_dev *dev); -extern void pci_disable_bridge_window(struct pci_dev *dev); -#endif +void pci_reassigndev_resource_alignment(struct pci_dev *dev); +void pci_disable_bridge_window(struct pci_dev *dev);  /* Single Root I/O Virtualization */  struct pci_sriov { @@ -233,52 +227,36 @@ struct pci_sriov {  	int nres;		/* number of resources */  	u32 cap;		/* SR-IOV Capabilities */  	u16 ctrl;		/* SR-IOV Control */ -	u16 total;		/* total VFs associated with the PF */ -	u16 initial;		/* initial VFs associated with the PF */ -	u16 nr_virtfn;		/* number of VFs available */ +	u16 total_VFs;		/* total VFs associated with the PF */ +	u16 initial_VFs;	/* initial VFs associated with the PF */ +	u16 num_VFs;		/* number of VFs available */  	u16 offset;		/* first VF Routing ID offset */  	u16 stride;		/* following VF stride */  	u32 pgsz;		/* page size for BAR alignment */  	u8 link;		/* Function Dependency Link */ +	u16 driver_max_VFs;	/* max num VFs driver supports */  	struct pci_dev *dev;	/* lowest numbered PF */  	struct pci_dev *self;	/* this PF */  	struct mutex lock;	/* lock for VF bus */ -	struct work_struct mtask; /* VF Migration task */ -	u8 __iomem *mstate;	/* VF Migration State Array */ -}; - -/* Address Translation Service */ -struct pci_ats { -	int pos;	/* capability position */ -	int stu;	/* Smallest Translation Unit */ -	int qdep;	/* Invalidate Queue Depth */ -	int ref_cnt;	/* Physical Function reference count */ -	unsigned int is_enabled:1;	/* Enable bit is set */  }; -#ifdef CONFIG_PCI_IOV -extern int pci_iov_init(struct pci_dev *dev); -extern void pci_iov_release(struct pci_dev *dev); -extern int pci_iov_resource_bar(struct pci_dev *dev, int resno, -				enum pci_bar_type *type); -extern resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev, -						    int resno); -extern void pci_restore_iov_state(struct pci_dev *dev); -extern int pci_iov_bus_range(struct pci_bus *bus); - -extern int pci_enable_ats(struct pci_dev *dev, int ps); -extern void pci_disable_ats(struct pci_dev *dev); -extern int pci_ats_queue_depth(struct pci_dev *dev); -/** - * pci_ats_enabled - query the ATS status - * @dev: the PCI device - * - * Returns 1 if ATS capability is enabled, or 0 if not. - */ -static inline int pci_ats_enabled(struct pci_dev *dev) +#ifdef CONFIG_PCI_ATS +void pci_restore_ats_state(struct pci_dev *dev); +#else +static inline void pci_restore_ats_state(struct pci_dev *dev)  { -	return dev->ats && dev->ats->is_enabled;  } +#endif /* CONFIG_PCI_ATS */ + +#ifdef CONFIG_PCI_IOV +int pci_iov_init(struct pci_dev *dev); +void pci_iov_release(struct pci_dev *dev); +int pci_iov_resource_bar(struct pci_dev *dev, int resno, +			 enum pci_bar_type *type); +resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev, int resno); +void pci_restore_iov_state(struct pci_dev *dev); +int pci_iov_bus_range(struct pci_bus *bus); +  #else  static inline int pci_iov_init(struct pci_dev *dev)  { @@ -301,25 +279,12 @@ static inline int pci_iov_bus_range(struct pci_bus *bus)  	return 0;  } -static inline int pci_enable_ats(struct pci_dev *dev, int ps) -{ -	return -ENODEV; -} -static inline void pci_disable_ats(struct pci_dev *dev) -{ -} -static inline int pci_ats_queue_depth(struct pci_dev *dev) -{ -	return -ENODEV; -} -static inline int pci_ats_enabled(struct pci_dev *dev) -{ -	return 0; -}  #endif /* CONFIG_PCI_IOV */ +unsigned long pci_cardbus_resource_alignment(struct resource *); +  static inline resource_size_t pci_resource_alignment(struct pci_dev *dev, -					 struct resource *res) +						     struct resource *res)  {  #ifdef CONFIG_PCI_IOV  	int resno = res - dev->resource; @@ -327,10 +292,12 @@ static inline resource_size_t pci_resource_alignment(struct pci_dev *dev,  	if (resno >= PCI_IOV_RESOURCES && resno <= PCI_IOV_RESOURCE_END)  		return pci_sriov_resource_alignment(dev, resno);  #endif +	if (dev->class >> 8  == PCI_CLASS_BRIDGE_CARDBUS) +		return pci_cardbus_resource_alignment(res);  	return resource_alignment(res);  } -extern void pci_enable_acs(struct pci_dev *dev); +void pci_enable_acs(struct pci_dev *dev);  struct pci_dev_reset_methods {  	u16 vendor; @@ -339,7 +306,7 @@ struct pci_dev_reset_methods {  };  #ifdef CONFIG_PCI_QUIRKS -extern int pci_dev_specific_reset(struct pci_dev *dev, int probe); +int pci_dev_specific_reset(struct pci_dev *dev, int probe);  #else  static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe)  {  | 
