| From decbf88e62a23c55976d3787fe60458164a4cda4 Mon Sep 17 00:00:00 2001 |
| From: Kai-Heng Feng <kai.heng.feng@canonical.com> |
| Date: Mon, 10 Feb 2020 15:51:15 +0800 |
| Subject: [PATCH] iommu/amd: Disable IOMMU on Stoney Ridge systems |
| |
| commit 3dfee47b215e49788cfc80e474820ea2e948c031 upstream. |
| |
| Serious screen flickering when Stoney Ridge outputs to a 4K monitor. |
| |
| Use identity-mapping and PCI ATS doesn't help this issue. |
| |
| According to Alex Deucher, IOMMU isn't enabled on Windows, so let's do |
| the same here to avoid screen flickering on 4K monitor. |
| |
| Cc: Alex Deucher <alexander.deucher@amd.com> |
| Bug: https://gitlab.freedesktop.org/drm/amd/issues/961 |
| Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> |
| Acked-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c |
| index a0e6d1bb1437..85a5e8672ec3 100644 |
| --- a/drivers/iommu/amd_iommu_init.c |
| +++ b/drivers/iommu/amd_iommu_init.c |
| @@ -2444,6 +2444,7 @@ static int __init early_amd_iommu_init(void) |
| struct acpi_table_header *ivrs_base; |
| acpi_status status; |
| int i, remap_cache_sz, ret = 0; |
| + u32 pci_id; |
| |
| if (!amd_iommu_detected) |
| return -ENODEV; |
| @@ -2531,6 +2532,16 @@ static int __init early_amd_iommu_init(void) |
| if (ret) |
| goto out; |
| |
| + /* Disable IOMMU if there's Stoney Ridge graphics */ |
| + for (i = 0; i < 32; i++) { |
| + pci_id = read_pci_config(0, i, 0, 0); |
| + if ((pci_id & 0xffff) == 0x1002 && (pci_id >> 16) == 0x98e4) { |
| + pr_info("Disable IOMMU on Stoney Ridge\n"); |
| + amd_iommu_disabled = true; |
| + break; |
| + } |
| + } |
| + |
| /* Disable any previously enabled IOMMUs */ |
| if (!is_kdump_kernel() || amd_iommu_disabled) |
| disable_iommus(); |
| @@ -2639,7 +2650,7 @@ static int __init state_next(void) |
| ret = early_amd_iommu_init(); |
| init_state = ret ? IOMMU_INIT_ERROR : IOMMU_ACPI_FINISHED; |
| if (init_state == IOMMU_ACPI_FINISHED && amd_iommu_disabled) { |
| - pr_info("AMD IOMMU disabled on kernel command-line\n"); |
| + pr_info("AMD IOMMU disabled\n"); |
| free_dma_resources(); |
| free_iommu_resources(); |
| init_state = IOMMU_CMDLINE_DISABLED; |
| -- |
| 2.7.4 |
| |