]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/amd/display: use rgb full range as default quantization for non HDMI
authorWenjing Liu <Wenjing.Liu@amd.com>
Wed, 30 Nov 2016 22:57:24 +0000 (17:57 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 26 Sep 2017 21:04:00 +0000 (17:04 -0400)
Refactor the quantization decision to color module.
Add the check if non HDMI, default quantization should be rgb full range.

Signed-off-by: Wenjing Liu <Wenjing.Liu@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/modules/color/color.c
drivers/gpu/drm/amd/display/modules/inc/mod_color.h

index 30d09d358576b1d641abc70761d5f5598d946d78..0610b82b6d847775844f4829017dc531dad864bb 100644 (file)
@@ -2184,7 +2184,8 @@ bool mod_color_set_saturation(struct mod_color *mod_color,
        return true;
 }
 
-bool mod_color_set_preferred_quantization_range(struct mod_color *mod_color,
+bool mod_color_persist_user_preferred_quantization_range(
+               struct mod_color *mod_color,
                const struct dc_sink *sink,
                enum dc_quantization_range quantization_range)
 {
@@ -2214,13 +2215,90 @@ bool mod_color_set_preferred_quantization_range(struct mod_color *mod_color,
 
 bool mod_color_get_preferred_quantization_range(struct mod_color *mod_color,
                const struct dc_sink *sink,
+               const struct dc_crtc_timing *timing,
                enum dc_quantization_range *quantization_range)
 {
        struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
-       unsigned int sink_index;
+       unsigned int sink_index = sink_index_from_sink(core_color, sink);
+       enum dc_quantization_range user_preferred_quantization_range =
+                       core_color->state[sink_index].
+                               preferred_quantization_range;
+       bool rgb_full_range_supported =
+                       mod_color_is_rgb_full_range_supported_for_timing(
+                               sink, timing);
+       bool rgb_limited_range_supported =
+                       mod_color_is_rgb_limited_range_supported_for_timing(
+                               sink, timing);
+
+       if (rgb_full_range_supported && rgb_limited_range_supported)
+               *quantization_range = user_preferred_quantization_range;
+       else if (rgb_full_range_supported && !rgb_limited_range_supported)
+               *quantization_range = QUANTIZATION_RANGE_FULL;
+       else if (!rgb_full_range_supported && rgb_limited_range_supported)
+               *quantization_range = QUANTIZATION_RANGE_LIMITED;
+       else
+               *quantization_range = QUANTIZATION_RANGE_UNKNOWN;
 
-       sink_index = sink_index_from_sink(core_color, sink);
-       *quantization_range = core_color->state[sink_index].
-                       preferred_quantization_range;
        return true;
 }
+
+bool mod_color_is_rgb_full_range_supported_for_timing(
+               const struct dc_sink *sink,
+               const struct dc_crtc_timing *timing)
+{
+       bool result = false;
+
+       if (!sink || !timing)
+               return result;
+
+       if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A)
+               if (timing->vic || timing->hdmi_vic)
+                       if (timing->h_addressable == 640 &&
+                               timing->v_addressable == 480 &&
+                               (timing->pix_clk_khz == 25200 ||
+                                       timing->pix_clk_khz == 25170 ||
+                                       timing->pix_clk_khz == 25175))
+                               result = true;
+                       else
+                               /* don't support full range rgb */
+                               /* for HDMI CEA861 timings except VGA mode */
+                               result = false;
+               else
+                       result = true;
+       else
+               result = true;
+
+       return result;
+}
+
+bool mod_color_is_rgb_limited_range_supported_for_timing(
+               const struct dc_sink *sink,
+               const struct dc_crtc_timing *timing)
+{
+       bool result = false;
+
+       if (!sink || !timing)
+               return result;
+
+       if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A)
+               if (timing->vic || timing->hdmi_vic)
+                       if (timing->h_addressable == 640 &&
+                               timing->v_addressable == 480 &&
+                               (timing->pix_clk_khz == 25200 ||
+                                               timing->pix_clk_khz == 25170 ||
+                                               timing->pix_clk_khz == 25175))
+                               /* don't support rgb limited for */
+                               /* HDMI CEA VGA mode */
+                               result = false;
+                       else
+                               /* support rgb limited for non VGA CEA timing */
+                               result = true;
+               else
+                       /* support rgb limited for non CEA HDMI timing */
+                       result = true;
+       else
+               /* don't support rgb limited for non HDMI signal */
+               result = false;
+
+       return result;
+}
index e54fe2cb8611b68e34aeb8e17715862246882166..91abc173444a23ff6deff3aa7e36d0e5a9d7974e 100644 (file)
@@ -168,12 +168,22 @@ bool mod_color_set_saturation(struct mod_color *mod_color,
                const struct dc_stream **streams, int num_streams,
                int saturation_value);
 
-bool mod_color_set_preferred_quantization_range(struct mod_color *mod_color,
+bool mod_color_persist_user_preferred_quantization_range(
+               struct mod_color *mod_color,
                const struct dc_sink *sink,
                enum dc_quantization_range quantization_range);
 
 bool mod_color_get_preferred_quantization_range(struct mod_color *mod_color,
                const struct dc_sink *sink,
+               const struct dc_crtc_timing *timing,
                enum dc_quantization_range *quantization_range);
 
+bool mod_color_is_rgb_full_range_supported_for_timing(
+               const struct dc_sink *sink,
+               const struct dc_crtc_timing *timing);
+
+bool mod_color_is_rgb_limited_range_supported_for_timing(
+               const struct dc_sink *sink,
+               const struct dc_crtc_timing *timing);
+
 #endif /* MOD_COLOR_H_ */