mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
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: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220602205723.11341-1-ville.syrjala@linux.intel.com
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user