drm/i915: support two CSC module on gen11 and later
authorLee Shawn C <shawn.c.lee@intel.com>
Mon, 18 Jan 2021 02:27:53 +0000 (10:27 +0800)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 18 Jan 2021 14:55:28 +0000 (16:55 +0200)
There are two CSC on pipeline on gen11 and later platform.
User space application is allowed to enable CTM and RGB
to YCbCr coversion at the same time now.

v2: check csc capability in {}_color_check function.
v3: can't support two CSC at the same time in {ivb,glk}_color_check.

Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Cooper Chiou <cooper.chiou@intel.com>
Cc: Shankar Uma <uma.shankar@intel.com>
Signed-off-by: Lee Shawn C <shawn.c.lee@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210118022753.8798-1-shawn.c.lee@intel.com
drivers/gpu/drm/i915/display/intel_color.c
drivers/gpu/drm/i915/display/intel_display.c

index 172d398..ff7dcb7 100644 (file)
@@ -1485,6 +1485,7 @@ static u32 ivb_csc_mode(const struct intel_crtc_state *crtc_state)
 
 static int ivb_color_check(struct intel_crtc_state *crtc_state)
 {
+       struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        bool limited_color_range = ilk_csc_limited_range(crtc_state);
        int ret;
 
@@ -1492,6 +1493,13 @@ static int ivb_color_check(struct intel_crtc_state *crtc_state)
        if (ret)
                return ret;
 
+       if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB &&
+           crtc_state->hw.ctm) {
+               drm_dbg_kms(&dev_priv->drm,
+                           "YCBCR and CTM together are not possible\n");
+               return -EINVAL;
+       }
+
        crtc_state->gamma_enable =
                (crtc_state->hw.gamma_lut ||
                 crtc_state->hw.degamma_lut) &&
@@ -1525,12 +1533,20 @@ static u32 glk_gamma_mode(const struct intel_crtc_state *crtc_state)
 
 static int glk_color_check(struct intel_crtc_state *crtc_state)
 {
+       struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        int ret;
 
        ret = check_luts(crtc_state);
        if (ret)
                return ret;
 
+       if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB &&
+           crtc_state->hw.ctm) {
+               drm_dbg_kms(&dev_priv->drm,
+                           "YCBCR and CTM together are not possible\n");
+               return -EINVAL;
+       }
+
        crtc_state->gamma_enable =
                crtc_state->hw.gamma_lut &&
                !crtc_state->c8_planes;
index b728792..b614987 100644 (file)
@@ -6355,19 +6355,6 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
                return -EINVAL;
        }
 
-       if ((pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
-            pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR444) &&
-            pipe_config->hw.ctm) {
-               /*
-                * There is only one pipe CSC unit per pipe, and we need that
-                * for output conversion from RGB->YCBCR. So if CTM is already
-                * applied we can't support YCBCR420 output.
-                */
-               drm_dbg_kms(&dev_priv->drm,
-                           "YCBCR420 and CTM together are not possible\n");
-               return -EINVAL;
-       }
-
        /*
         * Pipe horizontal size must be even in:
         * - DVO ganged mode