pci.h 8.0 KB
Newer Older
1 2 3 4 5 6
#ifndef DRIVERS_PCI_H
#define DRIVERS_PCI_H

#define PCI_CFG_SPACE_SIZE	256
#define PCI_CFG_SPACE_EXP_SIZE	4096

L
Linus Torvalds 已提交
7 8
/* Functions internal to the PCI core code */

9
extern int pci_uevent(struct device *dev, struct kobj_uevent_env *env);
L
Linus Torvalds 已提交
10 11 12
extern int pci_create_sysfs_dev_files(struct pci_dev *pdev);
extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
extern void pci_cleanup_rom(struct pci_dev *dev);
13 14 15 16
#ifdef HAVE_PCI_MMAP
extern int pci_mmap_fits(struct pci_dev *pdev, int resno,
			 struct vm_area_struct *vma);
#endif
17

18
/**
19
 * struct pci_platform_pm_ops - Firmware PM callbacks
20
 *
21 22
 * @is_manageable: returns 'true' if given device is power manageable by the
 *                 platform firmware
23
 *
24
 * @set_state: invokes the platform firmware to set the device's power state
25
 *
26 27 28
 * @choose_state: returns PCI power state of given device preferred by the
 *                platform; to be used during system-wide transitions from a
 *                sleeping state to the working state and vice versa
29
 *
30 31
 * @can_wakeup: returns 'true' if given device is capable of waking up the
 *              system from a sleeping state
32
 *
33
 * @sleep_wake: enables/disables the system wake up capability of given device
34
 *
35 36 37 38 39 40 41
 * If given platform is generally capable of power managing PCI devices, all of
 * these callbacks are mandatory.
 */
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);
42 43
	bool (*can_wakeup)(struct pci_dev *dev);
	int (*sleep_wake)(struct pci_dev *dev, bool enable);
44 45 46
};

extern int pci_set_platform_pm(struct pci_platform_pm_ops *ops);
47
extern void pci_update_current_state(struct pci_dev *dev, pci_power_t state);
48
extern void pci_disable_enabled_device(struct pci_dev *dev);
49
extern void pci_pm_init(struct pci_dev *dev);
50
extern void platform_pci_wakeup_init(struct pci_dev *dev);
51
extern void pci_allocate_cap_save_buffers(struct pci_dev *dev);
52 53 54 55 56 57
extern int pci_restore_standard_config(struct pci_dev *dev);

static inline bool pci_is_bridge(struct pci_dev *pci_dev)
{
	return !!(pci_dev->subordinate);
}
58

59 60 61 62 63 64 65
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);

66
struct pci_vpd_ops {
67 68
	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);
69 70 71 72
	void (*release)(struct pci_dev *dev);
};

struct pci_vpd {
73
	unsigned int len;
74
	const struct pci_vpd_ops *ops;
75 76 77 78 79 80 81 82 83 84
	struct bin_attribute *attr; /* descriptor for sysfs VPD entry */
};

extern int pci_vpd_pci22_init(struct pci_dev *dev);
static inline void pci_vpd_release(struct pci_dev *dev)
{
	if (dev->vpd)
		dev->vpd->ops->release(dev);
}

L
Linus Torvalds 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98
/* 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);
#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; }
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);

99 100
#ifdef HAVE_PCI_LEGACY
extern void pci_create_legacy_files(struct pci_bus *bus);
L
Linus Torvalds 已提交
101
extern void pci_remove_legacy_files(struct pci_bus *bus);
102 103 104 105
#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; }
#endif
L
Linus Torvalds 已提交
106 107

/* Lock for read/write access to pci device and bus lists */
108
extern struct rw_semaphore pci_bus_sem;
L
Linus Torvalds 已提交
109

110
extern unsigned int pci_pm_d3_delay;
111

112
#ifdef CONFIG_PCI_MSI
113
void pci_no_msi(void);
114
extern void pci_msi_init_pci_dev(struct pci_dev *dev);
115
#else
116
static inline void pci_no_msi(void) { }
117
static inline void pci_msi_init_pci_dev(struct pci_dev *dev) { }
118
#endif
119

R
Randy Dunlap 已提交
120 121 122 123 124 125
#ifdef CONFIG_PCIEAER
void pci_no_aer(void);
#else
static inline void pci_no_aer(void) { }
#endif

126 127 128
static inline int pci_no_d1d2(struct pci_dev *dev)
{
	unsigned int parent_dstates = 0;
129

130 131 132 133 134
	if (dev->bus->self)
		parent_dstates = dev->bus->self->no_d1d2;
	return (dev->no_d1d2 || parent_dstates);

}
L
Linus Torvalds 已提交
135 136
extern int pcie_mch_quirk;
extern struct device_attribute pci_dev_attrs[];
137
extern struct device_attribute dev_attr_cpuaffinity;
M
Mike Travis 已提交
138
extern struct device_attribute dev_attr_cpulistaffinity;
L
Linus Torvalds 已提交
139 140 141 142 143 144

/**
 * pci_match_one_device - Tell if a PCI device structure has a matching
 *                        PCI device id structure
 * @id: single PCI device id structure to match
 * @dev: the PCI device structure to match against
145
 *
L
Linus Torvalds 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159
 * Returns the matching pci_device_id structure or %NULL if there is no match.
 */
static inline const struct pci_device_id *
pci_match_one_device(const struct pci_device_id *id, const struct pci_dev *dev)
{
	if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) &&
	    (id->device == PCI_ANY_ID || id->device == dev->device) &&
	    (id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) &&
	    (id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) &&
	    !((id->class ^ dev->class) & id->class_mask))
		return id;
	return NULL;
}

160
struct pci_dev *pci_find_upstream_pcie_bridge(struct pci_dev *pdev);
A
Alex Chiang 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173

/* PCI slot sysfs helper code */
#define to_pci_slot(s) container_of(s, struct pci_slot, kobj)

extern struct kset *pci_slots_kset;

struct pci_slot_attribute {
	struct attribute attr;
	ssize_t (*show)(struct pci_slot *, char *);
	ssize_t (*store)(struct pci_slot *, const char *, size_t);
};
#define to_pci_slot_attr(s) container_of(s, struct pci_slot_attribute, attr)

Y
Yu Zhao 已提交
174 175 176 177 178 179 180 181 182
enum pci_bar_type {
	pci_bar_unknown,	/* Standard PCI BAR probe */
	pci_bar_io,		/* An io port BAR */
	pci_bar_mem32,		/* A 32-bit memory BAR */
	pci_bar_mem64,		/* A 64-bit memory BAR */
};

extern int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
				struct resource *res, unsigned int reg);
183 184
extern int pci_resource_bar(struct pci_dev *dev, int resno,
			    enum pci_bar_type *type);
185
extern int pci_bus_add_child(struct pci_bus *bus);
Y
Yu Zhao 已提交
186 187 188
extern void pci_enable_ari(struct pci_dev *dev);
/**
 * pci_ari_enabled - query ARI forwarding status
Y
Yu Zhao 已提交
189
 * @bus: the PCI bus
Y
Yu Zhao 已提交
190 191 192
 *
 * Returns 1 if ARI forwarding is enabled, or 0 if not enabled;
 */
Y
Yu Zhao 已提交
193
static inline int pci_ari_enabled(struct pci_bus *bus)
Y
Yu Zhao 已提交
194
{
Y
Yu Zhao 已提交
195
	return bus->self && bus->self->ari_enabled;
Y
Yu Zhao 已提交
196 197
}

198 199 200 201 202 203
#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

204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
/* Single Root I/O Virtualization */
struct pci_sriov {
	int pos;		/* capability position */
	int nres;		/* number of resources */
	u32 cap;		/* SR-IOV Capabilities */
	u16 ctrl;		/* SR-IOV Control */
	u16 total;		/* total VFs associated with the PF */
	u16 offset;		/* first VF Routing ID offset */
	u16 stride;		/* following VF stride */
	u32 pgsz;		/* page size for BAR alignment */
	u8 link;		/* Function Dependency Link */
	struct pci_dev *dev;	/* lowest numbered PF */
	struct pci_dev *self;	/* this PF */
	struct mutex lock;	/* lock for VF bus */
};

#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);
#else
static inline int pci_iov_init(struct pci_dev *dev)
{
	return -ENODEV;
}
static inline void pci_iov_release(struct pci_dev *dev)

{
}
static inline int pci_iov_resource_bar(struct pci_dev *dev, int resno,
				       enum pci_bar_type *type)
{
	return 0;
}
#endif /* CONFIG_PCI_IOV */

241
#endif /* DRIVERS_PCI_H */