blob: ef17cf99830e06e7ba90becbf4248f65fea1753a [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
18/* Ugh. Need to stop exporting this to modules. */
19LIST_HEAD(pci_root_buses);
20EXPORT_SYMBOL(pci_root_buses);
21
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080022
23static int find_anything(struct device *dev, void *data)
24{
25 return 1;
26}
Linus Torvalds1da177e2005-04-16 15:20:36 -070027
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070028/*
29 * Some device drivers need know if pci is initiated.
30 * Basically, we think pci is not initiated when there
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080031 * is no device to be found on the pci_bus_type.
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070032 */
33int no_pci_devices(void)
34{
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080035 struct device *dev;
36 int no_devices;
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070037
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080038 dev = bus_find_device(&pci_bus_type, NULL, NULL, find_anything);
39 no_devices = (dev == NULL);
40 put_device(dev);
41 return no_devices;
42}
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070043EXPORT_SYMBOL(no_pci_devices);
44
Linus Torvalds1da177e2005-04-16 15:20:36 -070045/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070046 * PCI Bus Class
47 */
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040048static void release_pcibus_dev(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -070049{
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040050 struct pci_bus *pci_bus = to_pci_bus(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070051
52 if (pci_bus->bridge)
53 put_device(pci_bus->bridge);
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -070054 pci_bus_remove_resources(pci_bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 kfree(pci_bus);
56}
57
58static struct class pcibus_class = {
59 .name = "pci_bus",
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040060 .dev_release = &release_pcibus_dev,
Yinghai Lub9d320f2011-05-12 17:11:39 -070061 .dev_attrs = pcibus_dev_attrs,
Linus Torvalds1da177e2005-04-16 15:20:36 -070062};
63
64static int __init pcibus_class_init(void)
65{
66 return class_register(&pcibus_class);
67}
68postcore_initcall(pcibus_class_init);
69
Matthew Wilcox6ac665c2008-07-28 13:38:59 -040070static u64 pci_size(u64 base, u64 maxbase, u64 mask)
Yinghai Lu07eddf32006-11-29 13:53:10 -080071{
72 u64 size = mask & maxbase; /* Find the significant bits */
73 if (!size)
74 return 0;
75
76 /* Get the lowest of them to find the decode size, and
77 from that the extent. */
78 size = (size & ~(size-1)) - 1;
79
80 /* base == maxbase can be valid only if the BAR has
81 already been programmed with all 1s. */
82 if (base == maxbase && ((base | size) & mask) != mask)
83 return 0;
84
85 return size;
86}
87
Bjorn Helgaas28c68212011-06-14 13:04:35 -060088static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar)
Yinghai Lu07eddf32006-11-29 13:53:10 -080089{
Bjorn Helgaas8d6a6a42011-06-14 13:04:29 -060090 u32 mem_type;
Bjorn Helgaas28c68212011-06-14 13:04:35 -060091 unsigned long flags;
Bjorn Helgaas8d6a6a42011-06-14 13:04:29 -060092
Matthew Wilcox6ac665c2008-07-28 13:38:59 -040093 if ((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
Bjorn Helgaas28c68212011-06-14 13:04:35 -060094 flags = bar & ~PCI_BASE_ADDRESS_IO_MASK;
95 flags |= IORESOURCE_IO;
96 return flags;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -040097 }
98
Bjorn Helgaas28c68212011-06-14 13:04:35 -060099 flags = bar & ~PCI_BASE_ADDRESS_MEM_MASK;
100 flags |= IORESOURCE_MEM;
101 if (flags & PCI_BASE_ADDRESS_MEM_PREFETCH)
102 flags |= IORESOURCE_PREFETCH;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400103
Bjorn Helgaas8d6a6a42011-06-14 13:04:29 -0600104 mem_type = bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK;
105 switch (mem_type) {
106 case PCI_BASE_ADDRESS_MEM_TYPE_32:
107 break;
108 case PCI_BASE_ADDRESS_MEM_TYPE_1M:
109 dev_info(&dev->dev, "1M mem BAR treated as 32-bit BAR\n");
110 break;
111 case PCI_BASE_ADDRESS_MEM_TYPE_64:
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600112 flags |= IORESOURCE_MEM_64;
113 break;
Bjorn Helgaas8d6a6a42011-06-14 13:04:29 -0600114 default:
115 dev_warn(&dev->dev,
116 "mem unknown type %x treated as 32-bit BAR\n",
117 mem_type);
118 break;
119 }
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600120 return flags;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400121}
122
Yu Zhao0b400c72008-11-22 02:40:40 +0800123/**
124 * pci_read_base - read a PCI BAR
125 * @dev: the PCI device
126 * @type: type of the BAR
127 * @res: resource buffer to be filled in
128 * @pos: BAR position in the config space
129 *
130 * Returns 1 if the BAR is 64-bit, or 0 if 32-bit.
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400131 */
Yu Zhao0b400c72008-11-22 02:40:40 +0800132int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400133 struct resource *res, unsigned int pos)
134{
135 u32 l, sz, mask;
Jacob Pan253d2e52010-07-16 10:19:22 -0700136 u16 orig_cmd;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400137
Michael S. Tsirkin1ed67432009-10-29 17:24:59 +0200138 mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400139
Jacob Pan253d2e52010-07-16 10:19:22 -0700140 if (!dev->mmio_always_on) {
141 pci_read_config_word(dev, PCI_COMMAND, &orig_cmd);
142 pci_write_config_word(dev, PCI_COMMAND,
143 orig_cmd & ~(PCI_COMMAND_MEMORY | PCI_COMMAND_IO));
144 }
145
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400146 res->name = pci_name(dev);
147
148 pci_read_config_dword(dev, pos, &l);
Michael S. Tsirkin1ed67432009-10-29 17:24:59 +0200149 pci_write_config_dword(dev, pos, l | mask);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400150 pci_read_config_dword(dev, pos, &sz);
151 pci_write_config_dword(dev, pos, l);
152
Jacob Pan253d2e52010-07-16 10:19:22 -0700153 if (!dev->mmio_always_on)
154 pci_write_config_word(dev, PCI_COMMAND, orig_cmd);
155
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400156 /*
157 * All bits set in sz means the device isn't working properly.
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600158 * If the BAR isn't implemented, all bits must be 0. If it's a
159 * memory BAR or a ROM, bit 0 must be clear; if it's an io BAR, bit
160 * 1 must be clear.
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400161 */
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600162 if (!sz || sz == 0xffffffff)
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400163 goto fail;
164
165 /*
166 * I don't know how l can have all bits set. Copied from old code.
167 * Maybe it fixes a bug on some ancient platform.
168 */
169 if (l == 0xffffffff)
170 l = 0;
171
172 if (type == pci_bar_unknown) {
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600173 res->flags = decode_bar(dev, l);
174 res->flags |= IORESOURCE_SIZEALIGN;
175 if (res->flags & IORESOURCE_IO) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400176 l &= PCI_BASE_ADDRESS_IO_MASK;
David S. Miller5aceca92011-05-23 17:12:22 -0700177 mask = PCI_BASE_ADDRESS_IO_MASK & (u32) IO_SPACE_LIMIT;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400178 } else {
179 l &= PCI_BASE_ADDRESS_MEM_MASK;
180 mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
181 }
182 } else {
183 res->flags |= (l & IORESOURCE_ROM_ENABLE);
184 l &= PCI_ROM_ADDRESS_MASK;
185 mask = (u32)PCI_ROM_ADDRESS_MASK;
186 }
187
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600188 if (res->flags & IORESOURCE_MEM_64) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400189 u64 l64 = l;
190 u64 sz64 = sz;
191 u64 mask64 = mask | (u64)~0 << 32;
192
193 pci_read_config_dword(dev, pos + 4, &l);
194 pci_write_config_dword(dev, pos + 4, ~0);
195 pci_read_config_dword(dev, pos + 4, &sz);
196 pci_write_config_dword(dev, pos + 4, l);
197
198 l64 |= ((u64)l << 32);
199 sz64 |= ((u64)sz << 32);
200
201 sz64 = pci_size(l64, sz64, mask64);
202
203 if (!sz64)
204 goto fail;
205
Matthew Wilcoxcc5499c2008-07-28 13:39:00 -0400206 if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) {
Bjorn Helgaas865df572009-11-04 10:32:57 -0700207 dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n",
208 pos);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400209 goto fail;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600210 }
211
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600212 if ((sizeof(resource_size_t) < 8) && l) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400213 /* Address above 32-bit boundary; disable the BAR */
214 pci_write_config_dword(dev, pos, 0);
215 pci_write_config_dword(dev, pos + 4, 0);
216 res->start = 0;
217 res->end = sz64;
218 } else {
219 res->start = l64;
220 res->end = l64 + sz64;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600221 dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n",
Bjorn Helgaasa369c792009-10-06 15:33:44 -0600222 pos, res);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400223 }
224 } else {
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600225 sz = pci_size(l, sz, mask);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400226
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600227 if (!sz)
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400228 goto fail;
229
230 res->start = l;
Bjorn Helgaas45aa23b2010-04-22 09:02:43 -0600231 res->end = l + sz;
Vincent Legollf393d9b2008-10-12 12:26:12 +0200232
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600233 dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400234 }
235
236 out:
Bjorn Helgaas28c68212011-06-14 13:04:35 -0600237 return (res->flags & IORESOURCE_MEM_64) ? 1 : 0;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400238 fail:
239 res->flags = 0;
240 goto out;
Yinghai Lu07eddf32006-11-29 13:53:10 -0800241}
242
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
244{
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400245 unsigned int pos, reg;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400247 for (pos = 0; pos < howmany; pos++) {
248 struct resource *res = &dev->resource[pos];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249 reg = PCI_BASE_ADDRESS_0 + (pos << 2);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400250 pos += __pci_read_base(dev, pci_bar_unknown, res, reg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 }
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400252
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253 if (rom) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400254 struct resource *res = &dev->resource[PCI_ROM_RESOURCE];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255 dev->rom_base_reg = rom;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400256 res->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH |
257 IORESOURCE_READONLY | IORESOURCE_CACHEABLE |
258 IORESOURCE_SIZEALIGN;
259 __pci_read_base(dev, pci_bar_mem32, res, rom);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260 }
261}
262
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700263static void __devinit pci_read_bridge_io(struct pci_bus *child)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264{
265 struct pci_dev *dev = child->self;
266 u8 io_base_lo, io_limit_lo;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 unsigned long base, limit;
268 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270 res = child->resource[0];
271 pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo);
272 pci_read_config_byte(dev, PCI_IO_LIMIT, &io_limit_lo);
273 base = (io_base_lo & PCI_IO_RANGE_MASK) << 8;
274 limit = (io_limit_lo & PCI_IO_RANGE_MASK) << 8;
275
276 if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
277 u16 io_base_hi, io_limit_hi;
278 pci_read_config_word(dev, PCI_IO_BASE_UPPER16, &io_base_hi);
279 pci_read_config_word(dev, PCI_IO_LIMIT_UPPER16, &io_limit_hi);
280 base |= (io_base_hi << 16);
281 limit |= (io_limit_hi << 16);
282 }
283
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800284 if (base && base <= limit) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285 res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
Daniel Yeisley9d265122005-12-05 07:06:43 -0500286 if (!res->start)
287 res->start = base;
288 if (!res->end)
289 res->end = limit + 0xfff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600290 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800291 } else {
292 dev_printk(KERN_DEBUG, &dev->dev,
Bjorn Helgaas7b8ff6d2010-03-16 15:53:03 -0600293 " bridge window [io %#06lx-%#06lx] (disabled)\n",
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800294 base, limit);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700296}
297
298static void __devinit pci_read_bridge_mmio(struct pci_bus *child)
299{
300 struct pci_dev *dev = child->self;
301 u16 mem_base_lo, mem_limit_lo;
302 unsigned long base, limit;
303 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304
305 res = child->resource[1];
306 pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo);
307 pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
308 base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
309 limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16;
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800310 if (base && base <= limit) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311 res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
312 res->start = base;
313 res->end = limit + 0xfffff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600314 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800315 } else {
316 dev_printk(KERN_DEBUG, &dev->dev,
Bjorn Helgaas7b8ff6d2010-03-16 15:53:03 -0600317 " bridge window [mem %#010lx-%#010lx] (disabled)\n",
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800318 base, limit + 0xfffff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700320}
321
322static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child)
323{
324 struct pci_dev *dev = child->self;
325 u16 mem_base_lo, mem_limit_lo;
326 unsigned long base, limit;
327 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328
329 res = child->resource[2];
330 pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo);
331 pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo);
332 base = (mem_base_lo & PCI_PREF_RANGE_MASK) << 16;
333 limit = (mem_limit_lo & PCI_PREF_RANGE_MASK) << 16;
334
335 if ((mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) {
336 u32 mem_base_hi, mem_limit_hi;
337 pci_read_config_dword(dev, PCI_PREF_BASE_UPPER32, &mem_base_hi);
338 pci_read_config_dword(dev, PCI_PREF_LIMIT_UPPER32, &mem_limit_hi);
339
340 /*
341 * Some bridges set the base > limit by default, and some
342 * (broken) BIOSes do not initialize them. If we find
343 * this, just assume they are not being used.
344 */
345 if (mem_base_hi <= mem_limit_hi) {
346#if BITS_PER_LONG == 64
347 base |= ((long) mem_base_hi) << 32;
348 limit |= ((long) mem_limit_hi) << 32;
349#else
350 if (mem_base_hi || mem_limit_hi) {
Bjorn Helgaas80ccba12008-06-13 10:52:11 -0600351 dev_err(&dev->dev, "can't handle 64-bit "
352 "address space for bridge\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700353 return;
354 }
355#endif
356 }
357 }
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800358 if (base && base <= limit) {
Yinghai Lu1f82de12009-04-23 20:48:32 -0700359 res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) |
360 IORESOURCE_MEM | IORESOURCE_PREFETCH;
361 if (res->flags & PCI_PREF_RANGE_TYPE_64)
362 res->flags |= IORESOURCE_MEM_64;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363 res->start = base;
364 res->end = limit + 0xfffff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600365 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800366 } else {
367 dev_printk(KERN_DEBUG, &dev->dev,
Bjorn Helgaas7b8ff6d2010-03-16 15:53:03 -0600368 " bridge window [mem %#010lx-%#010lx pref] (disabled)\n",
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800369 base, limit + 0xfffff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370 }
371}
372
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700373void __devinit pci_read_bridge_bases(struct pci_bus *child)
374{
375 struct pci_dev *dev = child->self;
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700376 struct resource *res;
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700377 int i;
378
379 if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */
380 return;
381
382 dev_info(&dev->dev, "PCI bridge to [bus %02x-%02x]%s\n",
383 child->secondary, child->subordinate,
384 dev->transparent ? " (subtractive decode)" : "");
385
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700386 pci_bus_remove_resources(child);
387 for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++)
388 child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i];
389
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700390 pci_read_bridge_io(child);
391 pci_read_bridge_mmio(child);
392 pci_read_bridge_mmio_pref(child);
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700393
394 if (dev->transparent) {
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700395 pci_bus_for_each_resource(child->parent, res, i) {
396 if (res) {
397 pci_bus_add_resource(child, res,
398 PCI_SUBTRACTIVE_DECODE);
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700399 dev_printk(KERN_DEBUG, &dev->dev,
400 " bridge window %pR (subtractive decode)\n",
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700401 res);
402 }
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700403 }
404 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700405}
406
Sam Ravnborg96bde062007-03-26 21:53:30 -0800407static struct pci_bus * pci_alloc_bus(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408{
409 struct pci_bus *b;
410
Eric Sesterhennf5afe802006-02-28 15:34:49 +0100411 b = kzalloc(sizeof(*b), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412 if (b) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413 INIT_LIST_HEAD(&b->node);
414 INIT_LIST_HEAD(&b->children);
415 INIT_LIST_HEAD(&b->devices);
Alex Chiangf46753c2008-06-10 15:28:50 -0600416 INIT_LIST_HEAD(&b->slots);
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700417 INIT_LIST_HEAD(&b->resources);
Matthew Wilcox3749c512009-12-13 08:11:32 -0500418 b->max_bus_speed = PCI_SPEED_UNKNOWN;
419 b->cur_bus_speed = PCI_SPEED_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420 }
421 return b;
422}
423
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500424static unsigned char pcix_bus_speed[] = {
425 PCI_SPEED_UNKNOWN, /* 0 */
426 PCI_SPEED_66MHz_PCIX, /* 1 */
427 PCI_SPEED_100MHz_PCIX, /* 2 */
428 PCI_SPEED_133MHz_PCIX, /* 3 */
429 PCI_SPEED_UNKNOWN, /* 4 */
430 PCI_SPEED_66MHz_PCIX_ECC, /* 5 */
431 PCI_SPEED_100MHz_PCIX_ECC, /* 6 */
432 PCI_SPEED_133MHz_PCIX_ECC, /* 7 */
433 PCI_SPEED_UNKNOWN, /* 8 */
434 PCI_SPEED_66MHz_PCIX_266, /* 9 */
435 PCI_SPEED_100MHz_PCIX_266, /* A */
436 PCI_SPEED_133MHz_PCIX_266, /* B */
437 PCI_SPEED_UNKNOWN, /* C */
438 PCI_SPEED_66MHz_PCIX_533, /* D */
439 PCI_SPEED_100MHz_PCIX_533, /* E */
440 PCI_SPEED_133MHz_PCIX_533 /* F */
441};
442
Matthew Wilcox3749c512009-12-13 08:11:32 -0500443static unsigned char pcie_link_speed[] = {
444 PCI_SPEED_UNKNOWN, /* 0 */
445 PCIE_SPEED_2_5GT, /* 1 */
446 PCIE_SPEED_5_0GT, /* 2 */
Matthew Wilcox9dfd97f2009-12-13 08:11:35 -0500447 PCIE_SPEED_8_0GT, /* 3 */
Matthew Wilcox3749c512009-12-13 08:11:32 -0500448 PCI_SPEED_UNKNOWN, /* 4 */
449 PCI_SPEED_UNKNOWN, /* 5 */
450 PCI_SPEED_UNKNOWN, /* 6 */
451 PCI_SPEED_UNKNOWN, /* 7 */
452 PCI_SPEED_UNKNOWN, /* 8 */
453 PCI_SPEED_UNKNOWN, /* 9 */
454 PCI_SPEED_UNKNOWN, /* A */
455 PCI_SPEED_UNKNOWN, /* B */
456 PCI_SPEED_UNKNOWN, /* C */
457 PCI_SPEED_UNKNOWN, /* D */
458 PCI_SPEED_UNKNOWN, /* E */
459 PCI_SPEED_UNKNOWN /* F */
460};
461
462void pcie_update_link_speed(struct pci_bus *bus, u16 linksta)
463{
464 bus->cur_bus_speed = pcie_link_speed[linksta & 0xf];
465}
466EXPORT_SYMBOL_GPL(pcie_update_link_speed);
467
Matthew Wilcox45b4cdd52009-12-13 08:11:34 -0500468static unsigned char agp_speeds[] = {
469 AGP_UNKNOWN,
470 AGP_1X,
471 AGP_2X,
472 AGP_4X,
473 AGP_8X
474};
475
476static enum pci_bus_speed agp_speed(int agp3, int agpstat)
477{
478 int index = 0;
479
480 if (agpstat & 4)
481 index = 3;
482 else if (agpstat & 2)
483 index = 2;
484 else if (agpstat & 1)
485 index = 1;
486 else
487 goto out;
488
489 if (agp3) {
490 index += 2;
491 if (index == 5)
492 index = 0;
493 }
494
495 out:
496 return agp_speeds[index];
497}
498
499
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500500static void pci_set_bus_speed(struct pci_bus *bus)
501{
502 struct pci_dev *bridge = bus->self;
503 int pos;
504
Matthew Wilcox45b4cdd52009-12-13 08:11:34 -0500505 pos = pci_find_capability(bridge, PCI_CAP_ID_AGP);
506 if (!pos)
507 pos = pci_find_capability(bridge, PCI_CAP_ID_AGP3);
508 if (pos) {
509 u32 agpstat, agpcmd;
510
511 pci_read_config_dword(bridge, pos + PCI_AGP_STATUS, &agpstat);
512 bus->max_bus_speed = agp_speed(agpstat & 8, agpstat & 7);
513
514 pci_read_config_dword(bridge, pos + PCI_AGP_COMMAND, &agpcmd);
515 bus->cur_bus_speed = agp_speed(agpstat & 8, agpcmd & 7);
516 }
517
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500518 pos = pci_find_capability(bridge, PCI_CAP_ID_PCIX);
519 if (pos) {
520 u16 status;
521 enum pci_bus_speed max;
522 pci_read_config_word(bridge, pos + 2, &status);
523
524 if (status & 0x8000) {
525 max = PCI_SPEED_133MHz_PCIX_533;
526 } else if (status & 0x4000) {
527 max = PCI_SPEED_133MHz_PCIX_266;
528 } else if (status & 0x0002) {
529 if (((status >> 12) & 0x3) == 2) {
530 max = PCI_SPEED_133MHz_PCIX_ECC;
531 } else {
532 max = PCI_SPEED_133MHz_PCIX;
533 }
534 } else {
535 max = PCI_SPEED_66MHz_PCIX;
536 }
537
538 bus->max_bus_speed = max;
539 bus->cur_bus_speed = pcix_bus_speed[(status >> 6) & 0xf];
540
541 return;
542 }
543
544 pos = pci_find_capability(bridge, PCI_CAP_ID_EXP);
545 if (pos) {
546 u32 linkcap;
547 u16 linksta;
548
549 pci_read_config_dword(bridge, pos + PCI_EXP_LNKCAP, &linkcap);
550 bus->max_bus_speed = pcie_link_speed[linkcap & 0xf];
551
552 pci_read_config_word(bridge, pos + PCI_EXP_LNKSTA, &linksta);
553 pcie_update_link_speed(bus, linksta);
554 }
555}
556
557
Adrian Bunkcbd4e052008-04-18 13:53:55 -0700558static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
559 struct pci_dev *bridge, int busnr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560{
561 struct pci_bus *child;
562 int i;
563
564 /*
565 * Allocate a new bus, and inherit stuff from the parent..
566 */
567 child = pci_alloc_bus();
568 if (!child)
569 return NULL;
570
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571 child->parent = parent;
572 child->ops = parent->ops;
573 child->sysdata = parent->sysdata;
Michael S. Tsirkin6e325a62006-02-14 18:52:22 +0200574 child->bus_flags = parent->bus_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -0400576 /* initialize some portions of the bus device, but don't register it
577 * now as the parent is not properly set up yet. This device will get
578 * registered later in pci_bus_add_devices()
579 */
580 child->dev.class = &pcibus_class;
Kay Sievers1a927132008-10-30 02:17:49 +0100581 dev_set_name(&child->dev, "%04x:%02x", pci_domain_nr(child), busnr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582
583 /*
584 * Set up the primary, secondary and subordinate
585 * bus numbers.
586 */
587 child->number = child->secondary = busnr;
588 child->primary = parent->secondary;
589 child->subordinate = 0xff;
590
Yu Zhao3789fa82008-11-22 02:41:07 +0800591 if (!bridge)
592 return child;
593
594 child->self = bridge;
595 child->bridge = get_device(&bridge->dev);
596
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500597 pci_set_bus_speed(child);
598
Linus Torvalds1da177e2005-04-16 15:20:36 -0700599 /* Set up default resource pointers and names.. */
Yu Zhaofde09c62008-11-22 02:39:32 +0800600 for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601 child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i];
602 child->resource[i]->name = child->name;
603 }
604 bridge->subordinate = child;
605
606 return child;
607}
608
Sam Ravnborg451124a2008-02-02 22:33:43 +0100609struct pci_bus *__ref pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610{
611 struct pci_bus *child;
612
613 child = pci_alloc_child_bus(parent, dev, busnr);
Rajesh Shahe4ea9bb2005-04-28 00:25:48 -0700614 if (child) {
Zhang Yanmind71374d2006-06-02 12:35:43 +0800615 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 list_add_tail(&child->node, &parent->children);
Zhang Yanmind71374d2006-06-02 12:35:43 +0800617 up_write(&pci_bus_sem);
Rajesh Shahe4ea9bb2005-04-28 00:25:48 -0700618 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700619 return child;
620}
621
Sam Ravnborg96bde062007-03-26 21:53:30 -0800622static void pci_fixup_parent_subordinate_busnr(struct pci_bus *child, int max)
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700623{
624 struct pci_bus *parent = child->parent;
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700625
626 /* Attempts to fix that up are really dangerous unless
627 we're going to re-assign all bus numbers. */
628 if (!pcibios_assign_all_busses())
629 return;
630
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700631 while (parent->parent && parent->subordinate < max) {
632 parent->subordinate = max;
633 pci_write_config_byte(parent->self, PCI_SUBORDINATE_BUS, max);
634 parent = parent->parent;
635 }
636}
637
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638/*
639 * If it's a bridge, configure it and scan the bus behind it.
640 * For CardBus bridges, we don't scan behind as the devices will
641 * be handled by the bridge driver itself.
642 *
643 * We need to process bridges in two passes -- first we scan those
644 * already configured by the BIOS and after we are done with all of
645 * them, we proceed to assigning numbers to the remaining buses in
646 * order to avoid overlaps between old and new bus numbers.
647 */
Sam Ravnborg0ab2b572008-02-17 10:45:28 +0100648int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649{
650 struct pci_bus *child;
651 int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
Dominik Brodowski49887942005-12-08 16:53:12 +0100652 u32 buses, i, j = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653 u16 bctl;
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600654 u8 primary, secondary, subordinate;
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100655 int broken = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656
657 pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses);
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600658 primary = buses & 0xFF;
659 secondary = (buses >> 8) & 0xFF;
660 subordinate = (buses >> 16) & 0xFF;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600662 dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n",
663 secondary, subordinate, pass);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100665 /* Check if setup is sensible at all */
666 if (!pass &&
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600667 (primary != bus->number || secondary <= bus->number)) {
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100668 dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n");
669 broken = 1;
670 }
671
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672 /* Disable MasterAbortMode during probing to avoid reporting
673 of bus errors (in some architectures) */
674 pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl);
675 pci_write_config_word(dev, PCI_BRIDGE_CONTROL,
676 bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT);
677
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600678 if ((secondary || subordinate) && !pcibios_assign_all_busses() &&
679 !is_cardbus && !broken) {
680 unsigned int cmax;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 /*
682 * Bus already configured by firmware, process it in the first
683 * pass and just note the configuration.
684 */
685 if (pass)
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000686 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700687
688 /*
689 * If we already got to this bus through a different bridge,
Alex Chiang74710de2009-03-20 14:56:10 -0600690 * don't re-add it. This can happen with the i450NX chipset.
691 *
692 * However, we continue to descend down the hierarchy and
693 * scan remaining child buses.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 */
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600695 child = pci_find_bus(pci_domain_nr(bus), secondary);
Alex Chiang74710de2009-03-20 14:56:10 -0600696 if (!child) {
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600697 child = pci_add_new_bus(bus, dev, secondary);
Alex Chiang74710de2009-03-20 14:56:10 -0600698 if (!child)
699 goto out;
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600700 child->primary = primary;
701 child->subordinate = subordinate;
Alex Chiang74710de2009-03-20 14:56:10 -0600702 child->bridge_ctl = bctl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703 }
704
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705 cmax = pci_scan_child_bus(child);
706 if (cmax > max)
707 max = cmax;
708 if (child->subordinate > max)
709 max = child->subordinate;
710 } else {
711 /*
712 * We need to assign a number to this bus which we always
713 * do in the second pass.
714 */
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700715 if (!pass) {
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100716 if (pcibios_assign_all_busses() || broken)
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700717 /* Temporarily disable forwarding of the
718 configuration cycles on all bridges in
719 this bus segment to avoid possible
720 conflicts in the second pass between two
721 bridges programmed with overlapping
722 bus ranges. */
723 pci_write_config_dword(dev, PCI_PRIMARY_BUS,
724 buses & ~0xffffff);
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000725 goto out;
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700726 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727
728 /* Clear errors */
729 pci_write_config_word(dev, PCI_STATUS, 0xffff);
730
Rajesh Shahcc574502005-04-28 00:25:47 -0700731 /* Prevent assigning a bus number that already exists.
Tiejun Chenb1a98b62011-06-02 11:02:50 +0800732 * This can happen when a bridge is hot-plugged, so in
733 * this case we only re-scan this bus. */
734 child = pci_find_bus(pci_domain_nr(bus), max+1);
735 if (!child) {
736 child = pci_add_new_bus(bus, dev, ++max);
737 if (!child)
738 goto out;
739 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740 buses = (buses & 0xff000000)
741 | ((unsigned int)(child->primary) << 0)
742 | ((unsigned int)(child->secondary) << 8)
743 | ((unsigned int)(child->subordinate) << 16);
744
745 /*
746 * yenta.c forces a secondary latency timer of 176.
747 * Copy that behaviour here.
748 */
749 if (is_cardbus) {
750 buses &= ~0xff000000;
751 buses |= CARDBUS_LATENCY_TIMER << 24;
752 }
Jesper Juhl7c867c82011-01-24 21:14:33 +0100753
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754 /*
755 * We need to blast all three values with a single write.
756 */
757 pci_write_config_dword(dev, PCI_PRIMARY_BUS, buses);
758
759 if (!is_cardbus) {
Gary Hade11949252007-10-08 16:24:16 -0700760 child->bridge_ctl = bctl;
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700761 /*
762 * Adjust subordinate busnr in parent buses.
763 * We do this before scanning for children because
764 * some devices may not be detected if the bios
765 * was lazy.
766 */
767 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768 /* Now we can scan all subordinate buses... */
769 max = pci_scan_child_bus(child);
Kristen Accardie3ac86d2006-01-17 16:57:01 -0800770 /*
771 * now fix it up again since we have found
772 * the real value of max.
773 */
774 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 } else {
776 /*
777 * For CardBus bridges, we leave 4 bus numbers
778 * as cards with a PCI-to-PCI bridge can be
779 * inserted later.
780 */
Dominik Brodowski49887942005-12-08 16:53:12 +0100781 for (i=0; i<CARDBUS_RESERVE_BUSNR; i++) {
782 struct pci_bus *parent = bus;
Rajesh Shahcc574502005-04-28 00:25:47 -0700783 if (pci_find_bus(pci_domain_nr(bus),
784 max+i+1))
785 break;
Dominik Brodowski49887942005-12-08 16:53:12 +0100786 while (parent->parent) {
787 if ((!pcibios_assign_all_busses()) &&
788 (parent->subordinate > max) &&
789 (parent->subordinate <= max+i)) {
790 j = 1;
791 }
792 parent = parent->parent;
793 }
794 if (j) {
795 /*
796 * Often, there are two cardbus bridges
797 * -- try to leave one valid bus number
798 * for each one.
799 */
800 i /= 2;
801 break;
802 }
803 }
Rajesh Shahcc574502005-04-28 00:25:47 -0700804 max += i;
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700805 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 }
807 /*
808 * Set the subordinate bus number to its real value.
809 */
810 child->subordinate = max;
811 pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max);
812 }
813
Gary Hadecb3576f2008-02-08 14:00:52 -0800814 sprintf(child->name,
815 (is_cardbus ? "PCI CardBus %04x:%02x" : "PCI Bus %04x:%02x"),
816 pci_domain_nr(bus), child->number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700817
Bernhard Kaindld55bef512007-07-30 20:35:13 +0200818 /* Has only triggered on CardBus, fixup is in yenta_socket */
Dominik Brodowski49887942005-12-08 16:53:12 +0100819 while (bus->parent) {
820 if ((child->subordinate > bus->subordinate) ||
821 (child->number > bus->subordinate) ||
822 (child->number < bus->number) ||
823 (child->subordinate < bus->number)) {
Bjorn Helgaas865df572009-11-04 10:32:57 -0700824 dev_info(&child->dev, "[bus %02x-%02x] %s "
825 "hidden behind%s bridge %s [bus %02x-%02x]\n",
Bernhard Kaindld55bef512007-07-30 20:35:13 +0200826 child->number, child->subordinate,
827 (bus->number > child->subordinate &&
828 bus->subordinate < child->number) ?
Joe Perchesa6f29a92007-11-19 17:48:29 -0800829 "wholly" : "partially",
830 bus->self->transparent ? " transparent" : "",
Bjorn Helgaas865df572009-11-04 10:32:57 -0700831 dev_name(&bus->dev),
Bernhard Kaindld55bef512007-07-30 20:35:13 +0200832 bus->number, bus->subordinate);
Dominik Brodowski49887942005-12-08 16:53:12 +0100833 }
834 bus = bus->parent;
835 }
836
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000837out:
838 pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl);
839
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840 return max;
841}
842
843/*
844 * Read interrupt line and base address registers.
845 * The architecture-dependent code can tweak these, of course.
846 */
847static void pci_read_irq(struct pci_dev *dev)
848{
849 unsigned char irq;
850
851 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq);
Kristen Accardiffeff782005-11-02 16:24:32 -0800852 dev->pin = irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853 if (irq)
854 pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
855 dev->irq = irq;
856}
857
Benjamin Herrenschmidtbb209c82010-01-26 17:10:03 +0000858void set_pcie_port_type(struct pci_dev *pdev)
Yu Zhao480b93b2009-03-20 11:25:14 +0800859{
860 int pos;
861 u16 reg16;
862
863 pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
864 if (!pos)
865 return;
866 pdev->is_pcie = 1;
Kenji Kaneshige0efea002009-11-05 12:05:11 +0900867 pdev->pcie_cap = pos;
Yu Zhao480b93b2009-03-20 11:25:14 +0800868 pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
869 pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4;
870}
871
Benjamin Herrenschmidtbb209c82010-01-26 17:10:03 +0000872void set_pcie_hotplug_bridge(struct pci_dev *pdev)
Eric W. Biederman28760482009-09-09 14:09:24 -0700873{
874 int pos;
875 u16 reg16;
876 u32 reg32;
877
Kenji Kaneshige06a1cba2009-11-11 14:30:56 +0900878 pos = pci_pcie_cap(pdev);
Eric W. Biederman28760482009-09-09 14:09:24 -0700879 if (!pos)
880 return;
881 pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
882 if (!(reg16 & PCI_EXP_FLAGS_SLOT))
883 return;
884 pci_read_config_dword(pdev, pos + PCI_EXP_SLTCAP, &reg32);
885 if (reg32 & PCI_EXP_SLTCAP_HPC)
886 pdev->is_hotplug_bridge = 1;
887}
888
Bartlomiej Zolnierkiewicz01abc2a2007-04-23 23:19:36 +0200889#define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED)
Randy Dunlap76e6a1d2006-12-29 16:47:29 -0800890
Linus Torvalds1da177e2005-04-16 15:20:36 -0700891/**
892 * pci_setup_device - fill in class and map information of a device
893 * @dev: the device structure to fill
894 *
895 * Initialize the device structure with information about the device's
896 * vendor,class,memory and IO-space addresses,IRQ lines etc.
897 * Called at initialisation of the PCI subsystem and by CardBus services.
Yu Zhao480b93b2009-03-20 11:25:14 +0800898 * Returns 0 on success and negative if unknown type of device (not normal,
899 * bridge or CardBus).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 */
Yu Zhao480b93b2009-03-20 11:25:14 +0800901int pci_setup_device(struct pci_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700902{
903 u32 class;
Yu Zhao480b93b2009-03-20 11:25:14 +0800904 u8 hdr_type;
905 struct pci_slot *slot;
Gabe Blackbc577d22009-10-06 10:45:19 -0500906 int pos = 0;
Yu Zhao480b93b2009-03-20 11:25:14 +0800907
908 if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
909 return -EIO;
910
911 dev->sysdata = dev->bus->sysdata;
912 dev->dev.parent = dev->bus->bridge;
913 dev->dev.bus = &pci_bus_type;
914 dev->hdr_type = hdr_type & 0x7f;
915 dev->multifunction = !!(hdr_type & 0x80);
Yu Zhao480b93b2009-03-20 11:25:14 +0800916 dev->error_state = pci_channel_io_normal;
917 set_pcie_port_type(dev);
918
919 list_for_each_entry(slot, &dev->bus->slots, list)
920 if (PCI_SLOT(dev->devfn) == slot->number)
921 dev->slot = slot;
922
923 /* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer)
924 set this higher, assuming the system even supports it. */
925 dev->dma_mask = 0xffffffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926
Greg Kroah-Hartmaneebfcfb2008-07-02 13:24:49 -0700927 dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus),
928 dev->bus->number, PCI_SLOT(dev->devfn),
929 PCI_FUNC(dev->devfn));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930
931 pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
Auke Kokb8a3a522007-06-08 15:46:30 -0700932 dev->revision = class & 0xff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 class >>= 8; /* upper 3 bytes */
934 dev->class = class;
935 class >>= 8;
936
Bjorn Helgaas2c6413a2010-09-29 12:23:21 -0600937 dev_printk(KERN_DEBUG, &dev->dev, "[%04x:%04x] type %d class %#08x\n",
938 dev->vendor, dev->device, dev->hdr_type, class);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939
Yu Zhao853346e2009-03-21 22:05:11 +0800940 /* need to have dev->class ready */
941 dev->cfg_size = pci_cfg_space_size(dev);
942
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943 /* "Unknown power state" */
Daniel Ritz3fe9d192005-08-17 15:32:19 -0700944 dev->current_state = PCI_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945
946 /* Early fixups, before probing the BARs */
947 pci_fixup_device(pci_fixup_early, dev);
Yu Zhaof79b1b12009-05-28 00:25:05 +0800948 /* device class may be changed after fixup */
949 class = dev->class >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950
951 switch (dev->hdr_type) { /* header type */
952 case PCI_HEADER_TYPE_NORMAL: /* standard header */
953 if (class == PCI_CLASS_BRIDGE_PCI)
954 goto bad;
955 pci_read_irq(dev);
956 pci_read_bases(dev, 6, PCI_ROM_ADDRESS);
957 pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
958 pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
Alan Cox368c73d2006-10-04 00:41:26 +0100959
960 /*
961 * Do the ugly legacy mode stuff here rather than broken chip
962 * quirk code. Legacy mode ATA controllers have fixed
963 * addresses. These are not always echoed in BAR0-3, and
964 * BAR0-3 in a few cases contain junk!
965 */
966 if (class == PCI_CLASS_STORAGE_IDE) {
967 u8 progif;
968 pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
969 if ((progif & 1) == 0) {
Linus Torvaldsaf1bff42007-12-10 07:40:54 -0800970 dev->resource[0].start = 0x1F0;
971 dev->resource[0].end = 0x1F7;
972 dev->resource[0].flags = LEGACY_IO_RESOURCE;
973 dev->resource[1].start = 0x3F6;
974 dev->resource[1].end = 0x3F6;
975 dev->resource[1].flags = LEGACY_IO_RESOURCE;
Alan Cox368c73d2006-10-04 00:41:26 +0100976 }
977 if ((progif & 4) == 0) {
Linus Torvaldsaf1bff42007-12-10 07:40:54 -0800978 dev->resource[2].start = 0x170;
979 dev->resource[2].end = 0x177;
980 dev->resource[2].flags = LEGACY_IO_RESOURCE;
981 dev->resource[3].start = 0x376;
982 dev->resource[3].end = 0x376;
983 dev->resource[3].flags = LEGACY_IO_RESOURCE;
Alan Cox368c73d2006-10-04 00:41:26 +0100984 }
985 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 break;
987
988 case PCI_HEADER_TYPE_BRIDGE: /* bridge header */
989 if (class != PCI_CLASS_BRIDGE_PCI)
990 goto bad;
991 /* The PCI-to-PCI bridge spec requires that subtractive
992 decoding (i.e. transparent) bridge must have programming
993 interface code of 0x01. */
Kristen Accardi3efd2732005-11-02 16:55:49 -0800994 pci_read_irq(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995 dev->transparent = ((dev->class & 0xff) == 1);
996 pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
Eric W. Biederman28760482009-09-09 14:09:24 -0700997 set_pcie_hotplug_bridge(dev);
Gabe Blackbc577d22009-10-06 10:45:19 -0500998 pos = pci_find_capability(dev, PCI_CAP_ID_SSVID);
999 if (pos) {
1000 pci_read_config_word(dev, pos + PCI_SSVID_VENDOR_ID, &dev->subsystem_vendor);
1001 pci_read_config_word(dev, pos + PCI_SSVID_DEVICE_ID, &dev->subsystem_device);
1002 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 break;
1004
1005 case PCI_HEADER_TYPE_CARDBUS: /* CardBus bridge header */
1006 if (class != PCI_CLASS_BRIDGE_CARDBUS)
1007 goto bad;
1008 pci_read_irq(dev);
1009 pci_read_bases(dev, 1, 0);
1010 pci_read_config_word(dev, PCI_CB_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
1011 pci_read_config_word(dev, PCI_CB_SUBSYSTEM_ID, &dev->subsystem_device);
1012 break;
1013
1014 default: /* unknown header */
Bjorn Helgaas80ccba12008-06-13 10:52:11 -06001015 dev_err(&dev->dev, "unknown header type %02x, "
1016 "ignoring device\n", dev->hdr_type);
Yu Zhao480b93b2009-03-20 11:25:14 +08001017 return -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018
1019 bad:
Bjorn Helgaas80ccba12008-06-13 10:52:11 -06001020 dev_err(&dev->dev, "ignoring class %02x (doesn't match header "
1021 "type %02x)\n", class, dev->hdr_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022 dev->class = PCI_CLASS_NOT_DEFINED;
1023 }
1024
1025 /* We found a fine healthy device, go go go... */
1026 return 0;
1027}
1028
Zhao, Yu201de562008-10-13 19:49:55 +08001029static void pci_release_capabilities(struct pci_dev *dev)
1030{
1031 pci_vpd_release(dev);
Yu Zhaod1b054d2009-03-20 11:25:11 +08001032 pci_iov_release(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001033}
1034
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035/**
1036 * pci_release_dev - free a pci device structure when all users of it are finished.
1037 * @dev: device that's been disconnected
1038 *
1039 * Will be called only by the device core when all users of this pci device are
1040 * done.
1041 */
1042static void pci_release_dev(struct device *dev)
1043{
1044 struct pci_dev *pci_dev;
1045
1046 pci_dev = to_pci_dev(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001047 pci_release_capabilities(pci_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 kfree(pci_dev);
1049}
1050
1051/**
1052 * pci_cfg_space_size - get the configuration space size of the PCI device.
Randy Dunlap8f7020d2005-10-23 11:57:38 -07001053 * @dev: PCI device
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054 *
1055 * Regular PCI devices have 256 bytes, but PCI-X 2 and PCI Express devices
1056 * have 4096 bytes. Even if the device is capable, that doesn't mean we can
1057 * access it. Maybe we don't have a way to generate extended config space
1058 * accesses, or the device is behind a reverse Express bridge. So we try
1059 * reading the dword at 0x100 which must either be 0 or a valid extended
1060 * capability header.
1061 */
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001062int pci_cfg_space_size_ext(struct pci_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 u32 status;
Zhao, Yu557848c2008-10-13 19:18:07 +08001065 int pos = PCI_CFG_SPACE_SIZE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066
Zhao, Yu557848c2008-10-13 19:18:07 +08001067 if (pci_read_config_dword(dev, pos, &status) != PCIBIOS_SUCCESSFUL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068 goto fail;
1069 if (status == 0xffffffff)
1070 goto fail;
1071
1072 return PCI_CFG_SPACE_EXP_SIZE;
1073
1074 fail:
1075 return PCI_CFG_SPACE_SIZE;
1076}
1077
Yinghai Lu57741a72008-02-15 01:32:50 -08001078int pci_cfg_space_size(struct pci_dev *dev)
1079{
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001080 int pos;
1081 u32 status;
Yinghai Ludfadd9ed2009-03-08 21:35:37 -07001082 u16 class;
1083
1084 class = dev->class >> 8;
1085 if (class == PCI_CLASS_BRIDGE_HOST)
1086 return pci_cfg_space_size_ext(dev);
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001087
Kenji Kaneshige06a1cba2009-11-11 14:30:56 +09001088 pos = pci_pcie_cap(dev);
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001089 if (!pos) {
1090 pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
1091 if (!pos)
1092 goto fail;
1093
1094 pci_read_config_dword(dev, pos + PCI_X_STATUS, &status);
1095 if (!(status & (PCI_X_STATUS_266MHZ | PCI_X_STATUS_533MHZ)))
1096 goto fail;
1097 }
1098
1099 return pci_cfg_space_size_ext(dev);
1100
1101 fail:
1102 return PCI_CFG_SPACE_SIZE;
Yinghai Lu57741a72008-02-15 01:32:50 -08001103}
1104
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105static void pci_release_bus_bridge_dev(struct device *dev)
1106{
1107 kfree(dev);
1108}
1109
Michael Ellerman65891212007-04-05 17:19:08 +10001110struct pci_dev *alloc_pci_dev(void)
1111{
1112 struct pci_dev *dev;
1113
1114 dev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL);
1115 if (!dev)
1116 return NULL;
1117
Michael Ellerman65891212007-04-05 17:19:08 +10001118 INIT_LIST_HEAD(&dev->bus_list);
1119
1120 return dev;
1121}
1122EXPORT_SYMBOL(alloc_pci_dev);
1123
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124/*
1125 * Read the config data for a PCI device, sanity-check it
1126 * and fill in the dev structure...
1127 */
Adrian Bunk7f7b5de2008-04-18 13:53:55 -07001128static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129{
1130 struct pci_dev *dev;
1131 u32 l;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 int delay = 1;
1133
1134 if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
1135 return NULL;
1136
1137 /* some broken boards return 0 or ~0 if a slot is empty: */
1138 if (l == 0xffffffff || l == 0x00000000 ||
1139 l == 0x0000ffff || l == 0xffff0000)
1140 return NULL;
1141
1142 /* Configuration request Retry Status */
1143 while (l == 0xffff0001) {
1144 msleep(delay);
1145 delay *= 2;
1146 if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
1147 return NULL;
1148 /* Card hasn't responded in 60 seconds? Must be stuck. */
1149 if (delay > 60 * 1000) {
Bjorn Helgaas80ccba12008-06-13 10:52:11 -06001150 printk(KERN_WARNING "pci %04x:%02x:%02x.%d: not "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151 "responding\n", pci_domain_nr(bus),
1152 bus->number, PCI_SLOT(devfn),
1153 PCI_FUNC(devfn));
1154 return NULL;
1155 }
1156 }
1157
Michael Ellermanbab41e92007-04-05 17:19:09 +10001158 dev = alloc_pci_dev();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 if (!dev)
1160 return NULL;
1161
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 dev->bus = bus;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 dev->devfn = devfn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164 dev->vendor = l & 0xffff;
1165 dev->device = (l >> 16) & 0xffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166
Yu Zhao480b93b2009-03-20 11:25:14 +08001167 if (pci_setup_device(dev)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168 kfree(dev);
1169 return NULL;
1170 }
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001171
1172 return dev;
1173}
1174
Zhao, Yu201de562008-10-13 19:49:55 +08001175static void pci_init_capabilities(struct pci_dev *dev)
1176{
1177 /* MSI/MSI-X list */
1178 pci_msi_init_pci_dev(dev);
1179
Rafael J. Wysocki63f48982008-12-07 22:02:58 +01001180 /* Buffers for saving PCIe and PCI-X capabilities */
1181 pci_allocate_cap_save_buffers(dev);
1182
Zhao, Yu201de562008-10-13 19:49:55 +08001183 /* Power Management */
1184 pci_pm_init(dev);
Jesse Barneseb9c39d2008-12-17 12:10:05 -08001185 platform_pci_wakeup_init(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001186
1187 /* Vital Product Data */
1188 pci_vpd_pci22_init(dev);
Yu Zhao58c3a722008-10-14 14:02:53 +08001189
1190 /* Alternative Routing-ID Forwarding */
1191 pci_enable_ari(dev);
Yu Zhaod1b054d2009-03-20 11:25:11 +08001192
1193 /* Single Root I/O Virtualization */
1194 pci_iov_init(dev);
Allen Kayae21ee62009-10-07 10:27:17 -07001195
1196 /* Enable ACS P2P upstream forwarding */
Chris Wright5d990b62009-12-04 12:15:21 -08001197 pci_enable_acs(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001198}
1199
Sam Ravnborg96bde062007-03-26 21:53:30 -08001200void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001201{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 device_initialize(&dev->dev);
1203 dev->dev.release = pci_release_dev;
1204 pci_dev_get(dev);
1205
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 dev->dev.dma_mask = &dev->dma_mask;
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001207 dev->dev.dma_parms = &dev->dma_parms;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208 dev->dev.coherent_dma_mask = 0xffffffffull;
1209
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001210 pci_set_dma_max_seg_size(dev, 65536);
FUJITA Tomonori59fc67d2008-02-04 22:28:14 -08001211 pci_set_dma_seg_boundary(dev, 0xffffffff);
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001212
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 /* Fix up broken headers */
1214 pci_fixup_device(pci_fixup_header, dev);
1215
Rafael J. Wysocki4b77b0a2009-09-09 23:49:59 +02001216 /* Clear the state_saved flag. */
1217 dev->state_saved = false;
1218
Zhao, Yu201de562008-10-13 19:49:55 +08001219 /* Initialize various capabilities */
1220 pci_init_capabilities(dev);
Rafael J. Wysockieb9d0fe2008-07-07 03:34:48 +02001221
Linus Torvalds1da177e2005-04-16 15:20:36 -07001222 /*
1223 * Add the device to our list of discovered devices
1224 * and the bus list for fixup functions, etc.
1225 */
Zhang Yanmind71374d2006-06-02 12:35:43 +08001226 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227 list_add_tail(&dev->bus_list, &bus->devices);
Zhang Yanmind71374d2006-06-02 12:35:43 +08001228 up_write(&pci_bus_sem);
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001229}
1230
Sam Ravnborg451124a2008-02-02 22:33:43 +01001231struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn)
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001232{
1233 struct pci_dev *dev;
1234
Trent Piepho90bdb312009-03-20 14:56:00 -06001235 dev = pci_get_slot(bus, devfn);
1236 if (dev) {
1237 pci_dev_put(dev);
1238 return dev;
1239 }
1240
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001241 dev = pci_scan_device(bus, devfn);
1242 if (!dev)
1243 return NULL;
1244
1245 pci_device_add(dev, bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246
1247 return dev;
1248}
Adrian Bunkb73e9682007-11-21 15:07:11 -08001249EXPORT_SYMBOL(pci_scan_single_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001251static unsigned next_ari_fn(struct pci_dev *dev, unsigned fn)
1252{
1253 u16 cap;
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001254 unsigned pos, next_fn;
1255
1256 if (!dev)
1257 return 0;
1258
1259 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI);
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001260 if (!pos)
1261 return 0;
1262 pci_read_config_word(dev, pos + 4, &cap);
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001263 next_fn = cap >> 8;
1264 if (next_fn <= fn)
1265 return 0;
1266 return next_fn;
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001267}
1268
1269static unsigned next_trad_fn(struct pci_dev *dev, unsigned fn)
1270{
1271 return (fn + 1) % 8;
1272}
1273
1274static unsigned no_next_fn(struct pci_dev *dev, unsigned fn)
1275{
1276 return 0;
1277}
1278
1279static int only_one_child(struct pci_bus *bus)
1280{
1281 struct pci_dev *parent = bus->self;
1282 if (!parent || !pci_is_pcie(parent))
1283 return 0;
1284 if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
1285 parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
1286 return 1;
1287 return 0;
1288}
1289
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290/**
1291 * pci_scan_slot - scan a PCI slot on a bus for devices.
1292 * @bus: PCI bus to scan
1293 * @devfn: slot number to scan (must have zero function.)
1294 *
1295 * Scan a PCI slot on the specified PCI bus for devices, adding
1296 * discovered devices to the @bus->devices list. New devices
Greg Kroah-Hartman8a1bc902008-02-14 14:56:56 -08001297 * will not have is_added set.
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001298 *
1299 * Returns the number of new devices found.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300 */
Sam Ravnborg96bde062007-03-26 21:53:30 -08001301int pci_scan_slot(struct pci_bus *bus, int devfn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001302{
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001303 unsigned fn, nr = 0;
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001304 struct pci_dev *dev;
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001305 unsigned (*next_fn)(struct pci_dev *, unsigned) = no_next_fn;
1306
1307 if (only_one_child(bus) && (devfn > 0))
1308 return 0; /* Already scanned the entire slot */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001309
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001310 dev = pci_scan_single_device(bus, devfn);
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001311 if (!dev)
1312 return 0;
1313 if (!dev->is_added)
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001314 nr++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001316 if (pci_ari_enabled(bus))
1317 next_fn = next_ari_fn;
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001318 else if (dev->multifunction)
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001319 next_fn = next_trad_fn;
1320
1321 for (fn = next_fn(dev, 0); fn > 0; fn = next_fn(dev, fn)) {
1322 dev = pci_scan_single_device(bus, devfn + fn);
1323 if (dev) {
1324 if (!dev->is_added)
1325 nr++;
1326 dev->multifunction = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327 }
1328 }
Shaohua Li7d715a62008-02-25 09:46:41 +08001329
Shaohua Li149e1632008-07-23 10:32:31 +08001330 /* only one slot has pcie device */
1331 if (bus->self && nr)
Shaohua Li7d715a62008-02-25 09:46:41 +08001332 pcie_aspm_init_link_state(bus->self);
1333
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334 return nr;
1335}
1336
Sam Ravnborg0ab2b572008-02-17 10:45:28 +01001337unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338{
1339 unsigned int devfn, pass, max = bus->secondary;
1340 struct pci_dev *dev;
1341
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001342 dev_dbg(&bus->dev, "scanning bus\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343
1344 /* Go find them, Rover! */
1345 for (devfn = 0; devfn < 0x100; devfn += 8)
1346 pci_scan_slot(bus, devfn);
1347
Yu Zhaoa28724b2009-03-20 11:25:13 +08001348 /* Reserve buses for SR-IOV capability. */
1349 max += pci_iov_bus_range(bus);
1350
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351 /*
1352 * After performing arch-dependent fixup of the bus, look behind
1353 * all PCI-to-PCI bridges on this bus.
1354 */
Alex Chiang74710de2009-03-20 14:56:10 -06001355 if (!bus->is_added) {
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001356 dev_dbg(&bus->dev, "fixups for bus\n");
Alex Chiang74710de2009-03-20 14:56:10 -06001357 pcibios_fixup_bus(bus);
1358 if (pci_is_root_bus(bus))
1359 bus->is_added = 1;
1360 }
1361
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362 for (pass=0; pass < 2; pass++)
1363 list_for_each_entry(dev, &bus->devices, bus_list) {
1364 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
1365 dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
1366 max = pci_scan_bridge(bus, dev, max, pass);
1367 }
1368
1369 /*
1370 * We've scanned the bus and so we know all about what's on
1371 * the other side of any bridges that may be on this bus plus
1372 * any devices.
1373 *
1374 * Return how far we've got finding sub-buses.
1375 */
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001376 dev_dbg(&bus->dev, "bus scan returning with max=%02x\n", max);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377 return max;
1378}
1379
Sam Ravnborg96bde062007-03-26 21:53:30 -08001380struct pci_bus * pci_create_bus(struct device *parent,
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001381 int bus, struct pci_ops *ops, void *sysdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382{
1383 int error;
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001384 struct pci_bus *b, *b2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 struct device *dev;
1386
1387 b = pci_alloc_bus();
1388 if (!b)
1389 return NULL;
1390
Geert Uytterhoeven6a3b3e22009-03-15 20:14:37 +01001391 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392 if (!dev){
1393 kfree(b);
1394 return NULL;
1395 }
1396
1397 b->sysdata = sysdata;
1398 b->ops = ops;
1399
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001400 b2 = pci_find_bus(pci_domain_nr(b), bus);
1401 if (b2) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001402 /* If we already got to this bus through a different bridge, ignore it */
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001403 dev_dbg(&b2->dev, "bus already known\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404 goto err_out;
1405 }
Zhang Yanmind71374d2006-06-02 12:35:43 +08001406
1407 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 list_add_tail(&b->node, &pci_root_buses);
Zhang Yanmind71374d2006-06-02 12:35:43 +08001409 up_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 dev->parent = parent;
1412 dev->release = pci_release_bus_bridge_dev;
Kay Sievers1a927132008-10-30 02:17:49 +01001413 dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 error = device_register(dev);
1415 if (error)
1416 goto dev_reg_err;
1417 b->bridge = get_device(dev);
Rafael J. Wysockia1e4d722010-02-08 19:16:33 +01001418 device_enable_async_suspend(b->bridge);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419
Yinghai Lu0d358f22008-02-19 03:20:41 -08001420 if (!parent)
1421 set_dev_node(b->bridge, pcibus_to_node(b));
1422
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001423 b->dev.class = &pcibus_class;
1424 b->dev.parent = b->bridge;
Kay Sievers1a927132008-10-30 02:17:49 +01001425 dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001426 error = device_register(&b->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001427 if (error)
1428 goto class_dev_reg_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001429
1430 /* Create legacy_io and legacy_mem files for this bus */
1431 pci_create_legacy_files(b);
1432
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433 b->number = b->secondary = bus;
1434 b->resource[0] = &ioport_resource;
1435 b->resource[1] = &iomem_resource;
1436
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 return b;
1438
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439class_dev_reg_err:
1440 device_unregister(dev);
1441dev_reg_err:
Zhang Yanmind71374d2006-06-02 12:35:43 +08001442 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443 list_del(&b->node);
Zhang Yanmind71374d2006-06-02 12:35:43 +08001444 up_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445err_out:
1446 kfree(dev);
1447 kfree(b);
1448 return NULL;
1449}
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001450
Sam Ravnborg0ab2b572008-02-17 10:45:28 +01001451struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent,
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001452 int bus, struct pci_ops *ops, void *sysdata)
1453{
1454 struct pci_bus *b;
1455
1456 b = pci_create_bus(parent, bus, ops, sysdata);
1457 if (b)
1458 b->subordinate = pci_scan_child_bus(b);
1459 return b;
1460}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461EXPORT_SYMBOL(pci_scan_bus_parented);
1462
1463#ifdef CONFIG_HOTPLUG
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001464/**
1465 * pci_rescan_bus - scan a PCI bus for devices.
1466 * @bus: PCI bus to scan
1467 *
1468 * Scan a PCI bus and child buses for new devices, adds them,
1469 * and enables them.
1470 *
1471 * Returns the max number of subordinate bus discovered.
1472 */
Alex Chiang5446a6b2009-04-01 18:24:12 -06001473unsigned int __ref pci_rescan_bus(struct pci_bus *bus)
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001474{
1475 unsigned int max;
1476 struct pci_dev *dev;
1477
1478 max = pci_scan_child_bus(bus);
1479
Alex Chiang705b1aa2009-03-20 14:56:31 -06001480 down_read(&pci_bus_sem);
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001481 list_for_each_entry(dev, &bus->devices, bus_list)
1482 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
1483 dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
1484 if (dev->subordinate)
1485 pci_bus_size_bridges(dev->subordinate);
Alex Chiang705b1aa2009-03-20 14:56:31 -06001486 up_read(&pci_bus_sem);
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001487
1488 pci_bus_assign_resources(bus);
1489 pci_enable_bridges(bus);
1490 pci_bus_add_devices(bus);
1491
1492 return max;
1493}
1494EXPORT_SYMBOL_GPL(pci_rescan_bus);
1495
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496EXPORT_SYMBOL(pci_add_new_bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497EXPORT_SYMBOL(pci_scan_slot);
1498EXPORT_SYMBOL(pci_scan_bridge);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499EXPORT_SYMBOL_GPL(pci_scan_child_bus);
1500#endif
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001501
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001502static int __init pci_sort_bf_cmp(const struct device *d_a, const struct device *d_b)
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001503{
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001504 const struct pci_dev *a = to_pci_dev(d_a);
1505 const struct pci_dev *b = to_pci_dev(d_b);
1506
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001507 if (pci_domain_nr(a->bus) < pci_domain_nr(b->bus)) return -1;
1508 else if (pci_domain_nr(a->bus) > pci_domain_nr(b->bus)) return 1;
1509
1510 if (a->bus->number < b->bus->number) return -1;
1511 else if (a->bus->number > b->bus->number) return 1;
1512
1513 if (a->devfn < b->devfn) return -1;
1514 else if (a->devfn > b->devfn) return 1;
1515
1516 return 0;
1517}
1518
Greg Kroah-Hartman5ff580c2008-02-14 14:56:56 -08001519void __init pci_sort_breadthfirst(void)
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001520{
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001521 bus_sort_breadthfirst(&pci_bus_type, &pci_sort_bf_cmp);
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001522}