Blame view

include/linux/pci.h 53.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /*
   *	pci.h
   *
   *	PCI defines and function prototypes
   *	Copyright 1994, Drew Eckhardt
   *	Copyright 1997--1999 Martin Mares <mj@ucw.cz>
   *
   *	For more information, please consult the following manuals (look at
   *	http://www.pcisig.com/ for how to get them):
   *
   *	PCI BIOS Specification
   *	PCI Local Bus Specification
   *	PCI to PCI Bridge Specification
   *	PCI System Design Guide
   */
  
  #ifndef LINUX_PCI_H
  #define LINUX_PCI_H
f46753c5e   Alex Chiang   PCI: introduce pc...
19
  #include <linux/pci_regs.h>	/* The pci register defines */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
24
25
26
27
28
  /*
   * The PCI interface treats multi-function devices as independent
   * devices.  The slot/function address of each device is encoded
   * in a single byte as follows:
   *
   *	7:3 = slot
   *	2:0 = function
   */
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
29
  #define PCI_DEVFN(slot, func)	((((slot) & 0x1f) << 3) | ((func) & 0x07))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
34
35
36
37
38
39
40
  #define PCI_SLOT(devfn)		(((devfn) >> 3) & 0x1f)
  #define PCI_FUNC(devfn)		((devfn) & 0x07)
  
  /* Ioctls for /proc/bus/pci/X/Y nodes. */
  #define PCIIOC_BASE		('P' << 24 | 'C' << 16 | 'I' << 8)
  #define PCIIOC_CONTROLLER	(PCIIOC_BASE | 0x00)	/* Get controller for PCI device. */
  #define PCIIOC_MMAP_IS_IO	(PCIIOC_BASE | 0x01)	/* Set mmap state to I/O space. */
  #define PCIIOC_MMAP_IS_MEM	(PCIIOC_BASE | 0x02)	/* Set mmap state to MEM space. */
  #define PCIIOC_WRITE_COMBINE	(PCIIOC_BASE | 0x03)	/* Enable/disable write-combining. */
  
  #ifdef __KERNEL__
778382e08   David Woodhouse   Don't include <li...
41
  #include <linux/mod_devicetable.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
  #include <linux/types.h>
98db6f193   Sam Ravnborg   x86: fix section ...
43
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
  #include <linux/ioport.h>
  #include <linux/list.h>
4a7fb6363   Andrew Morton   add __must_check ...
46
  #include <linux/compiler.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  #include <linux/errno.h>
f46753c5e   Alex Chiang   PCI: introduce pc...
48
  #include <linux/kobject.h>
60063497a   Arun Sharma   atomic: use <linu...
49
  #include <linux/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  #include <linux/device.h>
1388cc964   Stephen Rothwell   PCI: don't export...
51
  #include <linux/io.h>
74bb1bcc7   Yu Zhao   PCI: handle SR-IO...
52
  #include <linux/irqreturn.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53

7e7a43c32   Adrian Bunk   PCI: don't export...
54
55
  /* Include the ID list */
  #include <linux/pci_ids.h>
f46753c5e   Alex Chiang   PCI: introduce pc...
56
57
58
59
60
61
62
63
  /* pci_slot represents a physical slot */
  struct pci_slot {
  	struct pci_bus *bus;		/* The bus this slot is on */
  	struct list_head list;		/* node in list of slots on this bus */
  	struct hotplug_slot *hotplug;	/* Hotplug info (migrate over time) */
  	unsigned char number;		/* PCI_SLOT(pci_dev->devfn) */
  	struct kobject kobj;
  };
0ad772ec4   Alex Chiang   PCI, PCI Hotplug:...
64
65
66
67
  static inline const char *pci_slot_name(const struct pci_slot *slot)
  {
  	return kobject_name(&slot->kobj);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
71
72
73
74
75
76
77
78
  /* File state for mmap()s on /proc/bus/pci/X/Y */
  enum pci_mmap_state {
  	pci_mmap_io,
  	pci_mmap_mem
  };
  
  /* This defines the direction arg to the DMA mapping routines. */
  #define PCI_DMA_BIDIRECTIONAL	0
  #define PCI_DMA_TODEVICE	1
  #define PCI_DMA_FROMDEVICE	2
  #define PCI_DMA_NONE		3
fde09c6d8   Yu Zhao   PCI: define PCI r...
79
80
81
82
83
84
85
86
87
88
  /*
   *  For PCI devices, the region numbers are assigned this way:
   */
  enum {
  	/* #0-5: standard PCI resources */
  	PCI_STD_RESOURCES,
  	PCI_STD_RESOURCE_END = 5,
  
  	/* #6: expansion ROM resource */
  	PCI_ROM_RESOURCE,
d1b054da8   Yu Zhao   PCI: initialize a...
89
90
91
92
93
  	/* device specific resources */
  #ifdef CONFIG_PCI_IOV
  	PCI_IOV_RESOURCES,
  	PCI_IOV_RESOURCE_END = PCI_IOV_RESOURCES + PCI_SRIOV_NUM_BARS - 1,
  #endif
fde09c6d8   Yu Zhao   PCI: define PCI r...
94
95
96
97
98
99
100
101
102
103
104
  	/* resources assigned to buses behind the bridge */
  #define PCI_BRIDGE_RESOURCE_NUM 4
  
  	PCI_BRIDGE_RESOURCES,
  	PCI_BRIDGE_RESOURCE_END = PCI_BRIDGE_RESOURCES +
  				  PCI_BRIDGE_RESOURCE_NUM - 1,
  
  	/* total resources associated with a PCI device */
  	PCI_NUM_RESOURCES,
  
  	/* preserve this for compatibility */
cda57bf93   Yinghai Lu   PCI: DEVICE_COUNT...
105
  	DEVICE_COUNT_RESOURCE = PCI_NUM_RESOURCES,
fde09c6d8   Yu Zhao   PCI: define PCI r...
106
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
  
  typedef int __bitwise pci_power_t;
4352dfd5c   Greg Kroah-Hartman   [PATCH] PCI: clea...
109
110
111
  #define PCI_D0		((pci_power_t __force) 0)
  #define PCI_D1		((pci_power_t __force) 1)
  #define PCI_D2		((pci_power_t __force) 2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
113
  #define PCI_D3hot	((pci_power_t __force) 3)
  #define PCI_D3cold	((pci_power_t __force) 4)
3fe9d19f9   Daniel Ritz   [PATCH] PCI: Supp...
114
  #define PCI_UNKNOWN	((pci_power_t __force) 5)
438510f6f   Pavel Machek   [PATCH] pm_messag...
115
  #define PCI_POWER_ERROR	((pci_power_t __force) -1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116

00240c383   Alan Stern   PCI: add power-st...
117
118
119
120
121
122
123
  /* Remember to update this when the list above changes! */
  extern const char *pci_power_names[];
  
  static inline const char *pci_power_name(pci_power_t state)
  {
  	return pci_power_names[1 + (int) state];
  }
aa8c6c937   Rafael J. Wysocki   PCI PM: Restore s...
124
125
126
  #define PCI_PM_D2_DELAY	200
  #define PCI_PM_D3_WAIT	10
  #define PCI_PM_BUS_WAIT	50
392a1ce76   Linas Vepstas   [PATCH] PCI Error...
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  /** The pci_channel state describes connectivity between the CPU and
   *  the pci device.  If some PCI bus between here and the pci device
   *  has crashed or locked up, this info is reflected here.
   */
  typedef unsigned int __bitwise pci_channel_state_t;
  
  enum pci_channel_state {
  	/* I/O channel is in normal state */
  	pci_channel_io_normal = (__force pci_channel_state_t) 1,
  
  	/* I/O to channel is blocked */
  	pci_channel_io_frozen = (__force pci_channel_state_t) 2,
  
  	/* PCI card is dead */
  	pci_channel_io_perm_failure = (__force pci_channel_state_t) 3,
  };
f7bdd12d2   Brian King   pci: New PCI-E re...
143
144
145
146
147
148
149
150
151
152
153
154
  typedef unsigned int __bitwise pcie_reset_state_t;
  
  enum pcie_reset_state {
  	/* Reset is NOT asserted (Use to deassert reset) */
  	pcie_deassert_reset = (__force pcie_reset_state_t) 1,
  
  	/* Use #PERST to reset PCI-E device */
  	pcie_warm_reset = (__force pcie_reset_state_t) 2,
  
  	/* Use PCI-E Hot Reset to reset device */
  	pcie_hot_reset = (__force pcie_reset_state_t) 3
  };
ba698ad4b   David Miller   PCI: Add quirk fo...
155
156
157
158
159
160
  typedef unsigned short __bitwise pci_dev_flags_t;
  enum pci_dev_flags {
  	/* INTX_DISABLE in PCI_COMMAND register disables MSI
  	 * generation too.
  	 */
  	PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = (__force pci_dev_flags_t) 1,
979b1791e   Alan Cox   PCI: add D3 power...
161
162
  	/* Device configuration is irrevocably lost if disabled into D3 */
  	PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t) 2,
6777829cf   Greg Rose   pci: Add flag ind...
163
164
  	/* Provide indication device is assigned by a Virtual Machine Manager */
  	PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) 4,
ba698ad4b   David Miller   PCI: Add quirk fo...
165
  };
e1d3a9084   Stefan Assmann   pci, acpi: rerout...
166
167
168
169
  enum pci_irq_reroute_variant {
  	INTEL_IRQ_REROUTE_VARIANT = 1,
  	MAX_IRQ_REROUTE_VARIANTS = 3
  };
6e325a62a   Michael S. Tsirkin   [PATCH] PCI: make...
170
171
  typedef unsigned short __bitwise pci_bus_flags_t;
  enum pci_bus_flags {
d556ad4bb   Peter Oruba   PCI: add PCI-X/PC...
172
173
  	PCI_BUS_FLAGS_NO_MSI   = (__force pci_bus_flags_t) 1,
  	PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,
6e325a62a   Michael S. Tsirkin   [PATCH] PCI: make...
174
  };
536c8cb49   Matthew Wilcox   PCI: Unify pcie_l...
175
176
177
178
179
180
181
182
183
184
185
186
187
  /* 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,
45b4cdd57   Matthew Wilcox   PCI: Add support ...
188
189
190
191
192
  	AGP_UNKNOWN			= 0x0c,
  	AGP_1X				= 0x0d,
  	AGP_2X				= 0x0e,
  	AGP_4X				= 0x0f,
  	AGP_8X				= 0x10,
536c8cb49   Matthew Wilcox   PCI: Unify pcie_l...
193
194
195
196
197
  	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,
9dfd97fe1   Matthew Wilcox   PCI: Add support ...
198
  	PCIE_SPEED_8_0GT		= 0x16,
536c8cb49   Matthew Wilcox   PCI: Unify pcie_l...
199
200
  	PCI_SPEED_UNKNOWN		= 0xff,
  };
24a4742f0   Alex Williamson   PCI: Track the si...
201
  struct pci_cap_saved_data {
41017f0ca   Shaohua Li   [PATCH] PCI: MSI(...
202
  	char cap_nr;
24a4742f0   Alex Williamson   PCI: Track the si...
203
  	unsigned int size;
41017f0ca   Shaohua Li   [PATCH] PCI: MSI(...
204
205
  	u32 data[0];
  };
24a4742f0   Alex Williamson   PCI: Track the si...
206
207
208
209
  struct pci_cap_saved_state {
  	struct hlist_node next;
  	struct pci_cap_saved_data cap;
  };
7d715a6c1   Shaohua Li   PCI: add PCI Expr...
210
  struct pcie_link_state;
ee69439cc   Jesse Barnes   PCI: don't expose...
211
  struct pci_vpd;
d1b054da8   Yu Zhao   PCI: initialize a...
212
  struct pci_sriov;
302b4215d   Yu Zhao   PCI: support the ...
213
  struct pci_ats;
ee69439cc   Jesse Barnes   PCI: don't expose...
214

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
216
217
218
  /*
   * The pci_dev structure is used to describe PCI devices.
   */
  struct pci_dev {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
220
221
222
223
224
  	struct list_head bus_list;	/* node in per-bus list */
  	struct pci_bus	*bus;		/* bus this device is on */
  	struct pci_bus	*subordinate;	/* bus this device bridges to */
  
  	void		*sysdata;	/* hook for sys-specific extension */
  	struct proc_dir_entry *procent;	/* device entry in /proc/bus/pci */
f46753c5e   Alex Chiang   PCI: introduce pc...
225
  	struct pci_slot	*slot;		/* Physical slot this device is in */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
227
228
229
230
231
232
  
  	unsigned int	devfn;		/* encoded device & function index */
  	unsigned short	vendor;
  	unsigned short	device;
  	unsigned short	subsystem_vendor;
  	unsigned short	subsystem_device;
  	unsigned int	class;		/* 3 bytes: (base,sub,prog-if) */
b8a3a5214   Auke Kok   PCI: read revisio...
233
  	u8		revision;	/* PCI revision, low byte of class word */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
  	u8		hdr_type;	/* PCI header type (`multi' flag masked out) */
0efea0006   Kenji Kaneshige   PCI: cache PCIe c...
235
  	u8		pcie_cap;	/* PCI-E capability offset */
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
236
237
  	u8		pcie_type:4;	/* PCI-E device/port type */
  	u8		pcie_mpss:3;	/* PCI-E Max Payload Size Supported */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238
  	u8		rom_base_reg;	/* which config register controls the ROM */
ffeff788d   Kristen Accardi   [PATCH] pci: stor...
239
  	u8		pin;  		/* which interrupt pin this device uses */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240
241
242
243
244
245
246
  
  	struct pci_driver *driver;	/* which driver has allocated this device */
  	u64		dma_mask;	/* Mask of the bits of bus address this
  					   device implements.  Normally this is
  					   0xffffffff.  You only need to change
  					   this if your device has broken DMA
  					   or supports 64-bit transfers.  */
4d57cdfac   FUJITA Tomonori   iommu sg merging:...
247
  	struct device_dma_parameters dma_parms;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
248
249
250
  	pci_power_t     current_state;  /* Current operating state. In ACPI-speak,
  					   this is D0-D3, D0 being fully functional,
  					   and D3 being off. */
337001b6c   Rafael J. Wysocki   PCI: Simplify PCI...
251
252
253
254
  	int		pm_cap;		/* PM capability offset in the
  					   configuration space */
  	unsigned int	pme_support:5;	/* Bitmask of states from which PME#
  					   can be generated */
c7f486567   Rafael J. Wysocki   PCI PM: PCIe PME ...
255
  	unsigned int	pme_interrupt:1;
379021d5c   Rafael J. Wysocki   PCI / PM: Extend ...
256
  	unsigned int	pme_poll:1;	/* Poll device's PME status bit */
337001b6c   Rafael J. Wysocki   PCI: Simplify PCI...
257
258
259
  	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 */
253d2e549   Jacob Pan   PCI: disable mmio...
260
261
  	unsigned int	mmio_always_on:1;	/* disallow turning off io/mem
  						   decoding during bar sizing */
e80bb09d2   Rafael J. Wysocki   PCI PM: Introduce...
262
  	unsigned int	wakeup_prepared:1;
1ae861e65   Rafael J. Wysocki   PCI/PM: Use per-d...
263
  	unsigned int	d3_delay;	/* D3->D0 transition time in ms */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
264

7d715a6c1   Shaohua Li   PCI: add PCI Expr...
265
266
267
  #ifdef CONFIG_PCIEASPM
  	struct pcie_link_state	*link_state;	/* ASPM link state. */
  #endif
392a1ce76   Linas Vepstas   [PATCH] PCI Error...
268
  	pci_channel_state_t error_state;	/* current connectivity state */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269
  	struct	device	dev;		/* Generic device interface */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
271
272
273
274
275
276
277
  	int		cfg_size;	/* Size of configuration space */
  
  	/*
  	 * Instead of touching interrupt line and base address registers
  	 * directly, use the values stored here. They might be different!
  	 */
  	unsigned int	irq;
  	struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */
58c84eda0   Bjorn Helgaas   PCI: fall back to...
278
  	resource_size_t	fw_addr[DEVICE_COUNT_RESOURCE]; /* FW-assigned addr */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279
280
281
282
283
  
  	/* These fields are used by common fixups */
  	unsigned int	transparent:1;	/* Transparent PCI bridge */
  	unsigned int	multifunction:1;/* Part of multi-function device */
  	/* keep track of device state */
8a1bc9013   Greg Kroah-Hartman   PCI: add is_added...
284
  	unsigned int	is_added:1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
  	unsigned int	is_busmaster:1; /* device is busmaster */
4602b88d9   Kristen Accardi   [PATCH] PCI: 6700...
286
  	unsigned int	no_msi:1;	/* device may not use msi */
fb51ccbf2   Jan Kiszka   PCI: Rework confi...
287
  	unsigned int	block_cfg_access:1;	/* config space access is blocked */
bd8481e16   Doug Thompson   [PATCH] PCI Bus P...
288
  	unsigned int	broken_parity_status:1;	/* Device generates false positive parity */
e1d3a9084   Stefan Assmann   pci, acpi: rerout...
289
  	unsigned int	irq_reroute_variant:2;	/* device needs IRQ rerouting variant */
99dc804d9   Shaohua Li   [PATCH] PCI: disa...
290
291
  	unsigned int 	msi_enabled:1;
  	unsigned int	msix_enabled:1;
58c3a727c   Yu Zhao   PCI: support PCIe...
292
  	unsigned int	ari_enabled:1;	/* ARI forwarding */
9ac7849e3   Tejun Heo   devres: device re...
293
  	unsigned int	is_managed:1;
6d3be84aa   Kenji Kaneshige   PCI: mark is_pcie...
294
295
  	unsigned int	is_pcie:1;	/* Obsolete. Will be removed.
  					   Use pci_is_pcie() instead */
260d703ad   Mike Mason   PCI: support for ...
296
  	unsigned int    needs_freset:1; /* Dev requires fundamental reset */
aa8c6c937   Rafael J. Wysocki   PCI PM: Restore s...
297
  	unsigned int	state_saved:1;
d1b054da8   Yu Zhao   PCI: initialize a...
298
  	unsigned int	is_physfn:1;
dd7cc44d0   Yu Zhao   PCI: add SR-IOV A...
299
  	unsigned int	is_virtfn:1;
711d57796   Michael S. Tsirkin   PCI: expose funct...
300
  	unsigned int	reset_fn:1;
28760489a   Eric W. Biederman   PCI: pcie: Ensure...
301
  	unsigned int    is_hotplug_bridge:1;
affb72c3a   Huang Ying   ACPI, APEI, PCIE ...
302
303
  	unsigned int    __aer_firmware_first_valid:1;
  	unsigned int	__aer_firmware_first:1;
ba698ad4b   David Miller   PCI: Add quirk fo...
304
  	pci_dev_flags_t dev_flags;
bae94d023   Inaky Perez-Gonzalez   PCI: switch pci_{...
305
  	atomic_t	enable_cnt;	/* pci_enable_device has been called */
4602b88d9   Kristen Accardi   [PATCH] PCI: 6700...
306

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307
  	u32		saved_config_space[16]; /* config space saved at suspend time */
41017f0ca   Shaohua Li   [PATCH] PCI: MSI(...
308
  	struct hlist_head saved_cap_space;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
310
311
  	struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */
  	int rom_attr_enabled;		/* has display of the rom attribute been enabled? */
  	struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
45aec1ae7   venkatesh.pallipadi@intel.com   x86: PAT export r...
312
  	struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
ded86d8d3   Eric W. Biederman   msi: Kill msi_loo...
313
  #ifdef CONFIG_PCI_MSI
4aa9bc955   Michael Ellerman   MSI: Use a list i...
314
  	struct list_head msi_list;
da8d1c8ba   Neil Horman   PCI/sysfs: add pe...
315
  	struct kset *msi_kset;
ded86d8d3   Eric W. Biederman   msi: Kill msi_loo...
316
  #endif
94e610880   Ben Hutchings   PCI: Expose PCI V...
317
  	struct pci_vpd *vpd;
466b3ddfb   Joerg Roedel   PCI: Fix compile ...
318
  #ifdef CONFIG_PCI_ATS
dd7cc44d0   Yu Zhao   PCI: add SR-IOV A...
319
320
321
322
  	union {
  		struct pci_sriov *sriov;	/* SR-IOV capability related */
  		struct pci_dev *physfn;	/* the PF this VF is associated with */
  	};
302b4215d   Yu Zhao   PCI: support the ...
323
  	struct pci_ats	*ats;	/* Address Translation Service */
d1b054da8   Yu Zhao   PCI: initialize a...
324
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
  };
dda565492   Yinghai   intel-iommu: use ...
326
327
328
329
330
331
332
333
334
  static inline struct pci_dev *pci_physfn(struct pci_dev *dev)
  {
  #ifdef CONFIG_PCI_IOV
  	if (dev->is_virtfn)
  		dev = dev->physfn;
  #endif
  
  	return dev;
  }
65891215e   Michael Ellerman   PCI: Create alloc...
335
  extern struct pci_dev *alloc_pci_dev(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336
337
338
  #define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list)
  #define	to_pci_dev(n) container_of(n, struct pci_dev, dev)
  #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL)
a7369f1f6   Linas Vepstas   PCI: define inlin...
339
340
341
342
  static inline int pci_channel_offline(struct pci_dev *pdev)
  {
  	return (pdev->error_state != pci_channel_io_normal);
  }
41017f0ca   Shaohua Li   [PATCH] PCI: MSI(...
343
  static inline struct pci_cap_saved_state *pci_find_saved_cap(
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
344
  	struct pci_dev *pci_dev, char cap)
41017f0ca   Shaohua Li   [PATCH] PCI: MSI(...
345
346
347
348
349
  {
  	struct pci_cap_saved_state *tmp;
  	struct hlist_node *pos;
  
  	hlist_for_each_entry(tmp, pos, &pci_dev->saved_cap_space, next) {
24a4742f0   Alex Williamson   PCI: Track the si...
350
  		if (tmp->cap.cap_nr == cap)
41017f0ca   Shaohua Li   [PATCH] PCI: MSI(...
351
352
353
354
355
356
357
358
359
360
  			return tmp;
  	}
  	return NULL;
  }
  
  static inline void pci_add_saved_cap(struct pci_dev *pci_dev,
  	struct pci_cap_saved_state *new_cap)
  {
  	hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space);
  }
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
  /*
   * 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;
  };
4352dfd5c   Greg Kroah-Hartman   [PATCH] PCI: clea...
381
382
  
  #define PCI_REGION_FLAG_MASK	0x0fU	/* These bits of resource flags tell us the PCI region flags */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
384
385
386
387
388
389
  
  struct pci_bus {
  	struct list_head node;		/* node in list of buses */
  	struct pci_bus	*parent;	/* parent bus this bridge is on */
  	struct list_head children;	/* list of child buses */
  	struct list_head devices;	/* list of devices on this bus */
  	struct pci_dev	*self;		/* bridge device as seen by parent */
f46753c5e   Alex Chiang   PCI: introduce pc...
390
  	struct list_head slots;		/* list of slots on this bus */
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
391
392
  	struct resource *resource[PCI_BRIDGE_RESOURCE_NUM];
  	struct list_head resources;	/* address space routed to this bus */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
393
394
395
396
397
398
399
400
401
  
  	struct pci_ops	*ops;		/* configuration access functions */
  	void		*sysdata;	/* hook for sys-specific extension */
  	struct proc_dir_entry *procdir;	/* directory entry in /proc/bus/pci */
  
  	unsigned char	number;		/* bus number */
  	unsigned char	primary;	/* number of primary bridge */
  	unsigned char	secondary;	/* number of secondary bridge */
  	unsigned char	subordinate;	/* max number of subordinate buses */
3749c51ac   Matthew Wilcox   PCI: Make current...
402
403
  	unsigned char	max_bus_speed;	/* enum pci_bus_speed */
  	unsigned char	cur_bus_speed;	/* enum pci_bus_speed */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404
405
406
407
  
  	char		name[48];
  
  	unsigned short  bridge_ctl;	/* manage NO_ISA/FBB/et al behaviors */
6e325a62a   Michael S. Tsirkin   [PATCH] PCI: make...
408
  	pci_bus_flags_t bus_flags;	/* Inherited by child busses */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
  	struct device		*bridge;
fd7d1ced2   Greg Kroah-Hartman   PCI: make pci_bus...
410
  	struct device		dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411
412
  	struct bin_attribute	*legacy_io; /* legacy I/O for this bus */
  	struct bin_attribute	*legacy_mem; /* legacy mem */
cc74d96f4   Greg Kroah-Hartman   PCI: fix issue wi...
413
  	unsigned int		is_added:1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
415
416
  };
  
  #define pci_bus_b(n)	list_entry(n, struct pci_bus, node)
fd7d1ced2   Greg Kroah-Hartman   PCI: make pci_bus...
417
  #define to_pci_bus(n)	container_of(n, struct pci_bus, dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418

79af72d71   Kenji Kaneshige   PCI: pci_is_root_...
419
420
421
422
423
424
425
426
  /*
   * 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);
  }
16cf0ebc3   Rafael J. Wysocki   x86/PCI: Do not u...
427
428
429
430
431
432
433
434
  #ifdef CONFIG_PCI_MSI
  static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev)
  {
  	return pci_dev->msi_enabled || pci_dev->msix_enabled;
  }
  #else
  static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev) { return false; }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
  /*
   * Error values that may be returned by PCI functions.
   */
  #define PCIBIOS_SUCCESSFUL		0x00
  #define PCIBIOS_FUNC_NOT_SUPPORTED	0x81
  #define PCIBIOS_BAD_VENDOR_ID		0x83
  #define PCIBIOS_DEVICE_NOT_FOUND	0x86
  #define PCIBIOS_BAD_REGISTER_NUMBER	0x87
  #define PCIBIOS_SET_FAILED		0x88
  #define PCIBIOS_BUFFER_TOO_SMALL	0x89
  
  /* Low-level architecture-dependent routines */
  
  struct pci_ops {
  	int (*read)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val);
  	int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);
  };
b6ce068a1   Matthew Wilcox   Change pci_raw_op...
452
453
454
455
456
457
458
459
  /*
   * ACPI needs to be able to access PCI config space before we've done a
   * PCI bus scan and created pci_bus structures.
   */
  extern int raw_pci_read(unsigned int domain, unsigned int bus,
  			unsigned int devfn, int reg, int len, u32 *val);
  extern int raw_pci_write(unsigned int domain, unsigned int bus,
  			unsigned int devfn, int reg, int len, u32 val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
460
461
  
  struct pci_bus_region {
c40a22e0c   Benjamin Herrenschmidt   PCI: Fix bus reso...
462
463
  	resource_size_t start;
  	resource_size_t end;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
465
466
467
468
  };
  
  struct pci_dynids {
  	spinlock_t lock;            /* protects list, index */
  	struct list_head list;      /* for IDs added at runtime */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469
  };
392a1ce76   Linas Vepstas   [PATCH] PCI Error...
470
471
  /* ---------------------------------------------------------------- */
  /** PCI Error Recovery System (PCI-ERS).  If a PCI device driver provides
579082df3   Rolf Eike Beer   PCI: Fix typo in ...
472
   *  a set of callbacks in struct pci_error_handlers, then that device driver
392a1ce76   Linas Vepstas   [PATCH] PCI Error...
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
   *  will be notified of PCI bus errors, and will be driven to recovery
   *  when an error occurs.
   */
  
  typedef unsigned int __bitwise pci_ers_result_t;
  
  enum pci_ers_result {
  	/* no result/none/not supported in device driver */
  	PCI_ERS_RESULT_NONE = (__force pci_ers_result_t) 1,
  
  	/* Device driver can recover without slot reset */
  	PCI_ERS_RESULT_CAN_RECOVER = (__force pci_ers_result_t) 2,
  
  	/* Device driver wants slot to be reset. */
  	PCI_ERS_RESULT_NEED_RESET = (__force pci_ers_result_t) 3,
  
  	/* Device has completely failed, is unrecoverable */
  	PCI_ERS_RESULT_DISCONNECT = (__force pci_ers_result_t) 4,
  
  	/* Device driver is fully recovered and operational */
  	PCI_ERS_RESULT_RECOVERED = (__force pci_ers_result_t) 5,
  };
  
  /* PCI bus error event callbacks */
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
497
  struct pci_error_handlers {
392a1ce76   Linas Vepstas   [PATCH] PCI Error...
498
499
  	/* PCI bus error detected on this device */
  	pci_ers_result_t (*error_detected)(struct pci_dev *dev,
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
500
  					   enum pci_channel_state error);
392a1ce76   Linas Vepstas   [PATCH] PCI Error...
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
  
  	/* MMIO has been re-enabled, but not DMA */
  	pci_ers_result_t (*mmio_enabled)(struct pci_dev *dev);
  
  	/* PCI Express link has been reset */
  	pci_ers_result_t (*link_reset)(struct pci_dev *dev);
  
  	/* PCI slot has been reset */
  	pci_ers_result_t (*slot_reset)(struct pci_dev *dev);
  
  	/* Device driver may resume normal operations */
  	void (*resume)(struct pci_dev *dev);
  };
  
  /* ---------------------------------------------------------------- */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516
517
518
  struct module;
  struct pci_driver {
  	struct list_head node;
42b219322   Stephen Hemminger   PCI: pci_driver m...
519
  	const char *name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
521
522
523
  	const struct pci_device_id *id_table;	/* must be non-NULL for probe to be called */
  	int  (*probe)  (struct pci_dev *dev, const struct pci_device_id *id);	/* New device inserted */
  	void (*remove) (struct pci_dev *dev);	/* Device removed (NULL if not a hot-plug capable driver) */
  	int  (*suspend) (struct pci_dev *dev, pm_message_t state);	/* Device suspended */
cbd69dbbf   Linus Torvalds   Suspend changes f...
524
525
  	int  (*suspend_late) (struct pci_dev *dev, pm_message_t state);
  	int  (*resume_early) (struct pci_dev *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
526
  	int  (*resume) (struct pci_dev *dev);	                /* Device woken up */
c89581772   Greg Kroah-Hartman   [PATCH] PCI: Add ...
527
  	void (*shutdown) (struct pci_dev *dev);
392a1ce76   Linas Vepstas   [PATCH] PCI Error...
528
  	struct pci_error_handlers *err_handler;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
529
530
531
  	struct device_driver	driver;
  	struct pci_dynids dynids;
  };
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
532
  #define	to_pci_driver(drv) container_of(drv, struct pci_driver, driver)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533
534
  
  /**
9f9351bbe   Andrew Morton   rename DECLARE_PC...
535
   * DEFINE_PCI_DEVICE_TABLE - macro used to describe a pci device table
90a1ba0c5   Jonas Bonn   PCI: Add DECLARE_...
536
537
538
539
540
   * @_table: device table name
   *
   * This macro is used to create a struct pci_device_id array (a device table)
   * in a generic manner.
   */
9f9351bbe   Andrew Morton   rename DECLARE_PC...
541
  #define DEFINE_PCI_DEVICE_TABLE(_table) \
90a1ba0c5   Jonas Bonn   PCI: Add DECLARE_...
542
543
544
  	const struct pci_device_id _table[] __devinitconst
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
   * PCI_DEVICE - macro used to describe a specific pci device
   * @vend: the 16 bit PCI Vendor ID
   * @dev: the 16 bit PCI Device ID
   *
   * This macro is used to create a struct pci_device_id that matches a
   * specific device.  The subvendor and subdevice fields will be set to
   * PCI_ANY_ID.
   */
  #define PCI_DEVICE(vend,dev) \
  	.vendor = (vend), .device = (dev), \
  	.subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
  
  /**
   * PCI_DEVICE_CLASS - macro used to describe a specific pci device class
   * @dev_class: the class, subclass, prog-if triple for this device
   * @dev_class_mask: the class mask for this device
   *
   * This macro is used to create a struct pci_device_id that matches a
4352dfd5c   Greg Kroah-Hartman   [PATCH] PCI: clea...
563
   * specific PCI class.  The vendor, device, subvendor, and subdevice
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
564
565
566
567
568
569
   * fields will be set to PCI_ANY_ID.
   */
  #define PCI_DEVICE_CLASS(dev_class,dev_class_mask) \
  	.class = (dev_class), .class_mask = (dev_class_mask), \
  	.vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \
  	.subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
1597cacbe   Alan Cox   PCI: Fix multiple...
570
571
  /**
   * PCI_VDEVICE - macro used to describe a specific pci device in short form
c322b28a0   Zhao, Yu   PCI: use same arg...
572
573
   * @vendor: the vendor name
   * @device: the 16 bit PCI Device ID
1597cacbe   Alan Cox   PCI: Fix multiple...
574
575
576
577
578
579
580
581
582
583
   *
   * This macro is used to create a struct pci_device_id that matches a
   * specific PCI device.  The subvendor, and subdevice fields will be set
   * to PCI_ANY_ID. The macro allows the next field to follow as the device
   * private data.
   */
  
  #define PCI_VDEVICE(vendor, device)		\
  	PCI_VENDOR_ID_##vendor, (device),	\
  	PCI_ANY_ID, PCI_ANY_ID, 0, 0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
584
585
  /* these external functions are only available when PCI support is enabled */
  #ifdef CONFIG_PCI
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
586
587
588
  extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss);
  
  enum pcie_bus_config_types {
5f39e6705   Jon Mason   PCI: Disable MPS ...
589
  	PCIE_BUS_TUNE_OFF,
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
590
  	PCIE_BUS_SAFE,
5f39e6705   Jon Mason   PCI: Disable MPS ...
591
  	PCIE_BUS_PERFORMANCE,
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
592
593
594
595
  	PCIE_BUS_PEER2PEER,
  };
  
  extern enum pcie_bus_config_types pcie_bus_config;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
597
598
599
600
  extern struct bus_type pci_bus_type;
  
  /* Do NOT directly access these two variables, unless you are arch specific pci
   * code, or pci core code. */
  extern struct list_head pci_root_buses;	/* list of all known PCI buses */
ed4aaadb1   Zhang, Yanmin   fix jvc cdrom dri...
601
602
  /* Some device drivers need know if pci is initiated */
  extern int no_pci_devices(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603
604
  
  void pcibios_fixup_bus(struct pci_bus *);
4a7fb6363   Andrew Morton   add __must_check ...
605
  int __must_check pcibios_enable_device(struct pci_dev *, int mask);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
606
  char *pcibios_setup(char *str);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607
608
  
  /* Used only when drivers/pci/setup.c is used */
3b7a17fcd   Dominik Brodowski   resource/PCI: mar...
609
  resource_size_t pcibios_align_resource(void *, const struct resource *,
b26b2d494   Dominik Brodowski   resource/PCI: ali...
610
  				resource_size_t,
e31dd6e45   Greg Kroah-Hartman   [PATCH] 64bit res...
611
  				resource_size_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
612
  void pcibios_update_irq(struct pci_dev *, int irq);
2d1c86187   Benjamin Herrenschmidt   PCI/cardbus: Add ...
613
614
  /* Weak but can be overriden by arch */
  void pci_fixup_cardbus(struct pci_bus *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
615
  /* Generic PCI functions used internally */
d1fd4fb69   Mauro Carvalho Chehab   i7core_edac: Add ...
616
  void pcibios_scan_specific_bus(int busn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
617
  extern struct pci_bus *pci_find_bus(int domain, int busnr);
c48f1670f   akpm@linux-foundation.org   PCI: constify pci...
618
  void pci_bus_add_devices(const struct pci_bus *bus);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
619
620
  struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,
  				      struct pci_ops *ops, void *sysdata);
de4b2f76d   Bjorn Helgaas   PCI: convert pci_...
621
  struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata);
166c63707   Bjorn Helgaas   PCI: add pci_crea...
622
623
624
  struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
  				    struct pci_ops *ops, void *sysdata,
  				    struct list_head *resources);
a2ebb8279   Bjorn Helgaas   PCI: add pci_scan...
625
626
627
  struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus,
  					     struct pci_ops *ops, void *sysdata,
  					     struct list_head *resources);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
628
629
  struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
  				int busnr);
3749c51ac   Matthew Wilcox   PCI: Make current...
630
  void pcie_update_link_speed(struct pci_bus *bus, u16 link_status);
f46753c5e   Alex Chiang   PCI: introduce pc...
631
  struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,
828f37683   Alex Chiang   PCI: update pci_c...
632
633
  				 const char *name,
  				 struct hotplug_slot *hotplug);
f46753c5e   Alex Chiang   PCI: introduce pc...
634
  void pci_destroy_slot(struct pci_slot *slot);
d25b7c8d6   Alex Chiang   PCI: rename pci_u...
635
  void pci_renumber_slot(struct pci_slot *slot, int slot_nr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636
  int pci_scan_slot(struct pci_bus *bus, int devfn);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
637
  struct pci_dev *pci_scan_single_device(struct pci_bus *bus, int devfn);
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
638
  void pci_device_add(struct pci_dev *dev, struct pci_bus *bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
639
  unsigned int pci_scan_child_bus(struct pci_bus *bus);
b19441af1   Greg Kroah-Hartman   PCI: fix __must_c...
640
  int __must_check pci_bus_add_device(struct pci_dev *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
  void pci_read_bridge_bases(struct pci_bus *child);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
642
643
  struct resource *pci_find_parent_resource(const struct pci_dev *dev,
  					  struct resource *res);
57c2cf71c   Bjorn Helgaas   PCI: add pci_swiz...
644
  u8 pci_swizzle_interrupt_pin(struct pci_dev *dev, u8 pin);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
645
  int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge);
68feac87d   Bjorn Helgaas   PCI: add pci_comm...
646
  u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
648
649
650
  extern struct pci_dev *pci_dev_get(struct pci_dev *dev);
  extern void pci_dev_put(struct pci_dev *dev);
  extern void pci_remove_bus(struct pci_bus *b);
  extern void pci_remove_bus_device(struct pci_dev *dev);
24f8aa9b4   Satoru Takeuchi   PCI: add pci_stop...
651
  extern void pci_stop_bus_device(struct pci_dev *dev);
b3743fa44   Dominik Brodowski   [PATCH] yenta: sh...
652
  void pci_setup_cardbus(struct pci_bus *bus);
6b4b78fed   Matt Domsch   PCI: optionally s...
653
  extern void pci_sort_breadthfirst(void);
fb8a0d9d1   Williams, Mitch A   pci: Add SR-IOV c...
654
655
656
  #define dev_is_pci(d) ((d)->bus == &pci_bus_type)
  #define dev_is_pf(d) ((dev_is_pci(d) ? to_pci_dev(d)->is_physfn : false))
  #define dev_num_vf(d) ((dev_is_pci(d) ? pci_num_vf(to_pci_dev(d)) : 0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
657
658
  
  /* Generic PCI functions exported to card drivers */
388c8c16a   James Bottomley   PCI: add routines...
659
660
661
662
663
664
665
  enum pci_lost_interrupt_reason {
  	PCI_LOST_IRQ_NO_INFORMATION = 0,
  	PCI_LOST_IRQ_DISABLE_MSI,
  	PCI_LOST_IRQ_DISABLE_MSIX,
  	PCI_LOST_IRQ_DISABLE_ACPI,
  };
  enum pci_lost_interrupt_reason pci_lost_interrupt(struct pci_dev *dev);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
666
667
668
  int pci_find_capability(struct pci_dev *dev, int cap);
  int pci_find_next_capability(struct pci_dev *dev, u8 pos, int cap);
  int pci_find_ext_capability(struct pci_dev *dev, int cap);
cf4c43dd4   Jesse Barnes   PCI: Add pci_bus_...
669
670
  int pci_bus_find_ext_capability(struct pci_bus *bus, unsigned int devfn,
  				int cap);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
671
672
  int pci_find_ht_capability(struct pci_dev *dev, int ht_cap);
  int pci_find_next_ht_capability(struct pci_dev *dev, int pos, int ht_cap);
29f3eb646   Alan Cox   pci: Additional s...
673
  struct pci_bus *pci_find_next_bus(const struct pci_bus *from);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
674

d42552c3a   Andrew Morton   [PATCH] pci: decl...
675
676
  struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device,
  				struct pci_dev *from);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
677
  struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
678
  				unsigned int ss_vendor, unsigned int ss_device,
b08508c40   Greg Kroah-Hartman   PCI: fix compiler...
679
  				struct pci_dev *from);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
680
  struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);
3c299dc22   Andrew Patterson   PCI: add pci_get_...
681
682
683
684
685
686
687
  struct pci_dev *pci_get_domain_bus_and_slot(int domain, unsigned int bus,
  					    unsigned int devfn);
  static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
  						   unsigned int devfn)
  {
  	return pci_get_domain_bus_and_slot(0, bus, devfn);
  }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
688
  struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
  int pci_dev_present(const struct pci_device_id *ids);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
690
691
692
693
694
695
696
697
698
699
700
701
  int pci_bus_read_config_byte(struct pci_bus *bus, unsigned int devfn,
  			     int where, u8 *val);
  int pci_bus_read_config_word(struct pci_bus *bus, unsigned int devfn,
  			     int where, u16 *val);
  int pci_bus_read_config_dword(struct pci_bus *bus, unsigned int devfn,
  			      int where, u32 *val);
  int pci_bus_write_config_byte(struct pci_bus *bus, unsigned int devfn,
  			      int where, u8 val);
  int pci_bus_write_config_word(struct pci_bus *bus, unsigned int devfn,
  			      int where, u16 val);
  int pci_bus_write_config_dword(struct pci_bus *bus, unsigned int devfn,
  			       int where, u32 val);
a72b46c38   Huang Ying   PCI: Add pci_bus_...
702
  struct pci_ops *pci_bus_set_ops(struct pci_bus *bus, struct pci_ops *ops);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
703
704
705
  
  static inline int pci_read_config_byte(struct pci_dev *dev, int where, u8 *val)
  {
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
706
  	return pci_bus_read_config_byte(dev->bus, dev->devfn, where, val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
707
708
709
  }
  static inline int pci_read_config_word(struct pci_dev *dev, int where, u16 *val)
  {
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
710
  	return pci_bus_read_config_word(dev->bus, dev->devfn, where, val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711
  }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
712
713
  static inline int pci_read_config_dword(struct pci_dev *dev, int where,
  					u32 *val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
714
  {
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
715
  	return pci_bus_read_config_dword(dev->bus, dev->devfn, where, val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
716
717
718
  }
  static inline int pci_write_config_byte(struct pci_dev *dev, int where, u8 val)
  {
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
719
  	return pci_bus_write_config_byte(dev->bus, dev->devfn, where, val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
720
721
722
  }
  static inline int pci_write_config_word(struct pci_dev *dev, int where, u16 val)
  {
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
723
  	return pci_bus_write_config_word(dev->bus, dev->devfn, where, val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
724
  }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
725
726
  static inline int pci_write_config_dword(struct pci_dev *dev, int where,
  					 u32 val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
727
  {
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
728
  	return pci_bus_write_config_dword(dev->bus, dev->devfn, where, val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729
  }
4a7fb6363   Andrew Morton   add __must_check ...
730
  int __must_check pci_enable_device(struct pci_dev *dev);
b718989da   Benjamin Herrenschmidt   PCI: Add pci_enab...
731
732
  int __must_check pci_enable_device_io(struct pci_dev *dev);
  int __must_check pci_enable_device_mem(struct pci_dev *dev);
0b62e13b5   Tejun Heo   pci: rename __pci...
733
  int __must_check pci_reenable_device(struct pci_dev *);
9ac7849e3   Tejun Heo   devres: device re...
734
735
  int __must_check pcim_enable_device(struct pci_dev *pdev);
  void pcim_pin_device(struct pci_dev *pdev);
296ccb086   Yuji Shimada   PCI: Setup disabl...
736
737
738
739
  static inline int pci_is_enabled(struct pci_dev *pdev)
  {
  	return (atomic_read(&pdev->enable_cnt) > 0);
  }
9ac7849e3   Tejun Heo   devres: device re...
740
741
742
743
  static inline int pci_is_managed(struct pci_dev *pdev)
  {
  	return pdev->is_managed;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
744
  void pci_disable_device(struct pci_dev *dev);
96c559005   Myron Stowe   PCI: Pull PCI 'la...
745
746
  
  extern unsigned int pcibios_max_latency;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
747
  void pci_set_master(struct pci_dev *dev);
6a479079c   Ben Hutchings   PCI: Add pci_clea...
748
  void pci_clear_master(struct pci_dev *dev);
96c559005   Myron Stowe   PCI: Pull PCI 'la...
749

f7bdd12d2   Brian King   pci: New PCI-E re...
750
  int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state);
15ea76d40   Tejun Heo   pccard: configure...
751
  int pci_set_cacheline_size(struct pci_dev *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
752
  #define HAVE_PCI_SET_MWI
4a7fb6363   Andrew Morton   add __must_check ...
753
  int __must_check pci_set_mwi(struct pci_dev *dev);
694625c0b   Randy Dunlap   PCI: add pci_try_...
754
  int pci_try_set_mwi(struct pci_dev *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
755
  void pci_clear_mwi(struct pci_dev *dev);
a04ce0ffc   Brett M Russ   [PATCH] PCI/libat...
756
  void pci_intx(struct pci_dev *dev, int enable);
a2e27787f   Jan Kiszka   PCI: Introduce IN...
757
758
759
  bool pci_intx_mask_supported(struct pci_dev *dev);
  bool pci_check_and_mask_intx(struct pci_dev *dev);
  bool pci_check_and_unmask_intx(struct pci_dev *dev);
f5f2b1312   Eric W. Biederman   [PATCH] msi: sane...
760
  void pci_msi_off(struct pci_dev *dev);
4d57cdfac   FUJITA Tomonori   iommu sg merging:...
761
  int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size);
59fc67ded   FUJITA Tomonori   iommu sg merging:...
762
  int pci_set_dma_seg_boundary(struct pci_dev *dev, unsigned long mask);
d556ad4bb   Peter Oruba   PCI: add PCI-X/PC...
763
764
765
  int pcix_get_max_mmrbc(struct pci_dev *dev);
  int pcix_get_mmrbc(struct pci_dev *dev);
  int pcix_set_mmrbc(struct pci_dev *dev, int mmrbc);
2637e5b53   Brice Goglin   PCI: make pcie_ge...
766
  int pcie_get_readrq(struct pci_dev *dev);
d556ad4bb   Peter Oruba   PCI: add PCI-X/PC...
767
  int pcie_set_readrq(struct pci_dev *dev, int rq);
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
768
769
  int pcie_get_mps(struct pci_dev *dev);
  int pcie_set_mps(struct pci_dev *dev, int mps);
8c1c699fe   Yu Zhao   PCI: cleanup Func...
770
  int __pci_reset_function(struct pci_dev *dev);
8dd7f8036   Sheng Yang   PCI: add support ...
771
  int pci_reset_function(struct pci_dev *dev);
14add80b5   Yu Zhao   PCI: remove unnec...
772
  void pci_update_resource(struct pci_dev *dev, int resno);
4a7fb6363   Andrew Morton   add __must_check ...
773
  int __must_check pci_assign_resource(struct pci_dev *dev, int i);
2bbc69422   Ram Pai   PCI : ability to ...
774
  int __must_check pci_reassign_resource(struct pci_dev *dev, int i, resource_size_t add_size, resource_size_t align);
c87deff77   Hidetoshi Seto   PCI : Add selecte...
775
  int pci_select_bars(struct pci_dev *dev, unsigned long flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
776
777
  
  /* ROM control related routines */
e416de5e6   Alan Cox   Export the ROM en...
778
779
  int pci_enable_rom(struct pci_dev *pdev);
  void pci_disable_rom(struct pci_dev *pdev);
144a50ea5   Dave Jones   [PATCH] must_chec...
780
  void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
781
  void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);
97c44836c   Timothy S. Nelson   PCI: return error...
782
  size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
783
784
785
  
  /* Power management related routines */
  int pci_save_state(struct pci_dev *dev);
1d3c16a81   Jon Mason   PCI: make pci_res...
786
  void pci_restore_state(struct pci_dev *dev);
ffbdd3f79   Alex Williamson   PCI: Add interfac...
787
788
789
790
  struct pci_saved_state *pci_store_saved_state(struct pci_dev *dev);
  int pci_load_saved_state(struct pci_dev *dev, struct pci_saved_state *state);
  int pci_load_and_free_saved_state(struct pci_dev *dev,
  				  struct pci_saved_state **state);
0e5dd46b7   Rafael J. Wysocki   PCI PM: Introduce...
791
  int __pci_complete_power_transition(struct pci_dev *dev, pci_power_t state);
9c8550ee2   Linus Torvalds   Remove "must_chec...
792
793
  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);
e5899e1b7   Rafael J. Wysocki   PCI PM: make more...
794
  bool pci_pme_capable(struct pci_dev *dev, pci_power_t state);
5a6c9b60b   Rafael J. Wysocki   PCI PM: Export pc...
795
  void pci_pme_active(struct pci_dev *dev, bool enable);
6cbf82148   Rafael J. Wysocki   PCI PM: Run-time ...
796
797
  int __pci_enable_wake(struct pci_dev *dev, pci_power_t state,
  		      bool runtime, bool enable);
0235c4fc7   Rafael J. Wysocki   PCI PM: Introduce...
798
  int pci_wake_from_d3(struct pci_dev *dev, bool enable);
e5899e1b7   Rafael J. Wysocki   PCI PM: make more...
799
  pci_power_t pci_target_state(struct pci_dev *dev);
404cc2d8c   Rafael J. Wysocki   PCI PM: Introduce...
800
801
  int pci_prepare_to_sleep(struct pci_dev *dev);
  int pci_back_from_sleep(struct pci_dev *dev);
b67ea7617   Rafael J. Wysocki   PCI / ACPI / PM: ...
802
  bool pci_dev_run_wake(struct pci_dev *dev);
bf4d29086   Matthew Garrett   PCI: Export some ...
803
  bool pci_check_pme_status(struct pci_dev *dev);
bf4d29086   Matthew Garrett   PCI: Export some ...
804
  void pci_pme_wakeup_bus(struct pci_bus *bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
805

6cbf82148   Rafael J. Wysocki   PCI PM: Run-time ...
806
807
808
809
810
  static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state,
  				  bool enable)
  {
  	return __pci_enable_wake(dev, state, false, enable);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811

b48d4425b   Jesse Barnes   PCI: add ID-based...
812
813
814
815
  #define PCI_EXP_IDO_REQUEST	(1<<0)
  #define PCI_EXP_IDO_COMPLETION	(1<<1)
  void pci_enable_ido(struct pci_dev *dev, unsigned long type);
  void pci_disable_ido(struct pci_dev *dev, unsigned long type);
48a92a817   Jesse Barnes   PCI: add OBFF ena...
816
  enum pci_obff_signal_type {
688398bb7   Myron Stowe   PCI: Assign value...
817
818
  	PCI_EXP_OBFF_SIGNAL_L0 = 0,
  	PCI_EXP_OBFF_SIGNAL_ALWAYS = 1,
48a92a817   Jesse Barnes   PCI: add OBFF ena...
819
820
821
  };
  int pci_enable_obff(struct pci_dev *dev, enum pci_obff_signal_type);
  void pci_disable_obff(struct pci_dev *dev);
51c2e0a7e   Jesse Barnes   PCI: add latency ...
822
823
824
825
  bool pci_ltr_supported(struct pci_dev *dev);
  int pci_enable_ltr(struct pci_dev *dev);
  void pci_disable_ltr(struct pci_dev *dev);
  int pci_set_ltr(struct pci_dev *dev, int snoop_lat_ns, int nosnoop_lat_ns);
bb209c828   Benjamin Herrenschmidt   powerpc/pci: Add ...
826
827
828
  /* 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);
ce5ccdef1   Kumar Gala   PCI: Move prototy...
829
  /* Functions for PCI Hotplug drivers to use */
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
830
  int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap);
3ed4fd96b   Alex Chiang   PCI: Introduce pc...
831
832
833
  #ifdef CONFIG_HOTPLUG
  unsigned int pci_rescan_bus(struct pci_bus *bus);
  #endif
ce5ccdef1   Kumar Gala   PCI: Move prototy...
834

287d19ce2   Stephen Hemminger   PCI: revise VPD a...
835
836
837
  /* Vital product data routines */
  ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf);
  ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf);
db5679437   Stephen Hemminger   PCI: add interfac...
838
  int pci_vpd_truncate(struct pci_dev *dev, size_t size);
287d19ce2   Stephen Hemminger   PCI: revise VPD a...
839

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
840
  /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */
ea7415512   Andrew Morton   PCI: constify pci...
841
  void pci_bus_assign_resources(const struct pci_bus *bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
842
843
844
  void pci_bus_size_bridges(struct pci_bus *bus);
  int pci_claim_resource(struct pci_dev *, int);
  void pci_assign_unassigned_resources(void);
6841ec681   Yinghai Lu   PCI: introduce pc...
845
  void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
846
847
  void pdev_enable_device(struct pci_dev *);
  void pdev_sort_resources(struct pci_dev *, struct resource_list *);
842de40d9   Bjorn Helgaas   PCI: add generic ...
848
  int pci_enable_resources(struct pci_dev *, int mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
849
  void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *),
d5341942d   Ralf Baechle   PCI: Make the str...
850
  		    int (*)(const struct pci_dev *, u8, u8));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
851
  #define HAVE_PCI_REQ_REGIONS	2
4a7fb6363   Andrew Morton   add __must_check ...
852
  int __must_check pci_request_regions(struct pci_dev *, const char *);
e8de1481f   Arjan van de Ven   resource: allow M...
853
  int __must_check pci_request_regions_exclusive(struct pci_dev *, const char *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
854
  void pci_release_regions(struct pci_dev *);
4a7fb6363   Andrew Morton   add __must_check ...
855
  int __must_check pci_request_region(struct pci_dev *, int, const char *);
e8de1481f   Arjan van de Ven   resource: allow M...
856
  int __must_check pci_request_region_exclusive(struct pci_dev *, int, const char *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
857
  void pci_release_region(struct pci_dev *, int);
c87deff77   Hidetoshi Seto   PCI : Add selecte...
858
  int pci_request_selected_regions(struct pci_dev *, int, const char *);
e8de1481f   Arjan van de Ven   resource: allow M...
859
  int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *);
c87deff77   Hidetoshi Seto   PCI : Add selecte...
860
  void pci_release_selected_regions(struct pci_dev *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
861
862
  
  /* drivers/pci/bus.c */
45ca9e973   Bjorn Helgaas   PCI: add helpers ...
863
864
  void pci_add_resource(struct list_head *resources, struct resource *res);
  void pci_free_resource_list(struct list_head *resources);
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
865
866
867
  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);
89a74eccc   Bjorn Helgaas   PCI: add pci_bus_...
868
  #define pci_bus_for_each_resource(bus, res, i)				\
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
869
870
871
  	for (i = 0;							\
  	    (res = pci_bus_resource_n(bus, i)) || i < PCI_BRIDGE_RESOURCE_NUM; \
  	     i++)
89a74eccc   Bjorn Helgaas   PCI: add pci_bus_...
872

4a7fb6363   Andrew Morton   add __must_check ...
873
874
875
876
  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,
3b7a17fcd   Dominik Brodowski   resource/PCI: mar...
877
878
  			resource_size_t (*alignf)(void *,
  						  const struct resource *,
b26b2d494   Dominik Brodowski   resource/PCI: ali...
879
880
  						  resource_size_t,
  						  resource_size_t),
4a7fb6363   Andrew Morton   add __must_check ...
881
  			void *alignf_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882
  void pci_enable_bridges(struct pci_bus *bus);
863b18f4b   Laurent riffard   [PATCH] PCI: auto...
883
  /* Proper probing supporting hot-pluggable devices */
725522b54   Greg Kroah-Hartman   PCI: add the sysf...
884
885
  int __must_check __pci_register_driver(struct pci_driver *, struct module *,
  				       const char *mod_name);
bba811658   Andrew Morton   PCI: make pci_reg...
886
887
888
889
890
891
  
  /*
   * pci_register_driver must be a macro so that KBUILD_MODNAME can be expanded
   */
  #define pci_register_driver(driver)		\
  	__pci_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
863b18f4b   Laurent riffard   [PATCH] PCI: auto...
892

05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
893
894
895
  void pci_unregister_driver(struct pci_driver *dev);
  void pci_remove_behind_bridge(struct pci_dev *dev);
  struct pci_driver *pci_dev_driver(const struct pci_dev *dev);
9dba910e9   Tejun Heo   PCI: separate out...
896
897
898
899
900
  int pci_add_dynid(struct pci_driver *drv,
  		  unsigned int vendor, unsigned int device,
  		  unsigned int subvendor, unsigned int subdevice,
  		  unsigned int class, unsigned int class_mask,
  		  unsigned long driver_data);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
901
902
903
904
  const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
  					 struct pci_dev *dev);
  int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,
  		    int pass);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
905

70298c6e6   Zhang, Yanmin   PCI AER: support ...
906
  void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
cecf4864c   Paul Mackerras   [PATCH] PCI: Add ...
907
  		  void *userdata);
70b9f7dc1   Yinghai Lu   x86/pci: remove f...
908
  int pci_cfg_space_size_ext(struct pci_dev *dev);
ac7dc65ac   Benjamin Herrenschmidt   [PATCH] PCI: Expo...
909
  int pci_cfg_space_size(struct pci_dev *dev);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
910
  unsigned char pci_bus_max_busnr(struct pci_bus *bus);
e24442733   Benjamin Herrenschmidt   PCI: Make pci_set...
911
  void pci_setup_bridge(struct pci_bus *bus);
cecf4864c   Paul Mackerras   [PATCH] PCI: Add ...
912

3448a19da   Dave Airlie   vgaarb: use bridg...
913
914
  #define PCI_VGA_STATE_CHANGE_BRIDGE (1 << 0)
  #define PCI_VGA_STATE_CHANGE_DECODES (1 << 1)
deb2d2ecd   Benjamin Herrenschmidt   PCI/GPU: implemen...
915
  int pci_set_vga_state(struct pci_dev *pdev, bool decode,
3448a19da   Dave Airlie   vgaarb: use bridg...
916
  		      unsigned int command_bits, u32 flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
917
  /* kmem_cache style wrapper around pci_alloc_consistent() */
f41b17715   FUJITA Tomonori   pci-dma: add linu...
918
  #include <linux/pci-dma.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919
920
921
922
923
924
925
926
  #include <linux/dmapool.h>
  
  #define	pci_pool dma_pool
  #define pci_pool_create(name, pdev, size, align, allocation) \
  		dma_pool_create(name, &pdev->dev, size, align, allocation)
  #define	pci_pool_destroy(pool) dma_pool_destroy(pool)
  #define	pci_pool_alloc(pool, flags, handle) dma_pool_alloc(pool, flags, handle)
  #define	pci_pool_free(pool, vaddr, addr) dma_pool_free(pool, vaddr, addr)
e24c2d963   David S. Miller   [PATCH] PCI: DMA ...
927
928
929
930
931
932
933
934
  enum pci_dma_burst_strategy {
  	PCI_DMA_BURST_INFINITY,	/* make bursts as large as possible,
  				   strategy_parameter is N/A */
  	PCI_DMA_BURST_BOUNDARY, /* disconnect at every strategy_parameter
  				   byte boundaries */
  	PCI_DMA_BURST_MULTIPLE, /* disconnect at some multiple of
  				   strategy_parameter byte boundaries */
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
935
  struct msix_entry {
16dbef4a8   Yinghai Lu   PCI: change MSI-x...
936
  	u32	vector;	/* kernel uses to write allocated vector */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
937
938
  	u16	entry;	/* driver uses to specify entry, OS writes */
  };
0366f8f71   Eric W. Biederman   [PATCH] genirq: m...
939

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940
  #ifndef CONFIG_PCI_MSI
1c8d7b0a5   Matthew Wilcox   PCI MSI: Add supp...
941
  static inline int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec)
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
942
943
944
  {
  	return -1;
  }
d52877c7b   Yinghai Lu   pci/irq: let pci_...
945
946
  static inline void pci_msi_shutdown(struct pci_dev *dev)
  { }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
947
948
  static inline void pci_disable_msi(struct pci_dev *dev)
  { }
a52e2e351   Rafael J. Wysocki   PCI/MSI: Introduc...
949
950
951
952
  static inline int pci_msix_table_size(struct pci_dev *dev)
  {
  	return 0;
  }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
953
954
955
956
957
  static inline int pci_enable_msix(struct pci_dev *dev,
  				  struct msix_entry *entries, int nvec)
  {
  	return -1;
  }
d52877c7b   Yinghai Lu   pci/irq: let pci_...
958
959
  static inline void pci_msix_shutdown(struct pci_dev *dev)
  { }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
960
961
962
963
964
965
966
967
  static inline void pci_disable_msix(struct pci_dev *dev)
  { }
  
  static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev)
  { }
  
  static inline void pci_restore_msi_state(struct pci_dev *dev)
  { }
07ae95f98   Andrew Patterson   ACPI/PCI: PCI MSI...
968
969
970
971
  static inline int pci_msi_enabled(void)
  {
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
972
  #else
1c8d7b0a5   Matthew Wilcox   PCI MSI: Add supp...
973
  extern int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec);
d52877c7b   Yinghai Lu   pci/irq: let pci_...
974
  extern void pci_msi_shutdown(struct pci_dev *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
975
  extern void pci_disable_msi(struct pci_dev *dev);
a52e2e351   Rafael J. Wysocki   PCI/MSI: Introduc...
976
  extern int pci_msix_table_size(struct pci_dev *dev);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
977
  extern int pci_enable_msix(struct pci_dev *dev,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
978
  	struct msix_entry *entries, int nvec);
d52877c7b   Yinghai Lu   pci/irq: let pci_...
979
  extern void pci_msix_shutdown(struct pci_dev *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
980
981
  extern void pci_disable_msix(struct pci_dev *dev);
  extern void msi_remove_pci_irq_vectors(struct pci_dev *dev);
94688cf24   Linas Vepstas   PCI: export pci_r...
982
  extern void pci_restore_msi_state(struct pci_dev *dev);
07ae95f98   Andrew Patterson   ACPI/PCI: PCI MSI...
983
  extern int pci_msi_enabled(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984
  #endif
ab0724ffe   Markus Trippelsdorf   PCI / ACPI: Fix b...
985
  #ifdef CONFIG_PCIEPORTBUS
415e12b23   Rafael J. Wysocki   PCI/ACPI: Request...
986
987
  extern bool pcie_ports_disabled;
  extern bool pcie_ports_auto;
ab0724ffe   Markus Trippelsdorf   PCI / ACPI: Fix b...
988
989
990
991
  #else
  #define pcie_ports_disabled	true
  #define pcie_ports_auto		false
  #endif
415e12b23   Rafael J. Wysocki   PCI/ACPI: Request...
992

3e1b16002   Andrew Patterson   ACPI/PCI: PCIe AS...
993
  #ifndef CONFIG_PCIEASPM
8b8bae901   Rafael J. Wysocki   PCI/ACPI: Report ...
994
995
  static inline int pcie_aspm_enabled(void) { return 0; }
  static inline bool pcie_aspm_support_enabled(void) { return false; }
3e1b16002   Andrew Patterson   ACPI/PCI: PCIe AS...
996
997
  #else
  extern int pcie_aspm_enabled(void);
8b8bae901   Rafael J. Wysocki   PCI/ACPI: Report ...
998
  extern bool pcie_aspm_support_enabled(void);
3e1b16002   Andrew Patterson   ACPI/PCI: PCIe AS...
999
  #endif
415e12b23   Rafael J. Wysocki   PCI/ACPI: Request...
1000
1001
1002
1003
1004
1005
1006
  #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
43c164088   Andrew Patterson   PCI: Add support ...
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
  #ifndef CONFIG_PCIE_ECRC
  static inline void pcie_set_ecrc_checking(struct pci_dev *dev)
  {
  	return;
  }
  static inline void pcie_ecrc_get_policy(char *str) {};
  #else
  extern void pcie_set_ecrc_checking(struct pci_dev *dev);
  extern void pcie_ecrc_get_policy(char *str);
  #endif
1c8d7b0a5   Matthew Wilcox   PCI MSI: Add supp...
1017
  #define pci_enable_msi(pdev)	pci_enable_msi_block(pdev, 1)
8b955b0dd   Eric W. Biederman   [PATCH] Initial g...
1018
  #ifdef CONFIG_HT_IRQ
8b955b0dd   Eric W. Biederman   [PATCH] Initial g...
1019
1020
1021
  /* The functions a driver should call */
  int  ht_create_irq(struct pci_dev *dev, int idx);
  void ht_destroy_irq(unsigned int irq);
8b955b0dd   Eric W. Biederman   [PATCH] Initial g...
1022
  #endif /* CONFIG_HT_IRQ */
fb51ccbf2   Jan Kiszka   PCI: Rework confi...
1023
1024
1025
  extern void pci_cfg_access_lock(struct pci_dev *dev);
  extern bool pci_cfg_access_trylock(struct pci_dev *dev);
  extern void pci_cfg_access_unlock(struct pci_dev *dev);
e04b0ea2e   Brian King   [PATCH] PCI: Bloc...
1026

4352dfd5c   Greg Kroah-Hartman   [PATCH] PCI: clea...
1027
1028
1029
1030
1031
  /*
   * PCI domain support.  Sometimes called PCI segment (eg by ACPI),
   * a PCI domain is defined to be a set of PCI busses which share
   * configuration space.
   */
32a2eea79   Jeff Garzik   PCI: Add 'nodomai...
1032
1033
1034
1035
  #ifdef CONFIG_PCI_DOMAINS
  extern int pci_domains_supported;
  #else
  enum { pci_domains_supported = 0 };
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1036
1037
1038
1039
  static inline int pci_domain_nr(struct pci_bus *bus)
  {
  	return 0;
  }
4352dfd5c   Greg Kroah-Hartman   [PATCH] PCI: clea...
1040
1041
1042
1043
  static inline int pci_proc_domain(struct pci_bus *bus)
  {
  	return 0;
  }
32a2eea79   Jeff Garzik   PCI: Add 'nodomai...
1044
  #endif /* CONFIG_PCI_DOMAINS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1045

95a8b6efc   Mike Travis   pci: Update pci_s...
1046
1047
  /* some architectures require additional setup to direct VGA traffic */
  typedef int (*arch_set_vga_state_t)(struct pci_dev *pdev, bool decode,
3448a19da   Dave Airlie   vgaarb: use bridg...
1048
  		      unsigned int command_bits, u32 flags);
95a8b6efc   Mike Travis   pci: Update pci_s...
1049
  extern void pci_register_set_vga_state(arch_set_vga_state_t func);
4352dfd5c   Greg Kroah-Hartman   [PATCH] PCI: clea...
1050
  #else /* CONFIG_PCI is not enabled */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1051
1052
1053
1054
1055
  
  /*
   *  If the system does not have PCI, clearly these return errors.  Define
   *  these as simple inline functions to avoid hair in drivers.
   */
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1056
1057
1058
  #define _PCI_NOP(o, s, t) \
  	static inline int pci_##o##_config_##s(struct pci_dev *dev, \
  						int where, t val) \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1059
  		{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1060
1061
1062
1063
  
  #define _PCI_NOP_ALL(o, x)	_PCI_NOP(o, byte, u8 x) \
  				_PCI_NOP(o, word, u16 x) \
  				_PCI_NOP(o, dword, u32 x)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1064
1065
  _PCI_NOP_ALL(read, *)
  _PCI_NOP_ALL(write,)
d42552c3a   Andrew Morton   [PATCH] pci: decl...
1066
  static inline struct pci_dev *pci_get_device(unsigned int vendor,
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1067
1068
1069
1070
1071
  					     unsigned int device,
  					     struct pci_dev *from)
  {
  	return NULL;
  }
d42552c3a   Andrew Morton   [PATCH] pci: decl...
1072

05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1073
1074
1075
1076
  static inline struct pci_dev *pci_get_subsys(unsigned int vendor,
  					     unsigned int device,
  					     unsigned int ss_vendor,
  					     unsigned int ss_device,
b08508c40   Greg Kroah-Hartman   PCI: fix compiler...
1077
  					     struct pci_dev *from)
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1078
1079
1080
  {
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1081

05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1082
1083
1084
1085
1086
  static inline struct pci_dev *pci_get_class(unsigned int class,
  					    struct pci_dev *from)
  {
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1087
1088
  
  #define pci_dev_present(ids)	(0)
ed4aaadb1   Zhang, Yanmin   fix jvc cdrom dri...
1089
  #define no_pci_devices()	(1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1090
  #define pci_dev_put(dev)	do { } while (0)
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
  static inline void pci_set_master(struct pci_dev *dev)
  { }
  
  static inline int pci_enable_device(struct pci_dev *dev)
  {
  	return -EIO;
  }
  
  static inline void pci_disable_device(struct pci_dev *dev)
  { }
  
  static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
  {
  	return -EIO;
  }
80be03859   Randy Dunlap   PCI: add stub for...
1106
1107
1108
1109
  static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
  {
  	return -EIO;
  }
4d57cdfac   FUJITA Tomonori   iommu sg merging:...
1110
1111
1112
1113
1114
  static inline int pci_set_dma_max_seg_size(struct pci_dev *dev,
  					unsigned int size)
  {
  	return -EIO;
  }
59fc67ded   FUJITA Tomonori   iommu sg merging:...
1115
1116
1117
1118
1119
  static inline int pci_set_dma_seg_boundary(struct pci_dev *dev,
  					unsigned long mask)
  {
  	return -EIO;
  }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
  static inline int pci_assign_resource(struct pci_dev *dev, int i)
  {
  	return -EBUSY;
  }
  
  static inline int __pci_register_driver(struct pci_driver *drv,
  					struct module *owner)
  {
  	return 0;
  }
  
  static inline int pci_register_driver(struct pci_driver *drv)
  {
  	return 0;
  }
  
  static inline void pci_unregister_driver(struct pci_driver *drv)
  { }
  
  static inline int pci_find_capability(struct pci_dev *dev, int cap)
  {
  	return 0;
  }
  
  static inline int pci_find_next_capability(struct pci_dev *dev, u8 post,
  					   int cap)
  {
  	return 0;
  }
  
  static inline int pci_find_ext_capability(struct pci_dev *dev, int cap)
  {
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1154
  /* Power management related routines */
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1155
1156
1157
1158
  static inline int pci_save_state(struct pci_dev *dev)
  {
  	return 0;
  }
1d3c16a81   Jon Mason   PCI: make pci_res...
1159
1160
  static inline void pci_restore_state(struct pci_dev *dev)
  { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1161

05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1162
1163
1164
1165
  static inline int pci_set_power_state(struct pci_dev *dev, pci_power_t state)
  {
  	return 0;
  }
3449248c8   Randy Dunlap   PCI: fix tlan bui...
1166
1167
1168
1169
  static inline int pci_wake_from_d3(struct pci_dev *dev, bool enable)
  {
  	return 0;
  }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
  static inline pci_power_t pci_choose_state(struct pci_dev *dev,
  					   pm_message_t state)
  {
  	return PCI_D0;
  }
  
  static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state,
  				  int enable)
  {
  	return 0;
  }
b48d4425b   Jesse Barnes   PCI: add ID-based...
1181
1182
1183
1184
1185
1186
1187
  static inline void pci_enable_ido(struct pci_dev *dev, unsigned long type)
  {
  }
  
  static inline void pci_disable_ido(struct pci_dev *dev, unsigned long type)
  {
  }
48a92a817   Jesse Barnes   PCI: add OBFF ena...
1188
1189
1190
1191
1192
1193
1194
1195
  static inline int pci_enable_obff(struct pci_dev *dev, unsigned long type)
  {
  	return 0;
  }
  
  static inline void pci_disable_obff(struct pci_dev *dev)
  {
  }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1196
1197
1198
1199
1200
1201
1202
  static inline int pci_request_regions(struct pci_dev *dev, const char *res_name)
  {
  	return -EIO;
  }
  
  static inline void pci_release_regions(struct pci_dev *dev)
  { }
0da0ead90   Sergei Shtylyov   PCI: define pci_r...
1203

a46e81262   Kumar Gala   [PATCH] PCI: fix ...
1204
  #define pci_dma_burst_advice(pdev, strat, strategy_parameter) do { } while (0)
fb51ccbf2   Jan Kiszka   PCI: Rework confi...
1205
  static inline void pci_block_cfg_access(struct pci_dev *dev)
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1206
  { }
fb51ccbf2   Jan Kiszka   PCI: Rework confi...
1207
1208
1209
1210
  static inline int pci_block_cfg_access_in_atomic(struct pci_dev *dev)
  { return 0; }
  
  static inline void pci_unblock_cfg_access(struct pci_dev *dev)
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1211
  { }
e04b0ea2e   Brian King   [PATCH] PCI: Bloc...
1212

d80d02173   Randy Dunlap   pci.h stubs (for ...
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
  static inline struct pci_bus *pci_find_next_bus(const struct pci_bus *from)
  { return NULL; }
  
  static inline struct pci_dev *pci_get_slot(struct pci_bus *bus,
  						unsigned int devfn)
  { return NULL; }
  
  static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
  						unsigned int devfn)
  { return NULL; }
92298e668   Dave Airlie   PCI: provide stub...
1223
1224
  static inline int pci_domain_nr(struct pci_bus *bus)
  { return 0; }
fb8a0d9d1   Williams, Mitch A   pci: Add SR-IOV c...
1225
1226
1227
  #define dev_is_pci(d) (false)
  #define dev_is_pf(d) (false)
  #define dev_num_vf(d) (0)
4352dfd5c   Greg Kroah-Hartman   [PATCH] PCI: clea...
1228
  #endif /* CONFIG_PCI */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1229

4352dfd5c   Greg Kroah-Hartman   [PATCH] PCI: clea...
1230
1231
1232
  /* Include architecture-dependent settings and functions */
  
  #include <asm/pci.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1233

1f82de10d   Yinghai Lu   PCI/x86: don't as...
1234
1235
1236
  #ifndef PCIBIOS_MAX_MEM_32
  #define PCIBIOS_MAX_MEM_32 (-1)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1237
1238
  /* these helpers provide future and backwards compatibility
   * for accessing popular PCI BAR info */
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1239
1240
1241
  #define pci_resource_start(dev, bar)	((dev)->resource[(bar)].start)
  #define pci_resource_end(dev, bar)	((dev)->resource[(bar)].end)
  #define pci_resource_flags(dev, bar)	((dev)->resource[(bar)].flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1242
  #define pci_resource_len(dev,bar) \
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1243
1244
1245
1246
1247
1248
  	((pci_resource_start((dev), (bar)) == 0 &&	\
  	  pci_resource_end((dev), (bar)) ==		\
  	  pci_resource_start((dev), (bar))) ? 0 :	\
  							\
  	 (pci_resource_end((dev), (bar)) -		\
  	  pci_resource_start((dev), (bar)) + 1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1249
1250
1251
1252
1253
  
  /* Similar to the helpers above, these manipulate per-pci_dev
   * driver-specific data.  They are really just a wrapper around
   * the generic device structure functions of these calls.
   */
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1254
  static inline void *pci_get_drvdata(struct pci_dev *pdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1255
1256
1257
  {
  	return dev_get_drvdata(&pdev->dev);
  }
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1258
  static inline void pci_set_drvdata(struct pci_dev *pdev, void *data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1259
1260
1261
1262
1263
1264
1265
  {
  	dev_set_drvdata(&pdev->dev, data);
  }
  
  /* If you want to know what to call your pci_dev, ask this function.
   * Again, it's a wrapper around the generic device.
   */
2fc90f613   Alexey Zaytsev   PCI: make pci_nam...
1266
  static inline const char *pci_name(const struct pci_dev *pdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1267
  {
c6c4f070a   Greg Kroah-Hartman   PCI: make pci_nam...
1268
  	return dev_name(&pdev->dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1269
  }
2311b1f2b   Michael Ellerman   [PATCH] PCI: fix-...
1270
1271
1272
1273
1274
1275
  
  /* Some archs don't want to expose struct resource to userland as-is
   * in sysfs and /proc
   */
  #ifndef HAVE_ARCH_PCI_RESOURCE_TO_USER
  static inline void pci_resource_to_user(const struct pci_dev *dev, int bar,
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1276
  		const struct resource *rsrc, resource_size_t *start,
e31dd6e45   Greg Kroah-Hartman   [PATCH] 64bit res...
1277
  		resource_size_t *end)
2311b1f2b   Michael Ellerman   [PATCH] PCI: fix-...
1278
1279
1280
1281
1282
  {
  	*start = rsrc->start;
  	*end = rsrc->end;
  }
  #endif /* HAVE_ARCH_PCI_RESOURCE_TO_USER */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
  /*
   *  The world is not perfect and supplies us with broken PCI devices.
   *  For at least a part of these bugs we need a work-around, so both
   *  generic (drivers/pci/quirks.c) and per-architecture code can define
   *  fixup hooks to be called for particular buggy devices.
   */
  
  struct pci_fixup {
  	u16 vendor, device;	/* You can use PCI_ANY_ID here of course */
  	void (*hook)(struct pci_dev *dev);
  };
  
  enum pci_fixup_pass {
  	pci_fixup_early,	/* Before probing BARs */
  	pci_fixup_header,	/* After reading configuration header */
  	pci_fixup_final,	/* Final phase of device fixups */
  	pci_fixup_enable,	/* pci_enable_device() time */
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1300
1301
1302
  	pci_fixup_resume,	/* pci_device_resume() */
  	pci_fixup_suspend,	/* pci_device_suspend */
  	pci_fixup_resume_early, /* pci_device_resume_early() */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1303
1304
1305
1306
  };
  
  /* Anonymous variables would be nice... */
  #define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, hook)	\
3ff6eecca   Adrian Bunk   remove __attribut...
1307
  	static const struct pci_fixup __pci_fixup_##name __used		\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
  	__attribute__((__section__(#section))) = { vendor, device, hook };
  #define DECLARE_PCI_FIXUP_EARLY(vendor, device, hook)			\
  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early,			\
  			vendor##device##hook, vendor, device, hook)
  #define DECLARE_PCI_FIXUP_HEADER(vendor, device, hook)			\
  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_header,			\
  			vendor##device##hook, vendor, device, hook)
  #define DECLARE_PCI_FIXUP_FINAL(vendor, device, hook)			\
  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_final,			\
  			vendor##device##hook, vendor, device, hook)
  #define DECLARE_PCI_FIXUP_ENABLE(vendor, device, hook)			\
  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_enable,			\
  			vendor##device##hook, vendor, device, hook)
1597cacbe   Alan Cox   PCI: Fix multiple...
1321
1322
1323
  #define DECLARE_PCI_FIXUP_RESUME(vendor, device, hook)			\
  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume,			\
  			resume##vendor##device##hook, vendor, device, hook)
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1324
1325
1326
1327
1328
1329
  #define DECLARE_PCI_FIXUP_RESUME_EARLY(vendor, device, hook)		\
  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume_early,		\
  			resume_early##vendor##device##hook, vendor, device, hook)
  #define DECLARE_PCI_FIXUP_SUSPEND(vendor, device, hook)			\
  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_suspend,			\
  			suspend##vendor##device##hook, vendor, device, hook)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1330

93177a748   Rafael J. Wysocki   PCI: Clean up bui...
1331
  #ifdef CONFIG_PCI_QUIRKS
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1332
  void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev);
93177a748   Rafael J. Wysocki   PCI: Clean up bui...
1333
1334
1335
1336
  #else
  static inline void pci_fixup_device(enum pci_fixup_pass pass,
  				    struct pci_dev *dev) {}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1337

05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1338
  void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);
5ea817699   Al Viro   [PATCH] sort the ...
1339
  void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr);
05cca6e52   Greg Kroah-Hartman   PCI: fix codingst...
1340
  void __iomem * const *pcim_iomap_table(struct pci_dev *pdev);
fb7ebfe41   Yinghai Lu   PCI: Increase res...
1341
1342
  int pcim_iomap_regions(struct pci_dev *pdev, int mask, const char *name);
  int pcim_iomap_regions_request_all(struct pci_dev *pdev, int mask,
916fbfb7a   Tejun Heo   devres: implement...
1343
  				   const char *name);
fb7ebfe41   Yinghai Lu   PCI: Increase res...
1344
  void pcim_iounmap_regions(struct pci_dev *pdev, int mask);
5ea817699   Al Viro   [PATCH] sort the ...
1345

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1346
  extern int pci_pci_problems;
236561e5d   Alan Cox   [PATCH] PCI quirk...
1347
  #define PCIPCI_FAIL		1	/* No PCI PCI DMA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1348
1349
1350
1351
  #define PCIPCI_TRITON		2
  #define PCIPCI_NATOMA		4
  #define PCIPCI_VIAETBF		8
  #define PCIPCI_VSFX		16
236561e5d   Alan Cox   [PATCH] PCI quirk...
1352
1353
  #define PCIPCI_ALIMAGIK		32	/* Need low latency setting */
  #define PCIAGP_FAIL		64	/* No PCI to AGP DMA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1354

4516a618a   Atsushi Nemoto   PCI: Make CARDBUS...
1355
1356
  extern unsigned long pci_cardbus_io_size;
  extern unsigned long pci_cardbus_mem_size;
491424c0f   David Howells   PCI: Global varia...
1357
  extern u8 __devinitdata pci_dfl_cache_line_size;
ac1aa47b1   Jesse Barnes   PCI: determine CL...
1358
  extern u8 pci_cache_line_size;
4516a618a   Atsushi Nemoto   PCI: Make CARDBUS...
1359

28760489a   Eric W. Biederman   PCI: pcie: Ensure...
1360
1361
  extern unsigned long pci_hotplug_io_size;
  extern unsigned long pci_hotplug_mem_size;
cfce9fb80   Myron Stowe   PCI: add declarat...
1362
  /* Architecture specific versions may override these (weak) */
19792a085   Adrian Bunk   PCI: drivers/pci/...
1363
1364
  int pcibios_add_platform_entries(struct pci_dev *dev);
  void pcibios_disable_device(struct pci_dev *dev);
cfce9fb80   Myron Stowe   PCI: add declarat...
1365
  void pcibios_set_master(struct pci_dev *dev);
19792a085   Adrian Bunk   PCI: drivers/pci/...
1366
1367
  int pcibios_set_pcie_reset_state(struct pci_dev *dev,
  				 enum pcie_reset_state state);
575e3348c   Michael Ellerman   PCI: Use a weak s...
1368

7752d5cfe   Robert Hancock   x86: validate aga...
1369
  #ifdef CONFIG_PCI_MMCONFIG
bb63b4219   Yinghai Lu   x86 pci: remove c...
1370
  extern void __init pci_mmcfg_early_init(void);
7752d5cfe   Robert Hancock   x86: validate aga...
1371
1372
  extern void __init pci_mmcfg_late_init(void);
  #else
bb63b4219   Yinghai Lu   x86 pci: remove c...
1373
  static inline void pci_mmcfg_early_init(void) { }
7752d5cfe   Robert Hancock   x86: validate aga...
1374
1375
  static inline void pci_mmcfg_late_init(void) { }
  #endif
0ef5f8f61   Andrew Patterson   ACPI/PCI: PCI ext...
1376
  int pci_ext_cfg_avail(struct pci_dev *dev);
1684f5ddd   Andrew Morton   PCI: uninline pci...
1377
  void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar);
aa42d7c61   Arjan van de Ven   PCI: introduce an...
1378

dd7cc44d0   Yu Zhao   PCI: add SR-IOV A...
1379
1380
1381
  #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);
74bb1bcc7   Yu Zhao   PCI: handle SR-IO...
1382
  extern irqreturn_t pci_sriov_migration(struct pci_dev *dev);
fb8a0d9d1   Williams, Mitch A   pci: Add SR-IOV c...
1383
  extern int pci_num_vf(struct pci_dev *dev);
dd7cc44d0   Yu Zhao   PCI: add SR-IOV A...
1384
1385
1386
1387
1388
1389
1390
1391
  #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)
  {
  }
74bb1bcc7   Yu Zhao   PCI: handle SR-IO...
1392
1393
1394
1395
  static inline irqreturn_t pci_sriov_migration(struct pci_dev *dev)
  {
  	return IRQ_NONE;
  }
fb8a0d9d1   Williams, Mitch A   pci: Add SR-IOV c...
1396
1397
1398
1399
  static inline int pci_num_vf(struct pci_dev *dev)
  {
  	return 0;
  }
dd7cc44d0   Yu Zhao   PCI: add SR-IOV A...
1400
  #endif
c825bc94c   Kenji Kaneshige   PCI hotplug: crea...
1401
1402
1403
1404
  #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE)
  extern void pci_hp_create_module_link(struct pci_slot *pci_slot);
  extern void pci_hp_remove_module_link(struct pci_slot *pci_slot);
  #endif
d7b7e6052   Kenji Kaneshige   PCI: introduce pc...
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
  /**
   * pci_pcie_cap - get the saved PCIe capability offset
   * @dev: PCI device
   *
   * PCIe capability offset is calculated at PCI device initialization
   * time and saved in the data structure. This function returns saved
   * PCIe capability offset. Using this instead of pci_find_capability()
   * reduces unnecessary search in the PCI configuration space. If you
   * need to calculate PCIe capability offset from raw device for some
   * reasons, please use pci_find_capability() instead.
   */
  static inline int pci_pcie_cap(struct pci_dev *dev)
  {
  	return dev->pcie_cap;
  }
7eb776c42   Kenji Kaneshige   PCI: introduce pc...
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
  /**
   * pci_is_pcie - check if the PCI device is PCI Express capable
   * @dev: PCI device
   *
   * Retrun true if the PCI device is PCI Express capable, false otherwise.
   */
  static inline bool pci_is_pcie(struct pci_dev *dev)
  {
  	return !!pci_pcie_cap(dev);
  }
5d990b627   Chris Wright   PCI: add pci_requ...
1430
  void pci_request_acs(void);
a2ce76623   Matt Carlson   pci: Add PCI LRDT...
1431

7ad506fa1   Matt Carlson   pci: Add large an...
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
  #define PCI_VPD_LRDT			0x80	/* Large Resource Data Type */
  #define PCI_VPD_LRDT_ID(x)		(x | PCI_VPD_LRDT)
  
  /* Large Resource Data Type Tag Item Names */
  #define PCI_VPD_LTIN_ID_STRING		0x02	/* Identifier String */
  #define PCI_VPD_LTIN_RO_DATA		0x10	/* Read-Only Data */
  #define PCI_VPD_LTIN_RW_DATA		0x11	/* Read-Write Data */
  
  #define PCI_VPD_LRDT_ID_STRING		PCI_VPD_LRDT_ID(PCI_VPD_LTIN_ID_STRING)
  #define PCI_VPD_LRDT_RO_DATA		PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RO_DATA)
  #define PCI_VPD_LRDT_RW_DATA		PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RW_DATA)
  
  /* Small Resource Data Type Tag Item Names */
  #define PCI_VPD_STIN_END		0x78	/* End */
  
  #define PCI_VPD_SRDT_END		PCI_VPD_STIN_END
  
  #define PCI_VPD_SRDT_TIN_MASK		0x78
  #define PCI_VPD_SRDT_LEN_MASK		0x07
  
  #define PCI_VPD_LRDT_TAG_SIZE		3
  #define PCI_VPD_SRDT_TAG_SIZE		1
a2ce76623   Matt Carlson   pci: Add PCI LRDT...
1454

e1d5bdabb   Matt Carlson   pci: Add VPD info...
1455
  #define PCI_VPD_INFO_FLD_HDR_SIZE	3
4067a8541   Matt Carlson   pci: Add helper t...
1456
1457
1458
  #define PCI_VPD_RO_KEYWORD_PARTNO	"PN"
  #define PCI_VPD_RO_KEYWORD_MFR_ID	"MN"
  #define PCI_VPD_RO_KEYWORD_VENDOR0	"V0"
d4894f3ea   Matt Carlson   tg3: Add code to ...
1459
  #define PCI_VPD_RO_KEYWORD_CHKSUM	"RV"
4067a8541   Matt Carlson   pci: Add helper t...
1460

a2ce76623   Matt Carlson   pci: Add PCI LRDT...
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
  /**
   * pci_vpd_lrdt_size - Extracts the Large Resource Data Type length
   * @lrdt: Pointer to the beginning of the Large Resource Data Type tag
   *
   * Returns the extracted Large Resource Data Type length.
   */
  static inline u16 pci_vpd_lrdt_size(const u8 *lrdt)
  {
  	return (u16)lrdt[1] + ((u16)lrdt[2] << 8);
  }
7ad506fa1   Matt Carlson   pci: Add large an...
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
  /**
   * pci_vpd_srdt_size - Extracts the Small Resource Data Type length
   * @lrdt: Pointer to the beginning of the Small Resource Data Type tag
   *
   * Returns the extracted Small Resource Data Type length.
   */
  static inline u8 pci_vpd_srdt_size(const u8 *srdt)
  {
  	return (*srdt) & PCI_VPD_SRDT_LEN_MASK;
  }
b55ac1b22   Matt Carlson   pci: Add helper t...
1481
  /**
e1d5bdabb   Matt Carlson   pci: Add VPD info...
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
   * pci_vpd_info_field_size - Extracts the information field length
   * @lrdt: Pointer to the beginning of an information field header
   *
   * Returns the extracted information field length.
   */
  static inline u8 pci_vpd_info_field_size(const u8 *info_field)
  {
  	return info_field[2];
  }
  
  /**
b55ac1b22   Matt Carlson   pci: Add helper t...
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
   * pci_vpd_find_tag - Locates the Resource Data Type tag provided
   * @buf: Pointer to buffered vpd data
   * @off: The offset into the buffer at which to begin the search
   * @len: The length of the vpd buffer
   * @rdt: The Resource Data Type to search for
   *
   * Returns the index where the Resource Data Type was found or
   * -ENOENT otherwise.
   */
  int pci_vpd_find_tag(const u8 *buf, unsigned int off, unsigned int len, u8 rdt);
4067a8541   Matt Carlson   pci: Add helper t...
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
  /**
   * pci_vpd_find_info_keyword - Locates an information field keyword in the VPD
   * @buf: Pointer to buffered vpd data
   * @off: The offset into the buffer at which to begin the search
   * @len: The length of the buffer area, relative to off, in which to search
   * @kw: The keyword to search for
   *
   * Returns the index where the information field keyword was found or
   * -ENOENT otherwise.
   */
  int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,
  			      unsigned int len, const char *kw);
98d9f30c8   Benjamin Herrenschmidt   pci/of: Match PCI...
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
  /* PCI <-> OF binding helpers */
  #ifdef CONFIG_OF
  struct device_node;
  extern void pci_set_of_node(struct pci_dev *dev);
  extern void pci_release_of_node(struct pci_dev *dev);
  extern void pci_set_bus_of_node(struct pci_bus *bus);
  extern void pci_release_bus_of_node(struct pci_bus *bus);
  
  /* Arch may override this (weak) */
  extern struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus);
64099d981   Benjamin Herrenschmidt   pci/of: Consolida...
1525
1526
1527
1528
  static inline struct device_node *pci_device_to_OF_node(struct pci_dev *pdev)
  {
  	return pdev ? pdev->dev.of_node : NULL;
  }
ef3b4f8cc   Benjamin Herrenschmidt   pci/of: Consolida...
1529
1530
1531
1532
  static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
  {
  	return bus ? bus->dev.of_node : NULL;
  }
98d9f30c8   Benjamin Herrenschmidt   pci/of: Match PCI...
1533
1534
1535
1536
1537
1538
  #else /* CONFIG_OF */
  static inline void pci_set_of_node(struct pci_dev *dev) { }
  static inline void pci_release_of_node(struct pci_dev *dev) { }
  static inline void pci_set_bus_of_node(struct pci_bus *bus) { }
  static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
  #endif  /* CONFIG_OF */
166e9278a   Ohad Ben-Cohen   x86/ia64: intel-i...
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
  /**
   * pci_find_upstream_pcie_bridge - find upstream PCIe-to-PCI bridge of a device
   * @pdev: the PCI device
   *
   * if the device is PCIE, return NULL
   * if the device isn't connected to a PCIe bridge (that is its parent is a
   * legacy PCI bridge and the bridge is directly connected to bus 0), return its
   * parent
   */
  struct pci_dev *pci_find_upstream_pcie_bridge(struct pci_dev *pdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1549
1550
  #endif /* __KERNEL__ */
  #endif /* LINUX_PCI_H */