blob: 882bd8d29fe3c14903282c5c2ec20ea52b8a5347 [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>
Matt Domsch05843962009-11-02 11:51:24 -060013#include <acpi/acpi_hest.h>
Greg KHbc56b9e2005-04-08 14:53:31 +090014#include "pci.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070015
16#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
17#define CARDBUS_RESERVE_BUSNR 3
Linus Torvalds1da177e2005-04-16 15:20:36 -070018
19/* Ugh. Need to stop exporting this to modules. */
20LIST_HEAD(pci_root_buses);
21EXPORT_SYMBOL(pci_root_buses);
22
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080023
24static int find_anything(struct device *dev, void *data)
25{
26 return 1;
27}
Linus Torvalds1da177e2005-04-16 15:20:36 -070028
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070029/*
30 * Some device drivers need know if pci is initiated.
31 * Basically, we think pci is not initiated when there
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080032 * is no device to be found on the pci_bus_type.
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070033 */
34int no_pci_devices(void)
35{
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080036 struct device *dev;
37 int no_devices;
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070038
Greg Kroah-Hartman70308922008-02-13 22:30:39 -080039 dev = bus_find_device(&pci_bus_type, NULL, NULL, find_anything);
40 no_devices = (dev == NULL);
41 put_device(dev);
42 return no_devices;
43}
Zhang, Yanmined4aaad2007-07-15 23:39:39 -070044EXPORT_SYMBOL(no_pci_devices);
45
Linus Torvalds1da177e2005-04-16 15:20:36 -070046/*
47 * PCI Bus Class Devices
48 */
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040049static ssize_t pci_bus_show_cpuaffinity(struct device *dev,
Mike Travis39106dc2008-04-08 11:43:03 -070050 int type,
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040051 struct device_attribute *attr,
Alan Cox4327edf2005-09-10 00:25:49 -070052 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -070053{
Linus Torvalds1da177e2005-04-16 15:20:36 -070054 int ret;
Mike Travis588235b2009-01-04 05:18:02 -080055 const struct cpumask *cpumask;
Linus Torvalds1da177e2005-04-16 15:20:36 -070056
Mike Travis588235b2009-01-04 05:18:02 -080057 cpumask = cpumask_of_pcibus(to_pci_bus(dev));
Mike Travis39106dc2008-04-08 11:43:03 -070058 ret = type?
Mike Travis588235b2009-01-04 05:18:02 -080059 cpulist_scnprintf(buf, PAGE_SIZE-2, cpumask) :
60 cpumask_scnprintf(buf, PAGE_SIZE-2, cpumask);
Mike Travis39106dc2008-04-08 11:43:03 -070061 buf[ret++] = '\n';
62 buf[ret] = '\0';
Linus Torvalds1da177e2005-04-16 15:20:36 -070063 return ret;
64}
Mike Travis39106dc2008-04-08 11:43:03 -070065
66static ssize_t inline pci_bus_show_cpumaskaffinity(struct device *dev,
67 struct device_attribute *attr,
68 char *buf)
69{
70 return pci_bus_show_cpuaffinity(dev, 0, attr, buf);
71}
72
73static ssize_t inline pci_bus_show_cpulistaffinity(struct device *dev,
74 struct device_attribute *attr,
75 char *buf)
76{
77 return pci_bus_show_cpuaffinity(dev, 1, attr, buf);
78}
79
80DEVICE_ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpumaskaffinity, NULL);
81DEVICE_ATTR(cpulistaffinity, S_IRUGO, pci_bus_show_cpulistaffinity, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -070082
83/*
84 * PCI Bus Class
85 */
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040086static void release_pcibus_dev(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -070087{
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040088 struct pci_bus *pci_bus = to_pci_bus(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070089
90 if (pci_bus->bridge)
91 put_device(pci_bus->bridge);
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -070092 pci_bus_remove_resources(pci_bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -070093 kfree(pci_bus);
94}
95
96static struct class pcibus_class = {
97 .name = "pci_bus",
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -040098 .dev_release = &release_pcibus_dev,
Linus Torvalds1da177e2005-04-16 15:20:36 -070099};
100
101static int __init pcibus_class_init(void)
102{
103 return class_register(&pcibus_class);
104}
105postcore_initcall(pcibus_class_init);
106
107/*
108 * Translate the low bits of the PCI base
109 * to the resource type
110 */
111static inline unsigned int pci_calc_resource_flags(unsigned int flags)
112{
113 if (flags & PCI_BASE_ADDRESS_SPACE_IO)
114 return IORESOURCE_IO;
115
116 if (flags & PCI_BASE_ADDRESS_MEM_PREFETCH)
117 return IORESOURCE_MEM | IORESOURCE_PREFETCH;
118
119 return IORESOURCE_MEM;
120}
121
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400122static u64 pci_size(u64 base, u64 maxbase, u64 mask)
Yinghai Lu07eddf32006-11-29 13:53:10 -0800123{
124 u64 size = mask & maxbase; /* Find the significant bits */
125 if (!size)
126 return 0;
127
128 /* Get the lowest of them to find the decode size, and
129 from that the extent. */
130 size = (size & ~(size-1)) - 1;
131
132 /* base == maxbase can be valid only if the BAR has
133 already been programmed with all 1s. */
134 if (base == maxbase && ((base | size) & mask) != mask)
135 return 0;
136
137 return size;
138}
139
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400140static inline enum pci_bar_type decode_bar(struct resource *res, u32 bar)
Yinghai Lu07eddf32006-11-29 13:53:10 -0800141{
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400142 if ((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
143 res->flags = bar & ~PCI_BASE_ADDRESS_IO_MASK;
144 return pci_bar_io;
145 }
146
147 res->flags = bar & ~PCI_BASE_ADDRESS_MEM_MASK;
148
Peter Chubbe3545972008-10-13 11:49:04 +1100149 if (res->flags & PCI_BASE_ADDRESS_MEM_TYPE_64)
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400150 return pci_bar_mem64;
151 return pci_bar_mem32;
152}
153
Yu Zhao0b400c72008-11-22 02:40:40 +0800154/**
155 * pci_read_base - read a PCI BAR
156 * @dev: the PCI device
157 * @type: type of the BAR
158 * @res: resource buffer to be filled in
159 * @pos: BAR position in the config space
160 *
161 * Returns 1 if the BAR is 64-bit, or 0 if 32-bit.
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400162 */
Yu Zhao0b400c72008-11-22 02:40:40 +0800163int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400164 struct resource *res, unsigned int pos)
165{
166 u32 l, sz, mask;
167
Michael S. Tsirkin1ed67432009-10-29 17:24:59 +0200168 mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400169
170 res->name = pci_name(dev);
171
172 pci_read_config_dword(dev, pos, &l);
Michael S. Tsirkin1ed67432009-10-29 17:24:59 +0200173 pci_write_config_dword(dev, pos, l | mask);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400174 pci_read_config_dword(dev, pos, &sz);
175 pci_write_config_dword(dev, pos, l);
176
Bjorn Helgaasc519a5a2010-03-19 14:56:27 -0600177 if (!sz)
178 goto fail; /* BAR not implemented */
179
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400180 /*
181 * All bits set in sz means the device isn't working properly.
Bjorn Helgaasc519a5a2010-03-19 14:56:27 -0600182 * If it's a memory BAR or a ROM, bit 0 must be clear; if it's
183 * an io BAR, bit 1 must be clear.
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400184 */
Bjorn Helgaasc519a5a2010-03-19 14:56:27 -0600185 if (sz == 0xffffffff) {
186 dev_err(&dev->dev, "reg %x: invalid size %#x; broken device?\n",
187 pos, sz);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400188 goto fail;
Bjorn Helgaasc519a5a2010-03-19 14:56:27 -0600189 }
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400190
191 /*
192 * I don't know how l can have all bits set. Copied from old code.
193 * Maybe it fixes a bug on some ancient platform.
194 */
195 if (l == 0xffffffff)
196 l = 0;
197
198 if (type == pci_bar_unknown) {
199 type = decode_bar(res, l);
200 res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN;
201 if (type == pci_bar_io) {
202 l &= PCI_BASE_ADDRESS_IO_MASK;
Yinghai Lu1f82de12009-04-23 20:48:32 -0700203 mask = PCI_BASE_ADDRESS_IO_MASK & IO_SPACE_LIMIT;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400204 } else {
205 l &= PCI_BASE_ADDRESS_MEM_MASK;
206 mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
207 }
208 } else {
209 res->flags |= (l & IORESOURCE_ROM_ENABLE);
210 l &= PCI_ROM_ADDRESS_MASK;
211 mask = (u32)PCI_ROM_ADDRESS_MASK;
212 }
213
214 if (type == pci_bar_mem64) {
215 u64 l64 = l;
216 u64 sz64 = sz;
217 u64 mask64 = mask | (u64)~0 << 32;
218
219 pci_read_config_dword(dev, pos + 4, &l);
220 pci_write_config_dword(dev, pos + 4, ~0);
221 pci_read_config_dword(dev, pos + 4, &sz);
222 pci_write_config_dword(dev, pos + 4, l);
223
224 l64 |= ((u64)l << 32);
225 sz64 |= ((u64)sz << 32);
226
227 sz64 = pci_size(l64, sz64, mask64);
228
229 if (!sz64)
230 goto fail;
231
Matthew Wilcoxcc5499c2008-07-28 13:39:00 -0400232 if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) {
Bjorn Helgaas865df572009-11-04 10:32:57 -0700233 dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n",
234 pos);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400235 goto fail;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600236 }
237
238 res->flags |= IORESOURCE_MEM_64;
239 if ((sizeof(resource_size_t) < 8) && l) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400240 /* Address above 32-bit boundary; disable the BAR */
241 pci_write_config_dword(dev, pos, 0);
242 pci_write_config_dword(dev, pos + 4, 0);
243 res->start = 0;
244 res->end = sz64;
245 } else {
246 res->start = l64;
247 res->end = l64 + sz64;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600248 dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n",
Bjorn Helgaasa369c792009-10-06 15:33:44 -0600249 pos, res);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400250 }
251 } else {
Bjorn Helgaasc519a5a2010-03-19 14:56:27 -0600252 u32 size = pci_size(l, sz, mask);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400253
Bjorn Helgaasc519a5a2010-03-19 14:56:27 -0600254 if (!size) {
255 dev_err(&dev->dev, "reg %x: invalid size "
256 "(l %#x sz %#x mask %#x); broken device?",
257 pos, l, sz, mask);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400258 goto fail;
Bjorn Helgaasc519a5a2010-03-19 14:56:27 -0600259 }
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400260
261 res->start = l;
Bjorn Helgaasc519a5a2010-03-19 14:56:27 -0600262 res->end = l + size;
Vincent Legollf393d9b2008-10-12 12:26:12 +0200263
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600264 dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400265 }
266
267 out:
268 return (type == pci_bar_mem64) ? 1 : 0;
269 fail:
270 res->flags = 0;
271 goto out;
Yinghai Lu07eddf32006-11-29 13:53:10 -0800272}
273
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
275{
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400276 unsigned int pos, reg;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400278 for (pos = 0; pos < howmany; pos++) {
279 struct resource *res = &dev->resource[pos];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 reg = PCI_BASE_ADDRESS_0 + (pos << 2);
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400281 pos += __pci_read_base(dev, pci_bar_unknown, res, reg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282 }
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400283
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284 if (rom) {
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400285 struct resource *res = &dev->resource[PCI_ROM_RESOURCE];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286 dev->rom_base_reg = rom;
Matthew Wilcox6ac665c2008-07-28 13:38:59 -0400287 res->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH |
288 IORESOURCE_READONLY | IORESOURCE_CACHEABLE |
289 IORESOURCE_SIZEALIGN;
290 __pci_read_base(dev, pci_bar_mem32, res, rom);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291 }
292}
293
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700294static void __devinit pci_read_bridge_io(struct pci_bus *child)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295{
296 struct pci_dev *dev = child->self;
297 u8 io_base_lo, io_limit_lo;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298 unsigned long base, limit;
299 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301 res = child->resource[0];
302 pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo);
303 pci_read_config_byte(dev, PCI_IO_LIMIT, &io_limit_lo);
304 base = (io_base_lo & PCI_IO_RANGE_MASK) << 8;
305 limit = (io_limit_lo & PCI_IO_RANGE_MASK) << 8;
306
307 if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
308 u16 io_base_hi, io_limit_hi;
309 pci_read_config_word(dev, PCI_IO_BASE_UPPER16, &io_base_hi);
310 pci_read_config_word(dev, PCI_IO_LIMIT_UPPER16, &io_limit_hi);
311 base |= (io_base_hi << 16);
312 limit |= (io_limit_hi << 16);
313 }
314
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800315 if (base && base <= limit) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316 res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
Daniel Yeisley9d265122005-12-05 07:06:43 -0500317 if (!res->start)
318 res->start = base;
319 if (!res->end)
320 res->end = limit + 0xfff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600321 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800322 } else {
323 dev_printk(KERN_DEBUG, &dev->dev,
Bjorn Helgaas7b8ff6d2010-03-16 15:53:03 -0600324 " bridge window [io %#06lx-%#06lx] (disabled)\n",
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800325 base, limit);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700327}
328
329static void __devinit pci_read_bridge_mmio(struct pci_bus *child)
330{
331 struct pci_dev *dev = child->self;
332 u16 mem_base_lo, mem_limit_lo;
333 unsigned long base, limit;
334 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335
336 res = child->resource[1];
337 pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo);
338 pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
339 base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
340 limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16;
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800341 if (base && base <= limit) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342 res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
343 res->start = base;
344 res->end = limit + 0xfffff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600345 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800346 } else {
347 dev_printk(KERN_DEBUG, &dev->dev,
Bjorn Helgaas7b8ff6d2010-03-16 15:53:03 -0600348 " bridge window [mem %#010lx-%#010lx] (disabled)\n",
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800349 base, limit + 0xfffff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700351}
352
353static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child)
354{
355 struct pci_dev *dev = child->self;
356 u16 mem_base_lo, mem_limit_lo;
357 unsigned long base, limit;
358 struct resource *res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359
360 res = child->resource[2];
361 pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo);
362 pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo);
363 base = (mem_base_lo & PCI_PREF_RANGE_MASK) << 16;
364 limit = (mem_limit_lo & PCI_PREF_RANGE_MASK) << 16;
365
366 if ((mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) {
367 u32 mem_base_hi, mem_limit_hi;
368 pci_read_config_dword(dev, PCI_PREF_BASE_UPPER32, &mem_base_hi);
369 pci_read_config_dword(dev, PCI_PREF_LIMIT_UPPER32, &mem_limit_hi);
370
371 /*
372 * Some bridges set the base > limit by default, and some
373 * (broken) BIOSes do not initialize them. If we find
374 * this, just assume they are not being used.
375 */
376 if (mem_base_hi <= mem_limit_hi) {
377#if BITS_PER_LONG == 64
378 base |= ((long) mem_base_hi) << 32;
379 limit |= ((long) mem_limit_hi) << 32;
380#else
381 if (mem_base_hi || mem_limit_hi) {
Bjorn Helgaas80ccba12008-06-13 10:52:11 -0600382 dev_err(&dev->dev, "can't handle 64-bit "
383 "address space for bridge\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 return;
385 }
386#endif
387 }
388 }
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800389 if (base && base <= limit) {
Yinghai Lu1f82de12009-04-23 20:48:32 -0700390 res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) |
391 IORESOURCE_MEM | IORESOURCE_PREFETCH;
392 if (res->flags & PCI_PREF_RANGE_TYPE_64)
393 res->flags |= IORESOURCE_MEM_64;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394 res->start = base;
395 res->end = limit + 0xfffff;
Bjorn Helgaasc7dabef2009-10-27 13:26:47 -0600396 dev_printk(KERN_DEBUG, &dev->dev, " bridge window %pR\n", res);
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800397 } else {
398 dev_printk(KERN_DEBUG, &dev->dev,
Bjorn Helgaas7b8ff6d2010-03-16 15:53:03 -0600399 " bridge window [mem %#010lx-%#010lx pref] (disabled)\n",
Yinghai Lucd81e1e2010-01-22 01:02:22 -0800400 base, limit + 0xfffff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 }
402}
403
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700404void __devinit pci_read_bridge_bases(struct pci_bus *child)
405{
406 struct pci_dev *dev = child->self;
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700407 struct resource *res;
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700408 int i;
409
410 if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */
411 return;
412
413 dev_info(&dev->dev, "PCI bridge to [bus %02x-%02x]%s\n",
414 child->secondary, child->subordinate,
415 dev->transparent ? " (subtractive decode)" : "");
416
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700417 pci_bus_remove_resources(child);
418 for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++)
419 child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i];
420
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700421 pci_read_bridge_io(child);
422 pci_read_bridge_mmio(child);
423 pci_read_bridge_mmio_pref(child);
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700424
425 if (dev->transparent) {
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700426 pci_bus_for_each_resource(child->parent, res, i) {
427 if (res) {
428 pci_bus_add_resource(child, res,
429 PCI_SUBTRACTIVE_DECODE);
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700430 dev_printk(KERN_DEBUG, &dev->dev,
431 " bridge window %pR (subtractive decode)\n",
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700432 res);
433 }
Bjorn Helgaas2adf7512010-02-23 10:24:26 -0700434 }
435 }
Bjorn Helgaasfa27b2d2010-02-23 10:24:21 -0700436}
437
Sam Ravnborg96bde062007-03-26 21:53:30 -0800438static struct pci_bus * pci_alloc_bus(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700439{
440 struct pci_bus *b;
441
Eric Sesterhennf5afe802006-02-28 15:34:49 +0100442 b = kzalloc(sizeof(*b), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443 if (b) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 INIT_LIST_HEAD(&b->node);
445 INIT_LIST_HEAD(&b->children);
446 INIT_LIST_HEAD(&b->devices);
Alex Chiangf46753c2008-06-10 15:28:50 -0600447 INIT_LIST_HEAD(&b->slots);
Bjorn Helgaas2fe2abf2010-02-23 10:24:36 -0700448 INIT_LIST_HEAD(&b->resources);
Matthew Wilcox3749c512009-12-13 08:11:32 -0500449 b->max_bus_speed = PCI_SPEED_UNKNOWN;
450 b->cur_bus_speed = PCI_SPEED_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 }
452 return b;
453}
454
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500455static unsigned char pcix_bus_speed[] = {
456 PCI_SPEED_UNKNOWN, /* 0 */
457 PCI_SPEED_66MHz_PCIX, /* 1 */
458 PCI_SPEED_100MHz_PCIX, /* 2 */
459 PCI_SPEED_133MHz_PCIX, /* 3 */
460 PCI_SPEED_UNKNOWN, /* 4 */
461 PCI_SPEED_66MHz_PCIX_ECC, /* 5 */
462 PCI_SPEED_100MHz_PCIX_ECC, /* 6 */
463 PCI_SPEED_133MHz_PCIX_ECC, /* 7 */
464 PCI_SPEED_UNKNOWN, /* 8 */
465 PCI_SPEED_66MHz_PCIX_266, /* 9 */
466 PCI_SPEED_100MHz_PCIX_266, /* A */
467 PCI_SPEED_133MHz_PCIX_266, /* B */
468 PCI_SPEED_UNKNOWN, /* C */
469 PCI_SPEED_66MHz_PCIX_533, /* D */
470 PCI_SPEED_100MHz_PCIX_533, /* E */
471 PCI_SPEED_133MHz_PCIX_533 /* F */
472};
473
Matthew Wilcox3749c512009-12-13 08:11:32 -0500474static unsigned char pcie_link_speed[] = {
475 PCI_SPEED_UNKNOWN, /* 0 */
476 PCIE_SPEED_2_5GT, /* 1 */
477 PCIE_SPEED_5_0GT, /* 2 */
Matthew Wilcox9dfd97f2009-12-13 08:11:35 -0500478 PCIE_SPEED_8_0GT, /* 3 */
Matthew Wilcox3749c512009-12-13 08:11:32 -0500479 PCI_SPEED_UNKNOWN, /* 4 */
480 PCI_SPEED_UNKNOWN, /* 5 */
481 PCI_SPEED_UNKNOWN, /* 6 */
482 PCI_SPEED_UNKNOWN, /* 7 */
483 PCI_SPEED_UNKNOWN, /* 8 */
484 PCI_SPEED_UNKNOWN, /* 9 */
485 PCI_SPEED_UNKNOWN, /* A */
486 PCI_SPEED_UNKNOWN, /* B */
487 PCI_SPEED_UNKNOWN, /* C */
488 PCI_SPEED_UNKNOWN, /* D */
489 PCI_SPEED_UNKNOWN, /* E */
490 PCI_SPEED_UNKNOWN /* F */
491};
492
493void pcie_update_link_speed(struct pci_bus *bus, u16 linksta)
494{
495 bus->cur_bus_speed = pcie_link_speed[linksta & 0xf];
496}
497EXPORT_SYMBOL_GPL(pcie_update_link_speed);
498
Matthew Wilcox45b4cdd52009-12-13 08:11:34 -0500499static unsigned char agp_speeds[] = {
500 AGP_UNKNOWN,
501 AGP_1X,
502 AGP_2X,
503 AGP_4X,
504 AGP_8X
505};
506
507static enum pci_bus_speed agp_speed(int agp3, int agpstat)
508{
509 int index = 0;
510
511 if (agpstat & 4)
512 index = 3;
513 else if (agpstat & 2)
514 index = 2;
515 else if (agpstat & 1)
516 index = 1;
517 else
518 goto out;
519
520 if (agp3) {
521 index += 2;
522 if (index == 5)
523 index = 0;
524 }
525
526 out:
527 return agp_speeds[index];
528}
529
530
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500531static void pci_set_bus_speed(struct pci_bus *bus)
532{
533 struct pci_dev *bridge = bus->self;
534 int pos;
535
Matthew Wilcox45b4cdd52009-12-13 08:11:34 -0500536 pos = pci_find_capability(bridge, PCI_CAP_ID_AGP);
537 if (!pos)
538 pos = pci_find_capability(bridge, PCI_CAP_ID_AGP3);
539 if (pos) {
540 u32 agpstat, agpcmd;
541
542 pci_read_config_dword(bridge, pos + PCI_AGP_STATUS, &agpstat);
543 bus->max_bus_speed = agp_speed(agpstat & 8, agpstat & 7);
544
545 pci_read_config_dword(bridge, pos + PCI_AGP_COMMAND, &agpcmd);
546 bus->cur_bus_speed = agp_speed(agpstat & 8, agpcmd & 7);
547 }
548
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500549 pos = pci_find_capability(bridge, PCI_CAP_ID_PCIX);
550 if (pos) {
551 u16 status;
552 enum pci_bus_speed max;
553 pci_read_config_word(bridge, pos + 2, &status);
554
555 if (status & 0x8000) {
556 max = PCI_SPEED_133MHz_PCIX_533;
557 } else if (status & 0x4000) {
558 max = PCI_SPEED_133MHz_PCIX_266;
559 } else if (status & 0x0002) {
560 if (((status >> 12) & 0x3) == 2) {
561 max = PCI_SPEED_133MHz_PCIX_ECC;
562 } else {
563 max = PCI_SPEED_133MHz_PCIX;
564 }
565 } else {
566 max = PCI_SPEED_66MHz_PCIX;
567 }
568
569 bus->max_bus_speed = max;
570 bus->cur_bus_speed = pcix_bus_speed[(status >> 6) & 0xf];
571
572 return;
573 }
574
575 pos = pci_find_capability(bridge, PCI_CAP_ID_EXP);
576 if (pos) {
577 u32 linkcap;
578 u16 linksta;
579
580 pci_read_config_dword(bridge, pos + PCI_EXP_LNKCAP, &linkcap);
581 bus->max_bus_speed = pcie_link_speed[linkcap & 0xf];
582
583 pci_read_config_word(bridge, pos + PCI_EXP_LNKSTA, &linksta);
584 pcie_update_link_speed(bus, linksta);
585 }
586}
587
588
Adrian Bunkcbd4e052008-04-18 13:53:55 -0700589static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
590 struct pci_dev *bridge, int busnr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700591{
592 struct pci_bus *child;
593 int i;
594
595 /*
596 * Allocate a new bus, and inherit stuff from the parent..
597 */
598 child = pci_alloc_bus();
599 if (!child)
600 return NULL;
601
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602 child->parent = parent;
603 child->ops = parent->ops;
604 child->sysdata = parent->sysdata;
Michael S. Tsirkin6e325a62006-02-14 18:52:22 +0200605 child->bus_flags = parent->bus_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -0400607 /* initialize some portions of the bus device, but don't register it
608 * now as the parent is not properly set up yet. This device will get
609 * registered later in pci_bus_add_devices()
610 */
611 child->dev.class = &pcibus_class;
Kay Sievers1a927132008-10-30 02:17:49 +0100612 dev_set_name(&child->dev, "%04x:%02x", pci_domain_nr(child), busnr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700613
614 /*
615 * Set up the primary, secondary and subordinate
616 * bus numbers.
617 */
618 child->number = child->secondary = busnr;
619 child->primary = parent->secondary;
620 child->subordinate = 0xff;
621
Yu Zhao3789fa82008-11-22 02:41:07 +0800622 if (!bridge)
623 return child;
624
625 child->self = bridge;
626 child->bridge = get_device(&bridge->dev);
627
Matthew Wilcox9be60ca2009-12-13 08:11:33 -0500628 pci_set_bus_speed(child);
629
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630 /* Set up default resource pointers and names.. */
Yu Zhaofde09c62008-11-22 02:39:32 +0800631 for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632 child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i];
633 child->resource[i]->name = child->name;
634 }
635 bridge->subordinate = child;
636
637 return child;
638}
639
Sam Ravnborg451124a2008-02-02 22:33:43 +0100640struct pci_bus *__ref pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641{
642 struct pci_bus *child;
643
644 child = pci_alloc_child_bus(parent, dev, busnr);
Rajesh Shahe4ea9bb2005-04-28 00:25:48 -0700645 if (child) {
Zhang Yanmind71374d2006-06-02 12:35:43 +0800646 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700647 list_add_tail(&child->node, &parent->children);
Zhang Yanmind71374d2006-06-02 12:35:43 +0800648 up_write(&pci_bus_sem);
Rajesh Shahe4ea9bb2005-04-28 00:25:48 -0700649 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 return child;
651}
652
Sam Ravnborg96bde062007-03-26 21:53:30 -0800653static void pci_fixup_parent_subordinate_busnr(struct pci_bus *child, int max)
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700654{
655 struct pci_bus *parent = child->parent;
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700656
657 /* Attempts to fix that up are really dangerous unless
658 we're going to re-assign all bus numbers. */
659 if (!pcibios_assign_all_busses())
660 return;
661
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700662 while (parent->parent && parent->subordinate < max) {
663 parent->subordinate = max;
664 pci_write_config_byte(parent->self, PCI_SUBORDINATE_BUS, max);
665 parent = parent->parent;
666 }
667}
668
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669/*
670 * If it's a bridge, configure it and scan the bus behind it.
671 * For CardBus bridges, we don't scan behind as the devices will
672 * be handled by the bridge driver itself.
673 *
674 * We need to process bridges in two passes -- first we scan those
675 * already configured by the BIOS and after we are done with all of
676 * them, we proceed to assigning numbers to the remaining buses in
677 * order to avoid overlaps between old and new bus numbers.
678 */
Sam Ravnborg0ab2b572008-02-17 10:45:28 +0100679int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680{
681 struct pci_bus *child;
682 int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
Dominik Brodowski49887942005-12-08 16:53:12 +0100683 u32 buses, i, j = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684 u16 bctl;
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600685 u8 primary, secondary, subordinate;
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100686 int broken = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700687
688 pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses);
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600689 primary = buses & 0xFF;
690 secondary = (buses >> 8) & 0xFF;
691 subordinate = (buses >> 16) & 0xFF;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600693 dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n",
694 secondary, subordinate, pass);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100696 /* Check if setup is sensible at all */
697 if (!pass &&
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600698 (primary != bus->number || secondary <= bus->number)) {
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100699 dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n");
700 broken = 1;
701 }
702
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703 /* Disable MasterAbortMode during probing to avoid reporting
704 of bus errors (in some architectures) */
705 pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl);
706 pci_write_config_word(dev, PCI_BRIDGE_CONTROL,
707 bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT);
708
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600709 if ((secondary || subordinate) && !pcibios_assign_all_busses() &&
710 !is_cardbus && !broken) {
711 unsigned int cmax;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712 /*
713 * Bus already configured by firmware, process it in the first
714 * pass and just note the configuration.
715 */
716 if (pass)
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000717 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718
719 /*
720 * If we already got to this bus through a different bridge,
Alex Chiang74710de2009-03-20 14:56:10 -0600721 * don't re-add it. This can happen with the i450NX chipset.
722 *
723 * However, we continue to descend down the hierarchy and
724 * scan remaining child buses.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700725 */
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600726 child = pci_find_bus(pci_domain_nr(bus), secondary);
Alex Chiang74710de2009-03-20 14:56:10 -0600727 if (!child) {
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600728 child = pci_add_new_bus(bus, dev, secondary);
Alex Chiang74710de2009-03-20 14:56:10 -0600729 if (!child)
730 goto out;
Bjorn Helgaas99ddd552010-03-16 15:52:58 -0600731 child->primary = primary;
732 child->subordinate = subordinate;
Alex Chiang74710de2009-03-20 14:56:10 -0600733 child->bridge_ctl = bctl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 }
735
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 cmax = pci_scan_child_bus(child);
737 if (cmax > max)
738 max = cmax;
739 if (child->subordinate > max)
740 max = child->subordinate;
741 } else {
742 /*
743 * We need to assign a number to this bus which we always
744 * do in the second pass.
745 */
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700746 if (!pass) {
Benjamin Herrenschmidta1c19892008-10-21 10:06:29 +1100747 if (pcibios_assign_all_busses() || broken)
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700748 /* Temporarily disable forwarding of the
749 configuration cycles on all bridges in
750 this bus segment to avoid possible
751 conflicts in the second pass between two
752 bridges programmed with overlapping
753 bus ranges. */
754 pci_write_config_dword(dev, PCI_PRIMARY_BUS,
755 buses & ~0xffffff);
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000756 goto out;
Ivan Kokshaysky12f44f42005-09-22 21:06:31 -0700757 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700758
759 /* Clear errors */
760 pci_write_config_word(dev, PCI_STATUS, 0xffff);
761
Rajesh Shahcc574502005-04-28 00:25:47 -0700762 /* Prevent assigning a bus number that already exists.
763 * This can happen when a bridge is hot-plugged */
764 if (pci_find_bus(pci_domain_nr(bus), max+1))
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000765 goto out;
Rajesh Shah6ef6f0e2005-04-28 00:25:49 -0700766 child = pci_add_new_bus(bus, dev, ++max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767 buses = (buses & 0xff000000)
768 | ((unsigned int)(child->primary) << 0)
769 | ((unsigned int)(child->secondary) << 8)
770 | ((unsigned int)(child->subordinate) << 16);
771
772 /*
773 * yenta.c forces a secondary latency timer of 176.
774 * Copy that behaviour here.
775 */
776 if (is_cardbus) {
777 buses &= ~0xff000000;
778 buses |= CARDBUS_LATENCY_TIMER << 24;
779 }
780
781 /*
782 * We need to blast all three values with a single write.
783 */
784 pci_write_config_dword(dev, PCI_PRIMARY_BUS, buses);
785
786 if (!is_cardbus) {
Gary Hade11949252007-10-08 16:24:16 -0700787 child->bridge_ctl = bctl;
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700788 /*
789 * Adjust subordinate busnr in parent buses.
790 * We do this before scanning for children because
791 * some devices may not be detected if the bios
792 * was lazy.
793 */
794 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 /* Now we can scan all subordinate buses... */
796 max = pci_scan_child_bus(child);
Kristen Accardie3ac86d2006-01-17 16:57:01 -0800797 /*
798 * now fix it up again since we have found
799 * the real value of max.
800 */
801 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 } else {
803 /*
804 * For CardBus bridges, we leave 4 bus numbers
805 * as cards with a PCI-to-PCI bridge can be
806 * inserted later.
807 */
Dominik Brodowski49887942005-12-08 16:53:12 +0100808 for (i=0; i<CARDBUS_RESERVE_BUSNR; i++) {
809 struct pci_bus *parent = bus;
Rajesh Shahcc574502005-04-28 00:25:47 -0700810 if (pci_find_bus(pci_domain_nr(bus),
811 max+i+1))
812 break;
Dominik Brodowski49887942005-12-08 16:53:12 +0100813 while (parent->parent) {
814 if ((!pcibios_assign_all_busses()) &&
815 (parent->subordinate > max) &&
816 (parent->subordinate <= max+i)) {
817 j = 1;
818 }
819 parent = parent->parent;
820 }
821 if (j) {
822 /*
823 * Often, there are two cardbus bridges
824 * -- try to leave one valid bus number
825 * for each one.
826 */
827 i /= 2;
828 break;
829 }
830 }
Rajesh Shahcc574502005-04-28 00:25:47 -0700831 max += i;
Greg Kroah-Hartman26f674a2005-06-02 15:41:48 -0700832 pci_fixup_parent_subordinate_busnr(child, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833 }
834 /*
835 * Set the subordinate bus number to its real value.
836 */
837 child->subordinate = max;
838 pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max);
839 }
840
Gary Hadecb3576f2008-02-08 14:00:52 -0800841 sprintf(child->name,
842 (is_cardbus ? "PCI CardBus %04x:%02x" : "PCI Bus %04x:%02x"),
843 pci_domain_nr(bus), child->number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844
Bernhard Kaindld55bef52007-07-30 20:35:13 +0200845 /* Has only triggered on CardBus, fixup is in yenta_socket */
Dominik Brodowski49887942005-12-08 16:53:12 +0100846 while (bus->parent) {
847 if ((child->subordinate > bus->subordinate) ||
848 (child->number > bus->subordinate) ||
849 (child->number < bus->number) ||
850 (child->subordinate < bus->number)) {
Bjorn Helgaas865df572009-11-04 10:32:57 -0700851 dev_info(&child->dev, "[bus %02x-%02x] %s "
852 "hidden behind%s bridge %s [bus %02x-%02x]\n",
Bernhard Kaindld55bef52007-07-30 20:35:13 +0200853 child->number, child->subordinate,
854 (bus->number > child->subordinate &&
855 bus->subordinate < child->number) ?
Joe Perchesa6f29a92007-11-19 17:48:29 -0800856 "wholly" : "partially",
857 bus->self->transparent ? " transparent" : "",
Bjorn Helgaas865df572009-11-04 10:32:57 -0700858 dev_name(&bus->dev),
Bernhard Kaindld55bef52007-07-30 20:35:13 +0200859 bus->number, bus->subordinate);
Dominik Brodowski49887942005-12-08 16:53:12 +0100860 }
861 bus = bus->parent;
862 }
863
Ralf Baechlebbe8f9a2006-02-14 16:23:57 +0000864out:
865 pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl);
866
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 return max;
868}
869
870/*
871 * Read interrupt line and base address registers.
872 * The architecture-dependent code can tweak these, of course.
873 */
874static void pci_read_irq(struct pci_dev *dev)
875{
876 unsigned char irq;
877
878 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq);
Kristen Accardiffeff782005-11-02 16:24:32 -0800879 dev->pin = irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880 if (irq)
881 pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
882 dev->irq = irq;
883}
884
Benjamin Herrenschmidtbb209c82010-01-26 17:10:03 +0000885void set_pcie_port_type(struct pci_dev *pdev)
Yu Zhao480b93b2009-03-20 11:25:14 +0800886{
887 int pos;
888 u16 reg16;
889
890 pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
891 if (!pos)
892 return;
893 pdev->is_pcie = 1;
Kenji Kaneshige0efea002009-11-05 12:05:11 +0900894 pdev->pcie_cap = pos;
Yu Zhao480b93b2009-03-20 11:25:14 +0800895 pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
896 pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4;
897}
898
Benjamin Herrenschmidtbb209c82010-01-26 17:10:03 +0000899void set_pcie_hotplug_bridge(struct pci_dev *pdev)
Eric W. Biederman28760482009-09-09 14:09:24 -0700900{
901 int pos;
902 u16 reg16;
903 u32 reg32;
904
Kenji Kaneshige06a1cba2009-11-11 14:30:56 +0900905 pos = pci_pcie_cap(pdev);
Eric W. Biederman28760482009-09-09 14:09:24 -0700906 if (!pos)
907 return;
908 pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
909 if (!(reg16 & PCI_EXP_FLAGS_SLOT))
910 return;
911 pci_read_config_dword(pdev, pos + PCI_EXP_SLTCAP, &reg32);
912 if (reg32 & PCI_EXP_SLTCAP_HPC)
913 pdev->is_hotplug_bridge = 1;
914}
915
Matt Domsch05843962009-11-02 11:51:24 -0600916static void set_pci_aer_firmware_first(struct pci_dev *pdev)
917{
918 if (acpi_hest_firmware_first_pci(pdev))
919 pdev->aer_firmware_first = 1;
920}
921
Bartlomiej Zolnierkiewicz01abc2a2007-04-23 23:19:36 +0200922#define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED)
Randy Dunlap76e6a1d2006-12-29 16:47:29 -0800923
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924/**
925 * pci_setup_device - fill in class and map information of a device
926 * @dev: the device structure to fill
927 *
928 * Initialize the device structure with information about the device's
929 * vendor,class,memory and IO-space addresses,IRQ lines etc.
930 * Called at initialisation of the PCI subsystem and by CardBus services.
Yu Zhao480b93b2009-03-20 11:25:14 +0800931 * Returns 0 on success and negative if unknown type of device (not normal,
932 * bridge or CardBus).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 */
Yu Zhao480b93b2009-03-20 11:25:14 +0800934int pci_setup_device(struct pci_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700935{
936 u32 class;
Yu Zhao480b93b2009-03-20 11:25:14 +0800937 u8 hdr_type;
938 struct pci_slot *slot;
Gabe Blackbc577d22009-10-06 10:45:19 -0500939 int pos = 0;
Yu Zhao480b93b2009-03-20 11:25:14 +0800940
941 if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
942 return -EIO;
943
944 dev->sysdata = dev->bus->sysdata;
945 dev->dev.parent = dev->bus->bridge;
946 dev->dev.bus = &pci_bus_type;
947 dev->hdr_type = hdr_type & 0x7f;
948 dev->multifunction = !!(hdr_type & 0x80);
Yu Zhao480b93b2009-03-20 11:25:14 +0800949 dev->error_state = pci_channel_io_normal;
950 set_pcie_port_type(dev);
Matt Domsch05843962009-11-02 11:51:24 -0600951 set_pci_aer_firmware_first(dev);
Yu Zhao480b93b2009-03-20 11:25:14 +0800952
953 list_for_each_entry(slot, &dev->bus->slots, list)
954 if (PCI_SLOT(dev->devfn) == slot->number)
955 dev->slot = slot;
956
957 /* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer)
958 set this higher, assuming the system even supports it. */
959 dev->dma_mask = 0xffffffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700960
Greg Kroah-Hartmaneebfcfb2008-07-02 13:24:49 -0700961 dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus),
962 dev->bus->number, PCI_SLOT(dev->devfn),
963 PCI_FUNC(dev->devfn));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964
965 pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
Auke Kokb8a3a522007-06-08 15:46:30 -0700966 dev->revision = class & 0xff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967 class >>= 8; /* upper 3 bytes */
968 dev->class = class;
969 class >>= 8;
970
Bjorn Helgaas34a2e152008-08-25 15:45:20 -0600971 dev_dbg(&dev->dev, "found [%04x:%04x] class %06x header type %02x\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 dev->vendor, dev->device, class, dev->hdr_type);
973
Yu Zhao853346e2009-03-21 22:05:11 +0800974 /* need to have dev->class ready */
975 dev->cfg_size = pci_cfg_space_size(dev);
976
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 /* "Unknown power state" */
Daniel Ritz3fe9d192005-08-17 15:32:19 -0700978 dev->current_state = PCI_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979
980 /* Early fixups, before probing the BARs */
981 pci_fixup_device(pci_fixup_early, dev);
Yu Zhaof79b1b12009-05-28 00:25:05 +0800982 /* device class may be changed after fixup */
983 class = dev->class >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984
985 switch (dev->hdr_type) { /* header type */
986 case PCI_HEADER_TYPE_NORMAL: /* standard header */
987 if (class == PCI_CLASS_BRIDGE_PCI)
988 goto bad;
989 pci_read_irq(dev);
990 pci_read_bases(dev, 6, PCI_ROM_ADDRESS);
991 pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
992 pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
Alan Cox368c73d2006-10-04 00:41:26 +0100993
994 /*
995 * Do the ugly legacy mode stuff here rather than broken chip
996 * quirk code. Legacy mode ATA controllers have fixed
997 * addresses. These are not always echoed in BAR0-3, and
998 * BAR0-3 in a few cases contain junk!
999 */
1000 if (class == PCI_CLASS_STORAGE_IDE) {
1001 u8 progif;
1002 pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
1003 if ((progif & 1) == 0) {
Linus Torvaldsaf1bff42007-12-10 07:40:54 -08001004 dev->resource[0].start = 0x1F0;
1005 dev->resource[0].end = 0x1F7;
1006 dev->resource[0].flags = LEGACY_IO_RESOURCE;
1007 dev->resource[1].start = 0x3F6;
1008 dev->resource[1].end = 0x3F6;
1009 dev->resource[1].flags = LEGACY_IO_RESOURCE;
Alan Cox368c73d2006-10-04 00:41:26 +01001010 }
1011 if ((progif & 4) == 0) {
Linus Torvaldsaf1bff42007-12-10 07:40:54 -08001012 dev->resource[2].start = 0x170;
1013 dev->resource[2].end = 0x177;
1014 dev->resource[2].flags = LEGACY_IO_RESOURCE;
1015 dev->resource[3].start = 0x376;
1016 dev->resource[3].end = 0x376;
1017 dev->resource[3].flags = LEGACY_IO_RESOURCE;
Alan Cox368c73d2006-10-04 00:41:26 +01001018 }
1019 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020 break;
1021
1022 case PCI_HEADER_TYPE_BRIDGE: /* bridge header */
1023 if (class != PCI_CLASS_BRIDGE_PCI)
1024 goto bad;
1025 /* The PCI-to-PCI bridge spec requires that subtractive
1026 decoding (i.e. transparent) bridge must have programming
1027 interface code of 0x01. */
Kristen Accardi3efd2732005-11-02 16:55:49 -08001028 pci_read_irq(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 dev->transparent = ((dev->class & 0xff) == 1);
1030 pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
Eric W. Biederman28760482009-09-09 14:09:24 -07001031 set_pcie_hotplug_bridge(dev);
Gabe Blackbc577d22009-10-06 10:45:19 -05001032 pos = pci_find_capability(dev, PCI_CAP_ID_SSVID);
1033 if (pos) {
1034 pci_read_config_word(dev, pos + PCI_SSVID_VENDOR_ID, &dev->subsystem_vendor);
1035 pci_read_config_word(dev, pos + PCI_SSVID_DEVICE_ID, &dev->subsystem_device);
1036 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 break;
1038
1039 case PCI_HEADER_TYPE_CARDBUS: /* CardBus bridge header */
1040 if (class != PCI_CLASS_BRIDGE_CARDBUS)
1041 goto bad;
1042 pci_read_irq(dev);
1043 pci_read_bases(dev, 1, 0);
1044 pci_read_config_word(dev, PCI_CB_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
1045 pci_read_config_word(dev, PCI_CB_SUBSYSTEM_ID, &dev->subsystem_device);
1046 break;
1047
1048 default: /* unknown header */
Bjorn Helgaas80ccba12008-06-13 10:52:11 -06001049 dev_err(&dev->dev, "unknown header type %02x, "
1050 "ignoring device\n", dev->hdr_type);
Yu Zhao480b93b2009-03-20 11:25:14 +08001051 return -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052
1053 bad:
Bjorn Helgaas80ccba12008-06-13 10:52:11 -06001054 dev_err(&dev->dev, "ignoring class %02x (doesn't match header "
1055 "type %02x)\n", class, dev->hdr_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 dev->class = PCI_CLASS_NOT_DEFINED;
1057 }
1058
1059 /* We found a fine healthy device, go go go... */
1060 return 0;
1061}
1062
Zhao, Yu201de562008-10-13 19:49:55 +08001063static void pci_release_capabilities(struct pci_dev *dev)
1064{
1065 pci_vpd_release(dev);
Yu Zhaod1b054d2009-03-20 11:25:11 +08001066 pci_iov_release(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001067}
1068
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069/**
1070 * pci_release_dev - free a pci device structure when all users of it are finished.
1071 * @dev: device that's been disconnected
1072 *
1073 * Will be called only by the device core when all users of this pci device are
1074 * done.
1075 */
1076static void pci_release_dev(struct device *dev)
1077{
1078 struct pci_dev *pci_dev;
1079
1080 pci_dev = to_pci_dev(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001081 pci_release_capabilities(pci_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 kfree(pci_dev);
1083}
1084
1085/**
1086 * pci_cfg_space_size - get the configuration space size of the PCI device.
Randy Dunlap8f7020d2005-10-23 11:57:38 -07001087 * @dev: PCI device
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088 *
1089 * Regular PCI devices have 256 bytes, but PCI-X 2 and PCI Express devices
1090 * have 4096 bytes. Even if the device is capable, that doesn't mean we can
1091 * access it. Maybe we don't have a way to generate extended config space
1092 * accesses, or the device is behind a reverse Express bridge. So we try
1093 * reading the dword at 0x100 which must either be 0 or a valid extended
1094 * capability header.
1095 */
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001096int pci_cfg_space_size_ext(struct pci_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098 u32 status;
Zhao, Yu557848c2008-10-13 19:18:07 +08001099 int pos = PCI_CFG_SPACE_SIZE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100
Zhao, Yu557848c2008-10-13 19:18:07 +08001101 if (pci_read_config_dword(dev, pos, &status) != PCIBIOS_SUCCESSFUL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 goto fail;
1103 if (status == 0xffffffff)
1104 goto fail;
1105
1106 return PCI_CFG_SPACE_EXP_SIZE;
1107
1108 fail:
1109 return PCI_CFG_SPACE_SIZE;
1110}
1111
Yinghai Lu57741a72008-02-15 01:32:50 -08001112int pci_cfg_space_size(struct pci_dev *dev)
1113{
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001114 int pos;
1115 u32 status;
Yinghai Ludfadd9ed2009-03-08 21:35:37 -07001116 u16 class;
1117
1118 class = dev->class >> 8;
1119 if (class == PCI_CLASS_BRIDGE_HOST)
1120 return pci_cfg_space_size_ext(dev);
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001121
Kenji Kaneshige06a1cba2009-11-11 14:30:56 +09001122 pos = pci_pcie_cap(dev);
Yinghai Lu70b9f7d2008-04-28 16:27:23 -07001123 if (!pos) {
1124 pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
1125 if (!pos)
1126 goto fail;
1127
1128 pci_read_config_dword(dev, pos + PCI_X_STATUS, &status);
1129 if (!(status & (PCI_X_STATUS_266MHZ | PCI_X_STATUS_533MHZ)))
1130 goto fail;
1131 }
1132
1133 return pci_cfg_space_size_ext(dev);
1134
1135 fail:
1136 return PCI_CFG_SPACE_SIZE;
Yinghai Lu57741a72008-02-15 01:32:50 -08001137}
1138
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139static void pci_release_bus_bridge_dev(struct device *dev)
1140{
1141 kfree(dev);
1142}
1143
Michael Ellerman65891212007-04-05 17:19:08 +10001144struct pci_dev *alloc_pci_dev(void)
1145{
1146 struct pci_dev *dev;
1147
1148 dev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL);
1149 if (!dev)
1150 return NULL;
1151
Michael Ellerman65891212007-04-05 17:19:08 +10001152 INIT_LIST_HEAD(&dev->bus_list);
1153
1154 return dev;
1155}
1156EXPORT_SYMBOL(alloc_pci_dev);
1157
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158/*
1159 * Read the config data for a PCI device, sanity-check it
1160 * and fill in the dev structure...
1161 */
Adrian Bunk7f7b5de2008-04-18 13:53:55 -07001162static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163{
1164 struct pci_dev *dev;
1165 u32 l;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166 int delay = 1;
1167
1168 if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
1169 return NULL;
1170
1171 /* some broken boards return 0 or ~0 if a slot is empty: */
1172 if (l == 0xffffffff || l == 0x00000000 ||
1173 l == 0x0000ffff || l == 0xffff0000)
1174 return NULL;
1175
1176 /* Configuration request Retry Status */
1177 while (l == 0xffff0001) {
1178 msleep(delay);
1179 delay *= 2;
1180 if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
1181 return NULL;
1182 /* Card hasn't responded in 60 seconds? Must be stuck. */
1183 if (delay > 60 * 1000) {
Bjorn Helgaas80ccba12008-06-13 10:52:11 -06001184 printk(KERN_WARNING "pci %04x:%02x:%02x.%d: not "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185 "responding\n", pci_domain_nr(bus),
1186 bus->number, PCI_SLOT(devfn),
1187 PCI_FUNC(devfn));
1188 return NULL;
1189 }
1190 }
1191
Michael Ellermanbab41e92007-04-05 17:19:09 +10001192 dev = alloc_pci_dev();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 if (!dev)
1194 return NULL;
1195
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196 dev->bus = bus;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 dev->devfn = devfn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198 dev->vendor = l & 0xffff;
1199 dev->device = (l >> 16) & 0xffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200
Yu Zhao480b93b2009-03-20 11:25:14 +08001201 if (pci_setup_device(dev)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 kfree(dev);
1203 return NULL;
1204 }
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001205
1206 return dev;
1207}
1208
Zhao, Yu201de562008-10-13 19:49:55 +08001209static void pci_init_capabilities(struct pci_dev *dev)
1210{
1211 /* MSI/MSI-X list */
1212 pci_msi_init_pci_dev(dev);
1213
Rafael J. Wysocki63f48982008-12-07 22:02:58 +01001214 /* Buffers for saving PCIe and PCI-X capabilities */
1215 pci_allocate_cap_save_buffers(dev);
1216
Zhao, Yu201de562008-10-13 19:49:55 +08001217 /* Power Management */
1218 pci_pm_init(dev);
Jesse Barneseb9c39d2008-12-17 12:10:05 -08001219 platform_pci_wakeup_init(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001220
1221 /* Vital Product Data */
1222 pci_vpd_pci22_init(dev);
Yu Zhao58c3a722008-10-14 14:02:53 +08001223
1224 /* Alternative Routing-ID Forwarding */
1225 pci_enable_ari(dev);
Yu Zhaod1b054d2009-03-20 11:25:11 +08001226
1227 /* Single Root I/O Virtualization */
1228 pci_iov_init(dev);
Allen Kayae21ee62009-10-07 10:27:17 -07001229
1230 /* Enable ACS P2P upstream forwarding */
Chris Wright5d990b62009-12-04 12:15:21 -08001231 pci_enable_acs(dev);
Zhao, Yu201de562008-10-13 19:49:55 +08001232}
1233
Sam Ravnborg96bde062007-03-26 21:53:30 -08001234void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001235{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001236 device_initialize(&dev->dev);
1237 dev->dev.release = pci_release_dev;
1238 pci_dev_get(dev);
1239
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240 dev->dev.dma_mask = &dev->dma_mask;
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001241 dev->dev.dma_parms = &dev->dma_parms;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242 dev->dev.coherent_dma_mask = 0xffffffffull;
1243
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001244 pci_set_dma_max_seg_size(dev, 65536);
FUJITA Tomonori59fc67d2008-02-04 22:28:14 -08001245 pci_set_dma_seg_boundary(dev, 0xffffffff);
FUJITA Tomonori4d57cdf2008-02-04 22:27:55 -08001246
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247 /* Fix up broken headers */
1248 pci_fixup_device(pci_fixup_header, dev);
1249
Rafael J. Wysocki4b77b0a2009-09-09 23:49:59 +02001250 /* Clear the state_saved flag. */
1251 dev->state_saved = false;
1252
Zhao, Yu201de562008-10-13 19:49:55 +08001253 /* Initialize various capabilities */
1254 pci_init_capabilities(dev);
Rafael J. Wysockieb9d0fe2008-07-07 03:34:48 +02001255
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 /*
1257 * Add the device to our list of discovered devices
1258 * and the bus list for fixup functions, etc.
1259 */
Zhang Yanmind71374d2006-06-02 12:35:43 +08001260 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 list_add_tail(&dev->bus_list, &bus->devices);
Zhang Yanmind71374d2006-06-02 12:35:43 +08001262 up_write(&pci_bus_sem);
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001263}
1264
Sam Ravnborg451124a2008-02-02 22:33:43 +01001265struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn)
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001266{
1267 struct pci_dev *dev;
1268
Trent Piepho90bdb312009-03-20 14:56:00 -06001269 dev = pci_get_slot(bus, devfn);
1270 if (dev) {
1271 pci_dev_put(dev);
1272 return dev;
1273 }
1274
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001275 dev = pci_scan_device(bus, devfn);
1276 if (!dev)
1277 return NULL;
1278
1279 pci_device_add(dev, bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280
1281 return dev;
1282}
Adrian Bunkb73e9682007-11-21 15:07:11 -08001283EXPORT_SYMBOL(pci_scan_single_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001285static unsigned next_ari_fn(struct pci_dev *dev, unsigned fn)
1286{
1287 u16 cap;
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001288 unsigned pos, next_fn;
1289
1290 if (!dev)
1291 return 0;
1292
1293 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI);
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001294 if (!pos)
1295 return 0;
1296 pci_read_config_word(dev, pos + 4, &cap);
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001297 next_fn = cap >> 8;
1298 if (next_fn <= fn)
1299 return 0;
1300 return next_fn;
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001301}
1302
1303static unsigned next_trad_fn(struct pci_dev *dev, unsigned fn)
1304{
1305 return (fn + 1) % 8;
1306}
1307
1308static unsigned no_next_fn(struct pci_dev *dev, unsigned fn)
1309{
1310 return 0;
1311}
1312
1313static int only_one_child(struct pci_bus *bus)
1314{
1315 struct pci_dev *parent = bus->self;
1316 if (!parent || !pci_is_pcie(parent))
1317 return 0;
1318 if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
1319 parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
1320 return 1;
1321 return 0;
1322}
1323
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324/**
1325 * pci_scan_slot - scan a PCI slot on a bus for devices.
1326 * @bus: PCI bus to scan
1327 * @devfn: slot number to scan (must have zero function.)
1328 *
1329 * Scan a PCI slot on the specified PCI bus for devices, adding
1330 * discovered devices to the @bus->devices list. New devices
Greg Kroah-Hartman8a1bc902008-02-14 14:56:56 -08001331 * will not have is_added set.
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001332 *
1333 * Returns the number of new devices found.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334 */
Sam Ravnborg96bde062007-03-26 21:53:30 -08001335int pci_scan_slot(struct pci_bus *bus, int devfn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001336{
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001337 unsigned fn, nr = 0;
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001338 struct pci_dev *dev;
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001339 unsigned (*next_fn)(struct pci_dev *, unsigned) = no_next_fn;
1340
1341 if (only_one_child(bus) && (devfn > 0))
1342 return 0; /* Already scanned the entire slot */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001344 dev = pci_scan_single_device(bus, devfn);
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001345 if (!dev)
1346 return 0;
1347 if (!dev->is_added)
Trent Piepho1b69dfc2009-03-20 14:56:05 -06001348 nr++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001350 if (pci_ari_enabled(bus))
1351 next_fn = next_ari_fn;
Matthew Wilcox4fb88c12010-01-17 14:01:41 -07001352 else if (dev->multifunction)
Matthew Wilcoxf07852d2009-12-13 08:10:02 -05001353 next_fn = next_trad_fn;
1354
1355 for (fn = next_fn(dev, 0); fn > 0; fn = next_fn(dev, fn)) {
1356 dev = pci_scan_single_device(bus, devfn + fn);
1357 if (dev) {
1358 if (!dev->is_added)
1359 nr++;
1360 dev->multifunction = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 }
1362 }
Shaohua Li7d715a62008-02-25 09:46:41 +08001363
Shaohua Li149e1632008-07-23 10:32:31 +08001364 /* only one slot has pcie device */
1365 if (bus->self && nr)
Shaohua Li7d715a62008-02-25 09:46:41 +08001366 pcie_aspm_init_link_state(bus->self);
1367
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368 return nr;
1369}
1370
Sam Ravnborg0ab2b572008-02-17 10:45:28 +01001371unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372{
1373 unsigned int devfn, pass, max = bus->secondary;
1374 struct pci_dev *dev;
1375
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001376 dev_dbg(&bus->dev, "scanning bus\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377
1378 /* Go find them, Rover! */
1379 for (devfn = 0; devfn < 0x100; devfn += 8)
1380 pci_scan_slot(bus, devfn);
1381
Yu Zhaoa28724b2009-03-20 11:25:13 +08001382 /* Reserve buses for SR-IOV capability. */
1383 max += pci_iov_bus_range(bus);
1384
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 /*
1386 * After performing arch-dependent fixup of the bus, look behind
1387 * all PCI-to-PCI bridges on this bus.
1388 */
Alex Chiang74710de2009-03-20 14:56:10 -06001389 if (!bus->is_added) {
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001390 dev_dbg(&bus->dev, "fixups for bus\n");
Alex Chiang74710de2009-03-20 14:56:10 -06001391 pcibios_fixup_bus(bus);
1392 if (pci_is_root_bus(bus))
1393 bus->is_added = 1;
1394 }
1395
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396 for (pass=0; pass < 2; pass++)
1397 list_for_each_entry(dev, &bus->devices, bus_list) {
1398 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
1399 dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
1400 max = pci_scan_bridge(bus, dev, max, pass);
1401 }
1402
1403 /*
1404 * We've scanned the bus and so we know all about what's on
1405 * the other side of any bridges that may be on this bus plus
1406 * any devices.
1407 *
1408 * Return how far we've got finding sub-buses.
1409 */
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001410 dev_dbg(&bus->dev, "bus scan returning with max=%02x\n", max);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 return max;
1412}
1413
Sam Ravnborg96bde062007-03-26 21:53:30 -08001414struct pci_bus * pci_create_bus(struct device *parent,
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001415 int bus, struct pci_ops *ops, void *sysdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416{
1417 int error;
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001418 struct pci_bus *b, *b2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419 struct device *dev;
1420
1421 b = pci_alloc_bus();
1422 if (!b)
1423 return NULL;
1424
Geert Uytterhoeven6a3b3e22009-03-15 20:14:37 +01001425 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426 if (!dev){
1427 kfree(b);
1428 return NULL;
1429 }
1430
1431 b->sysdata = sysdata;
1432 b->ops = ops;
1433
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001434 b2 = pci_find_bus(pci_domain_nr(b), bus);
1435 if (b2) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436 /* If we already got to this bus through a different bridge, ignore it */
Bjorn Helgaas0207c352009-11-04 10:32:52 -07001437 dev_dbg(&b2->dev, "bus already known\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438 goto err_out;
1439 }
Zhang Yanmind71374d2006-06-02 12:35:43 +08001440
1441 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442 list_add_tail(&b->node, &pci_root_buses);
Zhang Yanmind71374d2006-06-02 12:35:43 +08001443 up_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445 dev->parent = parent;
1446 dev->release = pci_release_bus_bridge_dev;
Kay Sievers1a927132008-10-30 02:17:49 +01001447 dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448 error = device_register(dev);
1449 if (error)
1450 goto dev_reg_err;
1451 b->bridge = get_device(dev);
Rafael J. Wysockia1e4d722010-02-08 19:16:33 +01001452 device_enable_async_suspend(b->bridge);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453
Yinghai Lu0d358f22008-02-19 03:20:41 -08001454 if (!parent)
1455 set_dev_node(b->bridge, pcibus_to_node(b));
1456
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001457 b->dev.class = &pcibus_class;
1458 b->dev.parent = b->bridge;
Kay Sievers1a927132008-10-30 02:17:49 +01001459 dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001460 error = device_register(&b->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 if (error)
1462 goto class_dev_reg_err;
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001463 error = device_create_file(&b->dev, &dev_attr_cpuaffinity);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464 if (error)
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001465 goto dev_create_file_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466
1467 /* Create legacy_io and legacy_mem files for this bus */
1468 pci_create_legacy_files(b);
1469
Linus Torvalds1da177e2005-04-16 15:20:36 -07001470 b->number = b->secondary = bus;
1471 b->resource[0] = &ioport_resource;
1472 b->resource[1] = &iomem_resource;
1473
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474 return b;
1475
Greg Kroah-Hartmanfd7d1ce2007-05-22 22:47:54 -04001476dev_create_file_err:
1477 device_unregister(&b->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478class_dev_reg_err:
1479 device_unregister(dev);
1480dev_reg_err:
Zhang Yanmind71374d2006-06-02 12:35:43 +08001481 down_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001482 list_del(&b->node);
Zhang Yanmind71374d2006-06-02 12:35:43 +08001483 up_write(&pci_bus_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484err_out:
1485 kfree(dev);
1486 kfree(b);
1487 return NULL;
1488}
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001489
Sam Ravnborg0ab2b572008-02-17 10:45:28 +01001490struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent,
Paul Mackerrascdb9b9f2005-09-06 09:31:03 +10001491 int bus, struct pci_ops *ops, void *sysdata)
1492{
1493 struct pci_bus *b;
1494
1495 b = pci_create_bus(parent, bus, ops, sysdata);
1496 if (b)
1497 b->subordinate = pci_scan_child_bus(b);
1498 return b;
1499}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500EXPORT_SYMBOL(pci_scan_bus_parented);
1501
1502#ifdef CONFIG_HOTPLUG
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001503/**
1504 * pci_rescan_bus - scan a PCI bus for devices.
1505 * @bus: PCI bus to scan
1506 *
1507 * Scan a PCI bus and child buses for new devices, adds them,
1508 * and enables them.
1509 *
1510 * Returns the max number of subordinate bus discovered.
1511 */
Alex Chiang5446a6b2009-04-01 18:24:12 -06001512unsigned int __ref pci_rescan_bus(struct pci_bus *bus)
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001513{
1514 unsigned int max;
1515 struct pci_dev *dev;
1516
1517 max = pci_scan_child_bus(bus);
1518
Alex Chiang705b1aa2009-03-20 14:56:31 -06001519 down_read(&pci_bus_sem);
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001520 list_for_each_entry(dev, &bus->devices, bus_list)
1521 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
1522 dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
1523 if (dev->subordinate)
1524 pci_bus_size_bridges(dev->subordinate);
Alex Chiang705b1aa2009-03-20 14:56:31 -06001525 up_read(&pci_bus_sem);
Alex Chiang3ed4fd92009-03-20 14:56:25 -06001526
1527 pci_bus_assign_resources(bus);
1528 pci_enable_bridges(bus);
1529 pci_bus_add_devices(bus);
1530
1531 return max;
1532}
1533EXPORT_SYMBOL_GPL(pci_rescan_bus);
1534
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535EXPORT_SYMBOL(pci_add_new_bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536EXPORT_SYMBOL(pci_scan_slot);
1537EXPORT_SYMBOL(pci_scan_bridge);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538EXPORT_SYMBOL_GPL(pci_scan_child_bus);
1539#endif
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001540
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001541static int __init pci_sort_bf_cmp(const struct device *d_a, const struct device *d_b)
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001542{
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001543 const struct pci_dev *a = to_pci_dev(d_a);
1544 const struct pci_dev *b = to_pci_dev(d_b);
1545
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001546 if (pci_domain_nr(a->bus) < pci_domain_nr(b->bus)) return -1;
1547 else if (pci_domain_nr(a->bus) > pci_domain_nr(b->bus)) return 1;
1548
1549 if (a->bus->number < b->bus->number) return -1;
1550 else if (a->bus->number > b->bus->number) return 1;
1551
1552 if (a->devfn < b->devfn) return -1;
1553 else if (a->devfn > b->devfn) return 1;
1554
1555 return 0;
1556}
1557
Greg Kroah-Hartman5ff580c2008-02-14 14:56:56 -08001558void __init pci_sort_breadthfirst(void)
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001559{
Greg Kroah-Hartman99178b02008-08-26 11:00:57 -05001560 bus_sort_breadthfirst(&pci_bus_type, &pci_sort_bf_cmp);
Matt Domsch6b4b78f2006-09-29 15:23:23 -05001561}