]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/dp: Add support of BT.2020 Colorimetry to DP MSA
authorGwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Thu, 19 Sep 2019 19:53:05 +0000 (22:53 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 15 Oct 2019 13:24:59 +0000 (16:24 +0300)
When BT.2020 Colorimetry output is used for DP, we should program BT.2020
Colorimetry to MSA and VSC SDP. In order to handle colorspace of
drm_connector_state, it moves a calling of intel_ddi_set_pipe_settings()
function into intel_ddi_pre_enable_dp(). And it also rename
intel_ddi_set_pipe_settings() to intel_ddi_set_dp_msa().

As per DP 1.4a spec section 2.2.4 [MSA Data Transport]
The MSA data that the DP Source device transports for reproducing the main
video stream. Attribute data is sent once per frame during the main video
stream’s vertical blanking period.

In order to distinguish needed colorimetry for VSC SDP, it adds
intel_dp_needs_vsc_sdp function.
If the output colorspace requires vsc sdp or output format is YCbCr 4:2:0,
it uses MSA with VSC SDP.

As per DP 1.4a spec section 2.2.4.3 [MSA Field for Indication of
Color Encoding Format and Content Color Gamut] while sending
BT.2020 Colorimetry signals we should program MSA MISC1 fields which
indicate VSC SDP for the Pixel Encoding/Colorimetry Format.

v2: Remove useless parentheses
v3: Addressed review comments from Ville
    - In order to checking output format and output colorspace on
      intel_dp_needs_vsc_sdp(), it passes entire intel_crtc_state struct
      value.
    - Remove a pointless variable.
v9: Addressed review comments from Ville
    - Remove a duplicated output color space from intel_crtc_state.
    - In order to handle colorspace of drm_connector_state, it moves a
      calling of intel_ddi_set_pipe_settings() function into
      intel_ddi_pre_enable_dp().

Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190919195311.13972-3-gwan-gyeong.mun@intel.com
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
drivers/gpu/drm/i915/display/intel_ddi.c
drivers/gpu/drm/i915/display/intel_ddi.h
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp.h

index 079dae20deb58bb53c488077abdd66bfb798b31f..a8555e396b2a8ebd0c1a6f407d74a266fcb3bacd 100644 (file)
@@ -1741,7 +1741,8 @@ static void intel_ddi_clock_get(struct intel_encoder *encoder,
                hsw_ddi_clock_get(encoder, pipe_config);
 }
 
-void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state)
+void intel_ddi_set_dp_msa(const struct intel_crtc_state *crtc_state,
+                         const struct drm_connector_state *conn_state)
 {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@ -1792,11 +1793,12 @@ void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state)
        /*
         * As per DP 1.4a spec section 2.2.4.3 [MSA Field for Indication
         * of Color Encoding Format and Content Color Gamut] while sending
-        * YCBCR 420 signals we should program MSA MISC1 fields which
-        * indicate VSC SDP for the Pixel Encoding/Colorimetry Format.
+        * YCBCR 420, HDR BT.2020 signals we should program MSA MISC1 fields
+        * which indicate VSC SDP for the Pixel Encoding/Colorimetry Format.
         */
-       if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
+       if (intel_dp_needs_vsc_sdp(crtc_state, conn_state))
                temp |= TRANS_MSA_USE_VSC_SDP;
+
        I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
 }
 
@@ -3594,6 +3596,8 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
                tgl_ddi_pre_enable_dp(encoder, crtc_state, conn_state);
        else
                hsw_ddi_pre_enable_dp(encoder, crtc_state, conn_state);
+
+       intel_ddi_set_dp_msa(crtc_state, conn_state);
 }
 
 static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
@@ -4009,7 +4013,7 @@ static void intel_ddi_update_pipe_dp(struct intel_encoder *encoder,
 {
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 
-       intel_ddi_set_pipe_settings(crtc_state);
+       intel_ddi_set_dp_msa(crtc_state, conn_state);
 
        intel_psr_update(intel_dp, crtc_state);
        intel_edp_drrs_enable(intel_dp, crtc_state);
index a08365da26433379635b73a37409154f5979b3e1..19aeab1246eed46624ac7af035b74fc495976fbe 100644 (file)
@@ -30,7 +30,8 @@ void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state)
 void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state);
 void intel_ddi_enable_pipe_clock(const struct intel_crtc_state *crtc_state);
 void intel_ddi_disable_pipe_clock(const  struct intel_crtc_state *crtc_state);
-void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state);
+void intel_ddi_set_dp_msa(const struct intel_crtc_state *crtc_state,
+                         const struct drm_connector_state *conn_state);
 bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
 void intel_ddi_get_config(struct intel_encoder *encoder,
                          struct intel_crtc_state *pipe_config);
index 3cf39fc153b3009baeeffd867f03730a7886ec55..5d77f5bae0d962f5a2cf5618edc9f4101cfd8171 100644 (file)
@@ -6468,7 +6468,6 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
        if (INTEL_GEN(dev_priv) >= 11)
                icl_set_pipe_chicken(intel_crtc);
 
-       intel_ddi_set_pipe_settings(pipe_config);
        if (!transcoder_is_dsi(cpu_transcoder))
                intel_ddi_enable_transcoder_func(pipe_config);
 
index 7aa027881ff342d57237b4bc9e3cc375d110079d..d8dd7035ca46dcf17e9c476886866a66ca3b4ef4 100644 (file)
@@ -2297,6 +2297,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
                pipe_config->has_pch_encoder = true;
 
        pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
+
        if (lspcon->active)
                lspcon_ycbcr420_config(&intel_connector->base, pipe_config);
        else
@@ -4473,6 +4474,32 @@ intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
                DP_DPRX_ESI_LEN;
 }
 
+bool
+intel_dp_needs_vsc_sdp(const struct intel_crtc_state *crtc_state,
+                      const struct drm_connector_state *conn_state)
+{
+       /*
+        * As per DP 1.4a spec section 2.2.4.3 [MSA Field for Indication
+        * of Color Encoding Format and Content Color Gamut], in order to
+        * sending YCBCR 420 or HDR BT.2020 signals we should use DP VSC SDP.
+        */
+       if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
+               return true;
+
+       switch (conn_state->colorspace) {
+       case DRM_MODE_COLORIMETRY_SYCC_601:
+       case DRM_MODE_COLORIMETRY_OPYCC_601:
+       case DRM_MODE_COLORIMETRY_BT2020_YCC:
+       case DRM_MODE_COLORIMETRY_BT2020_RGB:
+       case DRM_MODE_COLORIMETRY_BT2020_CYCC:
+               return true;
+       default:
+               break;
+       }
+
+       return false;
+}
+
 static void
 intel_dp_setup_vsc_sdp(struct intel_dp *intel_dp,
                       const struct intel_crtc_state *crtc_state,
@@ -4601,7 +4628,7 @@ void intel_dp_vsc_enable(struct intel_dp *intel_dp,
                         const struct intel_crtc_state *crtc_state,
                         const struct drm_connector_state *conn_state)
 {
-       if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_YCBCR420)
+       if (!intel_dp_needs_vsc_sdp(crtc_state, conn_state))
                return;
 
        intel_dp_setup_vsc_sdp(intel_dp, crtc_state, conn_state);
index ce2b87f51a30f7ec91d1fa526ed9d74545dbdc3a..b05b9f62347f7e096c0b0ecf9d2bc7fc00f714d6 100644 (file)
@@ -108,6 +108,8 @@ bool intel_dp_read_dpcd(struct intel_dp *intel_dp);
 bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp);
 int intel_dp_link_required(int pixel_clock, int bpp);
 int intel_dp_max_data_rate(int max_link_clock, int max_lanes);
+bool intel_dp_needs_vsc_sdp(const struct intel_crtc_state *crtc_state,
+                           const struct drm_connector_state *conn_state);
 void intel_dp_vsc_enable(struct intel_dp *intel_dp,
                         const struct intel_crtc_state *crtc_state,
                         const struct drm_connector_state *conn_state);