aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2006-10-01 02:27:03 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-01 03:39:17 -0400
commit236561e5df009f79f1939e3ca269b9b6f18092f5 (patch)
tree86e9f0986667c4238983a6520b0f3f6aee622062
parent3fcd03e07008ec0f667dfb7626171165699ea5c2 (diff)
[PATCH] PCI quirks update
This fixes two things Firstly someone mistakenly used "errata" for the singular. This causes Dave Woodhouse to emit diagnostics whenever the string is read, and so should be fixed. Secondly the AMD AGP tunnel has an erratum which causes hangs if you try and do direct PCI to AGP transfers in some cases. We have a flag for PCI/PCI failures but we need a different flag for this really as in this case we don't want to stop PCI/PCI transfers using things like IOAT and the new RAID offload work. I'll post some updates to make proper use of the PCIAGP flag in the media/video drivers to Mauro. Signed-off-by: Alan Cox <alan@redhat.com> Cc: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--drivers/pci/quirks.c17
-rw-r--r--include/linux/pci.h5
2 files changed, 18 insertions, 4 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 08cd86a6dd66..23b599d6a9d5 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -93,8 +93,21 @@ static void __devinit quirk_nopcipci(struct pci_dev *dev)
93 pci_pci_problems |= PCIPCI_FAIL; 93 pci_pci_problems |= PCIPCI_FAIL;
94 } 94 }
95} 95}
96
97static void __devinit quirk_nopciamd(struct pci_dev *dev)
98{
99 u8 rev;
100 pci_read_config_byte(dev, 0x08, &rev);
101 if (rev == 0x13) {
102 /* Erratum 24 */
103 printk(KERN_INFO "Chipset erratum: Disabling direct PCI/AGP transfers.\n");
104 pci_pci_problems |= PCIAGP_FAIL;
105 }
106}
107
96DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, quirk_nopcipci ); 108DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, quirk_nopcipci );
97DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496, quirk_nopcipci ); 109DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496, quirk_nopcipci );
110DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8151_0, quirk_nopciamd );
98 111
99/* 112/*
100 * Triton requires workarounds to be used by the drivers 113 * Triton requires workarounds to be used by the drivers
@@ -555,7 +568,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_vt
555 * is currently marked NoFix 568 * is currently marked NoFix
556 * 569 *
557 * We have multiple reports of hangs with this chipset that went away with 570 * We have multiple reports of hangs with this chipset that went away with
558 * noapic specified. For the moment we assume its the errata. We may be wrong 571 * noapic specified. For the moment we assume it's the erratum. We may be wrong
559 * of course. However the advice is demonstrably good even if so.. 572 * of course. However the advice is demonstrably good even if so..
560 */ 573 */
561static void __devinit quirk_amd_ioapic(struct pci_dev *dev) 574static void __devinit quirk_amd_ioapic(struct pci_dev *dev)
@@ -564,7 +577,7 @@ static void __devinit quirk_amd_ioapic(struct pci_dev *dev)
564 577
565 pci_read_config_byte(dev, PCI_REVISION_ID, &rev); 578 pci_read_config_byte(dev, PCI_REVISION_ID, &rev);
566 if (rev >= 0x02) { 579 if (rev >= 0x02) {
567 printk(KERN_WARNING "I/O APIC: AMD Errata #22 may be present. In the event of instability try\n"); 580 printk(KERN_WARNING "I/O APIC: AMD Erratum #22 may be present. In the event of instability try\n");
568 printk(KERN_WARNING " : booting with the \"noapic\" option.\n"); 581 printk(KERN_WARNING " : booting with the \"noapic\" option.\n");
569 } 582 }
570} 583}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 5c3a4176eb64..4431ce4e1e6f 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -787,12 +787,13 @@ enum pci_fixup_pass {
787void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev); 787void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev);
788 788
789extern int pci_pci_problems; 789extern int pci_pci_problems;
790#define PCIPCI_FAIL 1 790#define PCIPCI_FAIL 1 /* No PCI PCI DMA */
791#define PCIPCI_TRITON 2 791#define PCIPCI_TRITON 2
792#define PCIPCI_NATOMA 4 792#define PCIPCI_NATOMA 4
793#define PCIPCI_VIAETBF 8 793#define PCIPCI_VIAETBF 8
794#define PCIPCI_VSFX 16 794#define PCIPCI_VSFX 16
795#define PCIPCI_ALIMAGIK 32 795#define PCIPCI_ALIMAGIK 32 /* Need low latency setting */
796#define PCIAGP_FAIL 64 /* No PCI to AGP DMA */
796 797
797#endif /* __KERNEL__ */ 798#endif /* __KERNEL__ */
798#endif /* LINUX_PCI_H */ 799#endif /* LINUX_PCI_H */