diff options
Diffstat (limited to 'drivers/pci')
| -rw-r--r-- | drivers/pci/hotplug/fakephp.c | 6 | ||||
| -rw-r--r-- | drivers/pci/hotplug/pciehp_hpc.c | 2 | ||||
| -rw-r--r-- | drivers/pci/intel-iommu.c | 23 | ||||
| -rw-r--r-- | drivers/pci/pci-sysfs.c | 19 | ||||
| -rw-r--r-- | drivers/pci/pcie/aspm.c | 2 | ||||
| -rw-r--r-- | drivers/pci/probe.c | 18 | ||||
| -rw-r--r-- | drivers/pci/search.c | 6 | ||||
| -rw-r--r-- | drivers/pci/setup-bus.c | 6 |
8 files changed, 70 insertions, 12 deletions
diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c index 40337a06c18a..146ca9cd1567 100644 --- a/drivers/pci/hotplug/fakephp.c +++ b/drivers/pci/hotplug/fakephp.c | |||
| @@ -320,15 +320,15 @@ static int disable_slot(struct hotplug_slot *slot) | |||
| 320 | return -ENODEV; | 320 | return -ENODEV; |
| 321 | } | 321 | } |
| 322 | 322 | ||
| 323 | /* remove the device from the pci core */ | ||
| 324 | pci_remove_bus_device(dev); | ||
| 325 | |||
| 323 | /* queue work item to blow away this sysfs entry and other | 326 | /* queue work item to blow away this sysfs entry and other |
| 324 | * parts. | 327 | * parts. |
| 325 | */ | 328 | */ |
| 326 | INIT_WORK(&dslot->remove_work, remove_slot_worker); | 329 | INIT_WORK(&dslot->remove_work, remove_slot_worker); |
| 327 | queue_work(dummyphp_wq, &dslot->remove_work); | 330 | queue_work(dummyphp_wq, &dslot->remove_work); |
| 328 | 331 | ||
| 329 | /* blow away this sysfs entry and other parts. */ | ||
| 330 | remove_slot(dslot); | ||
| 331 | |||
| 332 | pci_dev_put(dev); | 332 | pci_dev_put(dev); |
| 333 | } | 333 | } |
| 334 | return 0; | 334 | return 0; |
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index ab31f5ba665d..9d934ddee956 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c | |||
| @@ -258,7 +258,7 @@ static int pcie_poll_cmd(struct controller *ctrl) | |||
| 258 | return 1; | 258 | return 1; |
| 259 | } | 259 | } |
| 260 | } | 260 | } |
| 261 | while (timeout > 1000) { | 261 | while (timeout > 0) { |
| 262 | msleep(10); | 262 | msleep(10); |
| 263 | timeout -= 10; | 263 | timeout -= 10; |
| 264 | if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status)) { | 264 | if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status)) { |
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 8d0e60ac849c..c3edcdc08e72 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
| @@ -2348,11 +2348,34 @@ static void __init iommu_exit_mempool(void) | |||
| 2348 | 2348 | ||
| 2349 | } | 2349 | } |
| 2350 | 2350 | ||
| 2351 | static int blacklist_iommu(const struct dmi_system_id *id) | ||
| 2352 | { | ||
| 2353 | printk(KERN_INFO "%s detected; disabling IOMMU\n", | ||
| 2354 | id->ident); | ||
| 2355 | dmar_disabled = 1; | ||
| 2356 | return 0; | ||
| 2357 | } | ||
| 2358 | |||
| 2359 | static struct dmi_system_id __initdata intel_iommu_dmi_table[] = { | ||
| 2360 | { /* Some DG33BU BIOS revisions advertised non-existent VT-d */ | ||
| 2361 | .callback = blacklist_iommu, | ||
| 2362 | .ident = "Intel DG33BU", | ||
| 2363 | { DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), | ||
| 2364 | DMI_MATCH(DMI_BOARD_NAME, "DG33BU"), | ||
| 2365 | } | ||
| 2366 | }, | ||
| 2367 | { } | ||
| 2368 | }; | ||
| 2369 | |||
| 2370 | |||
| 2351 | void __init detect_intel_iommu(void) | 2371 | void __init detect_intel_iommu(void) |
| 2352 | { | 2372 | { |
| 2353 | if (swiotlb || no_iommu || iommu_detected || dmar_disabled) | 2373 | if (swiotlb || no_iommu || iommu_detected || dmar_disabled) |
| 2354 | return; | 2374 | return; |
| 2355 | if (early_dmar_detect()) { | 2375 | if (early_dmar_detect()) { |
| 2376 | dmi_check_system(intel_iommu_dmi_table); | ||
| 2377 | if (dmar_disabled) | ||
| 2378 | return; | ||
| 2356 | iommu_detected = 1; | 2379 | iommu_detected = 1; |
| 2357 | } | 2380 | } |
| 2358 | } | 2381 | } |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 9c718583a237..77baff022f71 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | 17 | ||
| 18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| 19 | #include <linux/sched.h> | ||
| 19 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
| 20 | #include <linux/stat.h> | 21 | #include <linux/stat.h> |
| 21 | #include <linux/topology.h> | 22 | #include <linux/topology.h> |
| @@ -484,6 +485,21 @@ pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr, | |||
| 484 | #endif /* HAVE_PCI_LEGACY */ | 485 | #endif /* HAVE_PCI_LEGACY */ |
| 485 | 486 | ||
| 486 | #ifdef HAVE_PCI_MMAP | 487 | #ifdef HAVE_PCI_MMAP |
| 488 | |||
| 489 | static int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma) | ||
| 490 | { | ||
| 491 | unsigned long nr, start, size; | ||
| 492 | |||
| 493 | nr = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | ||
| 494 | start = vma->vm_pgoff; | ||
| 495 | size = pci_resource_len(pdev, resno) >> PAGE_SHIFT; | ||
| 496 | if (start < size && size - start >= nr) | ||
| 497 | return 1; | ||
| 498 | WARN(1, "process \"%s\" tried to map 0x%08lx-0x%08lx on %s BAR %d (size 0x%08lx)\n", | ||
| 499 | current->comm, start, start+nr, pci_name(pdev), resno, size); | ||
| 500 | return 0; | ||
| 501 | } | ||
| 502 | |||
| 487 | /** | 503 | /** |
| 488 | * pci_mmap_resource - map a PCI resource into user memory space | 504 | * pci_mmap_resource - map a PCI resource into user memory space |
| 489 | * @kobj: kobject for mapping | 505 | * @kobj: kobject for mapping |
| @@ -510,6 +526,9 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, | |||
| 510 | if (i >= PCI_ROM_RESOURCE) | 526 | if (i >= PCI_ROM_RESOURCE) |
| 511 | return -ENODEV; | 527 | return -ENODEV; |
| 512 | 528 | ||
| 529 | if (!pci_mmap_fits(pdev, i, vma)) | ||
| 530 | return -EINVAL; | ||
| 531 | |||
| 513 | /* pci_mmap_page_range() expects the same kind of entry as coming | 532 | /* pci_mmap_page_range() expects the same kind of entry as coming |
| 514 | * from /proc/bus/pci/ which is a "user visible" value. If this is | 533 | * from /proc/bus/pci/ which is a "user visible" value. If this is |
| 515 | * different from the resource itself, arch will do necessary fixup. | 534 | * different from the resource itself, arch will do necessary fixup. |
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 9a7c9e1408a4..851f5b83cdbc 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c | |||
| @@ -527,7 +527,7 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev) | |||
| 527 | */ | 527 | */ |
| 528 | pci_read_config_dword(child_dev, child_pos + PCI_EXP_DEVCAP, | 528 | pci_read_config_dword(child_dev, child_pos + PCI_EXP_DEVCAP, |
| 529 | ®32); | 529 | ®32); |
| 530 | if (!(reg32 & PCI_EXP_DEVCAP_RBER && !aspm_force)) { | 530 | if (!(reg32 & PCI_EXP_DEVCAP_RBER) && !aspm_force) { |
| 531 | printk("Pre-1.1 PCIe device detected, " | 531 | printk("Pre-1.1 PCIe device detected, " |
| 532 | "disable ASPM for %s. It can be enabled forcedly" | 532 | "disable ASPM for %s. It can be enabled forcedly" |
| 533 | " with 'pcie_aspm=force'\n", pci_name(pdev)); | 533 | " with 'pcie_aspm=force'\n", pci_name(pdev)); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index cce2f4cb1fbf..36698e57b97f 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -304,6 +304,9 @@ static int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 304 | } else { | 304 | } else { |
| 305 | res->start = l64; | 305 | res->start = l64; |
| 306 | res->end = l64 + sz64; | 306 | res->end = l64 + sz64; |
| 307 | printk(KERN_DEBUG "PCI: %s reg %x 64bit mmio: [%llx, %llx]\n", | ||
| 308 | pci_name(dev), pos, (unsigned long long)res->start, | ||
| 309 | (unsigned long long)res->end); | ||
| 307 | } | 310 | } |
| 308 | } else { | 311 | } else { |
| 309 | sz = pci_size(l, sz, mask); | 312 | sz = pci_size(l, sz, mask); |
| @@ -313,6 +316,9 @@ static int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 313 | 316 | ||
| 314 | res->start = l; | 317 | res->start = l; |
| 315 | res->end = l + sz; | 318 | res->end = l + sz; |
| 319 | printk(KERN_DEBUG "PCI: %s reg %x %s: [%llx, %llx]\n", pci_name(dev), | ||
| 320 | pos, (res->flags & IORESOURCE_IO) ? "io port":"32bit mmio", | ||
| 321 | (unsigned long long)res->start, (unsigned long long)res->end); | ||
| 316 | } | 322 | } |
| 317 | 323 | ||
| 318 | out: | 324 | out: |
| @@ -383,7 +389,9 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
| 383 | res->start = base; | 389 | res->start = base; |
| 384 | if (!res->end) | 390 | if (!res->end) |
| 385 | res->end = limit + 0xfff; | 391 | res->end = limit + 0xfff; |
| 386 | printk(KERN_INFO "PCI: bridge %s io port: [%llx, %llx]\n", pci_name(dev), res->start, res->end); | 392 | printk(KERN_DEBUG "PCI: bridge %s io port: [%llx, %llx]\n", |
| 393 | pci_name(dev), (unsigned long long) res->start, | ||
| 394 | (unsigned long long) res->end); | ||
| 387 | } | 395 | } |
| 388 | 396 | ||
| 389 | res = child->resource[1]; | 397 | res = child->resource[1]; |
| @@ -395,7 +403,9 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
| 395 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; | 403 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; |
| 396 | res->start = base; | 404 | res->start = base; |
| 397 | res->end = limit + 0xfffff; | 405 | res->end = limit + 0xfffff; |
| 398 | printk(KERN_INFO "PCI: bridge %s 32bit mmio: [%llx, %llx]\n", pci_name(dev), res->start, res->end); | 406 | printk(KERN_DEBUG "PCI: bridge %s 32bit mmio: [%llx, %llx]\n", |
| 407 | pci_name(dev), (unsigned long long) res->start, | ||
| 408 | (unsigned long long) res->end); | ||
| 399 | } | 409 | } |
| 400 | 410 | ||
| 401 | res = child->resource[2]; | 411 | res = child->resource[2]; |
| @@ -431,7 +441,9 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
| 431 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH; | 441 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH; |
| 432 | res->start = base; | 442 | res->start = base; |
| 433 | res->end = limit + 0xfffff; | 443 | res->end = limit + 0xfffff; |
| 434 | printk(KERN_INFO "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n", pci_name(dev), (res->flags & PCI_PREF_RANGE_TYPE_64)?"64":"32",res->start, res->end); | 444 | printk(KERN_DEBUG "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n", |
| 445 | pci_name(dev), (res->flags & PCI_PREF_RANGE_TYPE_64) ? "64" : "32", | ||
| 446 | (unsigned long long) res->start, (unsigned long long) res->end); | ||
| 435 | } | 447 | } |
| 436 | } | 448 | } |
| 437 | 449 | ||
diff --git a/drivers/pci/search.c b/drivers/pci/search.c index 3b3b5f178797..4edfc4731bd4 100644 --- a/drivers/pci/search.c +++ b/drivers/pci/search.c | |||
| @@ -162,7 +162,7 @@ EXPORT_SYMBOL(pci_find_slot); | |||
| 162 | * time. | 162 | * time. |
| 163 | */ | 163 | */ |
| 164 | struct pci_dev *pci_find_device(unsigned int vendor, unsigned int device, | 164 | struct pci_dev *pci_find_device(unsigned int vendor, unsigned int device, |
| 165 | const struct pci_dev *from) | 165 | struct pci_dev *from) |
| 166 | { | 166 | { |
| 167 | struct pci_dev *pdev; | 167 | struct pci_dev *pdev; |
| 168 | 168 | ||
| @@ -263,7 +263,7 @@ static int match_pci_dev_by_id(struct device *dev, void *data) | |||
| 263 | * this file. | 263 | * this file. |
| 264 | */ | 264 | */ |
| 265 | static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id, | 265 | static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id, |
| 266 | const struct pci_dev *from) | 266 | struct pci_dev *from) |
| 267 | { | 267 | { |
| 268 | struct device *dev; | 268 | struct device *dev; |
| 269 | struct device *dev_start = NULL; | 269 | struct device *dev_start = NULL; |
| @@ -303,7 +303,7 @@ static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id, | |||
| 303 | */ | 303 | */ |
| 304 | struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device, | 304 | struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device, |
| 305 | unsigned int ss_vendor, unsigned int ss_device, | 305 | unsigned int ss_vendor, unsigned int ss_device, |
| 306 | const struct pci_dev *from) | 306 | struct pci_dev *from) |
| 307 | { | 307 | { |
| 308 | struct pci_dev *pdev; | 308 | struct pci_dev *pdev; |
| 309 | struct pci_device_id *id; | 309 | struct pci_device_id *id; |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 1aad599816f7..3abbfad9ddab 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
| @@ -540,7 +540,11 @@ static void pci_bus_dump_res(struct pci_bus *bus) | |||
| 540 | if (!res) | 540 | if (!res) |
| 541 | continue; | 541 | continue; |
| 542 | 542 | ||
| 543 | printk(KERN_INFO "bus: %02x index %x %s: [%llx, %llx]\n", bus->number, i, (res->flags & IORESOURCE_IO)? "io port":"mmio", res->start, res->end); | 543 | printk(KERN_INFO "bus: %02x index %x %s: [%llx, %llx]\n", |
| 544 | bus->number, i, | ||
| 545 | (res->flags & IORESOURCE_IO) ? "io port" : "mmio", | ||
| 546 | (unsigned long long) res->start, | ||
| 547 | (unsigned long long) res->end); | ||
| 544 | } | 548 | } |
| 545 | } | 549 | } |
| 546 | 550 | ||
