diff options
| -rw-r--r-- | drivers/pci/quirks.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 6f9350cabbd5..36191edd6d51 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -2764,6 +2764,29 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_m | |||
| 2764 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); | 2764 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
| 2765 | #endif /*CONFIG_MMC_RICOH_MMC*/ | 2765 | #endif /*CONFIG_MMC_RICOH_MMC*/ |
| 2766 | 2766 | ||
| 2767 | #if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP) | ||
| 2768 | #define VTUNCERRMSK_REG 0x1ac | ||
| 2769 | #define VTD_MSK_SPEC_ERRORS (1 << 31) | ||
| 2770 | /* | ||
| 2771 | * This is a quirk for masking vt-d spec defined errors to platform error | ||
| 2772 | * handling logic. With out this, platforms using Intel 7500, 5500 chipsets | ||
| 2773 | * (and the derivative chipsets like X58 etc) seem to generate NMI/SMI (based | ||
| 2774 | * on the RAS config settings of the platform) when a vt-d fault happens. | ||
| 2775 | * The resulting SMI caused the system to hang. | ||
| 2776 | * | ||
| 2777 | * VT-d spec related errors are already handled by the VT-d OS code, so no | ||
| 2778 | * need to report the same error through other channels. | ||
| 2779 | */ | ||
| 2780 | static void vtd_mask_spec_errors(struct pci_dev *dev) | ||
| 2781 | { | ||
| 2782 | u32 word; | ||
| 2783 | |||
| 2784 | pci_read_config_dword(dev, VTUNCERRMSK_REG, &word); | ||
| 2785 | pci_write_config_dword(dev, VTUNCERRMSK_REG, word | VTD_MSK_SPEC_ERRORS); | ||
| 2786 | } | ||
| 2787 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x342e, vtd_mask_spec_errors); | ||
| 2788 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x3c28, vtd_mask_spec_errors); | ||
| 2789 | #endif | ||
| 2767 | 2790 | ||
| 2768 | static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, | 2791 | static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, |
| 2769 | struct pci_fixup *end) | 2792 | struct pci_fixup *end) |
