From: Matthew Garrett <mjg@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: linux-pci@vger.kernel.org, joerg.roedel@amd.com,
jbarnes@virtuousgeek.org, Matthew Garrett <mjg@redhat.com>
Subject: [PATCH] pci: Reenable the AMD IOMMU if it's mysteriously vanished over suspend
Date: Thu, 30 Sep 2010 11:38:28 -0400 [thread overview]
Message-ID: <1285861108-24122-1-git-send-email-mjg@redhat.com> (raw)
AMD's reference BIOS code had a bug that could result in the firmware
failing to reenable the iommu on resume. It transpires that this causes
certain less than desirable behaviour when it comes to PCI accesses, to
whit them ending up somewhere near Bristol when the more desirable outcome
was Edinburgh. Sadness ensues, perhaps along with filesystem corruption.
Let's make sure that it gets turned back on.
Signed-off-by: Matthew Garrett <mjg@redhat.com>
---
drivers/pci/quirks.c | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 89ed181..dcf9832 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -2695,6 +2695,39 @@ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832,
#endif /*CONFIG_MMC_RICOH_MMC*/
+#ifdef CONFIG_AMD_IOMMU
+
+/* Some AMD BIOSes fail to reenable the iommu on resume */
+
+static void amd_iommu_reenable(struct pci_dev *dev)
+{
+ u32 ioc_feature_control;
+ struct pci_dev *iommu;
+
+ iommu = pci_get_device(PCI_VENDOR_ID_ATI, 0x5a23, NULL);
+
+ if (!iommu)
+ return;
+
+ /* Select Northbridge indirect register 0x75 and enable writing */
+ pci_write_config_dword(dev, 0x60, 0x75 | (1 << 7));
+ pci_read_config_dword(dev, 0x64, &ioc_feature_control);
+
+ /* Enable the iommu if it's vanished */
+ if (!(ioc_feature_control & 0x1))
+ pci_write_config_dword(dev, 0x64, ioc_feature_control | 1);
+
+ /* Disable writing again */
+ pci_write_config_dword(dev, 0x60, 0x75);
+
+ pci_dev_put(iommu);
+}
+
+DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, 0x5a10, amd_iommu_reenable);
+DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, 0x5a12, amd_iommu_reenable);
+DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, 0x5a13, amd_iommu_reenable);
+#endif
+
static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
struct pci_fixup *end)
{
--
1.7.3
next reply other threads:[~2010-09-30 15:38 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-30 15:38 Matthew Garrett [this message]
2010-09-30 17:39 ` Matthew Garrett
2010-09-30 18:43 ` Joerg Roedel
2010-09-30 19:05 ` Matthew Garrett
2010-10-01 17:58 ` Bjorn Helgaas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1285861108-24122-1-git-send-email-mjg@redhat.com \
--to=mjg@redhat.com \
--cc=jbarnes@virtuousgeek.org \
--cc=joerg.roedel@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®