Hi

Am 17.05.24 um 17:09 schrieb Jocelyn Falempe:
Unfortunately, the G200 ioburst workaround doesn't work on some
servers like Dell poweredge XR11, XR5610, or HPE XL260. In this case
completely disabling WC is the only option to achieve low-latency.
So this adds a new Kconfig option to disable WC mapping of the G200.

Signed-off-by: Jocelyn Falempe <jfale...@redhat.com>

Reviewed-by: Thomas Zimmermann <tzimmerm...@suse.de>

Thanks a lot for the fix.

Best regards
Thomas

---
  drivers/gpu/drm/mgag200/Kconfig       | 10 ++++++++++
  drivers/gpu/drm/mgag200/mgag200_drv.c |  6 ++++++
  2 files changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/mgag200/Kconfig b/drivers/gpu/drm/mgag200/Kconfig
index b28c5e4828f47..3096944a8f0ab 100644
--- a/drivers/gpu/drm/mgag200/Kconfig
+++ b/drivers/gpu/drm/mgag200/Kconfig
@@ -11,3 +11,13 @@ config DRM_MGAG200
         MGA G200 desktop chips and the server variants. It requires 0.3.0
         of the modesetting userspace driver, and a version of mga driver
         that will fail on KMS enabled devices.
+
+config DRM_MGAG200_DISABLE_WRITECOMBINE
+       bool "Disable Write Combine mapping of VRAM"
+       depends on DRM_MGAG200 && PREEMPT_RT
+       help
+         The VRAM of the G200 is mapped with Write-Combine to improve
+         performances. This can interfere with real-time tasks; even if they
+         are running on other CPU cores than the graphics output.
+         Enable this option only if you run realtime tasks on a server with a
+         Matrox G200.
\ No newline at end of file
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c 
b/drivers/gpu/drm/mgag200/mgag200_drv.c
index 3883f25ca4d8b..62080cf0f2da4 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
@@ -146,12 +146,18 @@ int mgag200_device_preinit(struct mga_device *mdev)
        }
        mdev->vram_res = res;
+#if defined(CONFIG_DRM_MGAG200_DISABLE_WRITECOMBINE)
+       mdev->vram = devm_ioremap(dev->dev, res->start, resource_size(res));
+       if (!mdev->vram)
+               return -ENOMEM;
+#else
        mdev->vram = devm_ioremap_wc(dev->dev, res->start, resource_size(res));
        if (!mdev->vram)
                return -ENOMEM;
/* Don't fail on errors, but performance might be reduced. */
        devm_arch_phys_wc_add(dev->dev, res->start, resource_size(res));
+#endif
return 0;
  }

--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)

Reply via email to