Commit 33846549 authored by Imre Deak's avatar Imre Deak
Browse files

drm/i915/dp: Fail state computation for invalid DSC source input BPP values



There is no reason to accept an invalid minimum/maximum DSC source input
BPP value (i.e a minimum DSC input BPP value above the maximum pipe BPP
or a maximum DSC input BPP value below the minimum pipe BPP value), fail
the state computation in these cases.

Reviewed-by: default avatarVinod Govindapillai <vinod.govindapillai@intel.com>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Link: https://patch.msgid.link/20251215192357.172201-17-imre.deak@intel.com
parent a63bbb8d
Loading
Loading
Loading
Loading
+21 −7
Original line number Diff line number Diff line
@@ -2661,16 +2661,30 @@ intel_dp_compute_config_link_bpp_limits(struct intel_dp *intel_dp,
	return true;
}

static void
intel_dp_dsc_compute_pipe_bpp_limits(struct intel_dp *intel_dp,
static bool
intel_dp_dsc_compute_pipe_bpp_limits(struct intel_connector *connector,
				     struct link_config_limits *limits)
{
	struct intel_display *display = to_intel_display(intel_dp);
	struct intel_display *display = to_intel_display(connector);
	const struct link_config_limits orig_limits = *limits;
	int dsc_min_bpc = intel_dp_dsc_min_src_input_bpc();
	int dsc_max_bpc = intel_dp_dsc_max_src_input_bpc(display);

	limits->pipe.max_bpp = clamp(limits->pipe.max_bpp, dsc_min_bpc * 3, dsc_max_bpc * 3);
	limits->pipe.min_bpp = clamp(limits->pipe.min_bpp, dsc_min_bpc * 3, dsc_max_bpc * 3);
	limits->pipe.min_bpp = max(limits->pipe.min_bpp, dsc_min_bpc * 3);
	limits->pipe.max_bpp = min(limits->pipe.max_bpp, dsc_max_bpc * 3);

	if (limits->pipe.min_bpp <= 0 ||
	    limits->pipe.min_bpp > limits->pipe.max_bpp) {
		drm_dbg_kms(display->drm,
			    "[CONNECTOR:%d:%s] Invalid DSC src/sink input BPP (src:%d-%d pipe:%d-%d)\n",
			    connector->base.base.id, connector->base.name,
			    dsc_min_bpc * 3, dsc_max_bpc * 3,
			    orig_limits.pipe.min_bpp, orig_limits.pipe.max_bpp);

		return false;
	}

	return true;
}

bool
@@ -2710,8 +2724,8 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
							respect_downstream_limits);
	}

	if (dsc)
		intel_dp_dsc_compute_pipe_bpp_limits(intel_dp, limits);
	if (dsc && !intel_dp_dsc_compute_pipe_bpp_limits(connector, limits))
		return false;

	if (is_mst || intel_dp->use_max_params) {
		/*