drm/i915: Check EDID for HDR static metadata when choosing blc
authorjsg <jsg@openbsd.org>
Mon, 9 May 2022 09:00:01 +0000 (09:00 +0000)
committerjsg <jsg@openbsd.org>
Mon, 9 May 2022 09:00:01 +0000 (09:00 +0000)
From Jouni Hogander
67434e132b8c9d3fb59f0bc27da6d0a0488cf92b in linux 5.15.y/5.15.38
c05d8332f5d23fa3b521911cbe55a2b67fb21248 in mainline linux

sys/dev/pci/drm/i915/display/intel_dp_aux_backlight.c

index c82f8fe..e7b9086 100644 (file)
 
 #define INTEL_EDP_BRIGHTNESS_OPTIMIZATION_1                            0x359
 
+enum intel_dp_aux_backlight_modparam {
+       INTEL_DP_AUX_BACKLIGHT_AUTO = -1,
+       INTEL_DP_AUX_BACKLIGHT_OFF = 0,
+       INTEL_DP_AUX_BACKLIGHT_ON = 1,
+       INTEL_DP_AUX_BACKLIGHT_FORCE_VESA = 2,
+       INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL = 3,
+};
+
 /* Intel EDP backlight callbacks */
 static bool
 intel_dp_aux_supports_hdr_backlight(struct intel_connector *connector)
@@ -125,6 +133,24 @@ intel_dp_aux_supports_hdr_backlight(struct intel_connector *connector)
                return false;
        }
 
+       /*
+        * If we don't have HDR static metadata there is no way to
+        * runtime detect used range for nits based control. For now
+        * do not use Intel proprietary eDP backlight control if we
+        * don't have this data in panel EDID. In case we find panel
+        * which supports only nits based control, but doesn't provide
+        * HDR static metadata we need to start maintaining table of
+        * ranges for such panels.
+        */
+       if (i915->params.enable_dpcd_backlight != INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL &&
+           !(connector->base.hdr_sink_metadata.hdmi_type1.metadata_type &
+             BIT(HDMI_STATIC_METADATA_TYPE1))) {
+               drm_info(&i915->drm,
+                        "Panel is missing HDR static metadata. Possible support for Intel HDR backlight interface is not used. If your backlight controls don't work try booting with i915.enable_dpcd_backlight=%d. needs this, please file a _new_ bug report on drm/i915, see " FDO_BUG_URL " for details.\n",
+                        INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL);
+               return false;
+       }
+
        panel->backlight.edp.intel.sdr_uses_aux =
                tcon_cap[2] & INTEL_EDP_SDR_TCON_BRIGHTNESS_AUX_CAP;
 
@@ -373,14 +399,6 @@ static const struct intel_panel_bl_funcs intel_dp_vesa_bl_funcs = {
        .get = intel_dp_aux_vesa_get_backlight,
 };
 
-enum intel_dp_aux_backlight_modparam {
-       INTEL_DP_AUX_BACKLIGHT_AUTO = -1,
-       INTEL_DP_AUX_BACKLIGHT_OFF = 0,
-       INTEL_DP_AUX_BACKLIGHT_ON = 1,
-       INTEL_DP_AUX_BACKLIGHT_FORCE_VESA = 2,
-       INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL = 3,
-};
-
 int intel_dp_aux_init_backlight_funcs(struct intel_connector *connector)
 {
        struct drm_device *dev = connector->base.dev;