From: Werner Sembach <w...@tuxedocomputers.com>

This commit implements the "active color format" drm property for the Intel
GPU driver.

Signed-off-by: Werner Sembach <w...@tuxedocomputers.com>
Signed-off-by: Andri Yngvason <an...@yngvason.is>
Tested-by: Andri Yngvason <an...@yngvason.is>
---
 drivers/gpu/drm/i915/display/intel_display.c | 33 ++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_dp.c      |  7 +++--
 drivers/gpu/drm/i915/display/intel_dp_mst.c  |  5 +++
 drivers/gpu/drm/i915/display/intel_hdmi.c    |  4 ++-
 4 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index df582ff81b45f..79cc258db8f09 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7167,6 +7167,21 @@ static void 
intel_atomic_prepare_plane_clear_colors(struct intel_atomic_state *s
        }
 }
 
+static int convert_intel_output_format_into_drm_color_format(enum 
intel_output_format output_format)
+{
+       switch (output_format) {
+       case INTEL_OUTPUT_FORMAT_RGB:
+               return DRM_COLOR_FORMAT_RGB444;
+       case INTEL_OUTPUT_FORMAT_YCBCR420:
+               return DRM_COLOR_FORMAT_YCBCR420;
+       case INTEL_OUTPUT_FORMAT_YCBCR444:
+               return DRM_COLOR_FORMAT_YCBCR444;
+       default:
+               break;
+       }
+       return 0;
+}
+
 static void intel_atomic_commit_tail(struct intel_atomic_state *state)
 {
        struct drm_device *dev = state->base.dev;
@@ -7438,6 +7453,9 @@ int intel_atomic_commit(struct drm_device *dev, struct 
drm_atomic_state *_state,
 {
        struct intel_atomic_state *state = to_intel_atomic_state(_state);
        struct drm_i915_private *dev_priv = to_i915(dev);
+       struct drm_connector *connector;
+       struct drm_connector_state *new_conn_state;
+       int i;
        int ret = 0;
 
        state->wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
@@ -7506,6 +7524,21 @@ int intel_atomic_commit(struct drm_device *dev, struct 
drm_atomic_state *_state,
        intel_shared_dpll_swap_state(state);
        intel_atomic_track_fbs(state);
 
+       /* Extract information from crtc to communicate it to userspace as 
connector properties */
+       for_each_new_connector_in_state(&state->base, connector, 
new_conn_state, i) {
+               struct intel_crtc *crtc = to_intel_crtc(new_conn_state->crtc);
+
+               if (crtc) {
+                       struct intel_crtc_state *new_crtc_state =
+                               intel_atomic_get_new_crtc_state(state, crtc);
+
+                       
drm_connector_set_active_color_format_property(connector,
+                               
convert_intel_output_format_into_drm_color_format(
+                                       new_crtc_state->output_format));
+               } else
+                       
drm_connector_set_active_color_format_property(connector, 0);
+       }
+
        drm_atomic_state_get(&state->base);
        INIT_WORK(&state->base.commit_work, intel_atomic_commit_work);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 62ce92772367f..c40fe8a847614 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5910,10 +5910,13 @@ intel_dp_add_properties(struct intel_dp *intel_dp, 
struct drm_connector *connect
                intel_attach_force_audio_property(connector);
 
        intel_attach_broadcast_rgb_property(connector);
-       if (HAS_GMCH(dev_priv))
+       if (HAS_GMCH(dev_priv)) {
                drm_connector_attach_max_bpc_property(connector, 6, 10);
-       else if (DISPLAY_VER(dev_priv) >= 5)
+               drm_connector_attach_active_color_format_property(connector);
+       } else if (DISPLAY_VER(dev_priv) >= 5) {
                drm_connector_attach_max_bpc_property(connector, 6, 12);
+               drm_connector_attach_active_color_format_property(connector);
+       }
 
        /* Register HDMI colorspace for case of lspcon */
        if 
(intel_bios_encoder_is_lspcon(dp_to_dig_port(intel_dp)->base.devdata)) {
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c 
b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index aa10612626136..e7574ca0604e6 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -1210,6 +1210,11 @@ static struct drm_connector 
*intel_dp_add_mst_connector(struct drm_dp_mst_topolo
                drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP MST init failed, 
skipping.\n",
                            connector->name, connector->base.id);
 
+       connector->active_color_format_property =
+               intel_dp->attached_connector->base.active_color_format_property;
+       if (connector->active_color_format_property)
+               drm_connector_attach_active_color_format_property(connector);
+
        return connector;
 
 err:
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c 
b/drivers/gpu/drm/i915/display/intel_hdmi.c
index bfa456fa7d25c..ce0221f90de92 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -2611,8 +2611,10 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, 
struct drm_connector *c
        if (DISPLAY_VER(dev_priv) >= 10)
                drm_connector_attach_hdr_output_metadata_property(connector);
 
-       if (!HAS_GMCH(dev_priv))
+       if (!HAS_GMCH(dev_priv)) {
                drm_connector_attach_max_bpc_property(connector, 8, 12);
+               drm_connector_attach_active_color_format_property(connector);
+       }
 }
 
 /*
-- 
2.43.0

Reply via email to