]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/dp: Refactor FEC support check in intel_dp_supports_dsc
authorAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Tue, 17 Dec 2024 09:32:31 +0000 (15:02 +0530)
committerAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Tue, 24 Dec 2024 09:49:54 +0000 (15:19 +0530)
Forward Error Correction is required for DP if we are using DSC but
is optional for eDP.

Currently the helper intel_dp_supports_dsc checks if fec_enable is set for
DP or not. The helper is called after fec_enable is set in crtc_state.

Instead of this a better approach would be to:
first, call intel_dp_supports_dsc to check for DSC support
(along with FEC requirement for DP) and then set fec_enable for DP
(if not already set) in crtc_state.

To achieve this, remove the check for fec_enable in the helper and instead
check for FEC support for DP. With this change the helper
intel_dp_supports_dsc can be called earlier and return early if DSC is
not supported. The structure intel_dp is added to the helper to get the
FEC support for DP.

v2: Pass intel_dp to adjust_limits_for_dsc_hblank_expansion_quirk
instead of deriving it from connector. (Jani)

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241217093244.3938132-2-ankit.k.nautiyal@intel.com
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp.h
drivers/gpu/drm/i915/display/intel_dp_mst.c

index fba3af338280850e49bef00ecee9f39c816d992e..908b9887f89bd727d64a4446c611cea1be63eb14 100644 (file)
@@ -1627,13 +1627,15 @@ bool intel_dp_supports_fec(struct intel_dp *intel_dp,
                drm_dp_sink_supports_fec(connector->dp.fec_capability);
 }
 
-bool intel_dp_supports_dsc(const struct intel_connector *connector,
+bool intel_dp_supports_dsc(struct intel_dp *intel_dp,
+                          const struct intel_connector *connector,
                           const struct intel_crtc_state *crtc_state)
 {
        if (!intel_dp_has_dsc(connector))
                return false;
 
-       if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP) && !crtc_state->fec_enable)
+       if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP) &&
+           !intel_dp_supports_fec(intel_dp, connector, crtc_state))
                return false;
 
        return intel_dsc_source_support(crtc_state);
@@ -2373,7 +2375,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
                 intel_dp_supports_fec(intel_dp, connector, pipe_config) &&
                 !intel_dp_is_uhbr(pipe_config));
 
-       if (!intel_dp_supports_dsc(connector, pipe_config))
+       if (!intel_dp_supports_dsc(intel_dp, connector, pipe_config))
                return -EINVAL;
 
        if (!intel_dp_dsc_supports_format(connector, pipe_config->output_format))
index a1fd21c3b792197f77963b6d27e630c1d0b3b693..03dde9756bdc27f374af629b382bb88fbe171ff4 100644 (file)
@@ -170,7 +170,8 @@ bool intel_dp_supports_fec(struct intel_dp *intel_dp,
                           const struct intel_connector *connector,
                           const struct intel_crtc_state *pipe_config);
 
-bool intel_dp_supports_dsc(const struct intel_connector *connector,
+bool intel_dp_supports_dsc(struct intel_dp *intel_dp,
+                          const struct intel_connector *connector,
                           const struct intel_crtc_state *crtc_state);
 
 u32 intel_dp_dsc_nearest_valid_bpp(struct intel_display *display, u32 bpp, u32 pipe_bpp);
index 326ff20a5a4999a69ad1a0c4c83bdac2a3f4e31e..4217350eefb0d35de774214b86d83eaf8196079c 100644 (file)
@@ -519,7 +519,8 @@ hblank_expansion_quirk_needs_dsc(const struct intel_connector *connector,
 }
 
 static bool
-adjust_limits_for_dsc_hblank_expansion_quirk(const struct intel_connector *connector,
+adjust_limits_for_dsc_hblank_expansion_quirk(struct intel_dp *intel_dp,
+                                            const struct intel_connector *connector,
                                             const struct intel_crtc_state *crtc_state,
                                             struct link_config_limits *limits,
                                             bool dsc)
@@ -532,7 +533,7 @@ adjust_limits_for_dsc_hblank_expansion_quirk(const struct intel_connector *conne
                return true;
 
        if (!dsc) {
-               if (intel_dp_supports_dsc(connector, crtc_state)) {
+               if (intel_dp_supports_dsc(intel_dp, connector, crtc_state)) {
                        drm_dbg_kms(display->drm,
                                    "[CRTC:%d:%s][CONNECTOR:%d:%s] DSC needed by hblank expansion quirk\n",
                                    crtc->base.base.id, crtc->base.name,
@@ -588,7 +589,8 @@ mst_stream_compute_config_limits(struct intel_dp *intel_dp,
                                            limits))
                return false;
 
-       return adjust_limits_for_dsc_hblank_expansion_quirk(connector,
+       return adjust_limits_for_dsc_hblank_expansion_quirk(intel_dp,
+                                                           connector,
                                                            crtc_state,
                                                            limits,
                                                            dsc);
@@ -651,7 +653,7 @@ static int mst_stream_compute_config(struct intel_encoder *encoder,
                            str_yes_no(ret), str_yes_no(joiner_needs_dsc),
                            str_yes_no(intel_dp->force_dsc_en));
 
-               if (!intel_dp_supports_dsc(connector, pipe_config))
+               if (!intel_dp_supports_dsc(intel_dp, connector, pipe_config))
                        return -EINVAL;
 
                if (!mst_stream_compute_config_limits(intel_dp, connector,