xserver: Branch 'master'

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Sep 10 08:40:33 UTC 2021


 hw/xfree86/drivers/modesetting/drmmode_display.c |   16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

New commits:
commit 617f591fc44e24413e1f91017d16734999bbbac1
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Thu Sep 9 15:29:50 2021 -0700

    modesetting: Only use GAMMA_LUT if its size is 1024
    
    GAMMA_LUT sizes other than 1024 cause a crash during startup if the memcpy()
    calls in xf86RandR12CrtcSetGamma() read past the end of the legacy X11 /
    XVidMode gamma ramp.
    
    This is a problem on Intel ICL / GEN11 platforms because they report a GAMMA_LUT
    size of 262145. Since it's not clear that the modesetting driver will generate a
    proper gamma ramp at that size even if xf86RandR12CrtcSetGamma() is fixed, just
    disable use of GAMMA_LUT for sizes other than 1024 for now. This will cause the
    modesetting driver to disable the CTM property and fall back to the legacy gamma
    LUT.
    
    Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
    Fixes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1193
    Tested-by: Mark Herbert

diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index c10504c32..ab352a451 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -2406,7 +2406,21 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_res
 
     drmmode_crtc->use_gamma_lut =
         drmmode_crtc->props[DRMMODE_CRTC_GAMMA_LUT_SIZE].prop_id &&
-        drmmode_crtc->props[DRMMODE_CRTC_GAMMA_LUT_SIZE].value &&
+        /* Only use GAMMA_LUT if the size is 1024.
+         *
+         * Currently, the modesetting driver always passes a sigRGBbits value of
+         * 10 to xf86HandleColormaps.  This causes it to create a RRCrtc gamma
+         * ramp of 1024 elements. If DRMMODE_CRTC_GAMMA_LUT_SIZE is larger than
+         * 1024 (for example on Intel GEN11, where it has a value of 262145)
+         * then xf86RandR12CrtcSetGamma will read past the end of the RRCrtc's
+         * gamma ramp when trying to copy it into the larger xf86Crtc gamma
+         * ramp.
+         *
+         * Since the larger GEN11 gamma ramp size hasn't been tested, just
+         * disable it for now. This will cause the modesetting driver to disable
+         * the CTM property and use the legacy DRM gamma ramp rather than the
+         * GAMMA_LUT property. */
+        drmmode_crtc->props[DRMMODE_CRTC_GAMMA_LUT_SIZE].value == 1024 &&
         xf86ReturnOptValBool(drmmode->Options, OPTION_USE_GAMMA_LUT, TRUE);
 
     if (drmmode_crtc->use_gamma_lut &&


More information about the xorg-commit mailing list