drm/i915: Enable hw workaround to bypass alpha
authorVandita Kulkarni <vandita.kulkarni@intel.com>
Thu, 21 Jun 2018 15:13:56 +0000 (20:43 +0530)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Thu, 21 Jun 2018 18:25:00 +0000 (20:25 +0200)
Alpha blending with alpha 0 and 0xff passes through
alpha math and rounding logic causing differences
compared to fully transparent or opaque plane,resulting
in CRC mismatch.
This WA on icl and above enables hardware to bypass alpha
math and rounding for per pixel alpha values of 00 and 0xff

v2: Fix patchwork checkpatch warnings.

Signed-off-by: Vandita Kulkarni <vandita.kulkarni@intel.com>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/1529594036-25036-1-git-send-email-vandita.kulkarni@intel.com
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_display.c

index 65b222287ee4e48fb963c1376d4704ae0948373c..caad19f5f557fd9c79304a922aa22b54a92bf96c 100644 (file)
@@ -7366,6 +7366,14 @@ enum {
 #define BDW_SCRATCH1                                   _MMIO(0xb11c)
 #define  GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE     (1 << 2)
 
+/*GEN11 chicken */
+#define _PIPEA_CHICKEN                 0x70038
+#define _PIPEB_CHICKEN                 0x71038
+#define _PIPEC_CHICKEN                 0x72038
+#define  PER_PIXEL_ALPHA_BYPASS_EN     (1 << 7)
+#define PIPE_CHICKEN(pipe)             _MMIO_PIPE(pipe, _PIPEA_CHICKEN,\
+                                                  _PIPEB_CHICKEN)
+
 /* PCH */
 
 /* south display engine interrupt: IBX */
index b2a5a9ed940401ca0aec4406df1959acd2512f57..4db576c3e3649f70c18b9ce9ed3694408cb864bd 100644 (file)
@@ -5633,6 +5633,7 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
        struct intel_atomic_state *old_intel_state =
                to_intel_atomic_state(old_state);
        bool psl_clkgate_wa;
+       u32 pipe_chicken;
 
        if (WARN_ON(intel_crtc->active))
                return;
@@ -5692,6 +5693,17 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
         */
        intel_color_load_luts(&pipe_config->base);
 
+       /*
+        * Display WA #1153: enable hardware to bypass the alpha math
+        * and rounding for per-pixel values 00 and 0xff
+        */
+       if (INTEL_GEN(dev_priv) >= 11) {
+               pipe_chicken = I915_READ(PIPE_CHICKEN(pipe));
+               if (!(pipe_chicken & PER_PIXEL_ALPHA_BYPASS_EN))
+                       I915_WRITE_FW(PIPE_CHICKEN(pipe),
+                                     pipe_chicken | PER_PIXEL_ALPHA_BYPASS_EN);
+       }
+
        intel_ddi_set_pipe_settings(pipe_config);
        if (!transcoder_is_dsi(cpu_transcoder))
                intel_ddi_enable_transcoder_func(pipe_config);