Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'pci-v3.19-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci

Pull PCI fixes from Bjorn Helgaas:
"Enumeration
- Scan all device numbers on NEC as well as Stratus (Charlotte Richardson)

Resource management
- Handle read-only BARs on AMD CS553x devices (Myron Stowe)

Synopsys DesignWare
- Reject MSI-X IRQs (Lucas Stach)"

* tag 'pci-v3.19-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci:
PCI: Handle read-only BARs on AMD CS553x devices
PCI: Add NEC variants to Stratus ftServer PCIe DMI check
PCI: designware: Reject MSI-X IRQs

+56 -3
+16
arch/x86/pci/common.c
··· 448 448 DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), 449 449 }, 450 450 }, 451 + { 452 + .callback = set_scan_all, 453 + .ident = "Stratus/NEC ftServer", 454 + .matches = { 455 + DMI_MATCH(DMI_SYS_VENDOR, "NEC"), 456 + DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"), 457 + }, 458 + }, 459 + { 460 + .callback = set_scan_all, 461 + .ident = "Stratus/NEC ftServer", 462 + .matches = { 463 + DMI_MATCH(DMI_SYS_VENDOR, "NEC"), 464 + DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"), 465 + }, 466 + }, 451 467 {} 452 468 }; 453 469
+3
drivers/pci/host/pcie-designware.c
··· 283 283 struct msi_msg msg; 284 284 struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata); 285 285 286 + if (desc->msi_attrib.is_msix) 287 + return -EINVAL; 288 + 286 289 irq = assign_irq(1, desc, &pos); 287 290 if (irq < 0) 288 291 return irq;
+37 -3
drivers/pci/quirks.c
··· 324 324 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); 325 325 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); 326 326 327 + static void quirk_io(struct pci_dev *dev, int pos, unsigned size, 328 + const char *name) 329 + { 330 + u32 region; 331 + struct pci_bus_region bus_region; 332 + struct resource *res = dev->resource + pos; 333 + 334 + pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + (pos << 2), &region); 335 + 336 + if (!region) 337 + return; 338 + 339 + res->name = pci_name(dev); 340 + res->flags = region & ~PCI_BASE_ADDRESS_IO_MASK; 341 + res->flags |= 342 + (IORESOURCE_IO | IORESOURCE_PCI_FIXED | IORESOURCE_SIZEALIGN); 343 + region &= ~(size - 1); 344 + 345 + /* Convert from PCI bus to resource space */ 346 + bus_region.start = region; 347 + bus_region.end = region + size - 1; 348 + pcibios_bus_to_resource(dev->bus, res, &bus_region); 349 + 350 + dev_info(&dev->dev, FW_BUG "%s quirk: reg 0x%x: %pR\n", 351 + name, PCI_BASE_ADDRESS_0 + (pos << 2), res); 352 + } 353 + 327 354 /* 328 355 * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS 329 356 * ver. 1.33 20070103) don't set the correct ISA PCI region header info. 330 357 * BAR0 should be 8 bytes; instead, it may be set to something like 8k 331 358 * (which conflicts w/ BAR1's memory range). 359 + * 360 + * CS553x's ISA PCI BARs may also be read-only (ref: 361 + * https://bugzilla.kernel.org/show_bug.cgi?id=85991 - Comment #4 forward). 332 362 */ 333 363 static void quirk_cs5536_vsa(struct pci_dev *dev) 334 364 { 365 + static char *name = "CS5536 ISA bridge"; 366 + 335 367 if (pci_resource_len(dev, 0) != 8) { 336 - struct resource *res = &dev->resource[0]; 337 - res->end = res->start + 8 - 1; 338 - dev_info(&dev->dev, "CS5536 ISA bridge bug detected (incorrect header); workaround applied\n"); 368 + quirk_io(dev, 0, 8, name); /* SMB */ 369 + quirk_io(dev, 1, 256, name); /* GPIO */ 370 + quirk_io(dev, 2, 64, name); /* MFGPT */ 371 + dev_info(&dev->dev, "%s bug detected (incorrect header); workaround applied\n", 372 + name); 339 373 } 340 374 } 341 375 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa);