]> www.infradead.org Git - linux-platform-drivers-x86.git/commitdiff
drm/i915/display: Attach HDR property for capable Gen9 devices
authorUma Shankar <uma.shankar@intel.com>
Mon, 30 Nov 2020 20:47:26 +0000 (02:17 +0530)
committerUma Shankar <uma.shankar@intel.com>
Tue, 1 Dec 2020 19:52:29 +0000 (01:22 +0530)
Attach HDR property for Gen9 devices with MCA LSPCON
chips.

v2: Cleaned HDR property attachment logic based on capability
as per Jani Nikula's suggestion.

v3: Fixed the HDR property attachment logic as per the new changes
by Kai-Feng to align with lspcon detection failure on some devices.

v4: Add HDR proprty in late_register to handle lspcon detection,
as suggested by Ville.

v5: Init Lspcon only if advertized from BIOS.

v6: Added a Todo to plan a cleanup later, added Ville's RB.

Signed-off-by: Uma Shankar <uma.shankar@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201130204738.2443-4-uma.shankar@intel.com
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_lspcon.c
drivers/gpu/drm/i915/display/intel_lspcon.h

index 3896d08c41779b430eb9f9c4c21afb6127a6e02c..5aaa06d7360984cfd7953b6207cb80a18999b157 100644 (file)
@@ -6774,6 +6774,8 @@ intel_dp_connector_register(struct drm_connector *connector)
 {
        struct drm_i915_private *i915 = to_i915(connector->dev);
        struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
+       struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+       struct intel_lspcon *lspcon = &dig_port->lspcon;
        int ret;
 
        ret = intel_connector_register(connector);
@@ -6787,6 +6789,22 @@ intel_dp_connector_register(struct drm_connector *connector)
        ret = drm_dp_aux_register(&intel_dp->aux);
        if (!ret)
                drm_dp_cec_register_connector(&intel_dp->aux, connector);
+
+       if (!intel_bios_is_lspcon_present(i915, dig_port->base.port))
+               return ret;
+
+       /*
+        * ToDo: Clean this up to handle lspcon init and resume more
+        * efficiently and streamlined.
+        */
+       if (lspcon_init(dig_port)) {
+               lspcon_detect_hdr_capability(lspcon);
+               if (lspcon->hdr_supported)
+                       drm_object_attach_property(&connector->base,
+                                                  connector->dev->mode_config.hdr_output_metadata_property,
+                                                  0);
+       }
+
        return ret;
 }
 
index 641025f002868c21718a82492c0fabbd658757f7..f98891f058daca036c2c3045f03679ce174915f7 100644 (file)
@@ -552,7 +552,7 @@ void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon)
        lspcon_wait_mode(lspcon, DRM_LSPCON_MODE_PCON);
 }
 
-static bool lspcon_init(struct intel_digital_port *dig_port)
+bool lspcon_init(struct intel_digital_port *dig_port)
 {
        struct intel_dp *dp = &dig_port->dp;
        struct intel_lspcon *lspcon = &dig_port->lspcon;
index 98043ba50dd4cab619fecf1e4a9774ce8644e56f..42ccb21c908fdf911ac5d67b014e70e31f3765c7 100644 (file)
@@ -15,6 +15,7 @@ struct intel_digital_port;
 struct intel_encoder;
 struct intel_lspcon;
 
+bool lspcon_init(struct intel_digital_port *dig_port);
 void lspcon_detect_hdr_capability(struct intel_lspcon *lspcon);
 void lspcon_resume(struct intel_digital_port *dig_port);
 void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);