Message ID | 20200220083703.25402-2-kai.heng.feng@canonical.com |
---|---|
State | New |
Headers | show |
Series | [1/1] iommu/amd: Disable IOMMU on Stoney Ridge systems | expand |
On 20.02.20 09:37, Kai-Heng Feng wrote: > BugLink: https://bugs.launchpad.net/bugs/1864005 > > 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> > (cherry picked from commit 3dfee47b215e49788cfc80e474820ea2e948c031) > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> Clean cherry-pick and fixes hardware-specific issue. Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com> > --- > drivers/iommu/amd_iommu_init.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c > index 2759a8d57b7f..6be3853a5d97 100644 > --- a/drivers/iommu/amd_iommu_init.c > +++ b/drivers/iommu/amd_iommu_init.c > @@ -2523,6 +2523,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; > @@ -2610,6 +2611,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(); > @@ -2718,7 +2729,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"); > init_state = IOMMU_CMDLINE_DISABLED; > ret = -EINVAL; > } >
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 2759a8d57b7f..6be3853a5d97 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -2523,6 +2523,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; @@ -2610,6 +2611,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(); @@ -2718,7 +2729,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"); init_state = IOMMU_CMDLINE_DISABLED; ret = -EINVAL; }