blob: 3f07cb6bae326f11db10428d18b011878f3feac0 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * probe.c - PCI detection and setup code
3 */
4
5#include <linux/kernel.h>
6#include <linux/delay.h>
7#include <linux/init.h>
8#include <linux/pci.h>
9#include <linux/slab.h>
10#include <linux/module.h>
11#include <linux/cpumask.h>
Shaohua Li7d715a62008-02-25 09:46:41 +080012#include <linux/pci-aspm.h>
Greg KHbc56b9e2005-04-08 14:53:31 +090013#include "pci.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070014
15#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
16#define CARDBUS_RESERVE_BUSNR 3
Linus Torvalds1da177e2005-04-16 15:20:36 -070017
Bjorn Helgaas5a21d702012-02-23 20:18:59 -070018static LIST_HEAD(pci_host_bridges);
19
Linus Torvalds1da177e2005-04-16 15:20:36 -070020/* Ugh. Need to stop exporting this to modules. */
21LIST_HEAD(pci_root_buses);
22EXPORT_SYMBOL(pci_root_buses);
23
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080024
25static int find_anything(struct device *dev, void *data)
26{
27 return 1;
28}
Linus Torvalds1da177e2005-04-16 15:20:36 -070029
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070030/*
31 * Some device drivers need know if pci is initiated.
32 * Basically, we think pci is not initiated when there
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080033 * is no device to be found on the pci_bus_type.
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070034 */
35int no_pci_devices(void)
36{
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080037 struct device *dev;
38 int no_devices;
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070039
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080040 dev = bus_find_device(&pci_bus_type, NULL, NULL, find_anything);
41 no_devices = (dev == NULL);
42 put_device(dev);
43 return no_devices;
44}
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070045EXPORT_SYMBOL(no_pci_devices);
46
Bjorn Helgaas5a21d702012-02-23 20:18:59 -070047static struct pci_host_bridge *pci_host_bridge(struct pci_dev *dev)
48{
49 struct pci_bus *bus;
50 struct pci_host_bridge *bridge;
51
52 bus = dev->bus;
53 while (bus->parent)
54 bus = bus->parent;
55
56 list_for_each_entry(bridge, &pci_host_bridges, list) {
57 if (bridge->bus == bus)
58 return bridge;
59 }
60
61 return NULL;
62}
63
Linus Torvalds1da177e2005-04-16 15:20:36 -070064/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070065 * PCI Bus Class
66 */
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040067static void release_pcibus_dev(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -070068{
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040069 struct pci_bus *pci_bus = to_pci_bus(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070070
71 if (pci_bus->bridge)
72 put_device(pci_bus->bridge);
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -070073 pci_bus_remove_resources(pci_bus);
Benjamin Herrenschmidt98d9f30c82011-04-11 11:37:07 +100074 pci_release_bus_of_node(pci_bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -070075 kfree(pci_bus);
76}
77
78static struct class pcibus_class = {
79 .name = "pci_bus",
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040080 .dev_release = &release_pcibus_dev,
Yinghai Lub9d320f2011-05-12 17:11:39 -070081 .dev_attrs = pcibus_dev_attrs,
Linus Torvalds1da177e2005-04-16 15:20:36 -070082};
83
84static int __init pcibus_class_init(void)
85{
86 return class_register(&pcibus_class);
87}
88postcore_initcall(pcibus_class_init);
89
Matthew Wilcox6ac665c2008-07-28 13:38:59 -040090static u64 pci_size(u64 base, u64 maxbase, u64 mask)
Yinghai Lu07eddf32006-11-29 13:53:10 -080091{
92 u64 size = mask & maxbase; /* Find the significant bits */
93 if (!size)
94 return 0;
95
96 /* Get the lowest of them to find the decode size, and
97 from that the extent. */
98 size = (size & ~(size-1)) - 1;
99
100 /* base == maxbase can be valid only if the BAR has
101 already been programmed with all 1s. */
102 if (base == maxbase && ((base | size) & mask) != mask)
103 return 0;
104
105 return size;
106}
107
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600108static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar)
Yinghai Lu07eddf32006-11-29 13:53:10 -0800109{
Bjorn Helgaas8d6a6a42011-06-14 13:04:29 -0600110 u32 mem_type;
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600111 unsigned long flags;
Bjorn Helgaas8d6a6a42011-06-14 13:04:29 -0600112
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400113 if ((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600114 flags = bar & ~PCI_BASE_ADDRESS_IO_MASK;
115 flags |= IORESOURCE_IO;
116 return flags;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400117 }
118
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600119 flags = bar & ~PCI_BASE_ADDRESS_MEM_MASK;
120 flags |= IORESOURCE_MEM;
121 if (flags & PCI_BASE_ADDRESS_MEM_PREFETCH)
122 flags |= IORESOURCE_PREFETCH;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400123
Bjorn Helgaas8d6a6a42011-06-14 13:04:29 -0600124 mem_type = bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK;
125 switch (mem_type) {
126 case PCI_BASE_ADDRESS_MEM_TYPE_32:
127 break;
128 case PCI_BASE_ADDRESS_MEM_TYPE_1M:
129 dev_info(&dev->dev, "1M mem BAR treated as 32-bit BAR\n");
130 break;
131 case PCI_BASE_ADDRESS_MEM_TYPE_64:
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600132 flags |= IORESOURCE_MEM_64;
133 break;
Bjorn Helgaas8d6a6a42011-06-14 13:04:29 -0600134 default:
135 dev_warn(&dev->dev,
136 "mem unknown type %x treated as 32-bit BAR\n",
137 mem_type);
138 break;
139 }
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600140 return flags;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400141}
142
Yu Zhao0b400c72008-11-22 02:40:40 +0800143/**
144 * pci_read_base - read a PCI BAR
145 * @dev: the PCI device
146 * @type: type of the BAR
147 * @res: resource buffer to be filled in
148 * @pos: BAR position in the config space
149 *
150 * Returns 1 if the BAR is 64-bit, or 0 if 32-bit.
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400151 */
Yu Zhao0b400c72008-11-22 02:40:40 +0800152int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400153 struct resource *res, unsigned int pos)
154{
155 u32 l, sz, mask;
Jacob Pan253d2e52010-07-16 10:19:22 -0700156 u16 orig_cmd;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400157
Michael S. Tsirkin1ed67432009-10-29 17:24:59 +0200158 mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400159
Jacob Pan253d2e52010-07-16 10:19:22 -0700160 if (!dev->mmio_always_on) {
161 pci_read_config_word(dev, PCI_COMMAND, &orig_cmd);
162 pci_write_config_word(dev, PCI_COMMAND,
163 orig_cmd & ~(PCI_COMMAND_MEMORY | PCI_COMMAND_IO));
164 }
165
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400166 res->name = pci_name(dev);
167
168 pci_read_config_dword(dev, pos, &l);
Michael S. Tsirkin1ed67432009-10-29 17:24:59 +0200169 pci_write_config_dword(dev, pos, l | mask);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400170 pci_read_config_dword(dev, pos, &sz);
171 pci_write_config_dword(dev, pos, l);
172
Jacob Pan253d2e52010-07-16 10:19:22 -0700173 if (!dev->mmio_always_on)
174 pci_write_config_word(dev, PCI_COMMAND, orig_cmd);
175
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400176 /*
177 * All bits set in sz means the device isn't working properly.
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600178 * If the BAR isn't implemented, all bits must be 0. If it's a
179 * memory BAR or a ROM, bit 0 must be clear; if it's an io BAR, bit
180 * 1 must be clear.
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400181 */
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600182 if (!sz || sz == 0xffffffff)
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400183 goto fail;
184
185 /*
186 * I don't know how l can have all bits set. Copied from old code.
187 * Maybe it fixes a bug on some ancient platform.
188 */
189 if (l == 0xffffffff)
190 l = 0;
191
192 if (type == pci_bar_unknown) {
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600193 res->flags = decode_bar(dev, l);
194 res->flags |= IORESOURCE_SIZEALIGN;
195 if (res->flags & IORESOURCE_IO) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400196 l &= PCI_BASE_ADDRESS_IO_MASK;
David S. Miller5aceca92011-05-23 17:12:22 -0700197 mask = PCI_BASE_ADDRESS_IO_MASK & (u32) IO_SPACE_LIMIT;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400198 } else {
199 l &= PCI_BASE_ADDRESS_MEM_MASK;
200 mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
201 }
202 } else {
203 res->flags |= (l & IORESOURCE_ROM_ENABLE);
204 l &= PCI_ROM_ADDRESS_MASK;
205 mask = (u32)PCI_ROM_ADDRESS_MASK;
206 }
207
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600208 if (res->flags & IORESOURCE_MEM_64) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400209 u64 l64 = l;
210 u64 sz64 = sz;
211 u64 mask64 = mask | (u64)~0 << 32;
212
213 pci_read_config_dword(dev, pos + 4, &l);
214 pci_write_config_dword(dev, pos + 4, ~0);
215 pci_read_config_dword(dev, pos + 4, &sz);
216 pci_write_config_dword(dev, pos + 4, l);
217
218 l64 |= ((u64)l << 32);
219 sz64 |= ((u64)sz << 32);
220
221 sz64 = pci_size(l64, sz64, mask64);
222
223 if (!sz64)
224 goto fail;
225
Matthew Wilcoxcc5499c2008-07-28 13:39:00 -0400226 if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) {
Bjorn Helgaas865df572009-11-04 10:32:57 -0700227 dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n",
228 pos);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400229 goto fail;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600230 }
231
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600232 if ((sizeof(resource_size_t) < 8) && l) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400233 /* Address above 32-bit boundary; disable the BAR */
234 pci_write_config_dword(dev, pos, 0);
235 pci_write_config_dword(dev, pos + 4, 0);
236 res->start = 0;
237 res->end = sz64;
238 } else {
239 res->start = l64;
240 res->end = l64 + sz64;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600241 dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n",
Bjorn Helgaasa369c792009-10-06 15:33:44 -0600242 pos, res);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400243 }
244 } else {
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600245 sz = pci_size(l, sz, mask);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400246
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600247 if (!sz)
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400248 goto fail;
249
250 res->start = l;
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600251 res->end = l + sz;
Vincent Legollf393d9b2008-10-12 12:26:12 +0200252
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600253 dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400254 }
255
256 out:
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600257 return (res->flags & IORESOURCE_MEM_64) ? 1 : 0;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400258 fail:
259 res->flags = 0;
260 goto out;
Yinghai Lu07eddf32006-11-29 13:53:10 -0800261}
262
Linus Torvalds1da177e2005-04-16 15:20:36 -0700263static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
264{
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400265 unsigned int pos, reg;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700266
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400267 for (pos = 0; pos < howmany; pos++) {
268 struct resource *res = &dev->resource[pos];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 reg = PCI_BASE_ADDRESS_0 + (pos << 2);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400270 pos += __pci_read_base(dev, pci_bar_unknown, res, reg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 }
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400272
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 if (rom) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400274 struct resource *res = &dev->resource[PCI_ROM_RESOURCE];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 dev->rom_base_reg = rom;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400276 res->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH |
277 IORESOURCE_READONLY | IORESOURCE_CACHEABLE |
278 IORESOURCE_SIZEALIGN;
279 __pci_read_base(dev, pci_bar_mem32, res, rom);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 }
281}
282
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700283static void __devinit pci_read_bridge_io(struct pci_bus *child)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284{
285 struct pci_dev *dev = child->self;
286 u8 io_base_lo, io_limit_lo;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 unsigned long base, limit;
288 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289
Linus Torvalds1da177e2005-04-16 15:20:36 -0700290 res = child->resource[0];
291 pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo);
292 pci_read_config_byte(dev, PCI_IO_LIMIT, &io_limit_lo);
293 base = (io_base_lo & PCI_IO_RANGE_MASK) << 8;
294 limit = (io_limit_lo & PCI_IO_RANGE_MASK) << 8;
295
296 if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
297 u16 io_base_hi, io_limit_hi;
298 pci_read_config_word(dev, PCI_IO_BASE_UPPER16, &io_base_hi);
299 pci_read_config_word(dev, PCI_IO_LIMIT_UPPER16, &io_limit_hi);
300 base |= (io_base_hi << 16);
301 limit |= (io_limit_hi << 16);
302 }
303
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800304 if (base && base <= limit) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305 res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
Daniel Yeisley9d265122005-12-05 07:06:43 -0500306 if (!res->start)
307 res->start = base;
308 if (!res->end)
309 res->end = limit + 0xfff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600310 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700312}
313
314static void __devinit pci_read_bridge_mmio(struct pci_bus *child)
315{
316 struct pci_dev *dev = child->self;
317 u16 mem_base_lo, mem_limit_lo;
318 unsigned long base, limit;
319 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320
321 res = child->resource[1];
322 pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo);
323 pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
324 base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
325 limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16;
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800326 if (base && base <= limit) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327 res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
328 res->start = base;
329 res->end = limit + 0xfffff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600330 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700332}
333
334static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child)
335{
336 struct pci_dev *dev = child->self;
337 u16 mem_base_lo, mem_limit_lo;
338 unsigned long base, limit;
339 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340
341 res = child->resource[2];
342 pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo);
343 pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo);
344 base = (mem_base_lo & PCI_PREF_RANGE_MASK) << 16;
345 limit = (mem_limit_lo & PCI_PREF_RANGE_MASK) << 16;
346
347 if ((mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) {
348 u32 mem_base_hi, mem_limit_hi;
349 pci_read_config_dword(dev, PCI_PREF_BASE_UPPER32, &mem_base_hi);
350 pci_read_config_dword(dev, PCI_PREF_LIMIT_UPPER32, &mem_limit_hi);
351
352 /*
353 * Some bridges set the base > limit by default, and some
354 * (broken) BIOSes do not initialize them. If we find
355 * this, just assume they are not being used.
356 */
357 if (mem_base_hi <= mem_limit_hi) {
358#if BITS_PER_LONG == 64
359 base |= ((long) mem_base_hi) << 32;
360 limit |= ((long) mem_limit_hi) << 32;
361#else
362 if (mem_base_hi || mem_limit_hi) {
Bjorn Helgaas80ccba12008-06-13 10:52:11 -0600363 dev_err(&dev->dev, "can't handle 64-bit "
364 "address space for bridge\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 return;
366 }
367#endif
368 }
369 }
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800370 if (base && base <= limit) {
Yinghai Lu1f82de12009-04-23 20:48:32 -0700371 res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) |
372 IORESOURCE_MEM | IORESOURCE_PREFETCH;
373 if (res->flags & PCI_PREF_RANGE_TYPE_64)
374 res->flags |= IORESOURCE_MEM_64;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375 res->start = base;
376 res->end = limit + 0xfffff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600377 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378 }
379}
380
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700381void __devinit pci_read_bridge_bases(struct pci_bus *child)
382{
383 struct pci_dev *dev = child->self;
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700384 struct resource *res;
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700385 int i;
386
387 if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */
388 return;
389
390 dev_info(&dev->dev, "PCI bridge to [bus %02x-%02x]%s\n",
391 child->secondary, child->subordinate,
392 dev->transparent ? " (subtractive decode)" : "");
393
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700394 pci_bus_remove_resources(child);
395 for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++)
396 child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i];
397
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700398 pci_read_bridge_io(child);
399 pci_read_bridge_mmio(child);
400 pci_read_bridge_mmio_pref(child);
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700401
402 if (dev->transparent) {
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700403 pci_bus_for_each_resource(child->parent, res, i) {
404 if (res) {
405 pci_bus_add_resource(child, res,
406 PCI_SUBTRACTIVE_DECODE);
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700407 dev_printk(KERN_DEBUG, &dev->dev,
408 " bridge window %pR (subtractive decode)\n",
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700409 res);
410 }
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700411 }
412 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700413}
414
Sam Ravnborg96bde062007-03-26 21:53:30 -0800415static struct pci_bus * pci_alloc_bus(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416{
417 struct pci_bus *b;
418
Eric Sesterhennf5afe802006-02-28 15:34:49 +0100419 b = kzalloc(sizeof(*b), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420 if (b) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 INIT_LIST_HEAD(&b->node);
422 INIT_LIST_HEAD(&b->children);
423 INIT_LIST_HEAD(&b->devices);
Alex Chiangf46753c2008-06-10 15:28:50 -0600424 INIT_LIST_HEAD(&b->slots);
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700425 INIT_LIST_HEAD(&b->resources);
Matthew Wilcox3749c512009-12-13 08:11:32 -0500426 b->max_bus_speed = PCI_SPEED_UNKNOWN;
427 b->cur_bus_speed = PCI_SPEED_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 }
429 return b;
430}
431
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500432static unsigned char pcix_bus_speed[] = {
433 PCI_SPEED_UNKNOWN, /* 0 */
434 PCI_SPEED_66MHz_PCIX, /* 1 */
435 PCI_SPEED_100MHz_PCIX, /* 2 */
436 PCI_SPEED_133MHz_PCIX, /* 3 */
437 PCI_SPEED_UNKNOWN, /* 4 */
438 PCI_SPEED_66MHz_PCIX_ECC, /* 5 */
439 PCI_SPEED_100MHz_PCIX_ECC, /* 6 */
440 PCI_SPEED_133MHz_PCIX_ECC, /* 7 */
441 PCI_SPEED_UNKNOWN, /* 8 */
442 PCI_SPEED_66MHz_PCIX_266, /* 9 */
443 PCI_SPEED_100MHz_PCIX_266, /* A */
444 PCI_SPEED_133MHz_PCIX_266, /* B */
445 PCI_SPEED_UNKNOWN, /* C */
446 PCI_SPEED_66MHz_PCIX_533, /* D */
447 PCI_SPEED_100MHz_PCIX_533, /* E */
448 PCI_SPEED_133MHz_PCIX_533 /* F */
449};
450
Matthew Wilcox3749c512009-12-13 08:11:32 -0500451static unsigned char pcie_link_speed[] = {
452 PCI_SPEED_UNKNOWN, /* 0 */
453 PCIE_SPEED_2_5GT, /* 1 */
454 PCIE_SPEED_5_0GT, /* 2 */
Matthew Wilcox9dfd97f2009-12-13 08:11:35 -0500455 PCIE_SPEED_8_0GT, /* 3 */
Matthew Wilcox3749c512009-12-13 08:11:32 -0500456 PCI_SPEED_UNKNOWN, /* 4 */
457 PCI_SPEED_UNKNOWN, /* 5 */
458 PCI_SPEED_UNKNOWN, /* 6 */
459 PCI_SPEED_UNKNOWN, /* 7 */
460 PCI_SPEED_UNKNOWN, /* 8 */
461 PCI_SPEED_UNKNOWN, /* 9 */
462 PCI_SPEED_UNKNOWN, /* A */
463 PCI_SPEED_UNKNOWN, /* B */
464 PCI_SPEED_UNKNOWN, /* C */
465 PCI_SPEED_UNKNOWN, /* D */
466 PCI_SPEED_UNKNOWN, /* E */
467 PCI_SPEED_UNKNOWN /* F */
468};
469
470void pcie_update_link_speed(struct pci_bus *bus, u16 linksta)
471{
472 bus->cur_bus_speed = pcie_link_speed[linksta & 0xf];
473}
474EXPORT_SYMBOL_GPL(pcie_update_link_speed);
475
Matthew Wilcox45b4cdd52009-12-13 08:11:34 -0500476static unsigned char agp_speeds[] = {
477 AGP_UNKNOWN,
478 AGP_1X,
479 AGP_2X,
480 AGP_4X,
481 AGP_8X
482};
483
484static enum pci_bus_speed agp_speed(int agp3, int agpstat)
485{
486 int index = 0;
487
488 if (agpstat & 4)
489 index = 3;
490 else if (agpstat & 2)
491 index = 2;
492 else if (agpstat & 1)
493 index = 1;
494 else
495 goto out;
496
497 if (agp3) {
498 index += 2;
499 if (index == 5)
500 index = 0;
501 }
502
503 out:
504 return agp_speeds[index];
505}
506
507
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500508static void pci_set_bus_speed(struct pci_bus *bus)
509{
510 struct pci_dev *bridge = bus->self;
511 int pos;
512
Matthew Wilcox45b4cdd52009-12-13 08:11:34 -0500513 pos = pci_find_capability(bridge, PCI_CAP_ID_AGP);
514 if (!pos)
515 pos = pci_find_capability(bridge, PCI_CAP_ID_AGP3);
516 if (pos) {
517 u32 agpstat, agpcmd;
518
519 pci_read_config_dword(bridge, pos + PCI_AGP_STATUS, &agpstat);
520 bus->max_bus_speed = agp_speed(agpstat & 8, agpstat & 7);
521
522 pci_read_config_dword(bridge, pos + PCI_AGP_COMMAND, &agpcmd);
523 bus->cur_bus_speed = agp_speed(agpstat & 8, agpcmd & 7);
524 }
525
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500526 pos = pci_find_capability(bridge, PCI_CAP_ID_PCIX);
527 if (pos) {
528 u16 status;
529 enum pci_bus_speed max;
530 pci_read_config_word(bridge, pos + 2, &status);
531
532 if (status & 0x8000) {
533 max = PCI_SPEED_133MHz_PCIX_533;
534 } else if (status & 0x4000) {
535 max = PCI_SPEED_133MHz_PCIX_266;
536 } else if (status & 0x0002) {
537 if (((status >> 12) & 0x3) == 2) {
538 max = PCI_SPEED_133MHz_PCIX_ECC;
539 } else {
540 max = PCI_SPEED_133MHz_PCIX;
541 }
542 } else {
543 max = PCI_SPEED_66MHz_PCIX;
544 }
545
546 bus->max_bus_speed = max;
547 bus->cur_bus_speed = pcix_bus_speed[(status >> 6) & 0xf];
548
549 return;
550 }
551
552 pos = pci_find_capability(bridge, PCI_CAP_ID_EXP);
553 if (pos) {
554 u32 linkcap;
555 u16 linksta;
556
557 pci_read_config_dword(bridge, pos + PCI_EXP_LNKCAP, &linkcap);
558 bus->max_bus_speed = pcie_link_speed[linkcap & 0xf];
559
560 pci_read_config_word(bridge, pos + PCI_EXP_LNKSTA, &linksta);
561 pcie_update_link_speed(bus, linksta);
562 }
563}
564
565
Adrian Bunkcbd4e052008-04-18 13:53:55 -0700566static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
567 struct pci_dev *bridge, int busnr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568{
569 struct pci_bus *child;
570 int i;
571
572 /*
573 * Allocate a new bus, and inherit stuff from the parent..
574 */
575 child = pci_alloc_bus();
576 if (!child)
577 return NULL;
578
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 child->parent = parent;
580 child->ops = parent->ops;
581 child->sysdata = parent->sysdata;
Michael S. Tsirkin6e325a62006-02-14 18:52:22 +0200582 child->bus_flags = parent->bus_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -0400584 /* initialize some portions of the bus device, but don't register it
585 * now as the parent is not properly set up yet. This device will get
586 * registered later in pci_bus_add_devices()
587 */
588 child->dev.class = &pcibus_class;
Kay Sievers1a927132008-10-30 02:17:49 +0100589 dev_set_name(&child->dev, "%04x:%02x", pci_domain_nr(child), busnr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700590
591 /*
592 * Set up the primary, secondary and subordinate
593 * bus numbers.
594 */
595 child->number = child->secondary = busnr;
596 child->primary = parent->secondary;
597 child->subordinate = 0xff;
598
Yu Zhao3789fa82008-11-22 02:41:07 +0800599 if (!bridge)
600 return child;
601
602 child->self = bridge;
603 child->bridge = get_device(&bridge->dev);
Benjamin Herrenschmidt98d9f30c82011-04-11 11:37:07 +1000604 pci_set_bus_of_node(child);
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500605 pci_set_bus_speed(child);
606
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 /* Set up default resource pointers and names.. */
Yu Zhaofde09c62008-11-22 02:39:32 +0800608 for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609 child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i];
610 child->resource[i]->name = child->name;
611 }
612 bridge->subordinate = child;
613
614 return child;
615}
616
Sam Ravnborg451124a2008-02-02 22:33:43 +0100617struct pci_bus *__ref pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618{
619 struct pci_bus *child;
620
621 child = pci_alloc_child_bus(parent, dev, busnr);
Rajesh Shahe4ea9bb2005-04-28 00:25:48 -0700622 if (child) {
Zhang Yanmind71374d2006-06-02 12:35:43 +0800623 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624 list_add_tail(&child->node, &parent->children);
Zhang Yanmind71374d2006-06-02 12:35:43 +0800625 up_write(&pci_bus_sem);
Rajesh Shahe4ea9bb2005-04-28 00:25:48 -0700626 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627 return child;
628}
629
Sam Ravnborg96bde062007-03-26 21:53:30 -0800630static void pci_fixup_parent_subordinate_busnr(struct pci_bus *child, int max)
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700631{
632 struct pci_bus *parent = child->parent;
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700633
634 /* Attempts to fix that up are really dangerous unless
635 we're going to re-assign all bus numbers. */
636 if (!pcibios_assign_all_busses())
637 return;
638
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700639 while (parent->parent && parent->subordinate < max) {
640 parent->subordinate = max;
641 pci_write_config_byte(parent->self, PCI_SUBORDINATE_BUS, max);
642 parent = parent->parent;
643 }
644}
645
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646/*
647 * If it's a bridge, configure it and scan the bus behind it.
648 * For CardBus bridges, we don't scan behind as the devices will
649 * be handled by the bridge driver itself.
650 *
651 * We need to process bridges in two passes -- first we scan those
652 * already configured by the BIOS and after we are done with all of
653 * them, we proceed to assigning numbers to the remaining buses in
654 * order to avoid overlaps between old and new bus numbers.
655 */
Sam Ravnborg0ab2b572008-02-17 10:45:28 +0100656int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657{
658 struct pci_bus *child;
659 int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
Dominik Brodowski49887942005-12-08 16:53:12 +0100660 u32 buses, i, j = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 u16 bctl;
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600662 u8 primary, secondary, subordinate;
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100663 int broken = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664
665 pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses);
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600666 primary = buses & 0xFF;
667 secondary = (buses >> 8) & 0xFF;
668 subordinate = (buses >> 16) & 0xFF;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600670 dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n",
671 secondary, subordinate, pass);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672
Yinghai Lu71f6bd42012-01-30 12:25:24 +0100673 if (!primary && (primary != bus->number) && secondary && subordinate) {
674 dev_warn(&dev->dev, "Primary bus is hard wired to 0\n");
675 primary = bus->number;
676 }
677
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100678 /* Check if setup is sensible at all */
679 if (!pass &&
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600680 (primary != bus->number || secondary <= bus->number)) {
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100681 dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n");
682 broken = 1;
683 }
684
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 /* Disable MasterAbortMode during probing to avoid reporting
686 of bus errors (in some architectures) */
687 pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl);
688 pci_write_config_word(dev, PCI_BRIDGE_CONTROL,
689 bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT);
690
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600691 if ((secondary || subordinate) && !pcibios_assign_all_busses() &&
692 !is_cardbus && !broken) {
693 unsigned int cmax;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 /*
695 * Bus already configured by firmware, process it in the first
696 * pass and just note the configuration.
697 */
698 if (pass)
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000699 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700
701 /*
702 * If we already got to this bus through a different bridge,
Alex Chiang74710de2009-03-20 14:56:10 -0600703 * don't re-add it. This can happen with the i450NX chipset.
704 *
705 * However, we continue to descend down the hierarchy and
706 * scan remaining child buses.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707 */
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600708 child = pci_find_bus(pci_domain_nr(bus), secondary);
Alex Chiang74710de2009-03-20 14:56:10 -0600709 if (!child) {
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600710 child = pci_add_new_bus(bus, dev, secondary);
Alex Chiang74710de2009-03-20 14:56:10 -0600711 if (!child)
712 goto out;
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600713 child->primary = primary;
714 child->subordinate = subordinate;
Alex Chiang74710de2009-03-20 14:56:10 -0600715 child->bridge_ctl = bctl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 }
717
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 cmax = pci_scan_child_bus(child);
719 if (cmax > max)
720 max = cmax;
721 if (child->subordinate > max)
722 max = child->subordinate;
723 } else {
724 /*
725 * We need to assign a number to this bus which we always
726 * do in the second pass.
727 */
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700728 if (!pass) {
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100729 if (pcibios_assign_all_busses() || broken)
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700730 /* Temporarily disable forwarding of the
731 configuration cycles on all bridges in
732 this bus segment to avoid possible
733 conflicts in the second pass between two
734 bridges programmed with overlapping
735 bus ranges. */
736 pci_write_config_dword(dev, PCI_PRIMARY_BUS,
737 buses & ~0xffffff);
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000738 goto out;
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700739 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740
741 /* Clear errors */
742 pci_write_config_word(dev, PCI_STATUS, 0xffff);
743
Rajesh Shahcc574502005-04-28 00:25:47 -0700744 /* Prevent assigning a bus number that already exists.
Tiejun Chenb1a98b62011-06-02 11:02:50 +0800745 * This can happen when a bridge is hot-plugged, so in
746 * this case we only re-scan this bus. */
747 child = pci_find_bus(pci_domain_nr(bus), max+1);
748 if (!child) {
749 child = pci_add_new_bus(bus, dev, ++max);
750 if (!child)
751 goto out;
752 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753 buses = (buses & 0xff000000)
754 | ((unsigned int)(child->primary) << 0)
755 | ((unsigned int)(child->secondary) << 8)
756 | ((unsigned int)(child->subordinate) << 16);
757
758 /*
759 * yenta.c forces a secondary latency timer of 176.
760 * Copy that behaviour here.
761 */
762 if (is_cardbus) {
763 buses &= ~0xff000000;
764 buses |= CARDBUS_LATENCY_TIMER << 24;
765 }
Jesper Juhl7c867c82011-01-24 21:14:33 +0100766
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767 /*
768 * We need to blast all three values with a single write.
769 */
770 pci_write_config_dword(dev, PCI_PRIMARY_BUS, buses);
771
772 if (!is_cardbus) {
Gary Hade11949252007-10-08 16:24:16 -0700773 child->bridge_ctl = bctl;
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700774 /*
775 * Adjust subordinate busnr in parent buses.
776 * We do this before scanning for children because
777 * some devices may not be detected if the bios
778 * was lazy.
779 */
780 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781 /* Now we can scan all subordinate buses... */
782 max = pci_scan_child_bus(child);
Kristen Accardie3ac86d2006-01-17 16:57:01 -0800783 /*
784 * now fix it up again since we have found
785 * the real value of max.
786 */
787 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 } else {
789 /*
790 * For CardBus bridges, we leave 4 bus numbers
791 * as cards with a PCI-to-PCI bridge can be
792 * inserted later.
793 */
Dominik Brodowski49887942005-12-08 16:53:12 +0100794 for (i=0; i<CARDBUS_RESERVE_BUSNR; i++) {
795 struct pci_bus *parent = bus;
Rajesh Shahcc574502005-04-28 00:25:47 -0700796 if (pci_find_bus(pci_domain_nr(bus),
797 max+i+1))
798 break;
Dominik Brodowski49887942005-12-08 16:53:12 +0100799 while (parent->parent) {
800 if ((!pcibios_assign_all_busses()) &&
801 (parent->subordinate > max) &&
802 (parent->subordinate <= max+i)) {
803 j = 1;
804 }
805 parent = parent->parent;
806 }
807 if (j) {
808 /*
809 * Often, there are two cardbus bridges
810 * -- try to leave one valid bus number
811 * for each one.
812 */
813 i /= 2;
814 break;
815 }
816 }
Rajesh Shahcc574502005-04-28 00:25:47 -0700817 max += i;
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700818 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 }
820 /*
821 * Set the subordinate bus number to its real value.
822 */
823 child->subordinate = max;
824 pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max);
825 }
826
Gary Hadecb3576f2008-02-08 14:00:52 -0800827 sprintf(child->name,
828 (is_cardbus ? "PCI CardBus %04x:%02x" : "PCI Bus %04x:%02x"),
829 pci_domain_nr(bus), child->number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700830
Bernhard Kaindld55bef52007-07-30 20:35:13 +0200831 /* Has only triggered on CardBus, fixup is in yenta_socket */
Dominik Brodowski49887942005-12-08 16:53:12 +0100832 while (bus->parent) {
833 if ((child->subordinate > bus->subordinate) ||
834 (child->number > bus->subordinate) ||
835 (child->number < bus->number) ||
836 (child->subordinate < bus->number)) {
Bjorn Helgaas865df572009-11-04 10:32:57 -0700837 dev_info(&child->dev, "[bus %02x-%02x] %s "
838 "hidden behind%s bridge %s [bus %02x-%02x]\n",
Bernhard Kaindld55bef52007-07-30 20:35:13 +0200839 child->number, child->subordinate,
840 (bus->number > child->subordinate &&
841 bus->subordinate < child->number) ?
Joe Perchesa6f29a92007-11-19 17:48:29 -0800842 "wholly" : "partially",
843 bus->self->transparent ? " transparent" : "",
Bjorn Helgaas865df572009-11-04 10:32:57 -0700844 dev_name(&bus->dev),
Bernhard Kaindld55bef52007-07-30 20:35:13 +0200845 bus->number, bus->subordinate);
Dominik Brodowski49887942005-12-08 16:53:12 +0100846 }
847 bus = bus->parent;
848 }
849
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000850out:
851 pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl);
852
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853 return max;
854}
855
856/*
857 * Read interrupt line and base address registers.
858 * The architecture-dependent code can tweak these, of course.
859 */
860static void pci_read_irq(struct pci_dev *dev)
861{
862 unsigned char irq;
863
864 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq);
Kristen Accardiffeff782005-11-02 16:24:32 -0800865 dev->pin = irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866 if (irq)
867 pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
868 dev->irq = irq;
869}
870
Benjamin Herrenschmidtbb209c82010-01-26 17:10:03 +0000871void set_pcie_port_type(struct pci_dev *pdev)
Yu Zhao480b93b2009-03-20 11:25:14 +0800872{
873 int pos;
874 u16 reg16;
875
876 pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
877 if (!pos)
878 return;
879 pdev->is_pcie = 1;
Kenji Kaneshige0efea002009-11-05 12:05:11 +0900880 pdev->pcie_cap = pos;
Yu Zhao480b93b2009-03-20 11:25:14 +0800881 pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
882 pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4;
Jon Masonb03e7492011-07-20 15:20:54 -0500883 pci_read_config_word(pdev, pos + PCI_EXP_DEVCAP, &reg16);
884 pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD;
Yu Zhao480b93b2009-03-20 11:25:14 +0800885}
886
Benjamin Herrenschmidtbb209c82010-01-26 17:10:03 +0000887void set_pcie_hotplug_bridge(struct pci_dev *pdev)
Eric W. Biederman28760482009-09-09 14:09:24 -0700888{
889 int pos;
890 u16 reg16;
891 u32 reg32;
892
Kenji Kaneshige06a1cba2009-11-11 14:30:56 +0900893 pos = pci_pcie_cap(pdev);
Eric W. Biederman28760482009-09-09 14:09:24 -0700894 if (!pos)
895 return;
896 pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
897 if (!(reg16 & PCI_EXP_FLAGS_SLOT))
898 return;
899 pci_read_config_dword(pdev, pos + PCI_EXP_SLTCAP, &reg32);
900 if (reg32 & PCI_EXP_SLTCAP_HPC)
901 pdev->is_hotplug_bridge = 1;
902}
903
Bartlomiej Zolnierkiewicz01abc2a2007-04-23 23:19:36 +0200904#define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED)
Randy Dunlap76e6a1d2006-12-29 16:47:29 -0800905
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906/**
907 * pci_setup_device - fill in class and map information of a device
908 * @dev: the device structure to fill
909 *
910 * Initialize the device structure with information about the device's
911 * vendor,class,memory and IO-space addresses,IRQ lines etc.
912 * Called at initialisation of the PCI subsystem and by CardBus services.
Yu Zhao480b93b2009-03-20 11:25:14 +0800913 * Returns 0 on success and negative if unknown type of device (not normal,
914 * bridge or CardBus).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915 */
Yu Zhao480b93b2009-03-20 11:25:14 +0800916int pci_setup_device(struct pci_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917{
918 u32 class;
Yu Zhao480b93b2009-03-20 11:25:14 +0800919 u8 hdr_type;
920 struct pci_slot *slot;
Gabe Blackbc577d22009-10-06 10:45:19 -0500921 int pos = 0;
Yu Zhao480b93b2009-03-20 11:25:14 +0800922
923 if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
924 return -EIO;
925
926 dev->sysdata = dev->bus->sysdata;
927 dev->dev.parent = dev->bus->bridge;
928 dev->dev.bus = &pci_bus_type;
929 dev->hdr_type = hdr_type & 0x7f;
930 dev->multifunction = !!(hdr_type & 0x80);
Yu Zhao480b93b2009-03-20 11:25:14 +0800931 dev->error_state = pci_channel_io_normal;
932 set_pcie_port_type(dev);
933
934 list_for_each_entry(slot, &dev->bus->slots, list)
935 if (PCI_SLOT(dev->devfn) == slot->number)
936 dev->slot = slot;
937
938 /* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer)
939 set this higher, assuming the system even supports it. */
940 dev->dma_mask = 0xffffffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941
Greg Kroah-Hartmaneebfcfb2008-07-02 13:24:49 -0700942 dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus),
943 dev->bus->number, PCI_SLOT(dev->devfn),
944 PCI_FUNC(dev->devfn));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945
946 pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
Auke Kokb8a3a522007-06-08 15:46:30 -0700947 dev->revision = class & 0xff;
Yinghai Lu2dd8ba92012-02-19 14:50:12 -0800948 dev->class = class >> 8; /* upper 3 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700949
Yinghai Lu2dd8ba92012-02-19 14:50:12 -0800950 dev_printk(KERN_DEBUG, &dev->dev, "[%04x:%04x] type %02x class %#08x\n",
951 dev->vendor, dev->device, dev->hdr_type, dev->class);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952
Yu Zhao853346e2009-03-21 22:05:11 +0800953 /* need to have dev->class ready */
954 dev->cfg_size = pci_cfg_space_size(dev);
955
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956 /* "Unknown power state" */
Daniel Ritz3fe9d192005-08-17 15:32:19 -0700957 dev->current_state = PCI_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700958
959 /* Early fixups, before probing the BARs */
960 pci_fixup_device(pci_fixup_early, dev);
Yu Zhaof79b1b12009-05-28 00:25:05 +0800961 /* device class may be changed after fixup */
962 class = dev->class >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963
964 switch (dev->hdr_type) { /* header type */
965 case PCI_HEADER_TYPE_NORMAL: /* standard header */
966 if (class == PCI_CLASS_BRIDGE_PCI)
967 goto bad;
968 pci_read_irq(dev);
969 pci_read_bases(dev, 6, PCI_ROM_ADDRESS);
970 pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
971 pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
Alan Cox368c73d2006-10-04 00:41:26 +0100972
973 /*
974 * Do the ugly legacy mode stuff here rather than broken chip
975 * quirk code. Legacy mode ATA controllers have fixed
976 * addresses. These are not always echoed in BAR0-3, and
977 * BAR0-3 in a few cases contain junk!
978 */
979 if (class == PCI_CLASS_STORAGE_IDE) {
980 u8 progif;
981 pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
982 if ((progif & 1) == 0) {
Linus Torvaldsaf1bff42007-12-10 07:40:54 -0800983 dev->resource[0].start = 0x1F0;
984 dev->resource[0].end = 0x1F7;
985 dev->resource[0].flags = LEGACY_IO_RESOURCE;
986 dev->resource[1].start = 0x3F6;
987 dev->resource[1].end = 0x3F6;
988 dev->resource[1].flags = LEGACY_IO_RESOURCE;
Alan Cox368c73d2006-10-04 00:41:26 +0100989 }
990 if ((progif & 4) == 0) {
Linus Torvaldsaf1bff42007-12-10 07:40:54 -0800991 dev->resource[2].start = 0x170;
992 dev->resource[2].end = 0x177;
993 dev->resource[2].flags = LEGACY_IO_RESOURCE;
994 dev->resource[3].start = 0x376;
995 dev->resource[3].end = 0x376;
996 dev->resource[3].flags = LEGACY_IO_RESOURCE;
Alan Cox368c73d2006-10-04 00:41:26 +0100997 }
998 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999 break;
1000
1001 case PCI_HEADER_TYPE_BRIDGE: /* bridge header */
1002 if (class != PCI_CLASS_BRIDGE_PCI)
1003 goto bad;
1004 /* The PCI-to-PCI bridge spec requires that subtractive
1005 decoding (i.e. transparent) bridge must have programming
1006 interface code of 0x01. */
Kristen Accardi3efd2732005-11-02 16:55:49 -08001007 pci_read_irq(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 dev->transparent = ((dev->class & 0xff) == 1);
1009 pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
Eric W. Biederman28760482009-09-09 14:09:24 -07001010 set_pcie_hotplug_bridge(dev);
Gabe Blackbc577d22009-10-06 10:45:19 -05001011 pos = pci_find_capability(dev, PCI_CAP_ID_SSVID);
1012 if (pos) {
1013 pci_read_config_word(dev, pos + PCI_SSVID_VENDOR_ID, &dev->subsystem_vendor);
1014 pci_read_config_word(dev, pos + PCI_SSVID_DEVICE_ID, &dev->subsystem_device);
1015 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016 break;
1017
1018 case PCI_HEADER_TYPE_CARDBUS: /* CardBus bridge header */
1019 if (class != PCI_CLASS_BRIDGE_CARDBUS)
1020 goto bad;
1021 pci_read_irq(dev);
1022 pci_read_bases(dev, 1, 0);
1023 pci_read_config_word(dev, PCI_CB_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
1024 pci_read_config_word(dev, PCI_CB_SUBSYSTEM_ID, &dev->subsystem_device);
1025 break;
1026
1027 default: /* unknown header */
Bjorn Helgaas80ccba12008-06-13 10:52:11 -06001028 dev_err(&dev->dev, "unknown header type %02x, "
1029 "ignoring device\n", dev->hdr_type);
Yu Zhao480b93b2009-03-20 11:25:14 +08001030 return -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001031
1032 bad:
Yinghai Lu2dd8ba92012-02-19 14:50:12 -08001033 dev_err(&dev->dev, "ignoring class %#08x (doesn't match header "
1034 "type %02x)\n", dev->class, dev->hdr_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 dev->class = PCI_CLASS_NOT_DEFINED;
1036 }
1037
1038 /* We found a fine healthy device, go go go... */
1039 return 0;
1040}
1041
Zhao, Yu201de562008-10-13 19:49:55 +08001042static void pci_release_capabilities(struct pci_dev *dev)
1043{
1044 pci_vpd_release(dev);
Yu Zhaod1b054d2009-03-20 11:25:11 +08001045 pci_iov_release(dev);
Yinghai Luf7968412012-02-11 00:18:30 -08001046 pci_free_cap_save_buffers(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001047}
1048
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049/**
1050 * pci_release_dev - free a pci device structure when all users of it are finished.
1051 * @dev: device that's been disconnected
1052 *
1053 * Will be called only by the device core when all users of this pci device are
1054 * done.
1055 */
1056static void pci_release_dev(struct device *dev)
1057{
1058 struct pci_dev *pci_dev;
1059
1060 pci_dev = to_pci_dev(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001061 pci_release_capabilities(pci_dev);
Benjamin Herrenschmidt98d9f30c82011-04-11 11:37:07 +10001062 pci_release_of_node(pci_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063 kfree(pci_dev);
1064}
1065
1066/**
1067 * pci_cfg_space_size - get the configuration space size of the PCI device.
Randy Dunlap8f7020d2005-10-23 11:57:38 -07001068 * @dev: PCI device
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 *
1070 * Regular PCI devices have 256 bytes, but PCI-X 2 and PCI Express devices
1071 * have 4096 bytes. Even if the device is capable, that doesn't mean we can
1072 * access it. Maybe we don't have a way to generate extended config space
1073 * accesses, or the device is behind a reverse Express bridge. So we try
1074 * reading the dword at 0x100 which must either be 0 or a valid extended
1075 * capability header.
1076 */
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001077int pci_cfg_space_size_ext(struct pci_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 u32 status;
Zhao, Yu557848c2008-10-13 19:18:07 +08001080 int pos = PCI_CFG_SPACE_SIZE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081
Zhao, Yu557848c2008-10-13 19:18:07 +08001082 if (pci_read_config_dword(dev, pos, &status) != PCIBIOS_SUCCESSFUL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 goto fail;
1084 if (status == 0xffffffff)
1085 goto fail;
1086
1087 return PCI_CFG_SPACE_EXP_SIZE;
1088
1089 fail:
1090 return PCI_CFG_SPACE_SIZE;
1091}
1092
Yinghai Lu57741a72008-02-15 01:32:50 -08001093int pci_cfg_space_size(struct pci_dev *dev)
1094{
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001095 int pos;
1096 u32 status;
Yinghai Ludfadd9ed2009-03-08 21:35:37 -07001097 u16 class;
1098
1099 class = dev->class >> 8;
1100 if (class == PCI_CLASS_BRIDGE_HOST)
1101 return pci_cfg_space_size_ext(dev);
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001102
Kenji Kaneshige06a1cba2009-11-11 14:30:56 +09001103 pos = pci_pcie_cap(dev);
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001104 if (!pos) {
1105 pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
1106 if (!pos)
1107 goto fail;
1108
1109 pci_read_config_dword(dev, pos + PCI_X_STATUS, &status);
1110 if (!(status & (PCI_X_STATUS_266MHZ | PCI_X_STATUS_533MHZ)))
1111 goto fail;
1112 }
1113
1114 return pci_cfg_space_size_ext(dev);
1115
1116 fail:
1117 return PCI_CFG_SPACE_SIZE;
Yinghai Lu57741a72008-02-15 01:32:50 -08001118}
1119
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120static void pci_release_bus_bridge_dev(struct device *dev)
1121{
1122 kfree(dev);
1123}
1124
Michael Ellerman65891212007-04-05 17:19:08 +10001125struct pci_dev *alloc_pci_dev(void)
1126{
1127 struct pci_dev *dev;
1128
1129 dev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL);
1130 if (!dev)
1131 return NULL;
1132
Michael Ellerman65891212007-04-05 17:19:08 +10001133 INIT_LIST_HEAD(&dev->bus_list);
1134
1135 return dev;
1136}
1137EXPORT_SYMBOL(alloc_pci_dev);
1138
Yinghai Luefdc87d2012-01-27 10:55:10 -08001139bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *l,
1140 int crs_timeout)
1141{
1142 int delay = 1;
1143
1144 if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, l))
1145 return false;
1146
1147 /* some broken boards return 0 or ~0 if a slot is empty: */
1148 if (*l == 0xffffffff || *l == 0x00000000 ||
1149 *l == 0x0000ffff || *l == 0xffff0000)
1150 return false;
1151
1152 /* Configuration request Retry Status */
1153 while (*l == 0xffff0001) {
1154 if (!crs_timeout)
1155 return false;
1156
1157 msleep(delay);
1158 delay *= 2;
1159 if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, l))
1160 return false;
1161 /* Card hasn't responded in 60 seconds? Must be stuck. */
1162 if (delay > crs_timeout) {
1163 printk(KERN_WARNING "pci %04x:%02x:%02x.%d: not "
1164 "responding\n", pci_domain_nr(bus),
1165 bus->number, PCI_SLOT(devfn),
1166 PCI_FUNC(devfn));
1167 return false;
1168 }
1169 }
1170
1171 return true;
1172}
1173EXPORT_SYMBOL(pci_bus_read_dev_vendor_id);
1174
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175/*
1176 * Read the config data for a PCI device, sanity-check it
1177 * and fill in the dev structure...
1178 */
Adrian Bunk7f7b5de2008-04-18 13:53:55 -07001179static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180{
1181 struct pci_dev *dev;
1182 u32 l;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183
Yinghai Luefdc87d2012-01-27 10:55:10 -08001184 if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185 return NULL;
1186
Michael Ellermanbab41e92007-04-05 17:19:09 +10001187 dev = alloc_pci_dev();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001188 if (!dev)
1189 return NULL;
1190
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 dev->bus = bus;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 dev->devfn = devfn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 dev->vendor = l & 0xffff;
1194 dev->device = (l >> 16) & 0xffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001195
Benjamin Herrenschmidt98d9f30c82011-04-11 11:37:07 +10001196 pci_set_of_node(dev);
1197
Yu Zhao480b93b2009-03-20 11:25:14 +08001198 if (pci_setup_device(dev)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199 kfree(dev);
1200 return NULL;
1201 }
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001202
1203 return dev;
1204}
1205
Zhao, Yu201de562008-10-13 19:49:55 +08001206static void pci_init_capabilities(struct pci_dev *dev)
1207{
1208 /* MSI/MSI-X list */
1209 pci_msi_init_pci_dev(dev);
1210
Rafael J. Wysocki63f48982008-12-07 22:02:58 +01001211 /* Buffers for saving PCIe and PCI-X capabilities */
1212 pci_allocate_cap_save_buffers(dev);
1213
Zhao, Yu201de562008-10-13 19:49:55 +08001214 /* Power Management */
1215 pci_pm_init(dev);
Jesse Barneseb9c39d2008-12-17 12:10:05 -08001216 platform_pci_wakeup_init(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001217
1218 /* Vital Product Data */
1219 pci_vpd_pci22_init(dev);
Yu Zhao58c3a722008-10-14 14:02:53 +08001220
1221 /* Alternative Routing-ID Forwarding */
1222 pci_enable_ari(dev);
Yu Zhaod1b054d2009-03-20 11:25:11 +08001223
1224 /* Single Root I/O Virtualization */
1225 pci_iov_init(dev);
Allen Kayae21ee62009-10-07 10:27:17 -07001226
1227 /* Enable ACS P2P upstream forwarding */
Chris Wright5d990b62009-12-04 12:15:21 -08001228 pci_enable_acs(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001229}
1230
Sam Ravnborg96bde062007-03-26 21:53:30 -08001231void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001232{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233 device_initialize(&dev->dev);
1234 dev->dev.release = pci_release_dev;
1235 pci_dev_get(dev);
1236
Linus Torvalds1da177e2005-04-16 15:20:36 -07001237 dev->dev.dma_mask = &dev->dma_mask;
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001238 dev->dev.dma_parms = &dev->dma_parms;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239 dev->dev.coherent_dma_mask = 0xffffffffull;
1240
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001241 pci_set_dma_max_seg_size(dev, 65536);
FUJITA Tomonori59fc67d2008-02-04 22:28:14 -08001242 pci_set_dma_seg_boundary(dev, 0xffffffff);
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001243
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 /* Fix up broken headers */
1245 pci_fixup_device(pci_fixup_header, dev);
1246
Rafael J. Wysocki4b77b0a2009-09-09 23:49:59 +02001247 /* Clear the state_saved flag. */
1248 dev->state_saved = false;
1249
Zhao, Yu201de562008-10-13 19:49:55 +08001250 /* Initialize various capabilities */
1251 pci_init_capabilities(dev);
Rafael J. Wysockieb9d0fe2008-07-07 03:34:48 +02001252
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253 /*
1254 * Add the device to our list of discovered devices
1255 * and the bus list for fixup functions, etc.
1256 */
Zhang Yanmind71374d2006-06-02 12:35:43 +08001257 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 list_add_tail(&dev->bus_list, &bus->devices);
Zhang Yanmind71374d2006-06-02 12:35:43 +08001259 up_write(&pci_bus_sem);
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001260}
1261
Sam Ravnborg451124a2008-02-02 22:33:43 +01001262struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn)
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001263{
1264 struct pci_dev *dev;
1265
Trent Piepho90bdb312009-03-20 14:56:00 -06001266 dev = pci_get_slot(bus, devfn);
1267 if (dev) {
1268 pci_dev_put(dev);
1269 return dev;
1270 }
1271
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001272 dev = pci_scan_device(bus, devfn);
1273 if (!dev)
1274 return NULL;
1275
1276 pci_device_add(dev, bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277
1278 return dev;
1279}
Adrian Bunkb73e9682007-11-21 15:07:11 -08001280EXPORT_SYMBOL(pci_scan_single_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001282static unsigned next_ari_fn(struct pci_dev *dev, unsigned fn)
1283{
1284 u16 cap;
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001285 unsigned pos, next_fn;
1286
1287 if (!dev)
1288 return 0;
1289
1290 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI);
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001291 if (!pos)
1292 return 0;
1293 pci_read_config_word(dev, pos + 4, &cap);
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001294 next_fn = cap >> 8;
1295 if (next_fn <= fn)
1296 return 0;
1297 return next_fn;
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001298}
1299
1300static unsigned next_trad_fn(struct pci_dev *dev, unsigned fn)
1301{
1302 return (fn + 1) % 8;
1303}
1304
1305static unsigned no_next_fn(struct pci_dev *dev, unsigned fn)
1306{
1307 return 0;
1308}
1309
1310static int only_one_child(struct pci_bus *bus)
1311{
1312 struct pci_dev *parent = bus->self;
1313 if (!parent || !pci_is_pcie(parent))
1314 return 0;
1315 if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
1316 parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
1317 return 1;
1318 return 0;
1319}
1320
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321/**
1322 * pci_scan_slot - scan a PCI slot on a bus for devices.
1323 * @bus: PCI bus to scan
1324 * @devfn: slot number to scan (must have zero function.)
1325 *
1326 * Scan a PCI slot on the specified PCI bus for devices, adding
1327 * discovered devices to the @bus->devices list. New devices
Greg Kroah-Hartman8a1bc902008-02-14 14:56:56 -08001328 * will not have is_added set.
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001329 *
1330 * Returns the number of new devices found.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331 */
Sam Ravnborg96bde062007-03-26 21:53:30 -08001332int pci_scan_slot(struct pci_bus *bus, int devfn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333{
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001334 unsigned fn, nr = 0;
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001335 struct pci_dev *dev;
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001336 unsigned (*next_fn)(struct pci_dev *, unsigned) = no_next_fn;
1337
1338 if (only_one_child(bus) && (devfn > 0))
1339 return 0; /* Already scanned the entire slot */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001341 dev = pci_scan_single_device(bus, devfn);
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001342 if (!dev)
1343 return 0;
1344 if (!dev->is_added)
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001345 nr++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001347 if (pci_ari_enabled(bus))
1348 next_fn = next_ari_fn;
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001349 else if (dev->multifunction)
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001350 next_fn = next_trad_fn;
1351
1352 for (fn = next_fn(dev, 0); fn > 0; fn = next_fn(dev, fn)) {
1353 dev = pci_scan_single_device(bus, devfn + fn);
1354 if (dev) {
1355 if (!dev->is_added)
1356 nr++;
1357 dev->multifunction = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358 }
1359 }
Shaohua Li7d715a62008-02-25 09:46:41 +08001360
Shaohua Li149e1632008-07-23 10:32:31 +08001361 /* only one slot has pcie device */
1362 if (bus->self && nr)
Shaohua Li7d715a62008-02-25 09:46:41 +08001363 pcie_aspm_init_link_state(bus->self);
1364
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365 return nr;
1366}
1367
Jon Masonb03e7492011-07-20 15:20:54 -05001368static int pcie_find_smpss(struct pci_dev *dev, void *data)
1369{
1370 u8 *smpss = data;
1371
1372 if (!pci_is_pcie(dev))
1373 return 0;
1374
1375 /* For PCIE hotplug enabled slots not connected directly to a
1376 * PCI-E root port, there can be problems when hotplugging
1377 * devices. This is due to the possibility of hotplugging a
1378 * device into the fabric with a smaller MPS that the devices
1379 * currently running have configured. Modifying the MPS on the
1380 * running devices could cause a fatal bus error due to an
1381 * incoming frame being larger than the newly configured MPS.
1382 * To work around this, the MPS for the entire fabric must be
1383 * set to the minimum size. Any devices hotplugged into this
1384 * fabric will have the minimum MPS set. If the PCI hotplug
1385 * slot is directly connected to the root port and there are not
1386 * other devices on the fabric (which seems to be the most
1387 * common case), then this is not an issue and MPS discovery
1388 * will occur as normal.
1389 */
1390 if (dev->is_hotplug_bridge && (!list_is_singular(&dev->bus->devices) ||
Benjamin Herrenschmidt1a4b1a42011-09-13 15:16:33 -03001391 (dev->bus->self &&
1392 dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT)))
Jon Masonb03e7492011-07-20 15:20:54 -05001393 *smpss = 0;
1394
1395 if (*smpss > dev->pcie_mpss)
1396 *smpss = dev->pcie_mpss;
1397
1398 return 0;
1399}
1400
1401static void pcie_write_mps(struct pci_dev *dev, int mps)
1402{
Jon Mason62f392e2011-10-14 14:56:14 -05001403 int rc;
Jon Masonb03e7492011-07-20 15:20:54 -05001404
1405 if (pcie_bus_config == PCIE_BUS_PERFORMANCE) {
Jon Mason62f392e2011-10-14 14:56:14 -05001406 mps = 128 << dev->pcie_mpss;
Jon Masonb03e7492011-07-20 15:20:54 -05001407
Jon Mason62f392e2011-10-14 14:56:14 -05001408 if (dev->pcie_type != PCI_EXP_TYPE_ROOT_PORT && dev->bus->self)
1409 /* For "Performance", the assumption is made that
Jon Masonb03e7492011-07-20 15:20:54 -05001410 * downstream communication will never be larger than
1411 * the MRRS. So, the MPS only needs to be configured
1412 * for the upstream communication. This being the case,
1413 * walk from the top down and set the MPS of the child
1414 * to that of the parent bus.
Jon Mason62f392e2011-10-14 14:56:14 -05001415 *
1416 * Configure the device MPS with the smaller of the
1417 * device MPSS or the bridge MPS (which is assumed to be
1418 * properly configured at this point to the largest
1419 * allowable MPS based on its parent bus).
Jon Masonb03e7492011-07-20 15:20:54 -05001420 */
Jon Mason62f392e2011-10-14 14:56:14 -05001421 mps = min(mps, pcie_get_mps(dev->bus->self));
Jon Masonb03e7492011-07-20 15:20:54 -05001422 }
1423
1424 rc = pcie_set_mps(dev, mps);
1425 if (rc)
1426 dev_err(&dev->dev, "Failed attempting to set the MPS\n");
1427}
1428
Jon Mason62f392e2011-10-14 14:56:14 -05001429static void pcie_write_mrrs(struct pci_dev *dev)
Jon Masonb03e7492011-07-20 15:20:54 -05001430{
Jon Mason62f392e2011-10-14 14:56:14 -05001431 int rc, mrrs;
Jon Masonb03e7492011-07-20 15:20:54 -05001432
Jon Masoned2888e2011-09-08 16:41:18 -05001433 /* In the "safe" case, do not configure the MRRS. There appear to be
1434 * issues with setting MRRS to 0 on a number of devices.
1435 */
Jon Masoned2888e2011-09-08 16:41:18 -05001436 if (pcie_bus_config != PCIE_BUS_PERFORMANCE)
1437 return;
Jon Masonb03e7492011-07-20 15:20:54 -05001438
Jon Masoned2888e2011-09-08 16:41:18 -05001439 /* For Max performance, the MRRS must be set to the largest supported
1440 * value. However, it cannot be configured larger than the MPS the
Jon Mason62f392e2011-10-14 14:56:14 -05001441 * device or the bus can support. This should already be properly
1442 * configured by a prior call to pcie_write_mps.
Jon Masoned2888e2011-09-08 16:41:18 -05001443 */
Jon Mason62f392e2011-10-14 14:56:14 -05001444 mrrs = pcie_get_mps(dev);
Jon Masonb03e7492011-07-20 15:20:54 -05001445
1446 /* MRRS is a R/W register. Invalid values can be written, but a
Jon Masoned2888e2011-09-08 16:41:18 -05001447 * subsequent read will verify if the value is acceptable or not.
Jon Masonb03e7492011-07-20 15:20:54 -05001448 * If the MRRS value provided is not acceptable (e.g., too large),
1449 * shrink the value until it is acceptable to the HW.
1450 */
1451 while (mrrs != pcie_get_readrq(dev) && mrrs >= 128) {
1452 rc = pcie_set_readrq(dev, mrrs);
Jon Mason62f392e2011-10-14 14:56:14 -05001453 if (!rc)
1454 break;
Jon Masonb03e7492011-07-20 15:20:54 -05001455
Jon Mason62f392e2011-10-14 14:56:14 -05001456 dev_warn(&dev->dev, "Failed attempting to set the MRRS\n");
Jon Masonb03e7492011-07-20 15:20:54 -05001457 mrrs /= 2;
1458 }
Jon Mason62f392e2011-10-14 14:56:14 -05001459
1460 if (mrrs < 128)
1461 dev_err(&dev->dev, "MRRS was unable to be configured with a "
1462 "safe value. If problems are experienced, try running "
1463 "with pci=pcie_bus_safe.\n");
Jon Masonb03e7492011-07-20 15:20:54 -05001464}
1465
1466static int pcie_bus_configure_set(struct pci_dev *dev, void *data)
1467{
Jon Masona513a992011-10-14 14:56:16 -05001468 int mps, orig_mps;
Jon Masonb03e7492011-07-20 15:20:54 -05001469
1470 if (!pci_is_pcie(dev))
1471 return 0;
1472
Jon Masona513a992011-10-14 14:56:16 -05001473 mps = 128 << *(u8 *)data;
1474 orig_mps = pcie_get_mps(dev);
Jon Masonb03e7492011-07-20 15:20:54 -05001475
1476 pcie_write_mps(dev, mps);
Jon Mason62f392e2011-10-14 14:56:14 -05001477 pcie_write_mrrs(dev);
Jon Masonb03e7492011-07-20 15:20:54 -05001478
Jon Masona513a992011-10-14 14:56:16 -05001479 dev_info(&dev->dev, "PCI-E Max Payload Size set to %4d/%4d (was %4d), "
1480 "Max Read Rq %4d\n", pcie_get_mps(dev), 128 << dev->pcie_mpss,
1481 orig_mps, pcie_get_readrq(dev));
Jon Masonb03e7492011-07-20 15:20:54 -05001482
1483 return 0;
1484}
1485
Jon Masona513a992011-10-14 14:56:16 -05001486/* pcie_bus_configure_settings requires that pci_walk_bus work in a top-down,
Jon Masonb03e7492011-07-20 15:20:54 -05001487 * parents then children fashion. If this changes, then this code will not
1488 * work as designed.
1489 */
1490void pcie_bus_configure_settings(struct pci_bus *bus, u8 mpss)
1491{
Jon Mason5f39e672011-10-03 09:50:20 -05001492 u8 smpss;
Jon Masonb03e7492011-07-20 15:20:54 -05001493
Jon Masonb03e7492011-07-20 15:20:54 -05001494 if (!pci_is_pcie(bus->self))
1495 return;
1496
Jon Mason5f39e672011-10-03 09:50:20 -05001497 if (pcie_bus_config == PCIE_BUS_TUNE_OFF)
1498 return;
1499
1500 /* FIXME - Peer to peer DMA is possible, though the endpoint would need
1501 * to be aware to the MPS of the destination. To work around this,
1502 * simply force the MPS of the entire system to the smallest possible.
1503 */
1504 if (pcie_bus_config == PCIE_BUS_PEER2PEER)
1505 smpss = 0;
1506
Jon Masonb03e7492011-07-20 15:20:54 -05001507 if (pcie_bus_config == PCIE_BUS_SAFE) {
Jon Mason5f39e672011-10-03 09:50:20 -05001508 smpss = mpss;
1509
Jon Masonb03e7492011-07-20 15:20:54 -05001510 pcie_find_smpss(bus->self, &smpss);
1511 pci_walk_bus(bus, pcie_find_smpss, &smpss);
1512 }
1513
1514 pcie_bus_configure_set(bus->self, &smpss);
1515 pci_walk_bus(bus, pcie_bus_configure_set, &smpss);
1516}
Jon Masondebc3b72011-08-02 00:01:18 -05001517EXPORT_SYMBOL_GPL(pcie_bus_configure_settings);
Jon Masonb03e7492011-07-20 15:20:54 -05001518
Sam Ravnborg0ab2b572008-02-17 10:45:28 +01001519unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520{
1521 unsigned int devfn, pass, max = bus->secondary;
1522 struct pci_dev *dev;
1523
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001524 dev_dbg(&bus->dev, "scanning bus\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001525
1526 /* Go find them, Rover! */
1527 for (devfn = 0; devfn < 0x100; devfn += 8)
1528 pci_scan_slot(bus, devfn);
1529
Yu Zhaoa28724b2009-03-20 11:25:13 +08001530 /* Reserve buses for SR-IOV capability. */
1531 max += pci_iov_bus_range(bus);
1532
Linus Torvalds1da177e2005-04-16 15:20:36 -07001533 /*
1534 * After performing arch-dependent fixup of the bus, look behind
1535 * all PCI-to-PCI bridges on this bus.
1536 */
Alex Chiang74710de2009-03-20 14:56:10 -06001537 if (!bus->is_added) {
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001538 dev_dbg(&bus->dev, "fixups for bus\n");
Alex Chiang74710de2009-03-20 14:56:10 -06001539 pcibios_fixup_bus(bus);
1540 if (pci_is_root_bus(bus))
1541 bus->is_added = 1;
1542 }
1543
Linus Torvalds1da177e2005-04-16 15:20:36 -07001544 for (pass=0; pass < 2; pass++)
1545 list_for_each_entry(dev, &bus->devices, bus_list) {
1546 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
1547 dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
1548 max = pci_scan_bridge(bus, dev, max, pass);
1549 }
1550
1551 /*
1552 * We've scanned the bus and so we know all about what's on
1553 * the other side of any bridges that may be on this bus plus
1554 * any devices.
1555 *
1556 * Return how far we've got finding sub-buses.
1557 */
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001558 dev_dbg(&bus->dev, "bus scan returning with max=%02x\n", max);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001559 return max;
1560}
1561
Bjorn Helgaas166c6372011-10-28 16:25:45 -06001562struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
1563 struct pci_ops *ops, void *sysdata, struct list_head *resources)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001564{
Bjorn Helgaas0efd5aa2012-02-23 20:19:00 -07001565 int error;
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001566 struct pci_host_bridge *bridge;
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001567 struct pci_bus *b, *b2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001568 struct device *dev;
Bjorn Helgaas0efd5aa2012-02-23 20:19:00 -07001569 struct pci_host_bridge_window *window, *n;
Bjorn Helgaasa9d9f522011-10-28 16:25:40 -06001570 struct resource *res;
Bjorn Helgaas0efd5aa2012-02-23 20:19:00 -07001571 resource_size_t offset;
1572 char bus_addr[64];
1573 char *fmt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001574
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001575 bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
1576 if (!bridge)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577 return NULL;
1578
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001579 b = pci_alloc_bus();
1580 if (!b)
1581 goto err_bus;
1582
Geert Uytterhoeven6a3b3e22009-03-15 20:14:37 +01001583 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001584 if (!dev)
1585 goto err_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586
1587 b->sysdata = sysdata;
1588 b->ops = ops;
1589
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001590 b2 = pci_find_bus(pci_domain_nr(b), bus);
1591 if (b2) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001592 /* If we already got to this bus through a different bridge, ignore it */
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001593 dev_dbg(&b2->dev, "bus already known\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001594 goto err_out;
1595 }
Zhang Yanmind71374d2006-06-02 12:35:43 +08001596
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597 dev->parent = parent;
1598 dev->release = pci_release_bus_bridge_dev;
Kay Sievers1a927132008-10-30 02:17:49 +01001599 dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600 error = device_register(dev);
1601 if (error)
1602 goto dev_reg_err;
1603 b->bridge = get_device(dev);
Rafael J. Wysockia1e4d722010-02-08 19:16:33 +01001604 device_enable_async_suspend(b->bridge);
Benjamin Herrenschmidt98d9f30c82011-04-11 11:37:07 +10001605 pci_set_bus_of_node(b);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001606
Yinghai Lu0d358f22008-02-19 03:20:41 -08001607 if (!parent)
1608 set_dev_node(b->bridge, pcibus_to_node(b));
1609
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001610 b->dev.class = &pcibus_class;
1611 b->dev.parent = b->bridge;
Kay Sievers1a927132008-10-30 02:17:49 +01001612 dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001613 error = device_register(&b->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001614 if (error)
1615 goto class_dev_reg_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616
1617 /* Create legacy_io and legacy_mem files for this bus */
1618 pci_create_legacy_files(b);
1619
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 b->number = b->secondary = bus;
Bjorn Helgaas166c6372011-10-28 16:25:45 -06001621
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001622 bridge->bus = b;
Bjorn Helgaas0efd5aa2012-02-23 20:19:00 -07001623 INIT_LIST_HEAD(&bridge->windows);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624
Bjorn Helgaasa9d9f522011-10-28 16:25:40 -06001625 if (parent)
1626 dev_info(parent, "PCI host bridge to bus %s\n", dev_name(&b->dev));
1627 else
1628 printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev));
1629
Bjorn Helgaas0efd5aa2012-02-23 20:19:00 -07001630 /* Add initial resources to the bus */
1631 list_for_each_entry_safe(window, n, resources, list) {
1632 list_move_tail(&window->list, &bridge->windows);
1633 res = window->res;
1634 offset = window->offset;
1635 pci_bus_add_resource(b, res, 0);
1636 if (offset) {
1637 if (resource_type(res) == IORESOURCE_IO)
1638 fmt = " (bus address [%#06llx-%#06llx])";
1639 else
1640 fmt = " (bus address [%#010llx-%#010llx])";
1641 snprintf(bus_addr, sizeof(bus_addr), fmt,
1642 (unsigned long long) (res->start - offset),
1643 (unsigned long long) (res->end - offset));
1644 } else
1645 bus_addr[0] = '\0';
1646 dev_info(&b->dev, "root bus resource %pR%s\n", res, bus_addr);
Bjorn Helgaasa9d9f522011-10-28 16:25:40 -06001647 }
1648
Bjorn Helgaasa5390aa2012-02-23 20:18:59 -07001649 down_write(&pci_bus_sem);
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001650 list_add_tail(&bridge->list, &pci_host_bridges);
Bjorn Helgaasa5390aa2012-02-23 20:18:59 -07001651 list_add_tail(&b->node, &pci_root_buses);
1652 up_write(&pci_bus_sem);
1653
Linus Torvalds1da177e2005-04-16 15:20:36 -07001654 return b;
1655
Linus Torvalds1da177e2005-04-16 15:20:36 -07001656class_dev_reg_err:
1657 device_unregister(dev);
1658dev_reg_err:
Zhang Yanmind71374d2006-06-02 12:35:43 +08001659 down_write(&pci_bus_sem);
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001660 list_del(&bridge->list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001661 list_del(&b->node);
Zhang Yanmind71374d2006-06-02 12:35:43 +08001662 up_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663err_out:
1664 kfree(dev);
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001665err_dev:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001666 kfree(b);
Bjorn Helgaas5a21d702012-02-23 20:18:59 -07001667err_bus:
1668 kfree(bridge);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001669 return NULL;
1670}
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001671
Bjorn Helgaasa2ebb822011-10-28 16:25:50 -06001672struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus,
1673 struct pci_ops *ops, void *sysdata, struct list_head *resources)
1674{
1675 struct pci_bus *b;
1676
1677 b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
1678 if (!b)
1679 return NULL;
1680
1681 b->subordinate = pci_scan_child_bus(b);
1682 pci_bus_add_devices(b);
1683 return b;
1684}
1685EXPORT_SYMBOL(pci_scan_root_bus);
1686
Bjorn Helgaas7e00fe22011-10-28 16:26:05 -06001687/* Deprecated; use pci_scan_root_bus() instead */
Sam Ravnborg0ab2b572008-02-17 10:45:28 +01001688struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent,
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001689 int bus, struct pci_ops *ops, void *sysdata)
1690{
Bjorn Helgaas1e39ae92011-10-28 16:26:00 -06001691 LIST_HEAD(resources);
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001692 struct pci_bus *b;
1693
Bjorn Helgaas1e39ae92011-10-28 16:26:00 -06001694 pci_add_resource(&resources, &ioport_resource);
1695 pci_add_resource(&resources, &iomem_resource);
1696 b = pci_create_root_bus(parent, bus, ops, sysdata, &resources);
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001697 if (b)
1698 b->subordinate = pci_scan_child_bus(b);
Bjorn Helgaas1e39ae92011-10-28 16:26:00 -06001699 else
1700 pci_free_resource_list(&resources);
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001701 return b;
1702}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703EXPORT_SYMBOL(pci_scan_bus_parented);
1704
Bjorn Helgaasde4b2f72011-10-28 16:25:55 -06001705struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *ops,
1706 void *sysdata)
1707{
1708 LIST_HEAD(resources);
1709 struct pci_bus *b;
1710
1711 pci_add_resource(&resources, &ioport_resource);
1712 pci_add_resource(&resources, &iomem_resource);
1713 b = pci_create_root_bus(NULL, bus, ops, sysdata, &resources);
1714 if (b) {
1715 b->subordinate = pci_scan_child_bus(b);
1716 pci_bus_add_devices(b);
1717 } else {
1718 pci_free_resource_list(&resources);
1719 }
1720 return b;
1721}
1722EXPORT_SYMBOL(pci_scan_bus);
1723
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724#ifdef CONFIG_HOTPLUG
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001725/**
Yinghai Lu2f320522012-01-21 02:08:22 -08001726 * pci_rescan_bus_bridge_resize - scan a PCI bus for devices.
1727 * @bridge: PCI bridge for the bus to scan
1728 *
1729 * Scan a PCI bus and child buses for new devices, add them,
1730 * and enable them, resizing bridge mmio/io resource if necessary
1731 * and possible. The caller must ensure the child devices are already
1732 * removed for resizing to occur.
1733 *
1734 * Returns the max number of subordinate bus discovered.
1735 */
1736unsigned int __ref pci_rescan_bus_bridge_resize(struct pci_dev *bridge)
1737{
1738 unsigned int max;
1739 struct pci_bus *bus = bridge->subordinate;
1740
1741 max = pci_scan_child_bus(bus);
1742
1743 pci_assign_unassigned_bridge_resources(bridge);
1744
1745 pci_bus_add_devices(bus);
1746
1747 return max;
1748}
1749
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750EXPORT_SYMBOL(pci_add_new_bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751EXPORT_SYMBOL(pci_scan_slot);
1752EXPORT_SYMBOL(pci_scan_bridge);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001753EXPORT_SYMBOL_GPL(pci_scan_child_bus);
1754#endif
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001755
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001756static int __init pci_sort_bf_cmp(const struct device *d_a, const struct device *d_b)
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001757{
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001758 const struct pci_dev *a = to_pci_dev(d_a);
1759 const struct pci_dev *b = to_pci_dev(d_b);
1760
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001761 if (pci_domain_nr(a->bus) < pci_domain_nr(b->bus)) return -1;
1762 else if (pci_domain_nr(a->bus) > pci_domain_nr(b->bus)) return 1;
1763
1764 if (a->bus->number < b->bus->number) return -1;
1765 else if (a->bus->number > b->bus->number) return 1;
1766
1767 if (a->devfn < b->devfn) return -1;
1768 else if (a->devfn > b->devfn) return 1;
1769
1770 return 0;
1771}
1772
Greg Kroah-Hartman5ff580c2008-02-14 14:56:56 -08001773void __init pci_sort_breadthfirst(void)
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001774{
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001775 bus_sort_breadthfirst(&pci_bus_type, &pci_sort_bf_cmp);
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001776}