Commit 3dfee47b authored by Kai-Heng Feng's avatar Kai-Heng Feng Committed by Joerg Roedel

iommu/amd: Disable IOMMU on Stoney Ridge systems

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/961Signed-off-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 1ddb32da
...@@ -2523,6 +2523,7 @@ static int __init early_amd_iommu_init(void) ...@@ -2523,6 +2523,7 @@ static int __init early_amd_iommu_init(void)
struct acpi_table_header *ivrs_base; struct acpi_table_header *ivrs_base;
acpi_status status; acpi_status status;
int i, remap_cache_sz, ret = 0; int i, remap_cache_sz, ret = 0;
u32 pci_id;
if (!amd_iommu_detected) if (!amd_iommu_detected)
return -ENODEV; return -ENODEV;
...@@ -2610,6 +2611,16 @@ static int __init early_amd_iommu_init(void) ...@@ -2610,6 +2611,16 @@ static int __init early_amd_iommu_init(void)
if (ret) if (ret)
goto out; 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 */ /* Disable any previously enabled IOMMUs */
if (!is_kdump_kernel() || amd_iommu_disabled) if (!is_kdump_kernel() || amd_iommu_disabled)
disable_iommus(); disable_iommus();
...@@ -2718,7 +2729,7 @@ static int __init state_next(void) ...@@ -2718,7 +2729,7 @@ static int __init state_next(void)
ret = early_amd_iommu_init(); ret = early_amd_iommu_init();
init_state = ret ? IOMMU_INIT_ERROR : IOMMU_ACPI_FINISHED; init_state = ret ? IOMMU_INIT_ERROR : IOMMU_ACPI_FINISHED;
if (init_state == IOMMU_ACPI_FINISHED && amd_iommu_disabled) { 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");
init_state = IOMMU_CMDLINE_DISABLED; init_state = IOMMU_CMDLINE_DISABLED;
ret = -EINVAL; ret = -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment