Blame view

drivers/pci/probe.c 43.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
  /*
   * probe.c - PCI detection and setup code
   */
  
  #include <linux/kernel.h>
  #include <linux/delay.h>
  #include <linux/init.h>
  #include <linux/pci.h>
  #include <linux/slab.h>
  #include <linux/module.h>
  #include <linux/cpumask.h>
7d715a6c1   Shaohua Li   PCI: add PCI Expr...
12
  #include <linux/pci-aspm.h>
bc56b9e01   Greg Kroah-Hartman   [PATCH] PCI: Clea...
13
  #include "pci.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
  
  #define CARDBUS_LATENCY_TIMER	176	/* secondary latency timer */
  #define CARDBUS_RESERVE_BUSNR	3
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
20
  
  /* Ugh.  Need to stop exporting this to modules. */
  LIST_HEAD(pci_root_buses);
  EXPORT_SYMBOL(pci_root_buses);
70308923d   Greg Kroah-Hartman   PCI: make no_pci_...
21
22
23
24
25
  
  static int find_anything(struct device *dev, void *data)
  {
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26

ed4aaadb1   Zhang, Yanmin   fix jvc cdrom dri...
27
28
29
  /*
   * Some device drivers need know if pci is initiated.
   * Basically, we think pci is not initiated when there
70308923d   Greg Kroah-Hartman   PCI: make no_pci_...
30
   * is no device to be found on the pci_bus_type.
ed4aaadb1   Zhang, Yanmin   fix jvc cdrom dri...
31
32
33
   */
  int no_pci_devices(void)
  {
70308923d   Greg Kroah-Hartman   PCI: make no_pci_...
34
35
  	struct device *dev;
  	int no_devices;
ed4aaadb1   Zhang, Yanmin   fix jvc cdrom dri...
36

70308923d   Greg Kroah-Hartman   PCI: make no_pci_...
37
38
39
40
41
  	dev = bus_find_device(&pci_bus_type, NULL, NULL, find_anything);
  	no_devices = (dev == NULL);
  	put_device(dev);
  	return no_devices;
  }
ed4aaadb1   Zhang, Yanmin   fix jvc cdrom dri...
42
  EXPORT_SYMBOL(no_pci_devices);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
   * PCI Bus Class
   */
fd7d1ced2   Greg Kroah-Hartman   PCI: make pci_bus...
46
  static void release_pcibus_dev(struct device *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  {
fd7d1ced2   Greg Kroah-Hartman   PCI: make pci_bus...
48
  	struct pci_bus *pci_bus = to_pci_bus(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
  
  	if (pci_bus->bridge)
  		put_device(pci_bus->bridge);
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
52
  	pci_bus_remove_resources(pci_bus);
98d9f30c8   Benjamin Herrenschmidt   pci/of: Match PCI...
53
  	pci_release_bus_of_node(pci_bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
  	kfree(pci_bus);
  }
  
  static struct class pcibus_class = {
  	.name		= "pci_bus",
fd7d1ced2   Greg Kroah-Hartman   PCI: make pci_bus...
59
  	.dev_release	= &release_pcibus_dev,
b9d320fcb   Yinghai Lu   PCI: add rescan t...
60
  	.dev_attrs	= pcibus_dev_attrs,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
64
65
66
67
  };
  
  static int __init pcibus_class_init(void)
  {
  	return class_register(&pcibus_class);
  }
  postcore_initcall(pcibus_class_init);
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
68
  static u64 pci_size(u64 base, u64 maxbase, u64 mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
  {
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
70
  	u64 size = mask & maxbase;	/* Find the significant bits */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  	if (!size)
  		return 0;
  
  	/* Get the lowest of them to find the decode size, and
  	   from that the extent.  */
  	size = (size & ~(size-1)) - 1;
  
  	/* base == maxbase can be valid only if the BAR has
  	   already been programmed with all 1s.  */
  	if (base == maxbase && ((base | size) & mask) != mask)
  		return 0;
  
  	return size;
  }
28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
85
  static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar)
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
86
  {
8d6a6a476   Bjorn Helgaas   PCI: treat mem BA...
87
  	u32 mem_type;
28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
88
  	unsigned long flags;
8d6a6a476   Bjorn Helgaas   PCI: treat mem BA...
89

6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
90
  	if ((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
91
92
93
  		flags = bar & ~PCI_BASE_ADDRESS_IO_MASK;
  		flags |= IORESOURCE_IO;
  		return flags;
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
94
  	}
07eddf3d5   Yinghai Lu   PCI: check szhi w...
95

28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
96
97
98
99
  	flags = bar & ~PCI_BASE_ADDRESS_MEM_MASK;
  	flags |= IORESOURCE_MEM;
  	if (flags & PCI_BASE_ADDRESS_MEM_PREFETCH)
  		flags |= IORESOURCE_PREFETCH;
07eddf3d5   Yinghai Lu   PCI: check szhi w...
100

8d6a6a476   Bjorn Helgaas   PCI: treat mem BA...
101
102
103
104
105
106
107
108
109
  	mem_type = bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK;
  	switch (mem_type) {
  	case PCI_BASE_ADDRESS_MEM_TYPE_32:
  		break;
  	case PCI_BASE_ADDRESS_MEM_TYPE_1M:
  		dev_info(&dev->dev, "1M mem BAR treated as 32-bit BAR
  ");
  		break;
  	case PCI_BASE_ADDRESS_MEM_TYPE_64:
28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
110
111
  		flags |= IORESOURCE_MEM_64;
  		break;
8d6a6a476   Bjorn Helgaas   PCI: treat mem BA...
112
113
114
115
116
117
118
  	default:
  		dev_warn(&dev->dev,
  			 "mem unknown type %x treated as 32-bit BAR
  ",
  			 mem_type);
  		break;
  	}
28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
119
  	return flags;
07eddf3d5   Yinghai Lu   PCI: check szhi w...
120
  }
0b400c7ed   Yu Zhao   PCI: export __pci...
121
122
123
124
125
126
127
128
  /**
   * pci_read_base - read a PCI BAR
   * @dev: the PCI device
   * @type: type of the BAR
   * @res: resource buffer to be filled in
   * @pos: BAR position in the config space
   *
   * Returns 1 if the BAR is 64-bit, or 0 if 32-bit.
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
129
   */
0b400c7ed   Yu Zhao   PCI: export __pci...
130
  int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
131
  			struct resource *res, unsigned int pos)
07eddf3d5   Yinghai Lu   PCI: check szhi w...
132
  {
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
133
  	u32 l, sz, mask;
253d2e549   Jacob Pan   PCI: disable mmio...
134
  	u16 orig_cmd;
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
135

1ed674391   Michael S. Tsirkin   PCI: fix nit in R...
136
  	mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
137

253d2e549   Jacob Pan   PCI: disable mmio...
138
139
140
141
142
  	if (!dev->mmio_always_on) {
  		pci_read_config_word(dev, PCI_COMMAND, &orig_cmd);
  		pci_write_config_word(dev, PCI_COMMAND,
  			orig_cmd & ~(PCI_COMMAND_MEMORY | PCI_COMMAND_IO));
  	}
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
143
144
145
  	res->name = pci_name(dev);
  
  	pci_read_config_dword(dev, pos, &l);
1ed674391   Michael S. Tsirkin   PCI: fix nit in R...
146
  	pci_write_config_dword(dev, pos, l | mask);
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
147
148
  	pci_read_config_dword(dev, pos, &sz);
  	pci_write_config_dword(dev, pos, l);
253d2e549   Jacob Pan   PCI: disable mmio...
149
150
  	if (!dev->mmio_always_on)
  		pci_write_config_word(dev, PCI_COMMAND, orig_cmd);
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
151
152
  	/*
  	 * All bits set in sz means the device isn't working properly.
45aa23b4c   Bjorn Helgaas   PCI: revert broke...
153
154
155
  	 * If the BAR isn't implemented, all bits must be 0.  If it's a
  	 * memory BAR or a ROM, bit 0 must be clear; if it's an io BAR, bit
  	 * 1 must be clear.
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
156
  	 */
45aa23b4c   Bjorn Helgaas   PCI: revert broke...
157
  	if (!sz || sz == 0xffffffff)
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
158
159
160
161
162
163
164
165
166
167
  		goto fail;
  
  	/*
  	 * I don't know how l can have all bits set.  Copied from old code.
  	 * Maybe it fixes a bug on some ancient platform.
  	 */
  	if (l == 0xffffffff)
  		l = 0;
  
  	if (type == pci_bar_unknown) {
28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
168
169
170
  		res->flags = decode_bar(dev, l);
  		res->flags |= IORESOURCE_SIZEALIGN;
  		if (res->flags & IORESOURCE_IO) {
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
171
  			l &= PCI_BASE_ADDRESS_IO_MASK;
5aceca9d3   David S. Miller   PCI: Fix warning ...
172
  			mask = PCI_BASE_ADDRESS_IO_MASK & (u32) IO_SPACE_LIMIT;
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
173
174
175
176
177
178
179
180
181
  		} else {
  			l &= PCI_BASE_ADDRESS_MEM_MASK;
  			mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
  		}
  	} else {
  		res->flags |= (l & IORESOURCE_ROM_ENABLE);
  		l &= PCI_ROM_ADDRESS_MASK;
  		mask = (u32)PCI_ROM_ADDRESS_MASK;
  	}
28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
182
  	if (res->flags & IORESOURCE_MEM_64) {
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
  		u64 l64 = l;
  		u64 sz64 = sz;
  		u64 mask64 = mask | (u64)~0 << 32;
  
  		pci_read_config_dword(dev, pos + 4, &l);
  		pci_write_config_dword(dev, pos + 4, ~0);
  		pci_read_config_dword(dev, pos + 4, &sz);
  		pci_write_config_dword(dev, pos + 4, l);
  
  		l64 |= ((u64)l << 32);
  		sz64 |= ((u64)sz << 32);
  
  		sz64 = pci_size(l64, sz64, mask64);
  
  		if (!sz64)
  			goto fail;
cc5499c3a   Matthew Wilcox   PCI: handle 64-bi...
199
  		if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) {
865df576e   Bjorn Helgaas   PCI: improve disc...
200
201
202
  			dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR
  ",
  				pos);
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
203
  			goto fail;
c7dabef8a   Bjorn Helgaas   vsprintf: use %pR...
204
  		}
c7dabef8a   Bjorn Helgaas   vsprintf: use %pR...
205
  		if ((sizeof(resource_size_t) < 8) && l) {
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
206
207
208
209
210
211
212
213
  			/* Address above 32-bit boundary; disable the BAR */
  			pci_write_config_dword(dev, pos, 0);
  			pci_write_config_dword(dev, pos + 4, 0);
  			res->start = 0;
  			res->end = sz64;
  		} else {
  			res->start = l64;
  			res->end = l64 + sz64;
c7dabef8a   Bjorn Helgaas   vsprintf: use %pR...
214
215
  			dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR
  ",
a369c791e   Bjorn Helgaas   PCI: print resour...
216
  				   pos, res);
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
217
218
  		}
  	} else {
45aa23b4c   Bjorn Helgaas   PCI: revert broke...
219
  		sz = pci_size(l, sz, mask);
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
220

45aa23b4c   Bjorn Helgaas   PCI: revert broke...
221
  		if (!sz)
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
222
223
224
  			goto fail;
  
  		res->start = l;
45aa23b4c   Bjorn Helgaas   PCI: revert broke...
225
  		res->end = l + sz;
f393d9b13   Vincent Legoll   PCI: probing debu...
226

c7dabef8a   Bjorn Helgaas   vsprintf: use %pR...
227
228
  		dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR
  ", pos, res);
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
229
230
231
  	}
  
   out:
28c6821a0   Bjorn Helgaas   PCI: fold pci_cal...
232
  	return (res->flags & IORESOURCE_MEM_64) ? 1 : 0;
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
233
234
235
   fail:
  	res->flags = 0;
  	goto out;
07eddf3d5   Yinghai Lu   PCI: check szhi w...
236
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
238
  static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
  {
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
239
  	unsigned int pos, reg;
07eddf3d5   Yinghai Lu   PCI: check szhi w...
240

6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
241
242
  	for (pos = 0; pos < howmany; pos++) {
  		struct resource *res = &dev->resource[pos];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243
  		reg = PCI_BASE_ADDRESS_0 + (pos << 2);
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
244
  		pos += __pci_read_base(dev, pci_bar_unknown, res, reg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
  	}
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
246

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
  	if (rom) {
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
248
  		struct resource *res = &dev->resource[PCI_ROM_RESOURCE];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
  		dev->rom_base_reg = rom;
6ac665c63   Matthew Wilcox   PCI: rewrite PCI ...
250
251
252
253
  		res->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH |
  				IORESOURCE_READONLY | IORESOURCE_CACHEABLE |
  				IORESOURCE_SIZEALIGN;
  		__pci_read_base(dev, pci_bar_mem32, res, rom);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
255
  	}
  }
fa27b2d10   Bjorn Helgaas   PCI: split up pci...
256
  static void __devinit pci_read_bridge_io(struct pci_bus *child)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
258
259
  {
  	struct pci_dev *dev = child->self;
  	u8 io_base_lo, io_limit_lo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260
261
  	unsigned long base, limit;
  	struct resource *res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
264
265
266
267
268
269
270
271
272
273
274
275
  	res = child->resource[0];
  	pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo);
  	pci_read_config_byte(dev, PCI_IO_LIMIT, &io_limit_lo);
  	base = (io_base_lo & PCI_IO_RANGE_MASK) << 8;
  	limit = (io_limit_lo & PCI_IO_RANGE_MASK) << 8;
  
  	if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
  		u16 io_base_hi, io_limit_hi;
  		pci_read_config_word(dev, PCI_IO_BASE_UPPER16, &io_base_hi);
  		pci_read_config_word(dev, PCI_IO_LIMIT_UPPER16, &io_limit_hi);
  		base |= (io_base_hi << 16);
  		limit |= (io_limit_hi << 16);
  	}
cd81e1ea1   Yinghai Lu   PCI: reject mmio ...
276
  	if (base && base <= limit) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
  		res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
9d265124d   Daniel Yeisley   [PATCH] PCI Quirk...
278
279
280
281
  		if (!res->start)
  			res->start = base;
  		if (!res->end)
  			res->end = limit + 0xfff;
c7dabef8a   Bjorn Helgaas   vsprintf: use %pR...
282
283
  		dev_printk(KERN_DEBUG, &dev->dev, "  bridge window %pR
  ", res);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
  	}
fa27b2d10   Bjorn Helgaas   PCI: split up pci...
285
286
287
288
289
290
291
292
  }
  
  static void __devinit pci_read_bridge_mmio(struct pci_bus *child)
  {
  	struct pci_dev *dev = child->self;
  	u16 mem_base_lo, mem_limit_lo;
  	unsigned long base, limit;
  	struct resource *res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
296
297
298
  
  	res = child->resource[1];
  	pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo);
  	pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
  	base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
  	limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16;
cd81e1ea1   Yinghai Lu   PCI: reject mmio ...
299
  	if (base && base <= limit) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
301
302
  		res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
  		res->start = base;
  		res->end = limit + 0xfffff;
c7dabef8a   Bjorn Helgaas   vsprintf: use %pR...
303
304
  		dev_printk(KERN_DEBUG, &dev->dev, "  bridge window %pR
  ", res);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
  	}
fa27b2d10   Bjorn Helgaas   PCI: split up pci...
306
307
308
309
310
311
312
313
  }
  
  static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child)
  {
  	struct pci_dev *dev = child->self;
  	u16 mem_base_lo, mem_limit_lo;
  	unsigned long base, limit;
  	struct resource *res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
  
  	res = child->resource[2];
  	pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo);
  	pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo);
  	base = (mem_base_lo & PCI_PREF_RANGE_MASK) << 16;
  	limit = (mem_limit_lo & PCI_PREF_RANGE_MASK) << 16;
  
  	if ((mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) {
  		u32 mem_base_hi, mem_limit_hi;
  		pci_read_config_dword(dev, PCI_PREF_BASE_UPPER32, &mem_base_hi);
  		pci_read_config_dword(dev, PCI_PREF_LIMIT_UPPER32, &mem_limit_hi);
  
  		/*
  		 * Some bridges set the base > limit by default, and some
  		 * (broken) BIOSes do not initialize them.  If we find
  		 * this, just assume they are not being used.
  		 */
  		if (mem_base_hi <= mem_limit_hi) {
  #if BITS_PER_LONG == 64
  			base |= ((long) mem_base_hi) << 32;
  			limit |= ((long) mem_limit_hi) << 32;
  #else
  			if (mem_base_hi || mem_limit_hi) {
80ccba118   Bjorn Helgaas   PCI: use dev_prin...
337
338
339
  				dev_err(&dev->dev, "can't handle 64-bit "
  					"address space for bridge
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
341
342
343
344
  				return;
  			}
  #endif
  		}
  	}
cd81e1ea1   Yinghai Lu   PCI: reject mmio ...
345
  	if (base && base <= limit) {
1f82de10d   Yinghai Lu   PCI/x86: don't as...
346
347
348
349
  		res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) |
  					 IORESOURCE_MEM | IORESOURCE_PREFETCH;
  		if (res->flags & PCI_PREF_RANGE_TYPE_64)
  			res->flags |= IORESOURCE_MEM_64;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
351
  		res->start = base;
  		res->end = limit + 0xfffff;
c7dabef8a   Bjorn Helgaas   vsprintf: use %pR...
352
353
  		dev_printk(KERN_DEBUG, &dev->dev, "  bridge window %pR
  ", res);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
355
  	}
  }
fa27b2d10   Bjorn Helgaas   PCI: split up pci...
356
357
358
  void __devinit pci_read_bridge_bases(struct pci_bus *child)
  {
  	struct pci_dev *dev = child->self;
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
359
  	struct resource *res;
fa27b2d10   Bjorn Helgaas   PCI: split up pci...
360
361
362
363
364
365
366
367
368
  	int i;
  
  	if (pci_is_root_bus(child))	/* It's a host bus, nothing to read */
  		return;
  
  	dev_info(&dev->dev, "PCI bridge to [bus %02x-%02x]%s
  ",
  		 child->secondary, child->subordinate,
  		 dev->transparent ? " (subtractive decode)" : "");
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
369
370
371
  	pci_bus_remove_resources(child);
  	for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++)
  		child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i];
fa27b2d10   Bjorn Helgaas   PCI: split up pci...
372
373
374
  	pci_read_bridge_io(child);
  	pci_read_bridge_mmio(child);
  	pci_read_bridge_mmio_pref(child);
2adf75160   Bjorn Helgaas   PCI: read bridge ...
375
376
  
  	if (dev->transparent) {
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
377
378
379
380
  		pci_bus_for_each_resource(child->parent, res, i) {
  			if (res) {
  				pci_bus_add_resource(child, res,
  						     PCI_SUBTRACTIVE_DECODE);
2adf75160   Bjorn Helgaas   PCI: read bridge ...
381
382
383
  				dev_printk(KERN_DEBUG, &dev->dev,
  					   "  bridge window %pR (subtractive decode)
  ",
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
384
385
  					   res);
  			}
2adf75160   Bjorn Helgaas   PCI: read bridge ...
386
387
  		}
  	}
fa27b2d10   Bjorn Helgaas   PCI: split up pci...
388
  }
96bde06a2   Sam Ravnborg   pci: do not mark ...
389
  static struct pci_bus * pci_alloc_bus(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
  {
  	struct pci_bus *b;
f5afe8064   Eric Sesterhenn   [PATCH] PCI: kzal...
392
  	b = kzalloc(sizeof(*b), GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
393
  	if (b) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394
395
396
  		INIT_LIST_HEAD(&b->node);
  		INIT_LIST_HEAD(&b->children);
  		INIT_LIST_HEAD(&b->devices);
f46753c5e   Alex Chiang   PCI: introduce pc...
397
  		INIT_LIST_HEAD(&b->slots);
2fe2abf89   Bjorn Helgaas   PCI: augment bus ...
398
  		INIT_LIST_HEAD(&b->resources);
3749c51ac   Matthew Wilcox   PCI: Make current...
399
400
  		b->max_bus_speed = PCI_SPEED_UNKNOWN;
  		b->cur_bus_speed = PCI_SPEED_UNKNOWN;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
401
402
403
  	}
  	return b;
  }
9be60ca04   Matthew Wilcox   PCI: Add support ...
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
  static unsigned char pcix_bus_speed[] = {
  	PCI_SPEED_UNKNOWN,		/* 0 */
  	PCI_SPEED_66MHz_PCIX,		/* 1 */
  	PCI_SPEED_100MHz_PCIX,		/* 2 */
  	PCI_SPEED_133MHz_PCIX,		/* 3 */
  	PCI_SPEED_UNKNOWN,		/* 4 */
  	PCI_SPEED_66MHz_PCIX_ECC,	/* 5 */
  	PCI_SPEED_100MHz_PCIX_ECC,	/* 6 */
  	PCI_SPEED_133MHz_PCIX_ECC,	/* 7 */
  	PCI_SPEED_UNKNOWN,		/* 8 */
  	PCI_SPEED_66MHz_PCIX_266,	/* 9 */
  	PCI_SPEED_100MHz_PCIX_266,	/* A */
  	PCI_SPEED_133MHz_PCIX_266,	/* B */
  	PCI_SPEED_UNKNOWN,		/* C */
  	PCI_SPEED_66MHz_PCIX_533,	/* D */
  	PCI_SPEED_100MHz_PCIX_533,	/* E */
  	PCI_SPEED_133MHz_PCIX_533	/* F */
  };
3749c51ac   Matthew Wilcox   PCI: Make current...
422
423
424
425
  static unsigned char pcie_link_speed[] = {
  	PCI_SPEED_UNKNOWN,		/* 0 */
  	PCIE_SPEED_2_5GT,		/* 1 */
  	PCIE_SPEED_5_0GT,		/* 2 */
9dfd97fe1   Matthew Wilcox   PCI: Add support ...
426
  	PCIE_SPEED_8_0GT,		/* 3 */
3749c51ac   Matthew Wilcox   PCI: Make current...
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
  	PCI_SPEED_UNKNOWN,		/* 4 */
  	PCI_SPEED_UNKNOWN,		/* 5 */
  	PCI_SPEED_UNKNOWN,		/* 6 */
  	PCI_SPEED_UNKNOWN,		/* 7 */
  	PCI_SPEED_UNKNOWN,		/* 8 */
  	PCI_SPEED_UNKNOWN,		/* 9 */
  	PCI_SPEED_UNKNOWN,		/* A */
  	PCI_SPEED_UNKNOWN,		/* B */
  	PCI_SPEED_UNKNOWN,		/* C */
  	PCI_SPEED_UNKNOWN,		/* D */
  	PCI_SPEED_UNKNOWN,		/* E */
  	PCI_SPEED_UNKNOWN		/* F */
  };
  
  void pcie_update_link_speed(struct pci_bus *bus, u16 linksta)
  {
  	bus->cur_bus_speed = pcie_link_speed[linksta & 0xf];
  }
  EXPORT_SYMBOL_GPL(pcie_update_link_speed);
45b4cdd57   Matthew Wilcox   PCI: Add support ...
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
  static unsigned char agp_speeds[] = {
  	AGP_UNKNOWN,
  	AGP_1X,
  	AGP_2X,
  	AGP_4X,
  	AGP_8X
  };
  
  static enum pci_bus_speed agp_speed(int agp3, int agpstat)
  {
  	int index = 0;
  
  	if (agpstat & 4)
  		index = 3;
  	else if (agpstat & 2)
  		index = 2;
  	else if (agpstat & 1)
  		index = 1;
  	else
  		goto out;
  	
  	if (agp3) {
  		index += 2;
  		if (index == 5)
  			index = 0;
  	}
  
   out:
  	return agp_speeds[index];
  }
9be60ca04   Matthew Wilcox   PCI: Add support ...
476
477
478
479
  static void pci_set_bus_speed(struct pci_bus *bus)
  {
  	struct pci_dev *bridge = bus->self;
  	int pos;
45b4cdd57   Matthew Wilcox   PCI: Add support ...
480
481
482
483
484
485
486
487
488
489
490
491
  	pos = pci_find_capability(bridge, PCI_CAP_ID_AGP);
  	if (!pos)
  		pos = pci_find_capability(bridge, PCI_CAP_ID_AGP3);
  	if (pos) {
  		u32 agpstat, agpcmd;
  
  		pci_read_config_dword(bridge, pos + PCI_AGP_STATUS, &agpstat);
  		bus->max_bus_speed = agp_speed(agpstat & 8, agpstat & 7);
  
  		pci_read_config_dword(bridge, pos + PCI_AGP_COMMAND, &agpcmd);
  		bus->cur_bus_speed = agp_speed(agpstat & 8, agpcmd & 7);
  	}
9be60ca04   Matthew Wilcox   PCI: Add support ...
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
  	pos = pci_find_capability(bridge, PCI_CAP_ID_PCIX);
  	if (pos) {
  		u16 status;
  		enum pci_bus_speed max;
  		pci_read_config_word(bridge, pos + 2, &status);
  
  		if (status & 0x8000) {
  			max = PCI_SPEED_133MHz_PCIX_533;
  		} else if (status & 0x4000) {
  			max = PCI_SPEED_133MHz_PCIX_266;
  		} else if (status & 0x0002) {
  			if (((status >> 12) & 0x3) == 2) {
  				max = PCI_SPEED_133MHz_PCIX_ECC;
  			} else {
  				max = PCI_SPEED_133MHz_PCIX;
  			}
  		} else {
  			max = PCI_SPEED_66MHz_PCIX;
  		}
  
  		bus->max_bus_speed = max;
  		bus->cur_bus_speed = pcix_bus_speed[(status >> 6) & 0xf];
  
  		return;
  	}
  
  	pos = pci_find_capability(bridge, PCI_CAP_ID_EXP);
  	if (pos) {
  		u32 linkcap;
  		u16 linksta;
  
  		pci_read_config_dword(bridge, pos + PCI_EXP_LNKCAP, &linkcap);
  		bus->max_bus_speed = pcie_link_speed[linkcap & 0xf];
  
  		pci_read_config_word(bridge, pos + PCI_EXP_LNKSTA, &linksta);
  		pcie_update_link_speed(bus, linksta);
  	}
  }
cbd4e055f   Adrian Bunk   PCI: pci_alloc_ch...
530
531
  static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
  					   struct pci_dev *bridge, int busnr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
532
533
534
535
536
537
538
539
540
541
  {
  	struct pci_bus *child;
  	int i;
  
  	/*
  	 * Allocate a new bus, and inherit stuff from the parent..
  	 */
  	child = pci_alloc_bus();
  	if (!child)
  		return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542
543
544
  	child->parent = parent;
  	child->ops = parent->ops;
  	child->sysdata = parent->sysdata;
6e325a62a   Michael S. Tsirkin   [PATCH] PCI: make...
545
  	child->bus_flags = parent->bus_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
546

fd7d1ced2   Greg Kroah-Hartman   PCI: make pci_bus...
547
548
549
550
551
  	/* initialize some portions of the bus device, but don't register it
  	 * now as the parent is not properly set up yet.  This device will get
  	 * registered later in pci_bus_add_devices()
  	 */
  	child->dev.class = &pcibus_class;
1a9271331   Kay Sievers   PCI: struct devic...
552
  	dev_set_name(&child->dev, "%04x:%02x", pci_domain_nr(child), busnr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
553
554
555
556
557
558
559
560
  
  	/*
  	 * Set up the primary, secondary and subordinate
  	 * bus numbers.
  	 */
  	child->number = child->secondary = busnr;
  	child->primary = parent->secondary;
  	child->subordinate = 0xff;
3789fa8a2   Yu Zhao   PCI: allow pci_al...
561
562
563
564
565
  	if (!bridge)
  		return child;
  
  	child->self = bridge;
  	child->bridge = get_device(&bridge->dev);
98d9f30c8   Benjamin Herrenschmidt   pci/of: Match PCI...
566
  	pci_set_bus_of_node(child);
9be60ca04   Matthew Wilcox   PCI: Add support ...
567
  	pci_set_bus_speed(child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568
  	/* Set up default resource pointers and names.. */
fde09c6d8   Yu Zhao   PCI: define PCI r...
569
  	for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
570
571
572
573
574
575
576
  		child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i];
  		child->resource[i]->name = child->name;
  	}
  	bridge->subordinate = child;
  
  	return child;
  }
451124a7c   Sam Ravnborg   PCI: fix 4x secti...
577
  struct pci_bus *__ref pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
578
579
580
581
  {
  	struct pci_bus *child;
  
  	child = pci_alloc_child_bus(parent, dev, busnr);
e4ea9bb7e   Rajesh Shah   [PATCH] acpi brid...
582
  	if (child) {
d71374daf   Zhang Yanmin   [PATCH] PCI: fix ...
583
  		down_write(&pci_bus_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
584
  		list_add_tail(&child->node, &parent->children);
d71374daf   Zhang Yanmin   [PATCH] PCI: fix ...
585
  		up_write(&pci_bus_sem);
e4ea9bb7e   Rajesh Shah   [PATCH] acpi brid...
586
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
587
588
  	return child;
  }
96bde06a2   Sam Ravnborg   pci: do not mark ...
589
  static void pci_fixup_parent_subordinate_busnr(struct pci_bus *child, int max)
26f674ae0   Greg Kroah-Hartman   [PATCH] PCI: Fix ...
590
591
  {
  	struct pci_bus *parent = child->parent;
12f44f46b   Ivan Kokshaysky   [PATCH] pci: fixu...
592
593
594
595
596
  
  	/* Attempts to fix that up are really dangerous unless
  	   we're going to re-assign all bus numbers. */
  	if (!pcibios_assign_all_busses())
  		return;
26f674ae0   Greg Kroah-Hartman   [PATCH] PCI: Fix ...
597
598
599
600
601
602
  	while (parent->parent && parent->subordinate < max) {
  		parent->subordinate = max;
  		pci_write_config_byte(parent->self, PCI_SUBORDINATE_BUS, max);
  		parent = parent->parent;
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603
604
605
606
607
608
609
610
611
612
  /*
   * If it's a bridge, configure it and scan the bus behind it.
   * For CardBus bridges, we don't scan behind as the devices will
   * be handled by the bridge driver itself.
   *
   * We need to process bridges in two passes -- first we scan those
   * already configured by the BIOS and after we are done with all of
   * them, we proceed to assigning numbers to the remaining buses in
   * order to avoid overlaps between old and new bus numbers.
   */
0ab2b57f8   Sam Ravnborg   PCI: fix section ...
613
  int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
614
615
616
  {
  	struct pci_bus *child;
  	int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
498879417   Dominik Brodowski   [PATCH] PCI: use ...
617
  	u32 buses, i, j = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
618
  	u16 bctl;
99ddd552f   Bjorn Helgaas   PCI: break out pr...
619
  	u8 primary, secondary, subordinate;
a1c19894b   Benjamin Herrenschmidt   PCI: Workaround i...
620
  	int broken = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
621
622
  
  	pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses);
99ddd552f   Bjorn Helgaas   PCI: break out pr...
623
624
625
  	primary = buses & 0xFF;
  	secondary = (buses >> 8) & 0xFF;
  	subordinate = (buses >> 16) & 0xFF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
626

99ddd552f   Bjorn Helgaas   PCI: break out pr...
627
628
629
  	dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d
  ",
  		secondary, subordinate, pass);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
630

a1c19894b   Benjamin Herrenschmidt   PCI: Workaround i...
631
632
  	/* Check if setup is sensible at all */
  	if (!pass &&
99ddd552f   Bjorn Helgaas   PCI: break out pr...
633
  	    (primary != bus->number || secondary <= bus->number)) {
a1c19894b   Benjamin Herrenschmidt   PCI: Workaround i...
634
635
636
637
  		dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring
  ");
  		broken = 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
639
640
641
642
  	/* Disable MasterAbortMode during probing to avoid reporting
  	   of bus errors (in some architectures) */ 
  	pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl);
  	pci_write_config_word(dev, PCI_BRIDGE_CONTROL,
  			      bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT);
99ddd552f   Bjorn Helgaas   PCI: break out pr...
643
644
645
  	if ((secondary || subordinate) && !pcibios_assign_all_busses() &&
  	    !is_cardbus && !broken) {
  		unsigned int cmax;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
646
647
648
649
650
  		/*
  		 * Bus already configured by firmware, process it in the first
  		 * pass and just note the configuration.
  		 */
  		if (pass)
bbe8f9a3e   Ralf Baechle   [PATCH] PCI: Avoi...
651
  			goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
652
653
654
  
  		/*
  		 * If we already got to this bus through a different bridge,
74710ded8   Alex Chiang   PCI: always scan ...
655
656
657
658
  		 * don't re-add it. This can happen with the i450NX chipset.
  		 *
  		 * However, we continue to descend down the hierarchy and
  		 * scan remaining child buses.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
659
  		 */
99ddd552f   Bjorn Helgaas   PCI: break out pr...
660
  		child = pci_find_bus(pci_domain_nr(bus), secondary);
74710ded8   Alex Chiang   PCI: always scan ...
661
  		if (!child) {
99ddd552f   Bjorn Helgaas   PCI: break out pr...
662
  			child = pci_add_new_bus(bus, dev, secondary);
74710ded8   Alex Chiang   PCI: always scan ...
663
664
  			if (!child)
  				goto out;
99ddd552f   Bjorn Helgaas   PCI: break out pr...
665
666
  			child->primary = primary;
  			child->subordinate = subordinate;
74710ded8   Alex Chiang   PCI: always scan ...
667
  			child->bridge_ctl = bctl;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
669
670
671
672
673
674
675
676
677
678
  		cmax = pci_scan_child_bus(child);
  		if (cmax > max)
  			max = cmax;
  		if (child->subordinate > max)
  			max = child->subordinate;
  	} else {
  		/*
  		 * We need to assign a number to this bus which we always
  		 * do in the second pass.
  		 */
12f44f46b   Ivan Kokshaysky   [PATCH] pci: fixu...
679
  		if (!pass) {
a1c19894b   Benjamin Herrenschmidt   PCI: Workaround i...
680
  			if (pcibios_assign_all_busses() || broken)
12f44f46b   Ivan Kokshaysky   [PATCH] pci: fixu...
681
682
683
684
685
686
687
688
  				/* Temporarily disable forwarding of the
  				   configuration cycles on all bridges in
  				   this bus segment to avoid possible
  				   conflicts in the second pass between two
  				   bridges programmed with overlapping
  				   bus ranges. */
  				pci_write_config_dword(dev, PCI_PRIMARY_BUS,
  						       buses & ~0xffffff);
bbe8f9a3e   Ralf Baechle   [PATCH] PCI: Avoi...
689
  			goto out;
12f44f46b   Ivan Kokshaysky   [PATCH] pci: fixu...
690
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
691
692
693
  
  		/* Clear errors */
  		pci_write_config_word(dev, PCI_STATUS, 0xffff);
cc57450f5   Rajesh Shah   [PATCH] acpi brid...
694
  		/* Prevent assigning a bus number that already exists.
b1a98b695   Tiejun Chen   PCI: enumerate th...
695
696
697
698
699
700
701
702
  		 * This can happen when a bridge is hot-plugged, so in
  		 * this case we only re-scan this bus. */
  		child = pci_find_bus(pci_domain_nr(bus), max+1);
  		if (!child) {
  			child = pci_add_new_bus(bus, dev, ++max);
  			if (!child)
  				goto out;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
703
704
705
706
707
708
709
710
711
712
713
714
715
  		buses = (buses & 0xff000000)
  		      | ((unsigned int)(child->primary)     <<  0)
  		      | ((unsigned int)(child->secondary)   <<  8)
  		      | ((unsigned int)(child->subordinate) << 16);
  
  		/*
  		 * yenta.c forces a secondary latency timer of 176.
  		 * Copy that behaviour here.
  		 */
  		if (is_cardbus) {
  			buses &= ~0xff000000;
  			buses |= CARDBUS_LATENCY_TIMER << 24;
  		}
7c867c889   Jesper Juhl   PCI: Avoid potent...
716

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
718
719
720
721
722
  		/*
  		 * We need to blast all three values with a single write.
  		 */
  		pci_write_config_dword(dev, PCI_PRIMARY_BUS, buses);
  
  		if (!is_cardbus) {
11949255d   Gary Hade   PCI: modify PCI b...
723
  			child->bridge_ctl = bctl;
26f674ae0   Greg Kroah-Hartman   [PATCH] PCI: Fix ...
724
725
726
727
728
729
730
  			/*
  			 * Adjust subordinate busnr in parent buses.
  			 * We do this before scanning for children because
  			 * some devices may not be detected if the bios
  			 * was lazy.
  			 */
  			pci_fixup_parent_subordinate_busnr(child, max);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
731
732
  			/* Now we can scan all subordinate buses... */
  			max = pci_scan_child_bus(child);
e3ac86d8b   Kristen Accardi   [PATCH] PCI: real...
733
734
735
736
737
  			/*
  			 * now fix it up again since we have found
  			 * the real value of max.
  			 */
  			pci_fixup_parent_subordinate_busnr(child, max);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
738
739
740
741
742
743
  		} else {
  			/*
  			 * For CardBus bridges, we leave 4 bus numbers
  			 * as cards with a PCI-to-PCI bridge can be
  			 * inserted later.
  			 */
498879417   Dominik Brodowski   [PATCH] PCI: use ...
744
745
  			for (i=0; i<CARDBUS_RESERVE_BUSNR; i++) {
  				struct pci_bus *parent = bus;
cc57450f5   Rajesh Shah   [PATCH] acpi brid...
746
747
748
  				if (pci_find_bus(pci_domain_nr(bus),
  							max+i+1))
  					break;
498879417   Dominik Brodowski   [PATCH] PCI: use ...
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
  				while (parent->parent) {
  					if ((!pcibios_assign_all_busses()) &&
  					    (parent->subordinate > max) &&
  					    (parent->subordinate <= max+i)) {
  						j = 1;
  					}
  					parent = parent->parent;
  				}
  				if (j) {
  					/*
  					 * Often, there are two cardbus bridges
  					 * -- try to leave one valid bus number
  					 * for each one.
  					 */
  					i /= 2;
  					break;
  				}
  			}
cc57450f5   Rajesh Shah   [PATCH] acpi brid...
767
  			max += i;
26f674ae0   Greg Kroah-Hartman   [PATCH] PCI: Fix ...
768
  			pci_fixup_parent_subordinate_busnr(child, max);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
769
770
771
772
773
774
775
  		}
  		/*
  		 * Set the subordinate bus number to its real value.
  		 */
  		child->subordinate = max;
  		pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max);
  	}
cb3576fa3   Gary Hade   PCI: Include PCI ...
776
777
778
  	sprintf(child->name,
  		(is_cardbus ? "PCI CardBus %04x:%02x" : "PCI Bus %04x:%02x"),
  		pci_domain_nr(bus), child->number);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
779

d55bef515   Bernhard Kaindl   PCI: lets kill th...
780
  	/* Has only triggered on CardBus, fixup is in yenta_socket */
498879417   Dominik Brodowski   [PATCH] PCI: use ...
781
782
783
784
785
  	while (bus->parent) {
  		if ((child->subordinate > bus->subordinate) ||
  		    (child->number > bus->subordinate) ||
  		    (child->number < bus->number) ||
  		    (child->subordinate < bus->number)) {
865df576e   Bjorn Helgaas   PCI: improve disc...
786
787
788
  			dev_info(&child->dev, "[bus %02x-%02x] %s "
  				"hidden behind%s bridge %s [bus %02x-%02x]
  ",
d55bef515   Bernhard Kaindl   PCI: lets kill th...
789
790
791
  				child->number, child->subordinate,
  				(bus->number > child->subordinate &&
  				 bus->subordinate < child->number) ?
a6f29a98a   Joe Perches   PCI: Add missing ...
792
793
  					"wholly" : "partially",
  				bus->self->transparent ? " transparent" : "",
865df576e   Bjorn Helgaas   PCI: improve disc...
794
  				dev_name(&bus->dev),
d55bef515   Bernhard Kaindl   PCI: lets kill th...
795
  				bus->number, bus->subordinate);
498879417   Dominik Brodowski   [PATCH] PCI: use ...
796
797
798
  		}
  		bus = bus->parent;
  	}
bbe8f9a3e   Ralf Baechle   [PATCH] PCI: Avoi...
799
800
  out:
  	pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
801
802
803
804
805
806
807
808
809
810
811
812
  	return max;
  }
  
  /*
   * Read interrupt line and base address registers.
   * The architecture-dependent code can tweak these, of course.
   */
  static void pci_read_irq(struct pci_dev *dev)
  {
  	unsigned char irq;
  
  	pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq);
ffeff788d   Kristen Accardi   [PATCH] pci: stor...
813
  	dev->pin = irq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
814
815
816
817
  	if (irq)
  		pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
  	dev->irq = irq;
  }
bb209c828   Benjamin Herrenschmidt   powerpc/pci: Add ...
818
  void set_pcie_port_type(struct pci_dev *pdev)
480b93b78   Yu Zhao   PCI: centralize d...
819
820
821
822
823
824
825
826
  {
  	int pos;
  	u16 reg16;
  
  	pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
  	if (!pos)
  		return;
  	pdev->is_pcie = 1;
0efea0006   Kenji Kaneshige   PCI: cache PCIe c...
827
  	pdev->pcie_cap = pos;
480b93b78   Yu Zhao   PCI: centralize d...
828
829
  	pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
  	pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
830
831
  	pci_read_config_word(pdev, pos + PCI_EXP_DEVCAP, &reg16);
  	pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD;
480b93b78   Yu Zhao   PCI: centralize d...
832
  }
bb209c828   Benjamin Herrenschmidt   powerpc/pci: Add ...
833
  void set_pcie_hotplug_bridge(struct pci_dev *pdev)
28760489a   Eric W. Biederman   PCI: pcie: Ensure...
834
835
836
837
  {
  	int pos;
  	u16 reg16;
  	u32 reg32;
06a1cbafb   Kenji Kaneshige   PCI: use pci_pcie...
838
  	pos = pci_pcie_cap(pdev);
28760489a   Eric W. Biederman   PCI: pcie: Ensure...
839
840
841
842
843
844
845
846
847
  	if (!pos)
  		return;
  	pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
  	if (!(reg16 & PCI_EXP_FLAGS_SLOT))
  		return;
  	pci_read_config_dword(pdev, pos + PCI_EXP_SLTCAP, &reg32);
  	if (reg32 & PCI_EXP_SLTCAP_HPC)
  		pdev->is_hotplug_bridge = 1;
  }
01abc2aa0   Bartlomiej Zolnierkiewicz   Revert "adjust le...
848
  #define LEGACY_IO_RESOURCE	(IORESOURCE_IO | IORESOURCE_PCI_FIXED)
76e6a1d66   Randy Dunlap   [PATCH] pci/probe...
849

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
850
851
852
853
854
855
856
  /**
   * pci_setup_device - fill in class and map information of a device
   * @dev: the device structure to fill
   *
   * Initialize the device structure with information about the device's 
   * vendor,class,memory and IO-space addresses,IRQ lines etc.
   * Called at initialisation of the PCI subsystem and by CardBus services.
480b93b78   Yu Zhao   PCI: centralize d...
857
858
   * Returns 0 on success and negative if unknown type of device (not normal,
   * bridge or CardBus).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
859
   */
480b93b78   Yu Zhao   PCI: centralize d...
860
  int pci_setup_device(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
861
862
  {
  	u32 class;
480b93b78   Yu Zhao   PCI: centralize d...
863
864
  	u8 hdr_type;
  	struct pci_slot *slot;
bc577d2bb   Gabe Black   PCI: populate sub...
865
  	int pos = 0;
480b93b78   Yu Zhao   PCI: centralize d...
866
867
868
869
870
871
872
873
874
  
  	if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
  		return -EIO;
  
  	dev->sysdata = dev->bus->sysdata;
  	dev->dev.parent = dev->bus->bridge;
  	dev->dev.bus = &pci_bus_type;
  	dev->hdr_type = hdr_type & 0x7f;
  	dev->multifunction = !!(hdr_type & 0x80);
480b93b78   Yu Zhao   PCI: centralize d...
875
876
877
878
879
880
881
882
883
884
  	dev->error_state = pci_channel_io_normal;
  	set_pcie_port_type(dev);
  
  	list_for_each_entry(slot, &dev->bus->slots, list)
  		if (PCI_SLOT(dev->devfn) == slot->number)
  			dev->slot = slot;
  
  	/* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer)
  	   set this higher, assuming the system even supports it.  */
  	dev->dma_mask = 0xffffffff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
885

eebfcfb52   Greg Kroah-Hartman   PCI: handle pci_n...
886
887
888
  	dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus),
  		     dev->bus->number, PCI_SLOT(dev->devfn),
  		     PCI_FUNC(dev->devfn));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
889
890
  
  	pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
b8a3a5214   Auke Kok   PCI: read revisio...
891
  	dev->revision = class & 0xff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892
893
894
  	class >>= 8;				    /* upper 3 bytes */
  	dev->class = class;
  	class >>= 8;
2c6413aee   Bjorn Helgaas   PCI: log vendor/d...
895
896
897
  	dev_printk(KERN_DEBUG, &dev->dev, "[%04x:%04x] type %d class %#08x
  ",
  		   dev->vendor, dev->device, dev->hdr_type, class);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
898

853346e43   Yu Zhao   PCI: fix conflict...
899
900
  	/* need to have dev->class ready */
  	dev->cfg_size = pci_cfg_space_size(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
901
  	/* "Unknown power state" */
3fe9d19f9   Daniel Ritz   [PATCH] PCI: Supp...
902
  	dev->current_state = PCI_UNKNOWN;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
903
904
905
  
  	/* Early fixups, before probing the BARs */
  	pci_fixup_device(pci_fixup_early, dev);
f79b1b146   Yu Zhao   PCI: use fixed-up...
906
907
  	/* device class may be changed after fixup */
  	class = dev->class >> 8;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
908
909
910
911
912
913
914
915
916
  
  	switch (dev->hdr_type) {		    /* header type */
  	case PCI_HEADER_TYPE_NORMAL:		    /* standard header */
  		if (class == PCI_CLASS_BRIDGE_PCI)
  			goto bad;
  		pci_read_irq(dev);
  		pci_read_bases(dev, 6, PCI_ROM_ADDRESS);
  		pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
  		pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
368c73d4f   Alan Cox   PCI: quirks: fix ...
917
918
919
920
921
922
923
924
925
926
927
  
  		/*
  		 *	Do the ugly legacy mode stuff here rather than broken chip
  		 *	quirk code. Legacy mode ATA controllers have fixed
  		 *	addresses. These are not always echoed in BAR0-3, and
  		 *	BAR0-3 in a few cases contain junk!
  		 */
  		if (class == PCI_CLASS_STORAGE_IDE) {
  			u8 progif;
  			pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
  			if ((progif & 1) == 0) {
af1bff4f1   Linus Torvalds   Revert "PCI: fix ...
928
929
930
931
932
933
  				dev->resource[0].start = 0x1F0;
  				dev->resource[0].end = 0x1F7;
  				dev->resource[0].flags = LEGACY_IO_RESOURCE;
  				dev->resource[1].start = 0x3F6;
  				dev->resource[1].end = 0x3F6;
  				dev->resource[1].flags = LEGACY_IO_RESOURCE;
368c73d4f   Alan Cox   PCI: quirks: fix ...
934
935
  			}
  			if ((progif & 4) == 0) {
af1bff4f1   Linus Torvalds   Revert "PCI: fix ...
936
937
938
939
940
941
  				dev->resource[2].start = 0x170;
  				dev->resource[2].end = 0x177;
  				dev->resource[2].flags = LEGACY_IO_RESOURCE;
  				dev->resource[3].start = 0x376;
  				dev->resource[3].end = 0x376;
  				dev->resource[3].flags = LEGACY_IO_RESOURCE;
368c73d4f   Alan Cox   PCI: quirks: fix ...
942
943
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
944
945
946
947
948
949
950
951
  		break;
  
  	case PCI_HEADER_TYPE_BRIDGE:		    /* bridge header */
  		if (class != PCI_CLASS_BRIDGE_PCI)
  			goto bad;
  		/* The PCI-to-PCI bridge spec requires that subtractive
  		   decoding (i.e. transparent) bridge must have programming
  		   interface code of 0x01. */ 
3efd273b4   Kristen Accardi   [PATCH] pci: call...
952
  		pci_read_irq(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
954
  		dev->transparent = ((dev->class & 0xff) == 1);
  		pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
28760489a   Eric W. Biederman   PCI: pcie: Ensure...
955
  		set_pcie_hotplug_bridge(dev);
bc577d2bb   Gabe Black   PCI: populate sub...
956
957
958
959
960
  		pos = pci_find_capability(dev, PCI_CAP_ID_SSVID);
  		if (pos) {
  			pci_read_config_word(dev, pos + PCI_SSVID_VENDOR_ID, &dev->subsystem_vendor);
  			pci_read_config_word(dev, pos + PCI_SSVID_DEVICE_ID, &dev->subsystem_device);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
961
962
963
964
965
966
967
968
969
970
971
972
  		break;
  
  	case PCI_HEADER_TYPE_CARDBUS:		    /* CardBus bridge header */
  		if (class != PCI_CLASS_BRIDGE_CARDBUS)
  			goto bad;
  		pci_read_irq(dev);
  		pci_read_bases(dev, 1, 0);
  		pci_read_config_word(dev, PCI_CB_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
  		pci_read_config_word(dev, PCI_CB_SUBSYSTEM_ID, &dev->subsystem_device);
  		break;
  
  	default:				    /* unknown header */
80ccba118   Bjorn Helgaas   PCI: use dev_prin...
973
974
975
  		dev_err(&dev->dev, "unknown header type %02x, "
  			"ignoring device
  ", dev->hdr_type);
480b93b78   Yu Zhao   PCI: centralize d...
976
  		return -EIO;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
977
978
  
  	bad:
80ccba118   Bjorn Helgaas   PCI: use dev_prin...
979
980
981
  		dev_err(&dev->dev, "ignoring class %02x (doesn't match header "
  			"type %02x)
  ", class, dev->hdr_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
982
983
984
985
986
987
  		dev->class = PCI_CLASS_NOT_DEFINED;
  	}
  
  	/* We found a fine healthy device, go go go... */
  	return 0;
  }
201de56eb   Zhao, Yu   PCI: centralize t...
988
989
990
  static void pci_release_capabilities(struct pci_dev *dev)
  {
  	pci_vpd_release(dev);
d1b054da8   Yu Zhao   PCI: initialize a...
991
  	pci_iov_release(dev);
201de56eb   Zhao, Yu   PCI: centralize t...
992
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
  /**
   * pci_release_dev - free a pci device structure when all users of it are finished.
   * @dev: device that's been disconnected
   *
   * Will be called only by the device core when all users of this pci device are
   * done.
   */
  static void pci_release_dev(struct device *dev)
  {
  	struct pci_dev *pci_dev;
  
  	pci_dev = to_pci_dev(dev);
201de56eb   Zhao, Yu   PCI: centralize t...
1005
  	pci_release_capabilities(pci_dev);
98d9f30c8   Benjamin Herrenschmidt   pci/of: Match PCI...
1006
  	pci_release_of_node(pci_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
1008
1009
1010
1011
  	kfree(pci_dev);
  }
  
  /**
   * pci_cfg_space_size - get the configuration space size of the PCI device.
8f7020d36   Randy Dunlap   [PATCH] kernel-do...
1012
   * @dev: PCI device
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1013
1014
1015
1016
1017
1018
1019
1020
   *
   * Regular PCI devices have 256 bytes, but PCI-X 2 and PCI Express devices
   * have 4096 bytes.  Even if the device is capable, that doesn't mean we can
   * access it.  Maybe we don't have a way to generate extended config space
   * accesses, or the device is behind a reverse Express bridge.  So we try
   * reading the dword at 0x100 which must either be 0 or a valid extended
   * capability header.
   */
70b9f7dc1   Yinghai Lu   x86/pci: remove f...
1021
  int pci_cfg_space_size_ext(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1022
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1023
  	u32 status;
557848c3c   Zhao, Yu   PCI: replace cfg ...
1024
  	int pos = PCI_CFG_SPACE_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1025

557848c3c   Zhao, Yu   PCI: replace cfg ...
1026
  	if (pci_read_config_dword(dev, pos, &status) != PCIBIOS_SUCCESSFUL)
70b9f7dc1   Yinghai Lu   x86/pci: remove f...
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
  		goto fail;
  	if (status == 0xffffffff)
  		goto fail;
  
  	return PCI_CFG_SPACE_EXP_SIZE;
  
   fail:
  	return PCI_CFG_SPACE_SIZE;
  }
  
  int pci_cfg_space_size(struct pci_dev *dev)
  {
  	int pos;
  	u32 status;
dfadd9edf   Yinghai Lu   PCI/x86: detect h...
1041
1042
1043
1044
1045
  	u16 class;
  
  	class = dev->class >> 8;
  	if (class == PCI_CLASS_BRIDGE_HOST)
  		return pci_cfg_space_size_ext(dev);
57741a779   Yinghai Lu   x86_64: set cfg_s...
1046

06a1cbafb   Kenji Kaneshige   PCI: use pci_pcie...
1047
  	pos = pci_pcie_cap(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1048
1049
1050
1051
1052
1053
1054
1055
1056
  	if (!pos) {
  		pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
  		if (!pos)
  			goto fail;
  
  		pci_read_config_dword(dev, pos + PCI_X_STATUS, &status);
  		if (!(status & (PCI_X_STATUS_266MHZ | PCI_X_STATUS_533MHZ)))
  			goto fail;
  	}
70b9f7dc1   Yinghai Lu   x86/pci: remove f...
1057
  	return pci_cfg_space_size_ext(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1058
1059
1060
1061
1062
1063
1064
1065
1066
  
   fail:
  	return PCI_CFG_SPACE_SIZE;
  }
  
  static void pci_release_bus_bridge_dev(struct device *dev)
  {
  	kfree(dev);
  }
65891215e   Michael Ellerman   PCI: Create alloc...
1067
1068
1069
1070
1071
1072
1073
  struct pci_dev *alloc_pci_dev(void)
  {
  	struct pci_dev *dev;
  
  	dev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL);
  	if (!dev)
  		return NULL;
65891215e   Michael Ellerman   PCI: Create alloc...
1074
1075
1076
1077
1078
  	INIT_LIST_HEAD(&dev->bus_list);
  
  	return dev;
  }
  EXPORT_SYMBOL(alloc_pci_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1079
1080
1081
1082
  /*
   * Read the config data for a PCI device, sanity-check it
   * and fill in the dev structure...
   */
7f7b5de2c   Adrian Bunk   PCI: pci_scan_dev...
1083
  static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1084
1085
1086
  {
  	struct pci_dev *dev;
  	u32 l;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
  	int delay = 1;
  
  	if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
  		return NULL;
  
  	/* some broken boards return 0 or ~0 if a slot is empty: */
  	if (l == 0xffffffff || l == 0x00000000 ||
  	    l == 0x0000ffff || l == 0xffff0000)
  		return NULL;
  
  	/* Configuration request Retry Status */
  	while (l == 0xffff0001) {
  		msleep(delay);
  		delay *= 2;
  		if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
  			return NULL;
  		/* Card hasn't responded in 60 seconds?  Must be stuck. */
  		if (delay > 60 * 1000) {
80ccba118   Bjorn Helgaas   PCI: use dev_prin...
1105
  			printk(KERN_WARNING "pci %04x:%02x:%02x.%d: not "
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106
1107
1108
1109
1110
1111
1112
  					"responding
  ", pci_domain_nr(bus),
  					bus->number, PCI_SLOT(devfn),
  					PCI_FUNC(devfn));
  			return NULL;
  		}
  	}
bab41e9be   Michael Ellerman   PCI: Convert to a...
1113
  	dev = alloc_pci_dev();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1114
1115
  	if (!dev)
  		return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1116
  	dev->bus = bus;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1117
  	dev->devfn = devfn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1118
1119
  	dev->vendor = l & 0xffff;
  	dev->device = (l >> 16) & 0xffff;
cef354db0   Alex Chiang   PCI: connect stru...
1120

98d9f30c8   Benjamin Herrenschmidt   pci/of: Match PCI...
1121
  	pci_set_of_node(dev);
480b93b78   Yu Zhao   PCI: centralize d...
1122
  	if (pci_setup_device(dev)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1123
1124
1125
  		kfree(dev);
  		return NULL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1126
1127
1128
  
  	return dev;
  }
201de56eb   Zhao, Yu   PCI: centralize t...
1129
1130
1131
1132
  static void pci_init_capabilities(struct pci_dev *dev)
  {
  	/* MSI/MSI-X list */
  	pci_msi_init_pci_dev(dev);
63f4898ac   Rafael J. Wysocki   PCI: handle PCI s...
1133
1134
  	/* Buffers for saving PCIe and PCI-X capabilities */
  	pci_allocate_cap_save_buffers(dev);
201de56eb   Zhao, Yu   PCI: centralize t...
1135
1136
  	/* Power Management */
  	pci_pm_init(dev);
eb9c39d03   Jesse Barnes   PCI: set device w...
1137
  	platform_pci_wakeup_init(dev);
201de56eb   Zhao, Yu   PCI: centralize t...
1138
1139
1140
  
  	/* Vital Product Data */
  	pci_vpd_pci22_init(dev);
58c3a727c   Yu Zhao   PCI: support PCIe...
1141
1142
1143
  
  	/* Alternative Routing-ID Forwarding */
  	pci_enable_ari(dev);
d1b054da8   Yu Zhao   PCI: initialize a...
1144
1145
1146
  
  	/* Single Root I/O Virtualization */
  	pci_iov_init(dev);
ae21ee65e   Allen Kay   PCI: acs p2p upst...
1147
1148
  
  	/* Enable ACS P2P upstream forwarding */
5d990b627   Chris Wright   PCI: add pci_requ...
1149
  	pci_enable_acs(dev);
201de56eb   Zhao, Yu   PCI: centralize t...
1150
  }
96bde06a2   Sam Ravnborg   pci: do not mark ...
1151
  void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1152
  {
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1153
1154
1155
  	device_initialize(&dev->dev);
  	dev->dev.release = pci_release_dev;
  	pci_dev_get(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1156

cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1157
  	dev->dev.dma_mask = &dev->dma_mask;
4d57cdfac   FUJITA Tomonori   iommu sg merging:...
1158
  	dev->dev.dma_parms = &dev->dma_parms;
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1159
  	dev->dev.coherent_dma_mask = 0xffffffffull;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1160

4d57cdfac   FUJITA Tomonori   iommu sg merging:...
1161
  	pci_set_dma_max_seg_size(dev, 65536);
59fc67ded   FUJITA Tomonori   iommu sg merging:...
1162
  	pci_set_dma_seg_boundary(dev, 0xffffffff);
4d57cdfac   FUJITA Tomonori   iommu sg merging:...
1163

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1164
1165
  	/* Fix up broken headers */
  	pci_fixup_device(pci_fixup_header, dev);
4b77b0a2b   Rafael J. Wysocki   PCI: Clear saved_...
1166
1167
  	/* Clear the state_saved flag. */
  	dev->state_saved = false;
201de56eb   Zhao, Yu   PCI: centralize t...
1168
1169
  	/* Initialize various capabilities */
  	pci_init_capabilities(dev);
eb9d0fe40   Rafael J. Wysocki   PCI ACPI: Rework ...
1170

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1171
1172
1173
1174
  	/*
  	 * Add the device to our list of discovered devices
  	 * and the bus list for fixup functions, etc.
  	 */
d71374daf   Zhang Yanmin   [PATCH] PCI: fix ...
1175
  	down_write(&pci_bus_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1176
  	list_add_tail(&dev->bus_list, &bus->devices);
d71374daf   Zhang Yanmin   [PATCH] PCI: fix ...
1177
  	up_write(&pci_bus_sem);
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1178
  }
451124a7c   Sam Ravnborg   PCI: fix 4x secti...
1179
  struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn)
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1180
1181
  {
  	struct pci_dev *dev;
90bdb3117   Trent Piepho   PCI: don't scan e...
1182
1183
1184
1185
1186
  	dev = pci_get_slot(bus, devfn);
  	if (dev) {
  		pci_dev_put(dev);
  		return dev;
  	}
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1187
1188
1189
1190
1191
  	dev = pci_scan_device(bus, devfn);
  	if (!dev)
  		return NULL;
  
  	pci_device_add(dev, bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1192
1193
1194
  
  	return dev;
  }
b73e96878   Adrian Bunk   PCI: always expor...
1195
  EXPORT_SYMBOL(pci_scan_single_device);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1196

f07852d64   Matthew Wilcox   PCI: Rewrite pci_...
1197
1198
1199
  static unsigned next_ari_fn(struct pci_dev *dev, unsigned fn)
  {
  	u16 cap;
4fb88c1a2   Matthew Wilcox   PCI: Make pci_sca...
1200
1201
1202
1203
1204
1205
  	unsigned pos, next_fn;
  
  	if (!dev)
  		return 0;
  
  	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI);
f07852d64   Matthew Wilcox   PCI: Rewrite pci_...
1206
1207
1208
  	if (!pos)
  		return 0;
  	pci_read_config_word(dev, pos + 4, &cap);
4fb88c1a2   Matthew Wilcox   PCI: Make pci_sca...
1209
1210
1211
1212
  	next_fn = cap >> 8;
  	if (next_fn <= fn)
  		return 0;
  	return next_fn;
f07852d64   Matthew Wilcox   PCI: Rewrite pci_...
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
  }
  
  static unsigned next_trad_fn(struct pci_dev *dev, unsigned fn)
  {
  	return (fn + 1) % 8;
  }
  
  static unsigned no_next_fn(struct pci_dev *dev, unsigned fn)
  {
  	return 0;
  }
  
  static int only_one_child(struct pci_bus *bus)
  {
  	struct pci_dev *parent = bus->self;
  	if (!parent || !pci_is_pcie(parent))
  		return 0;
  	if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
  	    parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
  		return 1;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1235
1236
1237
1238
1239
1240
1241
  /**
   * pci_scan_slot - scan a PCI slot on a bus for devices.
   * @bus: PCI bus to scan
   * @devfn: slot number to scan (must have zero function.)
   *
   * Scan a PCI slot on the specified PCI bus for devices, adding
   * discovered devices to the @bus->devices list.  New devices
8a1bc9013   Greg Kroah-Hartman   PCI: add is_added...
1242
   * will not have is_added set.
1b69dfc64   Trent Piepho   PCI: pci_scan_slo...
1243
1244
   *
   * Returns the number of new devices found.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1245
   */
96bde06a2   Sam Ravnborg   pci: do not mark ...
1246
  int pci_scan_slot(struct pci_bus *bus, int devfn)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1247
  {
f07852d64   Matthew Wilcox   PCI: Rewrite pci_...
1248
  	unsigned fn, nr = 0;
1b69dfc64   Trent Piepho   PCI: pci_scan_slo...
1249
  	struct pci_dev *dev;
f07852d64   Matthew Wilcox   PCI: Rewrite pci_...
1250
1251
1252
1253
  	unsigned (*next_fn)(struct pci_dev *, unsigned) = no_next_fn;
  
  	if (only_one_child(bus) && (devfn > 0))
  		return 0; /* Already scanned the entire slot */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1254

1b69dfc64   Trent Piepho   PCI: pci_scan_slo...
1255
  	dev = pci_scan_single_device(bus, devfn);
4fb88c1a2   Matthew Wilcox   PCI: Make pci_sca...
1256
1257
1258
  	if (!dev)
  		return 0;
  	if (!dev->is_added)
1b69dfc64   Trent Piepho   PCI: pci_scan_slo...
1259
  		nr++;
f07852d64   Matthew Wilcox   PCI: Rewrite pci_...
1260
1261
  	if (pci_ari_enabled(bus))
  		next_fn = next_ari_fn;
4fb88c1a2   Matthew Wilcox   PCI: Make pci_sca...
1262
  	else if (dev->multifunction)
f07852d64   Matthew Wilcox   PCI: Rewrite pci_...
1263
1264
1265
1266
1267
1268
1269
1270
  		next_fn = next_trad_fn;
  
  	for (fn = next_fn(dev, 0); fn > 0; fn = next_fn(dev, fn)) {
  		dev = pci_scan_single_device(bus, devfn + fn);
  		if (dev) {
  			if (!dev->is_added)
  				nr++;
  			dev->multifunction = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1271
1272
  		}
  	}
7d715a6c1   Shaohua Li   PCI: add PCI Expr...
1273

149e16372   Shaohua Li   PCI: disable ASPM...
1274
1275
  	/* only one slot has pcie device */
  	if (bus->self && nr)
7d715a6c1   Shaohua Li   PCI: add PCI Expr...
1276
  		pcie_aspm_init_link_state(bus->self);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1277
1278
  	return nr;
  }
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
  static int pcie_find_smpss(struct pci_dev *dev, void *data)
  {
  	u8 *smpss = data;
  
  	if (!pci_is_pcie(dev))
  		return 0;
  
  	/* For PCIE hotplug enabled slots not connected directly to a
  	 * PCI-E root port, there can be problems when hotplugging
  	 * devices.  This is due to the possibility of hotplugging a
  	 * device into the fabric with a smaller MPS that the devices
  	 * currently running have configured.  Modifying the MPS on the
  	 * running devices could cause a fatal bus error due to an
  	 * incoming frame being larger than the newly configured MPS.
  	 * To work around this, the MPS for the entire fabric must be
  	 * set to the minimum size.  Any devices hotplugged into this
  	 * fabric will have the minimum MPS set.  If the PCI hotplug
  	 * slot is directly connected to the root port and there are not
  	 * other devices on the fabric (which seems to be the most
  	 * common case), then this is not an issue and MPS discovery
  	 * will occur as normal.
  	 */
  	if (dev->is_hotplug_bridge && (!list_is_singular(&dev->bus->devices) ||
1a4b1a41b   Benjamin Herrenschmidt   pci: Don't crash ...
1302
1303
  	     (dev->bus->self &&
  	      dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT)))
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
  		*smpss = 0;
  
  	if (*smpss > dev->pcie_mpss)
  		*smpss = dev->pcie_mpss;
  
  	return 0;
  }
  
  static void pcie_write_mps(struct pci_dev *dev, int mps)
  {
62f392ea5   Jon Mason   PCI: enable MPS "...
1314
  	int rc;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1315
1316
  
  	if (pcie_bus_config == PCIE_BUS_PERFORMANCE) {
62f392ea5   Jon Mason   PCI: enable MPS "...
1317
  		mps = 128 << dev->pcie_mpss;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1318

62f392ea5   Jon Mason   PCI: enable MPS "...
1319
1320
  		if (dev->pcie_type != PCI_EXP_TYPE_ROOT_PORT && dev->bus->self)
  			/* For "Performance", the assumption is made that
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1321
1322
1323
1324
1325
  			 * downstream communication will never be larger than
  			 * the MRRS.  So, the MPS only needs to be configured
  			 * for the upstream communication.  This being the case,
  			 * walk from the top down and set the MPS of the child
  			 * to that of the parent bus.
62f392ea5   Jon Mason   PCI: enable MPS "...
1326
1327
1328
1329
1330
  			 *
  			 * Configure the device MPS with the smaller of the
  			 * device MPSS or the bridge MPS (which is assumed to be
  			 * properly configured at this point to the largest
  			 * allowable MPS based on its parent bus).
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1331
  			 */
62f392ea5   Jon Mason   PCI: enable MPS "...
1332
  			mps = min(mps, pcie_get_mps(dev->bus->self));
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1333
1334
1335
1336
1337
1338
1339
  	}
  
  	rc = pcie_set_mps(dev, mps);
  	if (rc)
  		dev_err(&dev->dev, "Failed attempting to set the MPS
  ");
  }
62f392ea5   Jon Mason   PCI: enable MPS "...
1340
  static void pcie_write_mrrs(struct pci_dev *dev)
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1341
  {
62f392ea5   Jon Mason   PCI: enable MPS "...
1342
  	int rc, mrrs;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1343

ed2888e90   Jon Mason   PCI: Remove MRRS ...
1344
1345
1346
  	/* In the "safe" case, do not configure the MRRS.  There appear to be
  	 * issues with setting MRRS to 0 on a number of devices.
  	 */
ed2888e90   Jon Mason   PCI: Remove MRRS ...
1347
1348
  	if (pcie_bus_config != PCIE_BUS_PERFORMANCE)
  		return;
ed2888e90   Jon Mason   PCI: Remove MRRS ...
1349
1350
  	/* For Max performance, the MRRS must be set to the largest supported
  	 * value.  However, it cannot be configured larger than the MPS the
62f392ea5   Jon Mason   PCI: enable MPS "...
1351
1352
  	 * device or the bus can support.  This should already be properly
  	 * configured by a prior call to pcie_write_mps.
ed2888e90   Jon Mason   PCI: Remove MRRS ...
1353
  	 */
62f392ea5   Jon Mason   PCI: enable MPS "...
1354
  	mrrs = pcie_get_mps(dev);
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1355
1356
  
  	/* MRRS is a R/W register.  Invalid values can be written, but a
ed2888e90   Jon Mason   PCI: Remove MRRS ...
1357
  	 * subsequent read will verify if the value is acceptable or not.
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1358
1359
1360
1361
1362
  	 * If the MRRS value provided is not acceptable (e.g., too large),
  	 * shrink the value until it is acceptable to the HW.
   	 */
  	while (mrrs != pcie_get_readrq(dev) && mrrs >= 128) {
  		rc = pcie_set_readrq(dev, mrrs);
62f392ea5   Jon Mason   PCI: enable MPS "...
1363
1364
  		if (!rc)
  			break;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1365

62f392ea5   Jon Mason   PCI: enable MPS "...
1366
1367
  		dev_warn(&dev->dev, "Failed attempting to set the MRRS
  ");
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1368
1369
  		mrrs /= 2;
  	}
62f392ea5   Jon Mason   PCI: enable MPS "...
1370
1371
1372
1373
1374
1375
  
  	if (mrrs < 128)
  		dev_err(&dev->dev, "MRRS was unable to be configured with a "
  			"safe value.  If problems are experienced, try running "
  			"with pci=pcie_bus_safe.
  ");
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1376
1377
1378
1379
  }
  
  static int pcie_bus_configure_set(struct pci_dev *dev, void *data)
  {
a513a99a7   Jon Mason   PCI: Clean-up MPS...
1380
  	int mps, orig_mps;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1381
1382
1383
  
  	if (!pci_is_pcie(dev))
  		return 0;
a513a99a7   Jon Mason   PCI: Clean-up MPS...
1384
1385
  	mps = 128 << *(u8 *)data;
  	orig_mps = pcie_get_mps(dev);
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1386
1387
  
  	pcie_write_mps(dev, mps);
62f392ea5   Jon Mason   PCI: enable MPS "...
1388
  	pcie_write_mrrs(dev);
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1389

a513a99a7   Jon Mason   PCI: Clean-up MPS...
1390
1391
1392
1393
  	dev_info(&dev->dev, "PCI-E Max Payload Size set to %4d/%4d (was %4d), "
  		 "Max Read Rq %4d
  ", pcie_get_mps(dev), 128 << dev->pcie_mpss,
  		 orig_mps, pcie_get_readrq(dev));
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1394
1395
1396
  
  	return 0;
  }
a513a99a7   Jon Mason   PCI: Clean-up MPS...
1397
  /* pcie_bus_configure_settings requires that pci_walk_bus work in a top-down,
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1398
1399
1400
1401
1402
   * parents then children fashion.  If this changes, then this code will not
   * work as designed.
   */
  void pcie_bus_configure_settings(struct pci_bus *bus, u8 mpss)
  {
5f39e6705   Jon Mason   PCI: Disable MPS ...
1403
  	u8 smpss;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1404

b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1405
1406
  	if (!pci_is_pcie(bus->self))
  		return;
5f39e6705   Jon Mason   PCI: Disable MPS ...
1407
1408
1409
1410
1411
1412
1413
1414
1415
  	if (pcie_bus_config == PCIE_BUS_TUNE_OFF)
  		return;
  
  	/* FIXME - Peer to peer DMA is possible, though the endpoint would need
  	 * to be aware to the MPS of the destination.  To work around this,
  	 * simply force the MPS of the entire system to the smallest possible.
  	 */
  	if (pcie_bus_config == PCIE_BUS_PEER2PEER)
  		smpss = 0;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1416
  	if (pcie_bus_config == PCIE_BUS_SAFE) {
5f39e6705   Jon Mason   PCI: Disable MPS ...
1417
  		smpss = mpss;
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1418
1419
1420
1421
1422
1423
1424
  		pcie_find_smpss(bus->self, &smpss);
  		pci_walk_bus(bus, pcie_find_smpss, &smpss);
  	}
  
  	pcie_bus_configure_set(bus->self, &smpss);
  	pci_walk_bus(bus, pcie_bus_configure_set, &smpss);
  }
debc3b778   Jon Mason   PCI: export pcie_...
1425
  EXPORT_SYMBOL_GPL(pcie_bus_configure_settings);
b03e7495a   Jon Mason   PCI: Set PCI-E Ma...
1426

0ab2b57f8   Sam Ravnborg   PCI: fix section ...
1427
  unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1428
1429
1430
  {
  	unsigned int devfn, pass, max = bus->secondary;
  	struct pci_dev *dev;
0207c356e   Bjorn Helgaas   PCI: replace pr_d...
1431
1432
  	dev_dbg(&bus->dev, "scanning bus
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1433
1434
1435
1436
  
  	/* Go find them, Rover! */
  	for (devfn = 0; devfn < 0x100; devfn += 8)
  		pci_scan_slot(bus, devfn);
a28724b0f   Yu Zhao   PCI: reserve bus ...
1437
1438
  	/* Reserve buses for SR-IOV capability. */
  	max += pci_iov_bus_range(bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1439
1440
1441
1442
  	/*
  	 * After performing arch-dependent fixup of the bus, look behind
  	 * all PCI-to-PCI bridges on this bus.
  	 */
74710ded8   Alex Chiang   PCI: always scan ...
1443
  	if (!bus->is_added) {
0207c356e   Bjorn Helgaas   PCI: replace pr_d...
1444
1445
  		dev_dbg(&bus->dev, "fixups for bus
  ");
74710ded8   Alex Chiang   PCI: always scan ...
1446
1447
1448
1449
  		pcibios_fixup_bus(bus);
  		if (pci_is_root_bus(bus))
  			bus->is_added = 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
  	for (pass=0; pass < 2; pass++)
  		list_for_each_entry(dev, &bus->devices, bus_list) {
  			if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
  			    dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
  				max = pci_scan_bridge(bus, dev, max, pass);
  		}
  
  	/*
  	 * We've scanned the bus and so we know all about what's on
  	 * the other side of any bridges that may be on this bus plus
  	 * any devices.
  	 *
  	 * Return how far we've got finding sub-buses.
  	 */
0207c356e   Bjorn Helgaas   PCI: replace pr_d...
1464
1465
  	dev_dbg(&bus->dev, "bus scan returning with max=%02x
  ", max);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1466
1467
  	return max;
  }
166c63707   Bjorn Helgaas   PCI: add pci_crea...
1468
1469
  struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
  		struct pci_ops *ops, void *sysdata, struct list_head *resources)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1470
  {
a9d9f5276   Bjorn Helgaas   PCI: show host br...
1471
  	int error, i;
0207c356e   Bjorn Helgaas   PCI: replace pr_d...
1472
  	struct pci_bus *b, *b2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1473
  	struct device *dev;
166c63707   Bjorn Helgaas   PCI: add pci_crea...
1474
  	struct pci_bus_resource *bus_res, *n;
a9d9f5276   Bjorn Helgaas   PCI: show host br...
1475
  	struct resource *res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1476
1477
1478
1479
  
  	b = pci_alloc_bus();
  	if (!b)
  		return NULL;
6a3b3e268   Geert Uytterhoeven   PCI: Use kzalloc(...
1480
  	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
68e35c9b0   Zac Storer   PCI: fix a brace ...
1481
  	if (!dev) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1482
1483
1484
1485
1486
1487
  		kfree(b);
  		return NULL;
  	}
  
  	b->sysdata = sysdata;
  	b->ops = ops;
0207c356e   Bjorn Helgaas   PCI: replace pr_d...
1488
1489
  	b2 = pci_find_bus(pci_domain_nr(b), bus);
  	if (b2) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1490
  		/* If we already got to this bus through a different bridge, ignore it */
0207c356e   Bjorn Helgaas   PCI: replace pr_d...
1491
1492
  		dev_dbg(&b2->dev, "bus already known
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1493
1494
  		goto err_out;
  	}
d71374daf   Zhang Yanmin   [PATCH] PCI: fix ...
1495
1496
  
  	down_write(&pci_bus_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1497
  	list_add_tail(&b->node, &pci_root_buses);
d71374daf   Zhang Yanmin   [PATCH] PCI: fix ...
1498
  	up_write(&pci_bus_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1499

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1500
1501
  	dev->parent = parent;
  	dev->release = pci_release_bus_bridge_dev;
1a9271331   Kay Sievers   PCI: struct devic...
1502
  	dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1503
1504
1505
1506
  	error = device_register(dev);
  	if (error)
  		goto dev_reg_err;
  	b->bridge = get_device(dev);
a1e4d72cd   Rafael J. Wysocki   PM: Allow PCI dev...
1507
  	device_enable_async_suspend(b->bridge);
98d9f30c8   Benjamin Herrenschmidt   pci/of: Match PCI...
1508
  	pci_set_bus_of_node(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1509

0d358f22f   Yinghai Lu   driver core: try ...
1510
1511
  	if (!parent)
  		set_dev_node(b->bridge, pcibus_to_node(b));
fd7d1ced2   Greg Kroah-Hartman   PCI: make pci_bus...
1512
1513
  	b->dev.class = &pcibus_class;
  	b->dev.parent = b->bridge;
1a9271331   Kay Sievers   PCI: struct devic...
1514
  	dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
fd7d1ced2   Greg Kroah-Hartman   PCI: make pci_bus...
1515
  	error = device_register(&b->dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1516
1517
  	if (error)
  		goto class_dev_reg_err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1518
1519
1520
  
  	/* Create legacy_io and legacy_mem files for this bus */
  	pci_create_legacy_files(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1521
  	b->number = b->secondary = bus;
166c63707   Bjorn Helgaas   PCI: add pci_crea...
1522
1523
1524
1525
  
  	/* Add initial resources to the bus */
  	list_for_each_entry_safe(bus_res, n, resources, list)
  		list_move_tail(&bus_res->list, &b->resources);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1526

a9d9f5276   Bjorn Helgaas   PCI: show host br...
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
  	if (parent)
  		dev_info(parent, "PCI host bridge to bus %s
  ", dev_name(&b->dev));
  	else
  		printk(KERN_INFO "PCI host bridge to bus %s
  ", dev_name(&b->dev));
  
  	pci_bus_for_each_resource(b, res, i) {
  		if (res)
  			dev_info(&b->dev, "root bus resource %pR
  ", res);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1539
  	return b;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1540
1541
1542
  class_dev_reg_err:
  	device_unregister(dev);
  dev_reg_err:
d71374daf   Zhang Yanmin   [PATCH] PCI: fix ...
1543
  	down_write(&pci_bus_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1544
  	list_del(&b->node);
d71374daf   Zhang Yanmin   [PATCH] PCI: fix ...
1545
  	up_write(&pci_bus_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1546
1547
1548
1549
1550
  err_out:
  	kfree(dev);
  	kfree(b);
  	return NULL;
  }
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1551

a2ebb8279   Bjorn Helgaas   PCI: add pci_scan...
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
  struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus,
  		struct pci_ops *ops, void *sysdata, struct list_head *resources)
  {
  	struct pci_bus *b;
  
  	b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
  	if (!b)
  		return NULL;
  
  	b->subordinate = pci_scan_child_bus(b);
  	pci_bus_add_devices(b);
  	return b;
  }
  EXPORT_SYMBOL(pci_scan_root_bus);
7e00fe2e5   Bjorn Helgaas   PCI: deprecate pc...
1566
  /* Deprecated; use pci_scan_root_bus() instead */
0ab2b57f8   Sam Ravnborg   PCI: fix section ...
1567
  struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent,
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1568
1569
  		int bus, struct pci_ops *ops, void *sysdata)
  {
1e39ae9f9   Bjorn Helgaas   PCI: convert pci_...
1570
  	LIST_HEAD(resources);
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1571
  	struct pci_bus *b;
1e39ae9f9   Bjorn Helgaas   PCI: convert pci_...
1572
1573
1574
  	pci_add_resource(&resources, &ioport_resource);
  	pci_add_resource(&resources, &iomem_resource);
  	b = pci_create_root_bus(parent, bus, ops, sysdata, &resources);
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1575
1576
  	if (b)
  		b->subordinate = pci_scan_child_bus(b);
1e39ae9f9   Bjorn Helgaas   PCI: convert pci_...
1577
1578
  	else
  		pci_free_resource_list(&resources);
cdb9b9f73   Paul Mackerras   [PATCH] PCI: Smal...
1579
1580
  	return b;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1581
  EXPORT_SYMBOL(pci_scan_bus_parented);
de4b2f76d   Bjorn Helgaas   PCI: convert pci_...
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
  struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *ops,
  					void *sysdata)
  {
  	LIST_HEAD(resources);
  	struct pci_bus *b;
  
  	pci_add_resource(&resources, &ioport_resource);
  	pci_add_resource(&resources, &iomem_resource);
  	b = pci_create_root_bus(NULL, bus, ops, sysdata, &resources);
  	if (b) {
  		b->subordinate = pci_scan_child_bus(b);
  		pci_bus_add_devices(b);
  	} else {
  		pci_free_resource_list(&resources);
  	}
  	return b;
  }
  EXPORT_SYMBOL(pci_scan_bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1600
  #ifdef CONFIG_HOTPLUG
3ed4fd96b   Alex Chiang   PCI: Introduce pc...
1601
1602
1603
1604
1605
1606
1607
1608
1609
  /**
   * pci_rescan_bus - scan a PCI bus for devices.
   * @bus: PCI bus to scan
   *
   * Scan a PCI bus and child buses for new devices, adds them,
   * and enables them.
   *
   * Returns the max number of subordinate bus discovered.
   */
5446a6bdb   Alex Chiang   PCI: annotate pci...
1610
  unsigned int __ref pci_rescan_bus(struct pci_bus *bus)
3ed4fd96b   Alex Chiang   PCI: Introduce pc...
1611
1612
1613
1614
1615
  {
  	unsigned int max;
  	struct pci_dev *dev;
  
  	max = pci_scan_child_bus(bus);
705b1aaa8   Alex Chiang   PCI: Introduce /s...
1616
  	down_read(&pci_bus_sem);
3ed4fd96b   Alex Chiang   PCI: Introduce pc...
1617
1618
1619
1620
1621
  	list_for_each_entry(dev, &bus->devices, bus_list)
  		if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
  		    dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
  			if (dev->subordinate)
  				pci_bus_size_bridges(dev->subordinate);
705b1aaa8   Alex Chiang   PCI: Introduce /s...
1622
  	up_read(&pci_bus_sem);
3ed4fd96b   Alex Chiang   PCI: Introduce pc...
1623
1624
1625
1626
1627
1628
1629
1630
  
  	pci_bus_assign_resources(bus);
  	pci_enable_bridges(bus);
  	pci_bus_add_devices(bus);
  
  	return max;
  }
  EXPORT_SYMBOL_GPL(pci_rescan_bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1631
  EXPORT_SYMBOL(pci_add_new_bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1632
1633
  EXPORT_SYMBOL(pci_scan_slot);
  EXPORT_SYMBOL(pci_scan_bridge);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1634
1635
  EXPORT_SYMBOL_GPL(pci_scan_child_bus);
  #endif
6b4b78fed   Matt Domsch   PCI: optionally s...
1636

99178b036   Greg Kroah-Hartman   Driver core: add ...
1637
  static int __init pci_sort_bf_cmp(const struct device *d_a, const struct device *d_b)
6b4b78fed   Matt Domsch   PCI: optionally s...
1638
  {
99178b036   Greg Kroah-Hartman   Driver core: add ...
1639
1640
  	const struct pci_dev *a = to_pci_dev(d_a);
  	const struct pci_dev *b = to_pci_dev(d_b);
6b4b78fed   Matt Domsch   PCI: optionally s...
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
  	if      (pci_domain_nr(a->bus) < pci_domain_nr(b->bus)) return -1;
  	else if (pci_domain_nr(a->bus) > pci_domain_nr(b->bus)) return  1;
  
  	if      (a->bus->number < b->bus->number) return -1;
  	else if (a->bus->number > b->bus->number) return  1;
  
  	if      (a->devfn < b->devfn) return -1;
  	else if (a->devfn > b->devfn) return  1;
  
  	return 0;
  }
5ff580c10   Greg Kroah-Hartman   PCI: remove globa...
1652
  void __init pci_sort_breadthfirst(void)
6b4b78fed   Matt Domsch   PCI: optionally s...
1653
  {
99178b036   Greg Kroah-Hartman   Driver core: add ...
1654
  	bus_sort_breadthfirst(&pci_bus_type, &pci_sort_bf_cmp);
6b4b78fed   Matt Domsch   PCI: optionally s...
1655
  }