Commit 24b8b74e authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm/i915: Parse max link rate from the eDP BDB block



The eDP BDB block has gained yet another max link rate field.
Let's parse it and consult it during the source rate filtering.

v2: *20 instead of *2 to get the correct units (Jani)

Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220602205723.11341-1-ville.syrjala@linux.intel.com
parent f06d1d66
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1460,6 +1460,10 @@ parse_edp(struct drm_i915_private *i915,

	panel->vbt.edp.drrs_msa_timing_delay =
		(edp->sdrrs_msa_timing_delay >> (panel_type * 2)) & 3;

	if (i915->vbt.version >= 244)
		panel->vbt.edp.max_link_rate =
			edp->edp_max_port_link_rate[panel_type] * 20;
}

static void
+1 −0
Original line number Diff line number Diff line
@@ -300,6 +300,7 @@ struct intel_vbt_panel_data {
	enum drrs_type drrs_type;

	struct {
		int max_link_rate;
		int rate;
		int lanes;
		int preemphasis;
+21 −2
Original line number Diff line number Diff line
@@ -407,6 +407,26 @@ static int ehl_max_source_rate(struct intel_dp *intel_dp)
	return 810000;
}

static int vbt_max_link_rate(struct intel_dp *intel_dp)
{
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	int max_rate;

	max_rate = intel_bios_dp_max_link_rate(encoder);

	if (intel_dp_is_edp(intel_dp)) {
		struct intel_connector *connector = intel_dp->attached_connector;
		int edp_max_rate = connector->panel.vbt.edp.max_link_rate;

		if (max_rate && edp_max_rate)
			max_rate = min(max_rate, edp_max_rate);
		else if (edp_max_rate)
			max_rate = edp_max_rate;
	}

	return max_rate;
}

static void
intel_dp_set_source_rates(struct intel_dp *intel_dp)
{
@@ -428,7 +448,6 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp)
		162000, 270000
	};
	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
	struct intel_encoder *encoder = &dig_port->base;
	struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
	const int *source_rates;
	int size, max_rate = 0, vbt_max_rate;
@@ -464,7 +483,7 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp)
		size = ARRAY_SIZE(g4x_rates);
	}

	vbt_max_rate = intel_bios_dp_max_link_rate(encoder);
	vbt_max_rate = vbt_max_link_rate(intel_dp);
	if (max_rate && vbt_max_rate)
		max_rate = min(max_rate, vbt_max_rate);
	else if (vbt_max_rate)
+1 −0
Original line number Diff line number Diff line
@@ -697,6 +697,7 @@ struct bdb_edp {
	u16 apical_enable;					/* 203 */
	struct edp_apical_params apical_params[16];		/* 203 */
	u16 edp_fast_link_training_rate[16];			/* 224 */
	u16 edp_max_port_link_rate[16];				/* 244 */
} __packed;

/*