Commit 733abe4fff3afa13e301bc8bc5bee9aac4b59fdc
Exists in
master
and in
7 other branches
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6: PCI: Make PCI device numa-node attribute visible in sysfs PCI: add systems for automatic breadth-first device sorting PCI: PCI devices get assigned redundant IRQs PCI: Make CARDBUS_MEM_SIZE and CARDBUS_IO_SIZE boot options PCI: pci.txt fix __devexit() usage PCI/sysfs/kobject kernel-doc fixes
Showing 11 changed files Side-by-side Diff
Documentation/kernel-parameters.txt
... | ... | @@ -1275,6 +1275,12 @@ |
1275 | 1275 | This sorting is done to get a device |
1276 | 1276 | order compatible with older (<= 2.4) kernels. |
1277 | 1277 | nobfsort Don't sort PCI devices into breadth-first order. |
1278 | + cbiosize=nn[KMG] The fixed amount of bus space which is | |
1279 | + reserved for the CardBus bridge's IO window. | |
1280 | + The default value is 256 bytes. | |
1281 | + cbmemsize=nn[KMG] The fixed amount of bus space which is | |
1282 | + reserved for the CardBus bridge's memory | |
1283 | + window. The default value is 64 megabytes. | |
1278 | 1284 | |
1279 | 1285 | pcmv= [HW,PCMCIA] BadgePAD 4 |
1280 | 1286 |
Documentation/pci.txt
... | ... | @@ -205,8 +205,8 @@ |
205 | 205 | exclusively called by the probe() routine, can be marked __devinit. |
206 | 206 | Ditto for remove() and __devexit. |
207 | 207 | |
208 | - o If mydriver_probe() is marked with __devinit(), then all address | |
209 | - references to mydriver_probe must use __devexit_p(mydriver_probe) | |
208 | + o If mydriver_remove() is marked with __devexit(), then all address | |
209 | + references to mydriver_remove must use __devexit_p(mydriver_remove) | |
210 | 210 | (in the struct pci_driver declaration for example). |
211 | 211 | __devexit_p() will generate the function name _or_ NULL if the |
212 | 212 | function will be discarded. For an example, see drivers/net/tg3.c. |
arch/i386/pci/common.c
... | ... | @@ -191,6 +191,94 @@ |
191 | 191 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2950"), |
192 | 192 | }, |
193 | 193 | }, |
194 | + { | |
195 | + .callback = set_bf_sort, | |
196 | + .ident = "HP ProLiant BL20p G3", | |
197 | + .matches = { | |
198 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
199 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL20p G3"), | |
200 | + }, | |
201 | + }, | |
202 | + { | |
203 | + .callback = set_bf_sort, | |
204 | + .ident = "HP ProLiant BL20p G4", | |
205 | + .matches = { | |
206 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
207 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL20p G4"), | |
208 | + }, | |
209 | + }, | |
210 | + { | |
211 | + .callback = set_bf_sort, | |
212 | + .ident = "HP ProLiant BL30p G1", | |
213 | + .matches = { | |
214 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
215 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL30p G1"), | |
216 | + }, | |
217 | + }, | |
218 | + { | |
219 | + .callback = set_bf_sort, | |
220 | + .ident = "HP ProLiant BL25p G1", | |
221 | + .matches = { | |
222 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
223 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL25p G1"), | |
224 | + }, | |
225 | + }, | |
226 | + { | |
227 | + .callback = set_bf_sort, | |
228 | + .ident = "HP ProLiant BL35p G1", | |
229 | + .matches = { | |
230 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
231 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL35p G1"), | |
232 | + }, | |
233 | + }, | |
234 | + { | |
235 | + .callback = set_bf_sort, | |
236 | + .ident = "HP ProLiant BL45p G1", | |
237 | + .matches = { | |
238 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
239 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL45p G1"), | |
240 | + }, | |
241 | + }, | |
242 | + { | |
243 | + .callback = set_bf_sort, | |
244 | + .ident = "HP ProLiant BL45p G2", | |
245 | + .matches = { | |
246 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
247 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL45p G2"), | |
248 | + }, | |
249 | + }, | |
250 | + { | |
251 | + .callback = set_bf_sort, | |
252 | + .ident = "HP ProLiant BL460c G1", | |
253 | + .matches = { | |
254 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
255 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL460c G1"), | |
256 | + }, | |
257 | + }, | |
258 | + { | |
259 | + .callback = set_bf_sort, | |
260 | + .ident = "HP ProLiant BL465c G1", | |
261 | + .matches = { | |
262 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
263 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL465c G1"), | |
264 | + }, | |
265 | + }, | |
266 | + { | |
267 | + .callback = set_bf_sort, | |
268 | + .ident = "HP ProLiant BL480c G1", | |
269 | + .matches = { | |
270 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
271 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL480c G1"), | |
272 | + }, | |
273 | + }, | |
274 | + { | |
275 | + .callback = set_bf_sort, | |
276 | + .ident = "HP ProLiant BL685c G1", | |
277 | + .matches = { | |
278 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | |
279 | + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL685c G1"), | |
280 | + }, | |
281 | + }, | |
194 | 282 | {} |
195 | 283 | }; |
196 | 284 |
drivers/pci/pci-driver.c
... | ... | @@ -415,6 +415,7 @@ |
415 | 415 | * __pci_register_driver - register a new pci driver |
416 | 416 | * @drv: the driver structure to register |
417 | 417 | * @owner: owner module of drv |
418 | + * @mod_name: module name string | |
418 | 419 | * |
419 | 420 | * Adds the driver structure to the list of registered drivers. |
420 | 421 | * Returns a negative value on error, otherwise 0. |
drivers/pci/pci-sysfs.c
... | ... | @@ -143,7 +143,15 @@ |
143 | 143 | return sprintf (buf, "%u\n", atomic_read(&pdev->enable_cnt)); |
144 | 144 | } |
145 | 145 | |
146 | +#ifdef CONFIG_NUMA | |
146 | 147 | static ssize_t |
148 | +numa_node_show(struct device *dev, struct device_attribute *attr, char *buf) | |
149 | +{ | |
150 | + return sprintf (buf, "%d\n", dev->numa_node); | |
151 | +} | |
152 | +#endif | |
153 | + | |
154 | +static ssize_t | |
147 | 155 | msi_bus_show(struct device *dev, struct device_attribute *attr, char *buf) |
148 | 156 | { |
149 | 157 | struct pci_dev *pdev = to_pci_dev(dev); |
... | ... | @@ -194,6 +202,9 @@ |
194 | 202 | __ATTR_RO(irq), |
195 | 203 | __ATTR_RO(local_cpus), |
196 | 204 | __ATTR_RO(modalias), |
205 | +#ifdef CONFIG_NUMA | |
206 | + __ATTR_RO(numa_node), | |
207 | +#endif | |
197 | 208 | __ATTR(enable, 0600, is_enabled_show, is_enabled_store), |
198 | 209 | __ATTR(broken_parity_status,(S_IRUGO|S_IWUSR), |
199 | 210 | broken_parity_status_show,broken_parity_status_store), |
drivers/pci/pci.c
... | ... | @@ -21,6 +21,12 @@ |
21 | 21 | |
22 | 22 | unsigned int pci_pm_d3_delay = 10; |
23 | 23 | |
24 | +#define DEFAULT_CARDBUS_IO_SIZE (256) | |
25 | +#define DEFAULT_CARDBUS_MEM_SIZE (64*1024*1024) | |
26 | +/* pci=cbmemsize=nnM,cbiosize=nn can override this */ | |
27 | +unsigned long pci_cardbus_io_size = DEFAULT_CARDBUS_IO_SIZE; | |
28 | +unsigned long pci_cardbus_mem_size = DEFAULT_CARDBUS_MEM_SIZE; | |
29 | + | |
24 | 30 | /** |
25 | 31 | * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children |
26 | 32 | * @bus: pointer to PCI bus structure to search |
... | ... | @@ -1300,7 +1306,7 @@ |
1300 | 1306 | |
1301 | 1307 | /** |
1302 | 1308 | * pci_select_bars - Make BAR mask from the type of resource |
1303 | - * @pdev: the PCI device for which BAR mask is made | |
1309 | + * @dev: the PCI device for which BAR mask is made | |
1304 | 1310 | * @flags: resource type mask to be selected |
1305 | 1311 | * |
1306 | 1312 | * This helper routine makes bar mask from the type of resource. |
... | ... | @@ -1333,6 +1339,10 @@ |
1333 | 1339 | if (*str && (str = pcibios_setup(str)) && *str) { |
1334 | 1340 | if (!strcmp(str, "nomsi")) { |
1335 | 1341 | pci_no_msi(); |
1342 | + } else if (!strncmp(str, "cbiosize=", 9)) { | |
1343 | + pci_cardbus_io_size = memparse(str + 9, &str); | |
1344 | + } else if (!strncmp(str, "cbmemsize=", 10)) { | |
1345 | + pci_cardbus_mem_size = memparse(str + 10, &str); | |
1336 | 1346 | } else { |
1337 | 1347 | printk(KERN_ERR "PCI: Unknown option `%s'\n", |
1338 | 1348 | str); |
drivers/pci/setup-bus.c
... | ... | @@ -36,13 +36,6 @@ |
36 | 36 | |
37 | 37 | #define ROUND_UP(x, a) (((x) + (a) - 1) & ~((a) - 1)) |
38 | 38 | |
39 | -/* | |
40 | - * FIXME: IO should be max 256 bytes. However, since we may | |
41 | - * have a P2P bridge below a cardbus bridge, we need 4K. | |
42 | - */ | |
43 | -#define CARDBUS_IO_SIZE (256) | |
44 | -#define CARDBUS_MEM_SIZE (64*1024*1024) | |
45 | - | |
46 | 39 | static void __devinit |
47 | 40 | pbus_assign_resources_sorted(struct pci_bus *bus) |
48 | 41 | { |
49 | 42 | |
... | ... | @@ -415,12 +408,12 @@ |
415 | 408 | * Reserve some resources for CardBus. We reserve |
416 | 409 | * a fixed amount of bus space for CardBus bridges. |
417 | 410 | */ |
418 | - b_res[0].start = CARDBUS_IO_SIZE; | |
419 | - b_res[0].end = b_res[0].start + CARDBUS_IO_SIZE - 1; | |
411 | + b_res[0].start = pci_cardbus_io_size; | |
412 | + b_res[0].end = b_res[0].start + pci_cardbus_io_size - 1; | |
420 | 413 | b_res[0].flags |= IORESOURCE_IO; |
421 | 414 | |
422 | - b_res[1].start = CARDBUS_IO_SIZE; | |
423 | - b_res[1].end = b_res[1].start + CARDBUS_IO_SIZE - 1; | |
415 | + b_res[1].start = pci_cardbus_io_size; | |
416 | + b_res[1].end = b_res[1].start + pci_cardbus_io_size - 1; | |
424 | 417 | b_res[1].flags |= IORESOURCE_IO; |
425 | 418 | |
426 | 419 | /* |
427 | 420 | |
428 | 421 | |
... | ... | @@ -440,16 +433,16 @@ |
440 | 433 | * twice the size. |
441 | 434 | */ |
442 | 435 | if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0) { |
443 | - b_res[2].start = CARDBUS_MEM_SIZE; | |
444 | - b_res[2].end = b_res[2].start + CARDBUS_MEM_SIZE - 1; | |
436 | + b_res[2].start = pci_cardbus_mem_size; | |
437 | + b_res[2].end = b_res[2].start + pci_cardbus_mem_size - 1; | |
445 | 438 | b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH; |
446 | 439 | |
447 | - b_res[3].start = CARDBUS_MEM_SIZE; | |
448 | - b_res[3].end = b_res[3].start + CARDBUS_MEM_SIZE - 1; | |
440 | + b_res[3].start = pci_cardbus_mem_size; | |
441 | + b_res[3].end = b_res[3].start + pci_cardbus_mem_size - 1; | |
449 | 442 | b_res[3].flags |= IORESOURCE_MEM; |
450 | 443 | } else { |
451 | - b_res[3].start = CARDBUS_MEM_SIZE * 2; | |
452 | - b_res[3].end = b_res[3].start + CARDBUS_MEM_SIZE * 2 - 1; | |
444 | + b_res[3].start = pci_cardbus_mem_size * 2; | |
445 | + b_res[3].end = b_res[3].start + pci_cardbus_mem_size * 2 - 1; | |
453 | 446 | b_res[3].flags |= IORESOURCE_MEM; |
454 | 447 | } |
455 | 448 | } |
drivers/pci/setup-irq.c
... | ... | @@ -24,7 +24,7 @@ |
24 | 24 | int (*map_irq)(struct pci_dev *, u8, u8)) |
25 | 25 | { |
26 | 26 | u8 pin, slot; |
27 | - int irq; | |
27 | + int irq = 0; | |
28 | 28 | |
29 | 29 | /* If this device is not on the primary bus, we need to figure out |
30 | 30 | which interrupt pin it will come in on. We know which slot it |
31 | 31 | |
32 | 32 | |
... | ... | @@ -33,16 +33,18 @@ |
33 | 33 | apply the swizzle function. */ |
34 | 34 | |
35 | 35 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
36 | - /* Cope with 0 and illegal. */ | |
37 | - if (pin == 0 || pin > 4) | |
36 | + /* Cope with illegal. */ | |
37 | + if (pin > 4) | |
38 | 38 | pin = 1; |
39 | 39 | |
40 | - /* Follow the chain of bridges, swizzling as we go. */ | |
41 | - slot = (*swizzle)(dev, &pin); | |
40 | + if (pin != 0) { | |
41 | + /* Follow the chain of bridges, swizzling as we go. */ | |
42 | + slot = (*swizzle)(dev, &pin); | |
42 | 43 | |
43 | - irq = (*map_irq)(dev, slot, pin); | |
44 | - if (irq == -1) | |
45 | - irq = 0; | |
44 | + irq = (*map_irq)(dev, slot, pin); | |
45 | + if (irq == -1) | |
46 | + irq = 0; | |
47 | + } | |
46 | 48 | dev->irq = irq; |
47 | 49 | |
48 | 50 | pr_debug("PCI: fixup irq: (%s) got %d\n", |
fs/sysfs/file.c
include/linux/pci.h
... | ... | @@ -854,6 +854,9 @@ |
854 | 854 | #define PCIPCI_ALIMAGIK 32 /* Need low latency setting */ |
855 | 855 | #define PCIAGP_FAIL 64 /* No PCI to AGP DMA */ |
856 | 856 | |
857 | +extern unsigned long pci_cardbus_io_size; | |
858 | +extern unsigned long pci_cardbus_mem_size; | |
859 | + | |
857 | 860 | #endif /* __KERNEL__ */ |
858 | 861 | #endif /* LINUX_PCI_H */ |