2020-02-10 07:52:15

by Kai-Heng Feng

[permalink] [raw]
Subject: [PATCH v3] 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 <[email protected]>
Bug: https://gitlab.freedesktop.org/drm/amd/issues/961
Signed-off-by: Kai-Heng Feng <[email protected]>
---
v3:
- Update commit message to mention identity-mapping and ATS don't help.

v2:
- Find Stoney graphics instead of host bridge.

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;
}
--
2.17.1


2020-02-10 15:17:54

by Deucher, Alexander

[permalink] [raw]
Subject: RE: [PATCH v3] iommu/amd: Disable IOMMU on Stoney Ridge systems

[AMD Public Use]

> -----Original Message-----
> From: Kai-Heng Feng <[email protected]>
> Sent: Monday, February 10, 2020 2:51 AM
> To: [email protected]
> Cc: Kai-Heng Feng <[email protected]>; Deucher, Alexander
> <[email protected]>; open list:AMD IOMMU (AMD-VI)
> <[email protected]>; open list <linux-
> [email protected]>
> Subject: [PATCH v3] 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 <[email protected]>
> Bug:
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitla
> b.freedesktop.org%2Fdrm%2Famd%2Fissues%2F961&amp;data=02%7C01%7
> Calexander.deucher%40amd.com%7C79aa213aaf2d4540064308d7adfe0749%
> 7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637169178877965485
> &amp;sdata=UeNw4%2FuQ3Rs5SwEvguDmdfuMEsizO8F138B%2B2GNleTY%
> 3D&amp;reserved=0
> Signed-off-by: Kai-Heng Feng <[email protected]>

Acked-by: Alex Deucher <[email protected]>


> ---
> v3:
> - Update commit message to mention identity-mapping and ATS don't help.
>
> v2:
> - Find Stoney graphics instead of host bridge.
>
> 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;
> }
> --
> 2.17.1

2020-02-19 10:09:58

by Joerg Roedel

[permalink] [raw]
Subject: Re: [PATCH v3] iommu/amd: Disable IOMMU on Stoney Ridge systems

On Mon, Feb 10, 2020 at 03:51:15PM +0800, Kai-Heng Feng wrote:
> 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 <[email protected]>
> Bug: https://gitlab.freedesktop.org/drm/amd/issues/961
> Signed-off-by: Kai-Heng Feng <[email protected]>

Applied, thanks.