diff options
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r-- | drivers/pci/quirks.c | 148 |
1 files changed, 63 insertions, 85 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 0369fb6fc1da..7d68aeebf56b 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -324,29 +324,30 @@ static void quirk_cs5536_vsa(struct pci_dev *dev) | |||
324 | } | 324 | } |
325 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); | 325 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); |
326 | 326 | ||
327 | static void quirk_io_region(struct pci_dev *dev, unsigned region, | 327 | static void quirk_io_region(struct pci_dev *dev, int port, |
328 | unsigned size, int nr, const char *name) | 328 | unsigned size, int nr, const char *name) |
329 | { | 329 | { |
330 | region &= ~(size-1); | 330 | u16 region; |
331 | if (region) { | 331 | struct pci_bus_region bus_region; |
332 | struct pci_bus_region bus_region; | 332 | struct resource *res = dev->resource + nr; |
333 | struct resource *res = dev->resource + nr; | ||
334 | 333 | ||
335 | res->name = pci_name(dev); | 334 | pci_read_config_word(dev, port, ®ion); |
336 | res->start = region; | 335 | region &= ~(size - 1); |
337 | res->end = region + size - 1; | ||
338 | res->flags = IORESOURCE_IO; | ||
339 | 336 | ||
340 | /* Convert from PCI bus to resource space. */ | 337 | if (!region) |
341 | bus_region.start = res->start; | 338 | return; |
342 | bus_region.end = res->end; | ||
343 | pcibios_bus_to_resource(dev, res, &bus_region); | ||
344 | 339 | ||
345 | if (pci_claim_resource(dev, nr) == 0) | 340 | res->name = pci_name(dev); |
346 | dev_info(&dev->dev, "quirk: %pR claimed by %s\n", | 341 | res->flags = IORESOURCE_IO; |
347 | res, name); | 342 | |
348 | } | 343 | /* Convert from PCI bus to resource space */ |
349 | } | 344 | bus_region.start = region; |
345 | bus_region.end = region + size - 1; | ||
346 | pcibios_bus_to_resource(dev, res, &bus_region); | ||
347 | |||
348 | if (!pci_claim_resource(dev, nr)) | ||
349 | dev_info(&dev->dev, "quirk: %pR claimed by %s\n", res, name); | ||
350 | } | ||
350 | 351 | ||
351 | /* | 352 | /* |
352 | * ATI Northbridge setups MCE the processor if you even | 353 | * ATI Northbridge setups MCE the processor if you even |
@@ -374,12 +375,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100, quirk_ati_ | |||
374 | */ | 375 | */ |
375 | static void quirk_ali7101_acpi(struct pci_dev *dev) | 376 | static void quirk_ali7101_acpi(struct pci_dev *dev) |
376 | { | 377 | { |
377 | u16 region; | 378 | quirk_io_region(dev, 0xE0, 64, PCI_BRIDGE_RESOURCES, "ali7101 ACPI"); |
378 | 379 | quirk_io_region(dev, 0xE2, 32, PCI_BRIDGE_RESOURCES+1, "ali7101 SMB"); | |
379 | pci_read_config_word(dev, 0xE0, ®ion); | ||
380 | quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES, "ali7101 ACPI"); | ||
381 | pci_read_config_word(dev, 0xE2, ®ion); | ||
382 | quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1, "ali7101 SMB"); | ||
383 | } | 380 | } |
384 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi); | 381 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi); |
385 | 382 | ||
@@ -442,12 +439,10 @@ static void piix4_mem_quirk(struct pci_dev *dev, const char *name, unsigned int | |||
442 | */ | 439 | */ |
443 | static void quirk_piix4_acpi(struct pci_dev *dev) | 440 | static void quirk_piix4_acpi(struct pci_dev *dev) |
444 | { | 441 | { |
445 | u32 region, res_a; | 442 | u32 res_a; |
446 | 443 | ||
447 | pci_read_config_dword(dev, 0x40, ®ion); | 444 | quirk_io_region(dev, 0x40, 64, PCI_BRIDGE_RESOURCES, "PIIX4 ACPI"); |
448 | quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES, "PIIX4 ACPI"); | 445 | quirk_io_region(dev, 0x90, 16, PCI_BRIDGE_RESOURCES+1, "PIIX4 SMB"); |
449 | pci_read_config_dword(dev, 0x90, ®ion); | ||
450 | quirk_io_region(dev, region, 16, PCI_BRIDGE_RESOURCES+1, "PIIX4 SMB"); | ||
451 | 446 | ||
452 | /* Device resource A has enables for some of the other ones */ | 447 | /* Device resource A has enables for some of the other ones */ |
453 | pci_read_config_dword(dev, 0x5c, &res_a); | 448 | pci_read_config_dword(dev, 0x5c, &res_a); |
@@ -491,7 +486,6 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3, qui | |||
491 | */ | 486 | */ |
492 | static void quirk_ich4_lpc_acpi(struct pci_dev *dev) | 487 | static void quirk_ich4_lpc_acpi(struct pci_dev *dev) |
493 | { | 488 | { |
494 | u32 region; | ||
495 | u8 enable; | 489 | u8 enable; |
496 | 490 | ||
497 | /* | 491 | /* |
@@ -503,22 +497,14 @@ static void quirk_ich4_lpc_acpi(struct pci_dev *dev) | |||
503 | */ | 497 | */ |
504 | 498 | ||
505 | pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable); | 499 | pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable); |
506 | if (enable & ICH4_ACPI_EN) { | 500 | if (enable & ICH4_ACPI_EN) |
507 | pci_read_config_dword(dev, ICH_PMBASE, ®ion); | 501 | quirk_io_region(dev, ICH_PMBASE, 128, PCI_BRIDGE_RESOURCES, |
508 | region &= PCI_BASE_ADDRESS_IO_MASK; | 502 | "ICH4 ACPI/GPIO/TCO"); |
509 | if (region >= PCIBIOS_MIN_IO) | ||
510 | quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES, | ||
511 | "ICH4 ACPI/GPIO/TCO"); | ||
512 | } | ||
513 | 503 | ||
514 | pci_read_config_byte(dev, ICH4_GPIO_CNTL, &enable); | 504 | pci_read_config_byte(dev, ICH4_GPIO_CNTL, &enable); |
515 | if (enable & ICH4_GPIO_EN) { | 505 | if (enable & ICH4_GPIO_EN) |
516 | pci_read_config_dword(dev, ICH4_GPIOBASE, ®ion); | 506 | quirk_io_region(dev, ICH4_GPIOBASE, 64, PCI_BRIDGE_RESOURCES+1, |
517 | region &= PCI_BASE_ADDRESS_IO_MASK; | 507 | "ICH4 GPIO"); |
518 | if (region >= PCIBIOS_MIN_IO) | ||
519 | quirk_io_region(dev, region, 64, | ||
520 | PCI_BRIDGE_RESOURCES + 1, "ICH4 GPIO"); | ||
521 | } | ||
522 | } | 508 | } |
523 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi); | 509 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi); |
524 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, quirk_ich4_lpc_acpi); | 510 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, quirk_ich4_lpc_acpi); |
@@ -533,26 +519,17 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1, qui | |||
533 | 519 | ||
534 | static void ich6_lpc_acpi_gpio(struct pci_dev *dev) | 520 | static void ich6_lpc_acpi_gpio(struct pci_dev *dev) |
535 | { | 521 | { |
536 | u32 region; | ||
537 | u8 enable; | 522 | u8 enable; |
538 | 523 | ||
539 | pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable); | 524 | pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable); |
540 | if (enable & ICH6_ACPI_EN) { | 525 | if (enable & ICH6_ACPI_EN) |
541 | pci_read_config_dword(dev, ICH_PMBASE, ®ion); | 526 | quirk_io_region(dev, ICH_PMBASE, 128, PCI_BRIDGE_RESOURCES, |
542 | region &= PCI_BASE_ADDRESS_IO_MASK; | 527 | "ICH6 ACPI/GPIO/TCO"); |
543 | if (region >= PCIBIOS_MIN_IO) | ||
544 | quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES, | ||
545 | "ICH6 ACPI/GPIO/TCO"); | ||
546 | } | ||
547 | 528 | ||
548 | pci_read_config_byte(dev, ICH6_GPIO_CNTL, &enable); | 529 | pci_read_config_byte(dev, ICH6_GPIO_CNTL, &enable); |
549 | if (enable & ICH6_GPIO_EN) { | 530 | if (enable & ICH6_GPIO_EN) |
550 | pci_read_config_dword(dev, ICH6_GPIOBASE, ®ion); | 531 | quirk_io_region(dev, ICH6_GPIOBASE, 64, PCI_BRIDGE_RESOURCES+1, |
551 | region &= PCI_BASE_ADDRESS_IO_MASK; | 532 | "ICH6 GPIO"); |
552 | if (region >= PCIBIOS_MIN_IO) | ||
553 | quirk_io_region(dev, region, 64, | ||
554 | PCI_BRIDGE_RESOURCES + 1, "ICH6 GPIO"); | ||
555 | } | ||
556 | } | 533 | } |
557 | 534 | ||
558 | static void ich6_lpc_generic_decode(struct pci_dev *dev, unsigned reg, const char *name, int dynsize) | 535 | static void ich6_lpc_generic_decode(struct pci_dev *dev, unsigned reg, const char *name, int dynsize) |
@@ -650,13 +627,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_1, qui | |||
650 | */ | 627 | */ |
651 | static void quirk_vt82c586_acpi(struct pci_dev *dev) | 628 | static void quirk_vt82c586_acpi(struct pci_dev *dev) |
652 | { | 629 | { |
653 | u32 region; | 630 | if (dev->revision & 0x10) |
654 | 631 | quirk_io_region(dev, 0x48, 256, PCI_BRIDGE_RESOURCES, | |
655 | if (dev->revision & 0x10) { | 632 | "vt82c586 ACPI"); |
656 | pci_read_config_dword(dev, 0x48, ®ion); | ||
657 | region &= PCI_BASE_ADDRESS_IO_MASK; | ||
658 | quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES, "vt82c586 ACPI"); | ||
659 | } | ||
660 | } | 633 | } |
661 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi); | 634 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi); |
662 | 635 | ||
@@ -668,18 +641,12 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt | |||
668 | */ | 641 | */ |
669 | static void quirk_vt82c686_acpi(struct pci_dev *dev) | 642 | static void quirk_vt82c686_acpi(struct pci_dev *dev) |
670 | { | 643 | { |
671 | u16 hm; | ||
672 | u32 smb; | ||
673 | |||
674 | quirk_vt82c586_acpi(dev); | 644 | quirk_vt82c586_acpi(dev); |
675 | 645 | ||
676 | pci_read_config_word(dev, 0x70, &hm); | 646 | quirk_io_region(dev, 0x70, 128, PCI_BRIDGE_RESOURCES+1, |
677 | hm &= PCI_BASE_ADDRESS_IO_MASK; | 647 | "vt82c686 HW-mon"); |
678 | quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1, "vt82c686 HW-mon"); | ||
679 | 648 | ||
680 | pci_read_config_dword(dev, 0x90, &smb); | 649 | quirk_io_region(dev, 0x90, 16, PCI_BRIDGE_RESOURCES+2, "vt82c686 SMB"); |
681 | smb &= PCI_BASE_ADDRESS_IO_MASK; | ||
682 | quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2, "vt82c686 SMB"); | ||
683 | } | 650 | } |
684 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi); | 651 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi); |
685 | 652 | ||
@@ -690,15 +657,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt | |||
690 | */ | 657 | */ |
691 | static void quirk_vt8235_acpi(struct pci_dev *dev) | 658 | static void quirk_vt8235_acpi(struct pci_dev *dev) |
692 | { | 659 | { |
693 | u16 pm, smb; | 660 | quirk_io_region(dev, 0x88, 128, PCI_BRIDGE_RESOURCES, "vt8235 PM"); |
694 | 661 | quirk_io_region(dev, 0xd0, 16, PCI_BRIDGE_RESOURCES+1, "vt8235 SMB"); | |
695 | pci_read_config_word(dev, 0x88, &pm); | ||
696 | pm &= PCI_BASE_ADDRESS_IO_MASK; | ||
697 | quirk_io_region(dev, pm, 128, PCI_BRIDGE_RESOURCES, "vt8235 PM"); | ||
698 | |||
699 | pci_read_config_word(dev, 0xd0, &smb); | ||
700 | smb &= PCI_BASE_ADDRESS_IO_MASK; | ||
701 | quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 1, "vt8235 SMB"); | ||
702 | } | 662 | } |
703 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi); | 663 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi); |
704 | 664 | ||
@@ -2594,6 +2554,14 @@ static void quirk_msi_intx_disable_ati_bug(struct pci_dev *dev) | |||
2594 | dev->dev_flags |= PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG; | 2554 | dev->dev_flags |= PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG; |
2595 | pci_dev_put(p); | 2555 | pci_dev_put(p); |
2596 | } | 2556 | } |
2557 | static void quirk_msi_intx_disable_qca_bug(struct pci_dev *dev) | ||
2558 | { | ||
2559 | /* AR816X/AR817X/E210X MSI is fixed at HW level from revision 0x18 */ | ||
2560 | if (dev->revision < 0x18) { | ||
2561 | dev_info(&dev->dev, "set MSI_INTX_DISABLE_BUG flag\n"); | ||
2562 | dev->dev_flags |= PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG; | ||
2563 | } | ||
2564 | } | ||
2597 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM, | 2565 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM, |
2598 | PCI_DEVICE_ID_TIGON3_5780, | 2566 | PCI_DEVICE_ID_TIGON3_5780, |
2599 | quirk_msi_intx_disable_bug); | 2567 | quirk_msi_intx_disable_bug); |
@@ -2643,6 +2611,16 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1073, | |||
2643 | quirk_msi_intx_disable_bug); | 2611 | quirk_msi_intx_disable_bug); |
2644 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1083, | 2612 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1083, |
2645 | quirk_msi_intx_disable_bug); | 2613 | quirk_msi_intx_disable_bug); |
2614 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1090, | ||
2615 | quirk_msi_intx_disable_qca_bug); | ||
2616 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1091, | ||
2617 | quirk_msi_intx_disable_qca_bug); | ||
2618 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x10a0, | ||
2619 | quirk_msi_intx_disable_qca_bug); | ||
2620 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x10a1, | ||
2621 | quirk_msi_intx_disable_qca_bug); | ||
2622 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0xe091, | ||
2623 | quirk_msi_intx_disable_qca_bug); | ||
2646 | #endif /* CONFIG_PCI_MSI */ | 2624 | #endif /* CONFIG_PCI_MSI */ |
2647 | 2625 | ||
2648 | /* Allow manual resource allocation for PCI hotplug bridges | 2626 | /* Allow manual resource allocation for PCI hotplug bridges |