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

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
...@@ -1460,6 +1460,10 @@ parse_edp(struct drm_i915_private *i915, ...@@ -1460,6 +1460,10 @@ parse_edp(struct drm_i915_private *i915,
panel->vbt.edp.drrs_msa_timing_delay = panel->vbt.edp.drrs_msa_timing_delay =
(edp->sdrrs_msa_timing_delay >> (panel_type * 2)) & 3; (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 static void
......
...@@ -300,6 +300,7 @@ struct intel_vbt_panel_data { ...@@ -300,6 +300,7 @@ struct intel_vbt_panel_data {
enum drrs_type drrs_type; enum drrs_type drrs_type;
struct { struct {
int max_link_rate;
int rate; int rate;
int lanes; int lanes;
int preemphasis; int preemphasis;
......
...@@ -407,6 +407,26 @@ static int ehl_max_source_rate(struct intel_dp *intel_dp) ...@@ -407,6 +407,26 @@ static int ehl_max_source_rate(struct intel_dp *intel_dp)
return 810000; 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 static void
intel_dp_set_source_rates(struct intel_dp *intel_dp) intel_dp_set_source_rates(struct intel_dp *intel_dp)
{ {
...@@ -428,7 +448,6 @@ 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 162000, 270000
}; };
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 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); struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
const int *source_rates; const int *source_rates;
int size, max_rate = 0, vbt_max_rate; int size, max_rate = 0, vbt_max_rate;
...@@ -464,7 +483,7 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp) ...@@ -464,7 +483,7 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp)
size = ARRAY_SIZE(g4x_rates); 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) if (max_rate && vbt_max_rate)
max_rate = min(max_rate, vbt_max_rate); max_rate = min(max_rate, vbt_max_rate);
else if (vbt_max_rate) else if (vbt_max_rate)
......
...@@ -697,6 +697,7 @@ struct bdb_edp { ...@@ -697,6 +697,7 @@ struct bdb_edp {
u16 apical_enable; /* 203 */ u16 apical_enable; /* 203 */
struct edp_apical_params apical_params[16]; /* 203 */ struct edp_apical_params apical_params[16]; /* 203 */
u16 edp_fast_link_training_rate[16]; /* 224 */ u16 edp_fast_link_training_rate[16]; /* 224 */
u16 edp_max_port_link_rate[16]; /* 244 */
} __packed; } __packed;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment